/**
 * @author Ed Slocombe
 * FORM UTILITIES
 */

var FormUtils = {
	
	addRequiredStars : function () {
		for (var obj in Form) {
			if (Form[obj]["required"] == undefined) 
				continue;
			var elem = document.getElementById(obj + "_errMsg");
			if (elem) 
				elem.innerHTML = "*";
		}
	},
	
	clear : function (field) {
		if (field.value == field.defaultValue) field.value = ''; 
	},
	
	trim : function (value) {
		return (this.ltrim(this.rtrim(value)));
	},
	
	rtrim : function (value) {
		return value.replace(/\s\s*$/, '');
	},
	
	ltrim : function (value) {
		return value.replace(/^\s\s*/, '');
	},
	
	isEmpty : function (value) {
		if (value == null || value == undefined) return true;
		if (this.trim(value) == "") return true;
		return false;
	},
	
	validate_form : function (displayAlert) {
		
		var errors = false;
		
		for (var obj in Form) {
			errors = (this.validate_element(obj))? true : errors;
		}
		
		if (errors && displayAlert) alert("Please correct the errors indicated");
		
		return !errors;
		
	},
	
	validate_element : function (id) {
		
		var error = false;
		
		if (!Form[id]) return;
		var elem = document.getElementById(id);
		if (!elem) return;
		var errorMsgElem = document.getElementById(id+"_errMsg");
		if (!errorMsgElem) return;
		var value = elem.value;
		
		if (Form[id]["required"] == true && this.isEmpty(value)) {
			errorMsgElem.innerHTML = Form[id]["displayName"]+" is required";
			error = true;
		} else if (typeof Form[id]["valid"] == "function" && !this.isEmpty(value) && !Form[id]["valid"](value, elem)){
			errorMsgElem.innerHTML = (Form[id]["errorMsg"])? Form[id]["errorMsg"] : Form[id]["displayName"]+" is invalid";
			error = true;
		} else if (typeof Form[id]["valid"] == "object") {
			
			var tmpError = false;
			
			for (var i=0; i<Form[id]["valid"].length; i++) {
				if (Form[id]["valid"][i].toString().indexOf("isSetRequired") != -1 && Form[id]["valid"][i](value) === false) {
					errorMsgElem.innerHTML = Form[id]["displayName"] + " is required";
					tmpError = true;
				} else if (!this.isEmpty(value) && !Form[id]["valid"][i](value, elem)) {
					errorMsgElem.innerHTML = (Form[id]["errorMsg"])? Form[id]["errorMsg"] : Form[id]["displayName"]+" is invalid";
					tmpError = true;
				} 
			}
			
			if (!tmpError) errorMsgElem.innerHTML = "";
			error = (tmpError)? true : error;
			
		} else if (Form[id]["maxLength"] && this.validate_maxLength(value, Form[id]["maxLength"])) {
			errorMsgElem.innerHTML = (Form[id]["errorMsg"])? Form[id]["errorMsg"] : Form[id]["displayName"]+" is limited to "+Form[id]["maxLength"]+" characters";
			error = true;
		} else if (Form[id]["minLength"] && this.validate_minLength(value, Form[id]["minLength"])) {
			errorMsgElem.innerHTML = (Form[id]["errorMsg"])? Form[id]["errorMsg"] : Form[id]["displayName"]+" must be at least "+Form[id]["minLength"]+" characters";
			error = true;
		} else errorMsgElem.innerHTML = "";
		
		return error;
		
	}, 
	
	validate_isSetRequired : function(value, requiredId) {
		var on = (document.getElementById(requiredId).checked);
		if (on === true && this.isEmpty(value)) return false;
		return true; 
	},
	
	validate_image : function(value) {
		return value.match(/((\.jpg)|(\.jpeg)|(\.gif)|(\.png))$/);
	},
	
	validate_maxLength : function (value, maxLength) {
		return (value.length >= maxLength);
	},
	
	validate_minLength : function (value, minLength) {
		return (value.length < minLength);
	},
	
	validate_naturalNo : function(value) {
		return !value.replace(/\s/g, "").match(/\D/);
	},
	
	validate_floatingNo : function(value) {
		return value.match(/^-?\d*\.?\d+$/);
	},
	
	validate_alphabet : function(value) {
		return !value.replace(/[\s|-|.|']/g, "").match(/[\W|\d]/);
	},
	
	validate_alphaNum : function(value) {
		return !value.match(/\W/);
	},
	
	validate_date : function(value) {
		// Not implemented
	},
	
	validate_email : function(value) {
		return value.match(/^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/i);
	},
	
	validate_postCode : function(value) {
		return value.match(/^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? ?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/i);
	},
	
	validate_zipCode : function(value) {
		return value.match(/^\d{5}([\-]\d{4})?$/i);
	},
	
	validate_url : function(value) {
		return value.match(/^((https?|ftp|file):((\/\/)|(\\\\))+((www)|[a-zA-Z0-9]{2,})+\.[\w\d:#@%\/;$()~_?\+-=\\\.\&]{2,})$/i);
	},
	
	validate_youTubeVid : function(value) {
		return value.match(/^(http:\/\/www\.youtube\.com\/watch\?v=[\w\d:#@%\/;$()~_\+-=\\\.\&]{4,})$/i);
	},
	
	validate_checked : function(value, elem) {
		return elem.checked;
	},
	
	validate_matching : function(value, elem) {
		return (value == document.getElementById(elem).value);
	}
	
}
