var FormValidator = {};
// Namespace Global Variables
	FormValidator.errorMsgContainerId='f_error';
	FormValidator.errorClassName='form-error';
	FormValidator.errorMsgHeaderText='';
	FormValidator.errorMsgBodyText='';
	FormValidator.errorMsgUseDefault=false;
	FormValidator.errorMsgShow=true;
	FormValidator.rdoGroupName='';
	FormValidator.cbxGroupName='';
	FormValidator.skipValidation=false;
	FormValidator.count=0;
	FormValidator.errors=0;
	FormValidator.errorItemList='';
	FormValidator.onStartValidation=null;
	FormValidator.ReValidate=function(){
		FormValidator.Validate(document.forms[0]);
	},
	FormValidator.SkipValidation=function(){
		FormValidator.skipValidation=true;
	};
	
// Helper Object containing common methods
	FormValidator.Helpers = {
		get_parentElement:function(obj){if(typeof(obj)!=='undefined'){return(obj.parentNode||obj.parentElement);}},
		get_msgLengthAsBoolean:function(msg){if(typeof msg !== 'undefined' && msg.length === 0){return false;}else if(typeof(msg)!=='undefined'&&msg.length>0){return true;}return;},
		create_errorMarkers:function(el){var d=document;FormValidator.markerElement=d.createElement('span');FormValidator.markerText=d.createTextNode('!');FormValidator.markerElement.className=FormValidator.errorClassName;FormValidator.markerElement.id=el.id+'_span';FormValidator.markerElement.appendChild(FormValidator.markerText);},
		remove_errorMarkers:function(spanID){var oSpan=document.getElementById(spanID);if(oSpan){oSpan.parentNode.removeChild(oSpan);}return;},
		remove_errorClassName:function(el){if(el.className.indexOf(FormValidator.errorClassName)>-1){el.className=el.className.replace(FormValidator.errorClassName,'');}},
		attachEventListener:function(target, eventType, functionRef, capture){if(typeof target.addEventListener!="undefined"){target.addEventListener(eventType,functionRef,capture);}else if(typeof target.attachEvent!="undefined"){target.attachEvent("on"+eventType,functionRef);}else{return false;}return true;},
		removeEventListener:function(target, eventType, functionRef, capture){
			if(typeof target.removeEventListener!="undefined"){
				target.removeEventListener(eventType, functionRef, capture);
			}else if(typeof target.detachEvent!="undefined"){
				target.detachEvent("on"+eventType,functionRef);
			}else{
				return false;
			}
		},
		get_Numbers:function(v){
			var oRegEx = /^\d$/;
			var ri='';
			if(v.length > 0){
				for(var i=0;i<v.length;i++){
					if(oRegEx.test(v.charAt(i))){
						ri=ri+v.charAt(i);
					}
				}
			}
			return ri;
		}
	};
	
// Show Error Message
	FormValidator.update_errorMsg=function(b){
		var d=document,oDiv=d.getElementById(FormValidator.errorMsgContainerId);
		if(oDiv.style.display==='block'){
			document.getElementById('FormValidation_ErrorMessageBody').innerHTML='';
			document.getElementById('FormValidation_ErrorMessageBody').innerHTML=FormValidator.errorMsgBodyText;
		}
	};
	
	FormValidator.show_errorMsg=function(b){
		var d=document,oDiv=d.getElementById(FormValidator.errorMsgContainerId);
		var msgHeaderClassName='alert';
		var msgHeaderText='We\'ve encountered some errors on the form that need your attention<br>';
		var msgBodyText='Please correct the fields below as indicated by the error triangles. (hint: hover your mouse arrow over the triangle for a detailed explanation of the error).';
		if(FormValidator.errorMsgHeaderText.length > 0 && !(FormValidator.errorMsgUseDefault)){
			msgHeaderText=FormValidator.errorMsgHeaderText;
		}
		if(FormValidator.errorMsgBodyText.length > 0 && !(FormValidator.errorMsgUseDefault)){
			msgBodyText=FormValidator.errorMsgBodyText;
		}
		if(oDiv){
			if(b){
				if(oDiv.style.display!=='block'&&oDiv.style.display!==''){
					var errHeader=document.createElement('span');
					var errMsg=document.createElement('div');
					errHeader.innerHTML=msgHeaderText;
					errHeader.className=msgHeaderClassName;
					errMsg.id='FormValidation_ErrorMessageBody';
					errMsg.innerHTML=msgBodyText;
					oDiv.appendChild(errHeader);
					oDiv.appendChild(errMsg);
					oDiv.style.display='block';
					if(typeof(FormValidator.ResizePanel)!=='undefined'){
						FormValidator.ResizePanel();
					}
					if(typeof(FormValidator.JumpToMessage)!=='undefined'&&FormValidator.JumpToMessage===true){
						oDiv.scrollIntoView();
					}
				}
			}else{
				oDiv.innerHTML='';
				oDiv.style.display='none';
				if(typeof(FormValidator.ResizePanel)!=='undefined'){
					FormValidator.ResizePanel();
				}
			}
		}
	};
	
