/*
Copyright © 2011 Andrew Spendlove 
All rights reserved
*/
FormValidate = {Version		: "1.2.2.3",ID				: "Validate",Form			: {} ,ImagesPath		: "",$			: function (strID) {var objElement = document.getElementById(strID);return (objElement != null) ? objElement : null; },$$					: function (strElement) {return (strElement != null || (strElement != "")) ? document.createElement(strElement) : null;},$$$					: function (strTagName,objElement) {if (objElement == null) {objElement = document};return objElement.getElementsByTagName(strTagName);},ClassName	: {ValidateImage 	: "validateimage"},Images			: {Valid				: "tick.png" ,Invalid			: "cross.png"},Message		: {101 		: "$Label$ is required.",102.0 		: "$Label$ contains invalid characters",102.1 		: "$Label$ must contain numbers or letters",102.2 		: "$Label$ must contain only letters",102.3 		: "$Label$ must contain only numbers",102.4 		: "$Label$ must contain a valid email address",103.1 		: "$Label$ must contain a minimum of $MinLength$ characters",103.2 		: "$Label$ must contain a maximum of $MaxLength$ characters",103.3 		: "$Label$ must be between $MinLength$ and $MaxLength$ in length",104		: "$Label$ must match $CompareLabel$",105		: "A selection is required from $RedioGroupLabel$",106		: "This $Label$ is already in use."},MaxLabelParents 	: 5,Add			: function (strID) {this.Form[strID] = {ID				: strID,Field				: {},Add				: this.AddField,Validate			: this.ValidateForm,ValidateField		: this.ValidateField,Reset				: this.ResetForm,ClassName			: this.ClassName,Errors				: this.GetErrorMessages,FieldError			: this.GetErrorMessage,ImagesPath			: this.ImagesPath,Error				: {Seperator		: ",",Message			: {Show			: {OnValidate		: true,OnKeyUp		: false,OnChange		: false,OnClick		: false,OnMouseOver	: false},ClassName		: "formerrormsg",Template		: ""}}};return this.Form[strID];},AddField	: function (strID,objVars,blnInit) {this.Field[strID] = { ID				: strID,Required		: false,Type			: 0,MinLength 		: -1,MaxLength 		: -1,Compare		: false,CompareFieldID : "",RadioField		: false,RadioGroup		: "",RedioGroupLabel : "",OnKeyUp		: true,OnChange		: false,OnClick		: false,InValidChars	: "",RegEx			: "",ErrorID		: 0,ErrorMessage	: null,Label			: "",CompareLabel 	: "",Unique			: false,UniqueFunction : "",Value			: "",Select			: false};if (objVars != undefined && (objVars != null)) {for (var objVar in objVars) {this.Field[strID][objVar] =objVars[objVar];}}if (FormValidate.$(strID) && (blnInit != false)) {if (this.Field[strID].OnKeyUp) {FormValidate.$(strID).onkeyup = (function (strFieldID,strFormID,intType){return function () {FormValidate.Form[strFormID].ValidateField(strFieldID,intType);return false;}})(strID,this.ID,1);}if (this.Field[strID].Onchange) {FormValidate.$(strID).onchange = (function (strFieldID,strFormID,intType){return function () {FormValidate.Form[strFormID].ValidateField(strFieldID,intType);return false;}})(strID,this.ID,2);}if (this.Field[strID].Onclick) {FormValidate.$(strID).onclick = (function (strFieldID,strFormID,intType){return function () {FormValidate.Form[strFormID].ValidateField(strFieldID,intType);return false;}})(strID,this.ID,3);}if (this.Field[strID].Label == "") {this.Field[strID].Label = FormValidate.FindLabelFor(FormValidate.$(strID),this.ID);}}return this.Field[strID];},ValidateType : function (intType,strValue,strRegEx) {var objPattern = "";var intTempError = 0;switch (intType) {case -1:objPattern = strRegEx;intTempError = 102.0;break;case 1:	objPattern = /^([a-z0-9]+)$/i;intTempError = 102.1;break;case 2:	objPattern = /^([a-z]+)$/i;intTempError = 102.2;break;case 3:objPattern = /^([0-9]+)$/;intTempError = 102.3;break;case 4:objPattern = /^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/i;intTempError = 102.4;break;}if (objPattern != "" && (!objPattern.test(strValue))) {return [false,intTempError];}else{return [true,0];}},ValidateLength : function (strValue,intMin,intMax) {var intLength = strValue.length;var blnValid = true;var intError = 0;if (intMin != -1 && intMax != -1) {if (!(intLength > intMin &&  intLength < intMax)) {blnValid = false;intError = 103.3;}}else{if (intMin != -1 && (intLength < intMin)) {blnValid = false; intError = 103.1;}if (intMax != -1 && (intLength > intMax)) {blnValid = false; intError = 103.2;}}return [blnValid,intError];},ValidateRadio : function(strFormID, strGroupName) {var blnValid = false;var objContainer = FormValidate.GetContainer(strFormID);var objInputs = FormValidate.$$$("input");var intNum = objInputs.length;for(var i = 0; i < intNum; i++) {if (objInputs[i].type == "radio" && (objInputs[i].name == strGroupName && (objInputs[i].checked))) {blnValid = true;break;}}return (blnValid);},ValidateField : function (strFieldID,intSource) {var objField =  FormValidate.$(strFieldID);var blnValid = true ;if (objField && (!objField.disabled)) {var objTempField = this.Field[strFieldID];objTempField.ErrorMessage 	= null;objTempField.ErrorID		= null;if (objTempField.Label == "") {objTempField.Label = FormValidate.FindLabelFor(objField,this.ID);if (objTempField.Label == "") {objTempField.Label = this.ID;}}var strValue = FormValidate.$(strFieldID).value;if (strValue == "" && (objTempField.Select)) {var objSelect = FormValidate.$(strFieldID);strValue = objSelect[objSelect.selectedIndex].value;}if (strValue == "") {if (objTempField.Required) {blnValid = false;objTempField.ErrorID = 101;}}else{if (blnValid && (objTempField.Type != 0)) {var arrValidType = FormValidate.ValidateType(objTempField.Type,strValue,objTempField.RegEx);if (arrValidType[0] == false) {blnValid = false;objTempField.ErrorID = arrValidType[1];}}if (blnValid && (objTempField.MinLength != -1 || objTempField.MaxLength != -1)) {var arrValidLength = FormValidate.ValidateLength(strValue,objTempField.MinLength,objTempField.MaxLength);if (arrValidLength[0] == false) {blnValid = false;objTempField.ErrorID = arrValidLength[1];}}if (blnValid && (objTempField.Compare && (objTempField.CompareFieldID != "" && (this.$(objTempField.CompareFieldID))))) {if (!(strValue == this.$(objTempField.CompareFieldID).value)) {blnValid = false;objTempField.ErrorID = 104;objTempField.CompareLabel = FormValidate.FindLabelFor(this.$(objTempField.CompareFieldID));}}if (blnValid && (objTempField.RadioField)) {if (!FormValidate.ValidateRadio(this.ID,objTempField.RadioGroup)) {blnValid = false;objTempField.ErrorID = 105;}}if (blnValid && (objTempField.Unique)) {if (objTempField.UniqueFunction && (!objTempField.UniqueFunction(objTempField.ID,strValue))) {blnValid = false;objTempField.ErrorID = 106;}}}if (FormValidate.$(strFieldID + "_validate")) {FormValidate.$(strFieldID).parentNode.removeChild(FormValidate.$(strFieldID + "_validate"));}var objImg = FormValidate.$$("img");objImg.id = strFieldID + "_validate";objImg.className = FormValidate.ClassName.ValidateImage;var objErrorDiv = FormValidate.$(strFieldID + "_validate_msg");if (objErrorDiv == null) {objErrorDiv = FormValidate.$$("div");objErrorDiv.id = strFieldID + "_validate_msg";objErrorDiv.style.display = "none";}objErrorDiv.className = this.Error.Message.ClassName;var blnShowErrMsg = this.Error.Message.Show.OnValidate;if (blnShowErrMsg) {switch (intSource) {case 1:blnShowErrMsg = this.Error.Message.Show.OnKeyUp;break;case 2:blnShowErrMsg = this.Error.Message.Show.OnChange;break;case 3:blnShowErrMsg = this.Error.Message.Show.OnClick;break;}}if (!blnValid) {objTempField.ErrorMessage = this.FieldError(objTempField);objImg.src = this.ImagesPath + FormValidate.Images.Invalid;objImg.alt = objTempField.ErrorMessage;if (blnShowErrMsg || this.Error.Message.Show.OnMouseOver) {objErrorDiv.style.display = "block";var strErrMsg = this.Error.Message.Template.replace(/\$message\$/gi,this.FieldError(objTempField));objErrorDiv.innerHTML = strErrMsg;}}else{objImg.src = this.ImagesPath + FormValidate.Images.Valid;if (blnShowErrMsg || this.Error.Message.Show.OnMouseOver) {objErrorDiv.innerHTML = "";objErrorDiv.style.display = "none";}}if (strValue != "" || objTempField.Required) {FormValidate.$(strFieldID).parentNode.appendChild(objImg);if (blnShowErrMsg || this.Error.Message.Show.OnMouseOver) {FormValidate.$(strFieldID).parentNode.appendChild(objErrorDiv);}}}return blnValid;},ValidateForm	: function (strFormID) {var blnValid = true;var objForm = (strFormID != undefined) ? this.Form[strFormID] : this;for (var objField in objForm.Field) {if (objField != null) {var blnValidField = this.ValidateField(objField,0);if (!blnValidField) {blnValid = false;}}}objForm.Error.Message.OnKeyUp = true;return blnValid;},GetErrorMessages : function (strFormID) {var objForm = (strFormID != undefined) ? this.Form[strFormID] : this;var strErrorMsg = "";for (var objField in objForm.Field) {var strTempMsg = FormValidate.GetErrorMessage(objForm.Field[objField]);if (strTempMsg != "") {strErrorMsg +=  ((strErrorMsg != "") ? objForm.Error.Seperator : "") + strTempMsg;}}return strErrorMsg;},GetErrorMessage : function (objField) {var strErrorMsg = "";objField = (typeof objField== 'string') ? this.Form[objField] : objField;if (objField != null && (objField.ErrorID && (objField.ErrorID != 0))) {var objTempField = objField;if (objTempField.ErrorMessage != null) {strErrorMsg = objTempField.ErrorMessage;}else{strErrorMsg = FormValidate.Message[objTempField.ErrorID];var objMatches = strErrorMsg.match(/\$([A-Za-z0-9])+\$/gi);if (objMatches) {for (var i=0;i<objMatches.length;i++) {objMatches[i] = objMatches[i].replace(/\$/gi,"");strErrorMsg = strErrorMsg.replace("$"+ objMatches[i] + "$",objTempField[objMatches[i]]);}}objTempField.ErrorMessage  = strErrorMsg ;}}return strErrorMsg;},RemoveForm	: function (strFormID) {this.Form[strFormID] = {};},ResetForm		: function (strFormID) {var objForm = (strFormID != undefined) ? this.Form[strFormID] : this;for (var objField in objForm.Field) {objField.ErrorID = 0;objField.ErrorMessage 	= null;var objImg = this.$(objField + "_validate");var objErrorDiv = this.$(objField + "_validate_msg");if (objImg != null) objImg.parentNode.removeChild(objImg);if (objErrorDiv != null) objErrorDiv.parentNode.removeChild(objErrorDiv);}this.ShowRequired(strFormID);},FindLabelFor		: function (objField,strFormID,intMaxParents,blnReturnObject) {var strLabel = "";var objParent = this.GetContainer(objField,strFormID,intMaxParents);var objLabels = FormValidate.$$$("label",objParent);for(var i = 0; i < objLabels.length; i++) { if (objLabels[i].htmlFor ==objField.id ) {strLabel = (blnReturnObject == true) ? objLabels[i] : objLabels[i].innerHTML.replace(/:/,"");break; }}return strLabel;},GetContainer		: function (objChild,strFormID,intMaxParents) {var objContainer;intMaxParents = (intMaxParents != undefined && (!isNaN(intMaxParents))) ? intMaxParents : this.MaxLabelParents;if (strFormID != undefined && (this.$(strFormID))) {objContainer = this.$(strFormID);}else{if (intMaxParents != -1) {objContainer = objChild;for (var i=0; i<this.MaxLabelParents;i++) {if (objContainer.parentNode) {objContainer = objContainer.parentNode;}}}else{objContainer = document;}}return objContainer;}}

