// iNET Form Validation v1.1.0
var iNETFV = {
	errormsg:  "Oops! Please correct the following errors:",
	errors:    new Array(),
	rAlpha:    /^([\w\s]+)?$/i,
	rNumeric:  /^([\d\.]+)?$/,
	rEmail:    /^([a-z0-9][\w\.\-]*@[\w\.\-]+\.[a-z]{2,3})?$/i,
	rJpg:      /(.jpg)?$/i,
	rDate:     /(\d\d\/\d\d\/\d\d\d\d)?$/i,
	rUrl:      /^localhost|^([a-z][\w\-]*\.[\w\-]+(\.[a-z]{2,3})+[\/\w\-]*)?$/i,
	rPostcode: /^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)?$/,
	
	init: function() {
		for (var i in document.forms) {
			if(document.forms[i].validation) {
				document.forms[i].onsubmit = function() {
					return iNETFV.validate(this);
				};
			};
		};
	},
	
	validate: function(form) {
		var fields = form.validation.value.substring(0, form.validation.value.length - 1).split(";");  // Split by field
		for (var i in fields) {
			fields[i]    = fields[i].split(":");     // Split into id, validation and label
			fields[i][0] = id(fields[i][0]);         // Set field reference from id
			fields[i][1] = fields[i][1].split(",");  // Split validation rules
			
			// Scan through validation rules
			for (var ii in fields[i][1]) {
				switch(fields[i][1][ii]) {
					case "required" :
						if(fields[i][0].value == "") {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' is a required field.", fields[i][0]];
						};
						break;
					case "alpha" :
						if(!iNETFV.rAlpha.test(fields[i][0].value)) {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' accepts alpha characters only. (a-Z)", fields[i][0]];
						};
						break;
					case "numeric" :
						if(!iNETFV.rNumeric.test(fields[i][0].value)) {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' accepts numeric characters only.", fields[i][0]];
						};
						break;
					case "email" :
						if(!iNETFV.rEmail.test(fields[i][0].value)) {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' requires a valid email address.", fields[i][0]];
						};
						break;
					case "jpg" :
						if(!iNETFV.rJpg.test(fields[i][0].value)) {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' accepts .jpg files only.", field];
						};
						break;
					case "date" :
						if(!iNETFV.rDate.test(fields[i][0].value)) {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' accepts valid dates only. (dd/mm/yyyy)", field];
						};
						break;
					case "url" :
						if(!iNETFV.rUrl.test(field.value)) {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' accepts valid URLs only.", field];
						};
						break;
					case "postcode" :
						if(!iNETFV.rPostcode.test(field.value)) {
							iNETFV.errors[iNETFV.errors.length] = ["'" + fields[i][2] + "' accepts valid UK postcodes only.", field];
						};
						break;
				};
			};
		};
		if(iNETFV.errors.length > 0) {
			iNETFV.showErrors(form);
			iNETFV.errors = new Array();
			return false;
		};
	},
	
	showErrors: function(form) {
		// Remove errors div if set previously
		if(form.firstChild.className == "errors") form.removeChild(form.firstChild);
		// Remove any previously set error flags
		var DIVs = tag("div", form);
		for(var i = 0; i < DIVs.length; i++) {
			if(DIVs[i].firstChild.className) DIVs[i].className = DIVs[i].className.replace(/(\s)?error/, "");
		};
		
		// Create errors div
		var errorDiv = document.createElement("div");
		errorDiv.className = "errors";
		errorLink = errorDiv.appendChild(document.createElement("h2")).appendChild(document.createElement("a"));
		errorLink.appendChild(document.createTextNode(iNETFV.errormsg));
		OL = errorDiv.appendChild(document.createElement("ol"));
		
		// Build list of errors
		for(var i in iNETFV.errors) {
			LINK = OL.appendChild(document.createElement("li")).appendChild(document.createElement("a"));
			LINK.appendChild(document.createTextNode(iNETFV.errors[i][0]));
			LINK.href = "#" + iNETFV.errors[i][1].id;
			iNETFV.errors[i][1].parentNode.className += " error";
		};
		
		// Insert and focus on errors
		form.insertBefore(errorDiv, form.firstChild);
		errorLink.focus();
		
		// Scroll to error
		var dy = errorDiv.offsetTop;
		var thisNode = errorDiv;
    	while (thisNode.offsetParent && (thisNode.offsetParent != document.body)) {
			thisNode = thisNode.offsetParent;
			dy += thisNode.offsetTop;
		}
		window.scrollTo(0, dy);
	}
};

// set Loaded functions
addDOMLoadEvent(iNETFV.init);
