﻿/*
Form tools and validation
Creator: Irizan
Created: 2008-12-25
*/

function addEvent(obj, evType, fn){
 if (obj.addEventListener){
	obj.addEventListener(evType, fn, true);
	return true; } 
 else if (obj.attachEvent){
	var r = obj.attachEvent("on"+evType, fn);
	return r; } 
 else { return false;} 
} 	// addEvent

function Tools(){

	var mandatoryfields = RetrieveMandatoryFields();
	var datefields = RetrieveDateFields();
	var emailfields = RetrieveEmailFields();
	var numberfields = RetrieveNumberFields();

	this.ManageElemClass = ManageElemClass;
	this.GetElement = GetElement;
	this.GetValue = GetValue;
	this.GetNodeName = GetNodeName;
	this.GetInputType = GetInputType;
	this.SetAutoFocus = SetAutoFocus;
	this.IdIsAName = IdIsAName;
	this.GetName = GetName;
	this.ValidateDate = ValidateDate;
	this.GetDateFields = GetDateFields;
	this.IsDateField = IsDateField;
	this.GetDateLabelField = GetDateLabelField;
	this.GetEmailFields = GetEmailFields;
	this.GetMandatoryFields = GetMandatoryFields;
	this.GetNumberFields = GetNumberFields;
	
	function GetMandatoryFields(){
		return mandatoryfields;
	} // GetMandatoryFields
	
	function GetDateFields(){
		return datefields;
	} // GetDateFields
	
	function GetEmailFields(){
		return emailfields;
	} // GetEmailFields
	
	function GetNumberFields(){
		return numberfields;
	} // GetNumberFields
	
	function RetrieveMandatoryFields(){
		var mfields = new Array();
		var mandatoryFields = GetElement('mandatory_fields');
		if (!mandatoryFields) return mfields;
		return mandatoryFields.value.split(';');	
	} /// RetrieveMandatoryFields
	
	function RetrieveEmailFields(){
		var efields = new Array();
		var emailfieldscontainer = GetElement('email_fields');
		if (!emailfieldscontainer) return efields;
		return emailfieldscontainer.value.split(';');		
	} // RetrieveEmailFields
	
	function RetrieveNumberFields(){
		var nfields = new Array();
		var numberfieldcontainer = GetElement('number_fields');
		if (!numberfieldcontainer) return nfields;
		var rawnumberfields = numberfieldcontainer.value.split(';')
		/* no special handling for semi-colon  yet. 
		so far i couldnt think of the usage of semicolon in numbers. */
		for (var c=0;c<rawnumberfields.length;c++){
			var exceptionChrEnd = rawnumberfields[c].lastIndexOf(']');
			var id = rawnumberfields[c].substr(exceptionChrEnd + 1);
			var exceptionChr = '';
			if (exceptionChrEnd != -1) exceptionChr = rawnumberfields[c].substring(1,exceptionChrEnd);
			nfields.push(new NumberField(id, exceptionChr));
		} // for
		return nfields;
	} // RetrieveNumberFields
	
	function RetrieveDateFields(){
		var dfields = new Array();		
		var datefieldscontainer = GetElement('date_fields');
		if (!datefieldscontainer) return dfields;		
		var rawdatefield = datefieldscontainer.value.split(';');		
		for (var c=0;c<rawdatefield.length;c++){
			// single textbox, specific format
			if (rawdatefield[c].substr(0,1) == '[') {
				var closebracketpos = rawdatefield[c].lastIndexOf(']');
				var id = rawdatefield[c].substr(closebracketpos + 1);
				var dateformat = rawdatefield[c].substring(1,closebracketpos);
				dfields.push(new DateField(id, id, id, id, dateformat));
				continue;
			}
			var detaileddates = rawdatefield[c].split('=');
			var datecomponents = detaileddates[0].split(',');
			dfields.push(new DateField(detaileddates[1], datecomponents[0], datecomponents[1], datecomponents[2],''));			
		} // for
		return dfields;
	} // RetrieveDateFields
	
	function IsDateField(id){
		for (var c=0;c<datefields.length;c++){
			if ((id == datefields[c].DayFieldId) || (id == datefields[c].MonthFieldId) || (id == datefields[c].YearFieldId)) return true;
		} // for
		return false;
	} // IsDateField
	
	function GetDateLabelField(id){
		if (!IsDateField(id)) return '';
		for (var c=0;c<datefields.length;c++){
			if ((id == datefields[c].DayFieldId) || (id == datefields[c].MonthFieldId) || (id == datefields[c].YearFieldId)) return datefields[c].LabelId;
		} // for
		return '';		
	} // GetDateLabelField
	
		
	function ValidateDate(year, month, day){
		var ValidDigits = '0123456789';
		var YearLowRange = 1700;
		var YearHighRange = 9999;
		var EnteredDate = year + '' + month + ''+ day;
		
		for (var i=0;i< EnteredDate.length;i++) {
			if (ValidDigits.indexOf(EnteredDate.substr(i,1)) == -1) return false;
		} // for

		year = parseInt(year);
		month = parseInt(month);
		day = parseInt(day);
				
		if ((year < YearLowRange) || (year > YearHighRange)) return false;
		if ((parseInt(month) < 1) || (parseInt(month) > 12)) return false;
		if ((parseInt(day) < 1) || (parseInt(day) > 31)) return false;
		
		var leap = ((year % 4 == 0) || (year % 100 == 0) || (year % 400 == 0));

		if ((month == 2) && (leap) && (day > 29)) return false;
		if ((month == 2) && (!leap) && (day > 28)) return false;		
		if ((day > 31) && (MonthHas31Days(month))) return false;
		if ((day > 30) && (MonthHas30Days(month))) return false;		
		return true;
	}	// ValidateDate
	
	function MonthHas31Days(month){
		return ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12));
	}
	
	function MonthHas30Days(month){
		return ((month == 4) || (month == 6) || (month == 9) || (month == 11));
	}
	
	function GetValue(elem){
		var nodeName = GetNodeName(elem);
		var val = '';
		if (nodeName == 'input'){
			var inputType = GetInputType(elem);
			switch (inputType){
				case 'text': 
				case 'file':
				case 'hidden':{
					val = elem.value;
					break;
				}	
				case 'radio':
					var radios = document.getElementsByName(elem.name);
					for (var c=0;c<radios.length;c++){
						var radio = radios[c];
						if (!radio.checked)continue;
						val = radio.value;
						break;
					} // for
					break;
				case 'checkbox':
					var checkboxes = document.getElementsByName(elem.name);
					for (var c=0;c<checkboxes.length;c++){
						var checkbox = checkboxes[c];
						if (!checkbox.checked)continue;
						val = checkbox.value;
						break;
					} // for
					break;
			} // switch
		
		} // if
		else if (nodeName == 'select'){
			var options = elem.getElementsByTagName('option');			
			for (var c=0;c<options.length;c++){
				if (options[c].selected){
					val = options[c].value;
					if (val == '') val = options[c].text;
					if (val == '-') val = '';
					break;
				} // if		
			} // for
			
		} // else if
		else if (nodeName == 'textarea'){
			val = elem.value;
		}
		return val;	
	} // GetValue
	
	function SetAutoFocus(id){
		var field = GetElement(id);
		if (!field) return false;
		var CanSetFocus = ((GetNodeName(field) == 'input') && (GetInputType(field) == 'text') && (!field.disabled) && (!field.readOnly));
		if (CanSetFocus) field.focus();
		return CanSetFocus;
	} // SetAutoFocus
	
	function ManageElemClass(sAction,obj,sClass1,sClass2){
	  switch (sAction){
		 case 'replace':
			obj.className=!ManageElemClass('check',obj,sClass1)?obj.className.replace(sClass2,sClass1):obj.className.replace(sClass1,sClass2);
			break;
		 case 'add':
			if(!ManageElemClass('check',obj,sClass1)){obj.className+=obj.className?' '+sClass1:sClass1;}
			break;
		 case 'remove':
			var rep=obj.className.match(' '+sClass1)?' '+sClass1:sClass1;
			obj.className=obj.className.replace(rep,'');
			 break;
		 case 'check':
			return new RegExp('\\b'+sClass1+'\\b').test(obj.className)
			break;
	  }
	} // ManageElemClass
			
	function IdIsAName(id){
		return (id.substring(0,3) == '[n]');
	} // IdIsAName
	
	function GetName(id){
		if (IdIsAName(id)) return id.substr(3);
		return id;
	} // GetName
	
	function GetElement(id){
		if (id.length == 0) return;
		if (IdIsAName(id)){
			id = GetName(id);
			var elems = document.getElementsByName(id);
			if (elems.length > 0) return elems[0];
			return null;
		}
		return document.getElementById(id);
	} // GetElement

	function GetNodeName(elem){
		return elem.nodeName.toLowerCase();
	} // GetNodeName

	function GetInputType(input){
		return input.type.toLowerCase();
	} // GetInputType
	
} // Tools

