var FormValidator = {
	LimitScope:true,
	ScopeElement:null,
	ScopeElementArgs:[], // ['scopeElementID',['errorMsgContainerId','errorMsgHeaderText','errorMsgBodyText','FormValidator.JumpToMessage']]
	errorMsgContainerId:'f_error',
	errorClassName:'form-error',
	errorMsgHeaderText:'',
	errorMsgBodyText:'',
	rdoGroupName:'',
	cbxGroupName:'',
	count:0,
	errors:0,
	errorItemList:'',
	GetScopeElement:function(){
		var oRI;
		if(FormValidator.ScopeElement!==null){
			if(typeof(FormValidator.ScopeElement)==='string'){
				oRI=document.getElementById(FormValidator.ScopeElement);
			}else if(typeof(FormValidator.ScopeElement)==='object'){
				oRI=FormValidator.ScopeElement;
			}
			if(typeof(oRI)==='undefined'){
				FormValidator.SetScopeElement(document.forms[0]);
				oRI=document.forms[0];
			}
		}
		return oRI;
	},
	SetScopeElement:function(item){
		FormValidator.ScopeElement = item;
	},
	GetScopeElementArgs:function(){
		return FormValidator.ScopeElementArgs;
	},
	SetScopeElementArgs:function(args){
		FormValidator.GetScopeElementArgs().push(args);
	},
	ReValidate:function(){
		if(FormValidator.LimitScope===true){
			FormValidator.Validate(FormValidator.GetScopeElement());
		}else{
			FormValidator.Validate(document.forms[0]);
		}
	},
	errorIsShowing:false
};
	
// 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.GetScopeItemErrorArgs=function(){
		var oRI = null;
		var oSA = FormValidator.GetScopeElementArgs();
		var oSE = FormValidator.GetScopeElement();
		if(FormValidator.LimitScope){
			if(oSA.length>0){
				for(var item in oSA){
					var oI = oSA[item];
					if(oI.length > 0){
						if(oI[0]===oSE.id){
							oRI=oI[1];
							break;
						}
					}
				}
			}
		}
		return oRI;
	};
	FormValidator.show_errorMsg=function(b){
		var oDiv;
		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.LimitScope){
			var args=FormValidator.GetScopeItemErrorArgs();
			if(args!==null&&args.length > 0){
				oDiv=document.getElementById(args[0]);
				msgHeaderText=(args[1]&&args[1].length>0)?args[1]:msgHeaderText;
				msgBodyText=(args[2]&&args[2].length>0)?args[2]:msgBodyText;
				if(typeof(args[3])!=='undefined'&&typeof(args[3])==='boolean'){
					FormValidator.JumpToMessage=args[3];
				}
			}else{
				oDiv=document.getElementById(FormValidator.errorMsgContainerId);
				if(FormValidator.errorMsgHeaderText.length > 0){ msgHeaderText=FormValidator.errorMsgHeaderText; }
				if(FormValidator.errorMsgBodyText.length > 0){ msgBodyText=FormValidator.errorMsgBodyText; }
			}
		}else{
			oDiv=document.getElementById(FormValidator.errorMsgContainerId);
			if(FormValidator.errorMsgHeaderText.length > 0){ msgHeaderText=FormValidator.errorMsgHeaderText; }
			if(FormValidator.errorMsgBodyText.length > 0){ msgBodyText=FormValidator.errorMsgBodyText; }
		}
		if(oDiv){
			if(b){
				if(oDiv.style.display!=='block'&&oDiv.style.display!==''){
					var errHeader=document.createElement('span');
					var errMsg=document.createTextNode(msgBodyText);
					errHeader.innerHTML=msgHeaderText;
					errHeader.className=msgHeaderClassName;
					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();
					}
					FormValidator.errorIsShowing=true;
				}
			}else{
				oDiv.innerHTML='';
				oDiv.style.display='none';
				if(typeof(FormValidator.ResizePanel)!=='undefined'){
					FormValidator.ResizePanel();
				}
				FormValidator.errorIsShowing=false;
			}
		}
	};
	
