/* validation methods - syntax modeled after prototype.js */

var Validation = {
	required: function(element) {
		element = $(element);
		
		if (($F(element) || "").isBlank()) {
			Validation.showError(element, arguments[1], arguments[2] || "is required.");
			element.activate();
			return false;
		}
		
		return true;
	},
	
	email: function(element) {
		element = $(element);
		
		if (!($F(element) || "").isEmail()) {
			Validation.showError(element, arguments[1], arguments[2] || "requires a valid email address.");
			element.activate();
			return false;
		}
		
		return true;
	},
	
	numeric: function(element, allowDecimal) {
		element = $(element);
		
		if (allowDecimal ? !($F(element) || "").isNumeric() : !/^-?[0-9]*$/.test($F(element) || "")) {
			Validation.showError(element, arguments[2], arguments[3] || (allowDecimal ? "must be a number." : "must be a whole number."));
			element.activate();
			return false;
		}
		
		return true;
	},
	
	within: function(element, range, allowDecimal) {
		element = $(element);
		
		if (!$$N(element, allowDecimal, arguments[3], arguments[4]))
			return false;
			
		if (!($F(element) || "").isBlank() && !range.include($F(element))) {
			Validation.showError(element, arguments[3], arguments[4] || "must be between " + range.start + " and " + range.end + ".");
			element.activate();
			return false;
		}
		
		return true;
	},
	
	date: function(element) {
		element = $(element);
		
		if (!($F(element) || "").isDate()) {
			Validation.showError(element, arguments[1], arguments[2] || "is not a valid date.");
			element.activate();
			return false;
		}
		
		return true;
	},
	
	pattern: function(element, regex) {
		element = $(element);
		
		if (!regex.test(($F(element) || ""))) {
			Validation.showError(element, arguments[2], arguments[3] || "is not valid.");
			element.activate();
			return false;
		}
		
		return true;
	},
	
	showError: function(element, name, predicate) {
		
		if (!name) {
			var label = element.previous();
			
			if (label && label.tagName && label.tagName.toLowerCase() == "label") {
				name = "\"" + label.innerHTML + "\"";
			}
		}
		
		if (name) {
			alertDialog("The " + name + " field " + predicate, function() { if (element.visible() && element.style.visibility != "hidden") {element.focus();} return true;});
		}
	}
}

/* shortcuts */
var $$R = Validation.required;
var $$N = Validation.numeric;
var $$D = Validation.date;
var $$P = Validation.pattern;
var $$W = Validation.within;
var $$E = Validation.email;