// Validators
	FormValidator.Validators={
		validate_Email:function(v){
			var objRegExp = /^([a-zA-Z0-9_]|\-|\.)+@(([a-zA-Z0-9_]|\-)+\.)+[a-zA-Z]{2,4}$/;
			var objEmailRegExp = new RegExp(objRegExp);
			return objEmailRegExp.test(v);
		},
		validate_Phone:function(v){
			var p=FormValidator.Helpers.get_Numbers(v);
			var ri
			if(p.length===7){
				var objRegExp = /^\d{3}\-\d{4}$/;
				ri=objRegExp.test(v);
			}else if(p.length===10){
				var objRegExp = /^\d{3}\-\d{3}\-\d{4}$/;
				ri=objRegExp.test(v);
			}else{
				ri=false
			}
			return ri;
		},
		validate_InputType:function(e,what){
			var key,keyChar,regexp;
			if(window.event){key=e.keyCode;}else if(e.which){key=e.which;}
			keyChar=String.fromCharCode(key);
			switch(what){
				case 'alpha':
					regexp=/[a-zA-Z\-\' ]|\0|[\b]|\t/;
					if(!regexp.test(keyChar)){
						if(e.preventDefault){e.preventDefault();}
						e.returnValue = false;
						return false;
					}
					break;
				case 'alphanumeric':
					regexp=/[a-zA-Z\-\']|\d|\0|[\b]|\t/;
					if(!regexp.test(keyChar)){
						if(e.preventDefault){e.preventDefault();}
						e.returnValue = false;
						return false;
					}
					break;
				case 'integer':
					regexp=/\d|\0|[\b]|\t/;
					if(!regexp.test(keyChar)){
						if(e.preventDefault){e.preventDefault();}
						e.returnValue = false;
						return false;
					}
					break;
				case 'decimal':
					regexp=/\d|\.|\0|[\b]|\t/;
					if(!regexp.test(keyChar)){
						if(e.preventDefault){e.preventDefault();}
						e.returnValue = false;
						return false;
					}
					break;
				case 'email':
					regexp=/\S|\t/;
					if(!regexp.test(keyChar)){
						if(e.preventDefault){e.preventDefault();}
						e.returnValue = false;
						return false;
					}
				default:
					break;
			}
		},
		validate_InputLength:function(e,args){
			if(window.event){key=e.keyCode;el=e.srcElement}else if(e.which){key=e.which;el=e.target};
			var regexp=/(48)|(49)|(50)|(51)|(52)|(53)|(54)|(55)|(56)|(57)|(96)|(97)|(98)|(99)|(100)|(101)|(102)|(103)|(104)|(105)/;
			var limit=args[0],id=args[1],tabTarget;
			if(regexp.test(key)){
				if(el.value.length==limit){
					try{
						for(i=0;i<document.forms[0].length;i++){
							if(document.forms[0].elements[i].id.indexOf(id)>-1){
								tabTarget=document.forms[0].elements[i];
								break;
							}
						}
						window.setTimeout('',500);
						tabTarget.focus();
						tabTarget.select();
					}
					catch(err){
					
					}
				}
			}
		},
		validate_TextBox:function(el){
			var errors=0;
			FormValidator.Helpers.remove_errorMarkers(el.id+'_span');
			FormValidator.Helpers.remove_errorClassName(el);
			if(el.value.length === 0){
				errors+=1;
				el.className+=' '+FormValidator.errorClassName;
				FormValidator.Helpers.create_errorMarkers(el);
				FormValidator.markerElement.title=el.title+' is required and cannot be left blank.';
				FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
			}else{
				if(el.value.length > 0){
					if(el.id.toLowerCase().indexOf("email") > -1){
						if(!FormValidator.Validators.validate_Email(el.value)){
							errors+=1;
							el.className+=' '+FormValidator.errorClassName;
							FormValidator.Helpers.create_errorMarkers(el);
							FormValidator.markerElement.title=el.title+' does not appear to contain a valid email address. (exampe: name@address.com)';
							FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
						}
					}else if((el.id.toLowerCase().indexOf("phone") > -1)||(el.id.toLowerCase().indexOf("fax") > -1)){
						if(el.className.toLowerCase().indexOf('override')>-1){
							var arr,s = el.className.substring(el.className.indexOf('override'),el.className.length);
							arr=s.split('-');
							if(arr[1]==='length'){
								var c=FormValidator.Helpers.get_Numbers(el.value);
								if(c.length!==(parseInt(arr[2]))){
									errors+=1;
									el.className+=' '+FormValidator.errorClassName;
									FormValidator.Helpers.create_errorMarkers(el);
									FormValidator.markerElement.title=el.title+' must contain 10 digits (if US) and at least 10 digits (if International)';
									FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
								}
							}
						}else{
							if(!FormValidator.Validators.validate_Phone(el.value)){
								errors+=1;
								el.className+=' '+FormValidator.errorClassName;
								FormValidator.Helpers.create_errorMarkers(el);
								FormValidator.markerElement.title=el.title+' does not appear to contain a valid phone or fax number.(exampe: 123-123-1234 or 123-1234)';
								FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
							}
						}
					}
				}
			}
			return errors;
		},
		validate_Password:function(el){
			var errors=0;
			FormValidator.Helpers.remove_errorMarkers(el.id+'_span');
			FormValidator.Helpers.remove_errorClassName(el);
			if(el.value.length === 0){
				errors+=1;
				el.className+=' '+FormValidator.errorClassName;
				FormValidator.Helpers.create_errorMarkers(el);
				FormValidator.markerElement.title=el.title+' is required and cannot be left blank.';
				FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
				
			}else{
				if(typeof(FormValidator.Password)!=='undefined'&&typeof(FormValidator.ConfirmPassword)!=='undefined'){
					if(FormValidator.Password.value!==FormValidator.ConfirmPassword.value){
						errors+=1;
						el.className+=' '+FormValidator.errorClassName;
						FormValidator.Helpers.create_errorMarkers(el);
						FormValidator.markerElement.title='Your passwords do not match.  Please re-type them and try again';
						FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
					}
				}
			}
			return errors;
		},
		validate_TextArea:function(el){
			var errors=0;
			FormValidator.Helpers.remove_errorMarkers(el.id+'_span');
			FormValidator.Helpers.remove_errorClassName(el);
			if(el.value.length === 0){
				errors+=1;
				el.className+=' '+FormValidator.errorClassName;
				FormValidator.Helpers.create_errorMarkers(el);
				FormValidator.markerElement.title=el.title+' is required and cannot be left blank.';
				FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
			}
			return errors;
		},
		validate_SelectOne:function(el){
			var errors=0;
			FormValidator.Helpers.remove_errorMarkers(el.id+'_span');
			FormValidator.Helpers.remove_errorClassName(el);
			if((el.options[el.selectedIndex].value === 0)||(el.options[el.selectedIndex].value==='')){
				errors+=1;
				el.className+=' '+FormValidator.errorClassName;
				FormValidator.Helpers.create_errorMarkers(el);
				FormValidator.markerElement.title='A selection is required for '+el.title;
				FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
			}
			return errors;
		},
		validate_SelectMultiple:function(el){
			var errors=0;
			FormValidator.Helpers.remove_errorMarkers(el.id+'_span');
			FormValidator.Helpers.remove_errorClassName(el);
			if(el.selectedIndex===-1||el.options[el.selectedIndex].value===''){
				if(el.selectedIndex===0){el.selectedIndex=-1;}
				errors+=1;
				el.className+=' '+FormValidator.errorClassName;
				FormValidator.Helpers.create_errorMarkers(el);
				FormValidator.markerElement.title='At least one item must be selected for' +el.title;
				FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
			}
			return errors;
		},
		validate_RadioButton:function(el){
			var d=document,errors=0,count=0,rdoGroup;
			FormValidator.Helpers.remove_errorMarkers(el.id+'_span');
			FormValidator.Helpers.remove_errorClassName(el);
			if(el.name.length > 0){
				if(el.name.toLowerCase()!==FormValidator.rdoGroupName.toLowerCase()){
					FormValidator.rdoGroupName=el.name;
				}
				rdoGroup=d.getElementsByName(FormValidator.rdoGroupName);
				if(typeof(rdoGroup)!=='undefined'){
					for(var x=0;x<rdoGroup.length;x++){
						if(rdoGroup[x].checked){
							count+=1;
							break;
						}
					}
				}
				if(count===0){
					errors+=1;
					el.className+=' '+FormValidator.errorClassName;
					FormValidator.Helpers.create_errorMarkers(el);
					FormValidator.markerElement.title='A selection is required for '+el.title;
					FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
				}
				return errors;
			}
		},
		validate_CheckBox:function(el){
			var errors=0;
			FormValidator.Helpers.remove_errorMarkers(el.id+'_span');
			FormValidator.Helpers.remove_errorClassName(el);
			if(!el.checked){
				errors+=1;
				el.className+=' '+FormValidator.errorClassName;
				FormValidator.Helpers.create_errorMarkers(el);
				FormValidator.markerElement.title='A selection is required for '+el.title;
				FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
			}
			return errors;
		}
	};

// Call Validation Methods
	FormValidator.Validate=function(oForm){
		if(FormValidator.skipValidation){
			FormValidator.skipValidation=false;
			return true;
		}
		if(typeof(FormValidator.onStartValidation)=='function'){
			FormValidator.onStartValidation();
		}
		var el;
		FormValidator.count=0;
		FormValidator.errors=0;
		for(var i=0;i<oForm.length;i++){
			el=oForm.elements[i];
			if(el.style.display!=='none'&&el.style.visibility!=='hidden'&&el.type!=='hidden'){
				if(el.id.toLowerCase().indexOf("req_")>-1){
					checktype: switch(el.type){
						case 'text':
							FormValidator.Helpers.removeEventListener(el,"keydown",FormValidator.ReValidate,false);
							if(FormValidator.Validators.validate_TextBox(el)>0){
								FormValidator.count+=FormValidator.Validators.validate_TextBox(el);
								FormValidator.Helpers.attachEventListener(el,"keydown",FormValidator.ReValidate,false);
							}
							break checktype;
						case 'file':
							FormValidator.Helpers.removeEventListener(el,"blur",FormValidator.ReValidate,false);
							FormValidator.count+=FormValidator.Validators.validate_TextBox(el);
							FormValidator.Helpers.attachEventListener(el,"blur",FormValidator.ReValidate,false);
							break checktype;
						case 'password':
							FormValidator.Helpers.removeEventListener(el,"blur",FormValidator.ReValidate,false);
							FormValidator.count+=FormValidator.Validators.validate_Password(el);
							FormValidator.Helpers.attachEventListener(el,"blur",FormValidator.ReValidate,false);
							break checktype;
						case 'textarea':
							FormValidator.Helpers.removeEventListener(el,"keyup",FormValidator.ReValidate,false);
							FormValidator.count+=FormValidator.Validators.validate_TextArea(el);
							FormValidator.Helpers.attachEventListener(el,"keyup",FormValidator.ReValidate,false);
							break checktype;
						case 'select-one':
							FormValidator.Helpers.removeEventListener(el,"change",FormValidator.ReValidate,false);
							FormValidator.count+=FormValidator.Validators.validate_SelectOne(el);
							FormValidator.Helpers.attachEventListener(el,"change",FormValidator.ReValidate,false);
							break checktype;
						case 'select-multiple':
							FormValidator.Helpers.removeEventListener(el,"blur",FormValidator.ReValidate,false);
							FormValidator.count+=FormValidator.Validators.validate_SelectMultiple(el);
							FormValidator.Helpers.attachEventListener(el,"blur",FormValidator.ReValidate,false);
							break checktype;
						case 'radio':
							FormValidator.Helpers.removeEventListener(el,"click",FormValidator.ReValidate,false);
							FormValidator.count+=FormValidator.Validators.validate_RadioButton(el);
							FormValidator.Helpers.attachEventListener(el,"click",FormValidator.ReValidate,false);
							break checktype;
						case 'checkbox':
							FormValidator.Helpers.removeEventListener(el,"click",FormValidator.ReValidate,false);
							FormValidator.count+=FormValidator.Validators.validate_CheckBox(el);
							FormValidator.Helpers.attachEventListener(el,"click",FormValidator.ReValidate,false);
							break checktype;
						default:
							break checktype;
					}
				}
			}
		}
		if(typeof(FormValidator.ValidatePairs)!=='undefined'&&FormValidator.ValidatePairs!==null){
			if(FormValidator.ValidatePairs.args&&FormValidator.ValidatePairs.args.length>0){
				for(var i=0;i<FormValidator.ValidatePairs.args.length;i++){
					var sender=FormValidator.ValidatePairs.args[i][0];
					var target=FormValidator.ValidatePairs.args[i][1];
					if(sender.checked){
						FormValidator.count+=FormValidator.Validators.validate_SelectOne(target);
						FormValidator.Helpers.attachEventListener(target,"blur",FormValidator.ReValidate,false);
					}else{
						FormValidator.Helpers.remove_errorMarkers(target.id+'_span');
						FormValidator.Helpers.remove_errorClassName(target);
						FormValidator.Helpers.removeEventListener(target,"blur",FormValidator.ReValidate,false);
					}
				}
			}
		}
		FormValidator.errors=FormValidator.count;
		if(FormValidator.errors>0){
			if(FormValidator.errorMsgShow){
				FormValidator.show_errorMsg(true);
			}else{
				FormValidator.errorMsgShow=true;
			}
			return false;
		}else{
			FormValidator.show_errorMsg(false);
			return true;
		}
	};