function FieldLabel(field, label){
	this.Field = field;
	this.Label = label;
} // FieldLabel

function DateField(labelid, yearfieldId, monthfieldId, dayfieldId, dateformat){
	this.LabelId = labelid;
	this.YearFieldId = yearfieldId;
	this.MonthFieldId = monthfieldId;
	this.DayFieldId = dayfieldId;
	this.DateFormat = dateformat;
} // DateField

function NumberField(fieldId,exceptionChars){
	this.FieldId = fieldId;
	this.ExceptionChars= exceptionChars;
} // NumberField

function FormValidator(Tools){
	var EmptyMandatoryFields = new Array();
	var InvalidDateFields = new Array();
	var InvalidEmailFields = new Array();
	var InvalidNumberFields = new Array();

	var MandatoryFields = Tools.GetMandatoryFields();
	var DateFields = Tools.GetDateFields();
	var EmailFields = Tools.GetEmailFields();
	var NumberFields = Tools.GetNumberFields();

	var MandatoryFieldsLabels = GetFieldLabels('mandatory');
	var DateFieldLabels = GetFieldLabels('date');
	var EmailFieldsLabels = GetFieldLabels('email');
	var NumberFieldLabels = GetFieldLabels('number');
	
	this.CheckMandatoryFields = CheckMandatoryFields;
	this.CheckDateFields = CheckDateFields;
	this.CheckEmailFields = CheckEmailFields;
	this.CheckNumberFields = CheckNumberFields;
	
	this.EnforceFieldCheck = EnforceFieldCheck;
	this.IsEmptyValue  = IsEmptyValue;
	this.ShowMessage = ShowMessage;
	this.SetAutoFocus = SetAutoFocus;
	
	function IsEmptyValue(value){
		return (Trim(value) == '');
	} // IsEmptyValue
	
	function Trim(val){
		if (val == null) return '';
		var t = '';
		var b = false;
		var i;
		for (i=0; i<val.length; i++){
			var c = val.charAt(i);
			b = b || (c != ' ');
			if (b)
				t += c;
		} // for
		var s = '';
		b = false;
		for (i=t.length-1; i>=0; i--){
			var c = t.charAt(i);
			b = b || (c != ' ');
			if (b)
				s = c + s;
		} // for
		return s;
	} // Trim
				
	function ManageMandatoryWarning(e){
		var evt = e || window.event;
		var elem = evt.target || evt.srcElement;
	   
		var label = GetLabel(elem,'mandatory');
		if (!label) return;
		var val = Tools.GetValue(elem);	
		Tools.ManageElemClass(IsEmptyValue(val) ? 'add' : 'remove',label,'warning_mandatory');				
	} // ManageMandatoryWarning
	
	function ManageDateWarning(e){
		var evt = e || window.event;
		var elem = evt.target || evt.srcElement;
		
		var label = GetLabel(elem,'date');
		if (!label) return;
		
		/**/
		for (var c=0;c<InvalidDateFields.length;c++){
			var dayId = InvalidDateFields[c].DayFieldId;
			var monthId = InvalidDateFields[c].MonthFieldId;
			var yearId = InvalidDateFields[c].YearFieldId;
			var fmt = InvalidDateFields[c].DateFormat;
			
			if (fmt != ''){
				var val = Tools.GetValue(Tools.GetElement(dayId));
				if (val == '') Tools.ManageElemClass('remove',label,'warning_date');
				else Tools.ManageElemClass(ValidateDateWithFormat(val, fmt)? 'remove' : 'add',label,'warning_date'); 
				continue;
			}

			
			var day = Tools.GetElement(dayId);
			var month = Tools.GetElement(monthId);
			var year = Tools.GetElement(yearId);
			
			if ((elem === day) || (elem === month) || (elem === year)){
				var validdate = Tools.ValidateDate(Tools.GetValue(year),Tools.GetValue(month),Tools.GetValue(day));
				Tools.ManageElemClass((!validdate) ? 'add' : 'remove',label,'warning_date');
			}			
		} // for
	} // ManageDateWarning
	
	function ManageEmailWarning(e){
		var evt = e || window.event;
		var elem = evt.target || evt.srcElement;
	   
		var label = GetLabel(elem,'email');
		if (!label) return;
		var val = Tools.GetValue(elem);	
	
		var ok = IsEmptyValue(val);
		if (!ok) ok = CheckEmail(val);
		
		Tools.ManageElemClass((!ok) ? 'add' : 'remove',label,'warning_email');					
	} // ManageEmailWarning
	
	function ManageNumberWarning(e){
		var evt = e || window.event;
		var elem = evt.target || evt.srcElement;
	   
		var label = GetLabel(elem,'number');
		if (!label) return;
		var val = Tools.GetValue(elem);	
		var exception = ''
		for (var c=0;c<NumberFields.length;c++){
			if (elem.id != NumberFields[c].FieldId) continue;
			exception = NumberFields[c].ExceptionChars;
			break;
		} // for		
		Tools.ManageElemClass((!ValidNumbers(val,exception)) ? 'add' : 'remove',label,'warning_number');						
	} // ManageNumberWarning
	
	function GetFieldLabels(validationtype){
		var labels = new Array();
		var lookupfields;
		if (validationtype == 'mandatory') lookupfields = MandatoryFields;
		else if (validationtype == 'date') lookupfields = DateFields;
		else if (validationtype == 'email') lookupfields = EmailFields;
		else if (validationtype == 'number') lookupfields = NumberFields;
		
		if (lookupfields.length == 0) return labels;
		for (var c=0;c<lookupfields.length;c++){		
			if (validationtype == 'date'){
				var fld = lookupfields[c];
				labels.push(new FieldLabel(Tools.GetElement(fld.DayFieldId),Tools.GetElement('label_' + fld.LabelId)));
				labels.push(new FieldLabel(Tools.GetElement(fld.MonthFieldId),Tools.GetElement('label_' + fld.LabelId)));
				labels.push(new FieldLabel(Tools.GetElement(fld.YearFieldId),Tools.GetElement('label_' + fld.LabelId)));
				continue;
			} // if
			var label = null;
			var id = (validationtype == 'number')? lookupfields[c].FieldId : lookupfields[c];
			if (Tools.IdIsAName(id)){
				id =  Tools.GetName(id);
				var fld = document.getElementsByName(id);
				for (var k=0;k<fld.length;k++){
					label = Tools.GetElement('label_' + id);
					if (label) labels.push(new FieldLabel(fld[k], label));
				} // for
				continue;
			} // if
			var datelabelfield = Tools.GetDateLabelField(id);
			label = Tools.GetElement('label_' + ((datelabelfield != '')? datelabelfield : id));
			if (!label) continue;
			labels.push(new FieldLabel(Tools.GetElement(id), label));
		} // for
		return labels;
	} // GetFieldLabels
	
	function GetLabel(elem,validationtype){
		var lookupfields;
		if (validationtype == 'mandatory'){
			lookupfields = MandatoryFieldsLabels;
		} // if
		else if (validationtype == 'date'){
			lookupfields = DateFieldLabels;
		} // else if
		else if (validationtype == 'email'){
			lookupfields = EmailFieldsLabels;
		} // else if
		else if (validationtype == 'number'){
			lookupfields = NumberFieldLabels;
		} // else if
		
		for (var c=0;c<lookupfields.length;c++){
			if (lookupfields[c].Field === elem){
				return lookupfields[c].Label;
			}
		} // for
		return null;		
	} // GetLabel
	
	function EnforceFieldCheck(validationtype){
		var lookupfields;
		var callingfn;
		var warningclass;
		
		if (validationtype == 'mandatory') {
			lookupfields = EmptyMandatoryFields;
			callingfn = ManageMandatoryWarning;
			warningclass = 'warning_mandatory';
		}
		else if (validationtype == 'date') {
			lookupfields = InvalidDateFields;
			callingfn = ManageDateWarning;
			warningclass = 'warning_date';
		}
		else if (validationtype == 'email') {
			lookupfields = InvalidEmailFields;
			callingfn = ManageEmailWarning;
			warningclass = 'warning_email';
		}
		else if (validationtype == 'number') {
			lookupfields = InvalidNumberFields;
			callingfn = ManageNumberWarning;
			warningclass = 'warning_number';
		}
		
		for (var c=0;c<lookupfields.length;c++){		
			if (validationtype == 'date') {
				var day_field = Tools.GetElement(lookupfields[c].DayFieldId);
				var month_field = Tools.GetElement(lookupfields[c].MonthFieldId); 
				var year_field = Tools.GetElement(lookupfields[c].YearFieldId);
				var label = GetLabel(day_field,validationtype);
				if (label){Tools.ManageElemClass('add',label,warningclass);}
				if (lookupfields[c].DateFormat != '') addEvent(day_field,GetChangeEvent(day_field),callingfn);
				else {
					addEvent(day_field,GetChangeEvent(day_field),callingfn);
					addEvent(month_field,GetChangeEvent(month_field),callingfn);
					addEvent(year_field,GetChangeEvent(year_field),callingfn);				
				}

				continue;
			}  // if
			var field = Tools.GetElement(lookupfields[c]);
			if (!field) continue;

			var label = GetLabel(field,validationtype);
			if (label){Tools.ManageElemClass('add',label,warningclass);}
						
			var eventChange = GetChangeEvent(field); 
			
			if (Tools.IdIsAName(lookupfields[c])){
				var fld = document.getElementsByName(field.name);
				for (var m=0;m<fld.length;m++) addEvent(fld[m],eventChange,callingfn);
			}
			else{addEvent(field,eventChange,callingfn);}						
			
			
		} // for
	} //  EnforceFieldCheck	
	
	function GetChangeEvent(field){
		var NodeName = Tools.GetNodeName(field);
		var InputType = Tools.GetInputType(field);
		if ((NodeName == 'input') && (InputType == 'radio' || InputType == 'checkbox')) return 'click';
		if ((NodeName == 'input')&&(InputType == 'text')) return 'blur';
		return 'change';
	} // GetChangeEvent
	
	function CheckNumberFields(){
		if (NumberFields.length == 0) return true;
		for (var c=0;c<NumberFields.length;c++){
			var numfield = Tools.GetElement(NumberFields[c].FieldId);
			var numvalue = Tools.GetValue(numfield);
			if (!ValidNumbers(numvalue, NumberFields[c].ExceptionChars)){
				InvalidNumberFields.push(NumberFields[c].FieldId);
			} // if
		} // for
		if (InvalidNumberFields.length == 0) return true;		
		return false;
	} // CheckNumberFields
	
	function ValidNumbers(number,exception){
		if (IsEmptyValue(number)) return true;
		var validdigits = '1234567890' + exception;
		for (var d=0;d<number.length;d++){
			if (validdigits.indexOf(number.substr(d,1)) == -1) return false;
		} // for
		return true
	} // ValidNumbers
	
	function CheckEmailFields(){
		if (EmailFields.length == 0)return true;
		
		for (var c=0;c<EmailFields.length;c++){		
			var emailfield = Tools.GetElement(EmailFields[c]);
			var emailvalue = Tools.GetValue(emailfield);			
			if (IsEmptyValue(emailvalue)) continue;
			if (!CheckEmail(emailvalue)) InvalidEmailFields.push(EmailFields[c]);
		} // for
		if (InvalidEmailFields.length == 0) return true;		
		return false;
	} // CheckEmailFields
	
	/* validation logic from http://www.herworld.com.my/js_subscription.js*/	
	function CheckEmail(email) {	
		var at="@";
		var dot=".";
		var lat=email.indexOf(at);
		var lstr=email.length;
		var ldot=email.indexOf(dot);
		if (email.indexOf(at)==-1)return false;
		if (email.indexOf(at)==-1 || email.indexOf(at)==0 || email.indexOf(at)==lstr)return false;
		if (email.indexOf(dot)==-1 || email.indexOf(dot)==0 || email.indexOf(dot)==lstr)return false;
		if (email.indexOf(at,(lat+1))!=-1)return false;
		if (email.substring(lat-1,lat)==dot || email.substring(lat+1,lat+2)==dot)return false;
		if (email.indexOf(dot,(lat+2))==-1)return false;
		if (email.indexOf(" ")!=-1)return false;
		
		return true;
	} //CheckEmail
	
	function ValidateDateWithFormat(val,fmt){
		if (fmt == 'DD/MM/YYYY'){
			if (val.length != 10) return false;
			var datecomps = val.split('/');
			if (datecomps.length !=3) return false;
			else if (!Tools.ValidateDate(datecomps[2],datecomps[1],datecomps[0])){return false;}
		}	
		return true;
	} // ValidateDateWithFormat
	
	function CheckDateFields(){
		if (DateFields.length == 0) return true;
				
		for (var c=0;c<DateFields.length;c++){
			var yearId = DateFields[c].YearFieldId;
			var mthId = DateFields[c].MonthFieldId;
			var dayId = DateFields[c].DayFieldId;
			var fmt = DateFields[c].DateFormat;
			if (fmt != ''){
				var val = Tools.GetValue(Tools.GetElement(dayId));
				if (val == '') continue;
				if (!ValidateDateWithFormat(val,fmt)){InvalidDateFields.push(DateFields[c]);}				
				continue;
			}
		
			var year =  Tools.GetValue(Tools.GetElement(yearId));
			var month = Tools.GetValue(Tools.GetElement(mthId));
			var day = Tools.GetValue(Tools.GetElement(dayId));
			if (!(IsEmptyValue(year) && IsEmptyValue(month) && IsEmptyValue(day))){
				if (!Tools.ValidateDate(year,month,day)){InvalidDateFields.push(DateFields[c]);}
			}
		} // for
		if (InvalidDateFields.length == 0) return true;
		return false;
	} // CheckDateFields

	function CheckMandatoryFields(){
		if (MandatoryFields.length == 0) return true;
	 	
		for (var k=0; k < MandatoryFields.length; k++){
			var field = Tools.GetElement(MandatoryFields[k]);
			if (!field) continue;
			
			var val = Tools.GetValue(field);	
			if (IsEmptyValue(val)) EmptyMandatoryFields.push(MandatoryFields[k]);
			
		} // for
		
		if (EmptyMandatoryFields.length == 0) return true;
		return false;
	} // CheckMandatoryFields
	
	function ShowMessage(show, validationtype){
		var id = 'errormessage';
		var errormessage = Tools.GetElement(id);
		if (!errormessage) {return;}
		
		var submsg;
		var submsgvalue = '';
		
		switch (validationtype){
			case 'mandatory':
				submsg = Tools.GetElement('mandatory_submsg');	
				break;
			case 'date':
				submsg = Tools.GetElement('date_submsg');
				break;
			case 'email':
				submsg = Tools.GetElement('email_submsg');
				break;
			case 'number':
				submsg = Tools.GetElement('number_submsg');
				break;
			case 'filetoobig':
			case 'timeout': {
				if (validationtype == 'filetoobig'){
					submsgvalue =  'File attached is too large.  Please resubmit your form with a smaller sized file';
				}
				else{
					submsgvalue =  'Timeout. Please resubmit your form with a smaller sized file';
				}
				
				var recipient = Tools.GetElement('recipient');		
				if (recipient){
					var email = Tools.GetValue(recipient);
					var subject = Tools.GetElement('subject');
					if (email != ''){
					//
						submsgvalue += ', or email us at <a href="mailto:'+ email + ((subject)? '?subject=' + Tools.GetValue(subject)  : '') +'">' + email + '</a>';
					}
					else{
						submsgvalue += '.';
					}					
				}
				else{
					submsgvalue += '.';
				}
				break;
			}
		} // switch
				
		if (submsg) {submsgvalue = Tools.GetValue(submsg);}
		if (IsEmptyValue(submsgvalue)) {submsgvalue = 'There is a problem with your form submission. Please fill in all required fields with correct information.';}
				
		var errdivs = errormessage.getElementsByTagName('div');
		for (var c=0;c<errdivs.length;c++){
			if (!Tools.ManageElemClass('check', errdivs[c], 'secondary_message'))continue;
			errdivs[c].innerHTML = submsgvalue;
			break;
		} // for
		
		if (show){
			if (!Tools.ManageElemClass('check', errormessage, 'displaymessage')) {
				Tools.ManageElemClass('replace',errormessage, 'hiddenmessage','displaymessage');
			}		
		}
		else{
			if (!Tools.ManageElemClass('check', errormessage, 'hiddenmessage')) {
				Tools.ManageElemClass('replace',errormessage, 'displaymessage','hiddenmessage');
			}				
		}
		window.location.hash='#' + id;		
	} // ShowMessage
	
	function SetAutoFocus(validationtype){
		if ((validationtype == 'mandatory') && (EmptyMandatoryFields[0])) Tools.SetAutoFocus(EmptyMandatoryFields[0]);
		if ((validationtype == 'email') && (InvalidEmailFields[0])) Tools.SetAutoFocus(InvalidEmailFields[0]);
		if ((validationtype == 'number') && (InvalidNumberFields[0])) Tools.SetAutoFocus(InvalidNumberFields[0]);
		if ((validationtype == 'date') && (InvalidDateFields[0])) Tools.SetAutoFocus(InvalidDateFields[0].DayFieldId);
	} // SetAutoFocus
	
} // FormValidator