// Validators
	FormValidator.Validators={
		validate_Email:function(v){
			var objRegExp = /((^[^\.])([\w\W-]+)([^\.])@([^\.])(?:[\w\W]+)([a-zA-Z]{2,4}))/g;
			var objEmailRegExp = new RegExp(objRegExp);
			return objEmailRegExp.test(v);
		},
		validate_AreaCode:function(v){
			var objRegExp = /^\d{3}$/;
			return objRegExp.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=e.keyCode||e.which;
			var keyChar,regexp;
			if(!(BrokerIDX.IsDefined(key))){key=e.charCode}
			keyChar=String.fromCharCode(key);
			
			switch(what){
				case 'alpha':
					regexp=/[a-zA-Z\-\']|\0|[\b]|\t/;
					if(!regexp.test(keyChar)){
						if(key===36||key===46){
								return key; 
						}else{
							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(key===36||key===46){
							return key; 
						}else{
							if(e.preventDefault){e.preventDefault();}
							e.returnValue = false;
							return false;
						}
					}
					break;
				case 'integer':
					regexp=/\d|\0|[\b]|\t/;
					if(!regexp.test(keyChar)){
						if(key===36||key===46){
							return key; 
						}else{
							if(e.preventDefault){e.preventDefault();}
							e.returnValue = false;
							return false;
						}
					}
					break;
				case 'decimal':
					regexp=/\d|\.|\0|[\b]|\t/;
					if(!regexp.test(keyChar)){
						if(key===36||key===46){
							return key; 
						}else{
							if(e.preventDefault){e.preventDefault();}
							e.returnValue = false;
							return false;
						}
					}
					break;
				case 'email':
					regexp=/\S|\t/;
					if(!regexp.test(keyChar)){
						if(key===36||key===46){
							return key; 
						}else{
							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)||(el.className.toLowerCase().indexOf('phone-number')> -1)){
						if(el.id.toLowerCase().indexOf("txtlabel")>-1){
							return errors;
						}else if(el.id.toLowerCase().indexOf("txtareacode")>-1){
							if(!FormValidator.Validators.validate_AreaCode(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 area code.';
								FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
							}
						}else if(el.id.toLowerCase().indexOf("txtnumber")>-1){
							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.';
								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.';
								FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
							}
						}
					}
					else if((el.id.toLowerCase().indexOf("areacode") > -1)||(el.className.toLowerCase().indexOf('phone-areacode') > -1)){
						if(!FormValidator.Validators.validate_AreaCode(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 area code.';
							FormValidator.Helpers.get_parentElement(el).appendChild(FormValidator.markerElement);
						}
					}else if((el.id.toLowerCase().indexOf("uploadfile") > -1)&&(el.value.toLowerCase()==='please select a file to upload')){
						errors+=1;
						el.className+=' '+FormValidator.errorClassName;
						FormValidator.Helpers.create_errorMarkers(el);
						FormValidator.markerElement.title='This field does not contain a file to upload.  Please click the "Browse" button to select a file to upload.';
						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){
		var oE,oFV=FormValidator,oArr=[],aI,aS,aT;
		if(typeof(oForm)==='undefined'||oForm===null){
			return true;
		}else{
			if(oFV.LimitScope){
				oE = oFV.GetScopeElement();
				if(typeof(oE)===null||typeof(oE)==='undefined'){
					oE=oForm;
				}
			}else{
				oE = oForm;
			}
		}
		// -- DY : Undo earlier bug fix - unintended consequences resulted - more research needed -- if(oE.type==='undefined'||oE.type===undefined){ return true; }
		//Get HTMLCollections, Loop through to find required fields, add to Master Array
		try {
			aI=oE.getElementsByTagName("input");
			aS=oE.getElementsByTagName("select");
			aT=oE.getElementsByTagName("textarea");
			if(typeof(aI)!=='undefined'&&aI!==null&&aI.length>0){for(var item in aI){if(aI[item].id){if(aI[item].id.indexOf("req_")>-1){oArr.push(aI[item]);}}}}
			if(typeof(aS)!=='undefined'&&aS!==null&&aS.length>0){for(var item in aS){if(aS[item].id){if(aS[item].id.indexOf("req_")>-1){oArr.push(aS[item]);}}}}
			if(typeof(aT)!=='undefined'&&aI!==null&&aT.length>0){for(var item in aT){if(aT[item].id){if(aT[item].id.indexOf("req_")>-1){oArr.push(aT[item]);}}}}
			
			oFV.count=0;
			oFV.errors=0;
			var oItem;
			for(var item in oArr){
				oItem=oArr[item];
				if(oItem.tagName&&(oItem.style.display!=='none'&&oItem.style.visibility!=='hidden')){
					checktype: switch(oItem.type){
						case 'text':
							oFV.Helpers.removeEventListener(oItem,"keydown",oFV.ReValidate,false);
							if(oFV.Validators.validate_TextBox(oItem)>0){
								oFV.count+=oFV.Validators.validate_TextBox(oItem);
								oFV.Helpers.attachEventListener(oItem,"keydown",oFV.ReValidate,false);
							}
							break checktype;
						case 'file':
							oFV.Helpers.removeEventListener(oItem,"blur",oFV.ReValidate,false);
							oFV.count+=oFV.Validators.validate_TextBox(oItem);
							oFV.Helpers.attachEventListener(oItem,"blur",oFV.ReValidate,false);
							break checktype;
						case 'password':
							oFV.Helpers.removeEventListener(oItem,"blur",oFV.ReValidate,false);
							oFV.count+=oFV.Validators.validate_Password(oItem);
							oFV.Helpers.attachEventListener(oItem,"blur",oFV.ReValidate,false);
							break checktype;
						case 'textarea':
							oFV.Helpers.removeEventListener(oItem,"keyup",oFV.ReValidate,false);
							if(oFV.Validators.validate_TextArea(oItem)>0){
								oFV.count+=oFV.Validators.validate_TextArea(oItem);
								oFV.Helpers.attachEventListener(oItem,"keyup",oFV.ReValidate,false);
							}
							break checktype;
						case 'select-one':
							oFV.Helpers.removeEventListener(oItem,"change",oFV.ReValidate,false);
							oFV.count+=oFV.Validators.validate_SelectOne(oItem);
							oFV.Helpers.attachEventListener(oItem,"change",oFV.ReValidate,false);
							break checktype;
						case 'select-multiple':
							oFV.Helpers.removeEventListener(oItem,"blur",oFV.ReValidate,false);
							oFV.count+=oFV.Validators.validate_SelectMultiple(oItem);
							oFV.Helpers.attachEventListener(oItem,"blur",oFV.ReValidate,false);
							break checktype;
						case 'radio':
							oFV.Helpers.removeEventListener(oItem,"click",oFV.ReValidate,false);
							oFV.count+=oFV.Validators.validate_RadioButton(oItem);
							oFV.Helpers.attachEventListener(oItem,"click",oFV.ReValidate,false);
							break checktype;
						case 'checkbox':
							oFV.Helpers.removeEventListener(oItem,"click",oFV.ReValidate,false);
							oFV.count+=oFV.Validators.validate_CheckBox(oItem);
							oFV.Helpers.attachEventListener(oItem,"click",oFV.ReValidate,false);
							break checktype;
						default:
							break checktype;
					}
				}
			}
			if(typeof(oFV.ValidatePairs)!=='undefined'&&oFV.ValidatePairs!==null){
				if(oFV.ValidatePairs.args&&oFV.ValidatePairs.args.length>0){
					for(var i=0;i<oFV.ValidatePairs.args.length;i++){
						var sender=oFV.ValidatePairs.args[i][0];
						var target=oFV.ValidatePairs.args[i][1];
						if(sender.checked){
							oFV.count+=oFV.Validators.validate_SelectOne(target);
							oFV.Helpers.attachEventListener(target,"blur",oFV.ReValidate,false);
						}else{
							oFV.Helpers.remove_errorMarkers(target.id+'_span');
							oFV.Helpers.remove_errorClassName(target);
							oFV.Helpers.removeEventListener(target,"blur",oFV.ReValidate,false);
						}
					}
				}
			}
			oFV.errors=oFV.count;
			if(oFV.errors>0){
				oFV.show_errorMsg(true);
				return false;
			}else{
				oFV.show_errorMsg(false);
				return true;
			}
		}
		catch(ex){
			alert(ex.message);
		}
	};
