var formValidator={
	validateArr:[],
	validationArr:['isEmail','isBlank','isSelect','isCheck','isRadioCheck','isTel','isCalDate','isDigit','isEmptyOrEmail','isEqual','isLegalAge','isMaxLen','isPasswd','isDependancyBlank','isPostalCode'],
	calArr:[],
	forceSubmit:false,
	bSkip:false,
	init:function(errorMessage){
		var f=document.getElementsByTagName('form')[0];
		var i;
		if(f){
			if((BrowserDetect.browser=='Explorer')){f.autocomplete='off';}
			var els=f.elements;
			var str='';
			$j('input,select,textarea').filter(function(index){
				if(this.className.indexOf('validid')!=-1){
					var myId=this.className.substr(this.className.indexOf('validid')+7);
					if(myId.indexOf(' ')!=-1){
						myId=myId.substr(0,myId.indexOf(' '));
					}
					$j(this).attr('validid',myId);
				}
			});
			for(i=0;i<els.length;i++){
				var el=els[i];
				var validid=el.getAttribute('validid');
				if(validid!=null){
					var myValidator=formValidator.getValidators(el.className);
					formValidator.validateArr.push({validid:parseInt(validid),element:el,validators:myValidator});
				}else if(el.nodeName=='SELECT'&&el.className.indexOf('others')!=-1){
					el.onchange=function(){
						var val=formValidator.getFieldValue(this);
						var oe=$j(this.name+'others');
						if(oe){
							var els=oe.getElementsByTagName('input');
							if(val=='others'&&oe.className=='closed'){
								oe.className='opened';
								if(els.length>0){
									els[0].disabled=false;
									els[0].focus();
								}
							}else{
								oe.className='closed';
								if(els.length>0){
									els[0].value='';
									els[0].disabled=true;
								}
							}
						}
					}
				}else if(el.className.indexOf('btnReset')!=-1){
					el.onclick=function(){
						formValidator.reset();
						return false;
					}
				}
				if(el.className.indexOf('tdate')!=-1){
					var anchor=document.getElementById('popCal'+el.id);
					if(anchor){
						var cal=new CalendarPopup();
						var d=new Date();
						d.setDate(d.getDate()-1);
						cal.addDisabledDates(null,formatDate(d,'yyyy-MM-dd'));
						this.calArr[this.calArr.length]={id:el.id,anchor: 'popCal'+el.id,calpop: cal};
						anchor.onclick=function(){
							for(var i=0;i<formValidator.calArr.length;i++){
								if(formValidator.calArr[i].anchor==this.id){
									formValidator.calArr[i].calpop.select(document.getElementById(formValidator.calArr[i].id),formValidator.calArr[i].anchor,'dd-MM-yyyy');
									break;
								}
							}
							return false;
						};
					}
				}
				if(el.className.indexOf('isDependancyBlank')!=-1){
					var classes=el.className.split(' ');
					var dependant='';
					var k=0;
					for (k=0; k<classes.length; k++){
						if(classes[k].indexOf('dependent-')!=-1){
							dependant='#'+classes[k].substring(classes[k].indexOf('dependent-')+10);
							break;
						}
					}
					var $dependant=$j(dependant);
					if($dependant.length==1){
						$dependant.attr('original',$dependant.val());
						$j(el).attr('dependant',dependant);
					}
					delete classes,dependant,k,$dependant;
				}
			}
			f.errorMessage=errorMessage;
			f.onsubmit=this.performValidation;
			f.onreset=this.reset;
		}
		f=i=null;
	},
	uninit:function(){
		var f=document.getElementsByTagName('form')[0];
		f.errorMessage=f.onsubmit=f.onreset=null;
		f=null;
	},
	getValidators: function(classes){
		var arr=[];
		for(var i=0;i<formValidator.validationArr.length;i++){
			if(classes.indexOf(formValidator.validationArr[i])!=-1){
				arr.push(formValidator.validationArr[i]);
			}
		}
		return arr;
	},
	performValidation:function(){
		if(formValidator.forceSubmit){return true;}
		var f=document.getElementsByTagName('form')[0];
		var serverSideError=document.getElementById('warnmsg2');
		if(serverSideError!=null){
			serverSideError.className='hidden';
		}
		var strError='';
		var errObj=null;
		var i,j,e,retVal,refId;
		for(i=0;i<formValidator.validateArr.length;i++){
			el=formValidator.validateArr[i].element;
			retVal=false;
			for(j=0;j<formValidator.validateArr[i].validators.length;j++){
				if(formValidator.validateArr[i].validators[j]=='isEqual'){
					var refId=el.className.substring(el.className.indexOf('isEqual-')+8,el.className.length);
					refId=refId.substring(0,refId.indexOf(' '));
					var refEl=document.getElementById(refId);
					retVal=eval('formValidator.'+formValidator.validateArr[i].validators[j]+'(el,refEl)');
					delete refId,refEl;
				}else if(formValidator.validateArr[i].validators[j]=='isLegalAge'){
					var d,m,y,prefix;
					prefix=el.id.substring(0,el.id.indexOf('year'));
					d=document.getElementById(prefix+'day');
					m=document.getElementById(prefix+'month');
					y=document.getElementById(prefix+'year');
					retVal=eval('formValidator.'+formValidator.validateArr[i].validators[j]+'(d,m,y)');
					delete d,m,y,prefix;
				}else{
					retVal=eval('formValidator.'+formValidator.validateArr[i].validators[j]+'(el)');
				}
				if(formValidator.bSkip){retVal=true;}
				if(!retVal){break;}
			}
			refId=formValidator.validateArr[i].validid;
			var obj;
			do{
				obj=document.getElementById('lblvalid'+(refId--));
			}while(!obj);
			if(!retVal){
				if(obj){obj.className='mandatory';}
				if(errObj==null) {errObj=el;}
				strError += 'error';
			}else{
				if(obj){obj.className='';}
			}
			obj=null;
		}
		errMsgObj=document.getElementById('warnmsg');
		if(strError==''){
			if(errMsgObj){errMsgObj.className='hidden';}
			f=null;
			delete f;
			return true;
		}else{
			if(errMsgObj){errMsgObj.className='';}
			errObj.focus();
			return false;
		}
		return false;
	},
	getFieldValue:function(el){
		var result='';
		if(el.nodeName){
			switch (el.nodeName){
				case 'INPUT':
				case 'TEXTAREA':
					if(el.type=='checkbox'||el.type=='radio'){
						if(el.checked){
							result='checked';
						}
					}else{
						result=el.value;
					}
					break;
				case 'SELECT':
					if((el.ignoreFirstOption&&el.selectedIndex>0)||(!el.ignoreFirstOption&&el.selectedIndex>=0)){
						result=el.options[el.selectedIndex].value;
					}
					break;
			}
		}else if(typeof el=='string'){ 
			result=el;
		}
		return result.replace(/(^\s+|\s+$)/g,'');
	},
	isBlank:function(el){
		return (formValidator.getFieldValue(el).length>0);
	},
	isDigit:function(el){
		var str=el.value;
		var filter=/^([0-9]+)$/;
		if(str.length==0){return true;}
		if(filter.test(str)){return true;}
		else{return false;}
	},
	isEmail:function(el){
		var email=formValidator.getFieldValue(el);
		var filter=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		if(filter.test(email)&&email.length>0){return true;}
		return false;
	},
	isEmptyOrEmail:function(el){
		return(formValidator.isEmail(el)||formValidator.getFieldValue(el).length==0);
	},
	isOlderThan:function(bound,dd,mm,yyyy){
		if(dd==0 || mm==0 || yyyy==0){
			return false;
		}
		var leap = 0;
		if ((yyyy % 4 == 0) || (yyyy % 100 == 0) || (yyyy % 400 == 0)) {
			leap = 1;
		}
		if (((mm == 2) && (leap == 1) && (dd > 29)) || ((mm == 2) && (leap != 1) && (dd > 28))) {
			return false;
		}
		if(dd>30 && (mm==4 || mm==6 || mm==9 || mm==11)){
			return false;
		}
		var today = new Date();
		var dob = new Date();
		dob.setDate(dd);
		dob.setMonth(mm-1);
		dob.setFullYear(yyyy);
		if(today.getFullYear()-dob.getFullYear()>bound){
			return true;
		}else if(today.getFullYear()-dob.getFullYear()==bound && (today.getMonth()>dob.getMonth() || (today.getMonth()==dob.getMonth() && today.getDate()>=dob.getDate()))){
			return true;
		}
		return false;
	},
	isLegalAge:function(d,m,y){
		var dd=parseInt($j('#DOBday').val());
		var mm=parseInt($j('#DOBmonth').val());
		var yyyy=parseInt($j('#DOByear').val());
		return formValidator.isOlderThan(18,dd,mm,yyyy);
	},
	isEqual:function(el,refEl){
		var confirmpw=formValidator.getFieldValue(el);
		var originalpw=formValidator.getFieldValue(refEl);
		return (originalpw == confirmpw);
	},
	isCalDate:function(el){
		var dmy,d,m,y;
		var val=formValidator.getFieldValue(el);
		var today = new Date();
		var date = new Date();
		if(val.length==0){return true;}
		dmy=val.split('-');
		if(dmy.length!=3){return false;}
		d=parseInt(dmy[0],10);
		m=parseInt(dmy[1],10);
		y=parseInt(dmy[2],10);
		if(isNaN(d) || isNaN(m) || isNaN(y)){return false;}
		date.setDate(d);
		date.setMonth(m-1);
		date.setFullYear(y);
		if ((date.getDate() != d) || (date.getMonth() != m-1) || (date.getFullYear() != y)){return false;}
		if (date<today){return false;}
		return true;
	},
	isTel:function(el){
		var p=formValidator.getFieldValue(el);
		var filter=/^([\(\)0-9 \-\+]+)$/;
		if((p.length>0 && filter.test(p))||p.length==0){return true;}
		return false;
	},
	isSelect:function(el){
		var opt=formValidator.getFieldValue(el);
		if(opt.length>0){return true;}
		return false;
	},
	isRadioCheck:function(el){
		var opt=formValidator.getFieldValue(el);
		var i=0;
		var nam=el.name;
		var els=document.getElementsByTagName('input');
		for(i=0;i<els.length;i++){
			if(els[i].type=='radio' && els[i].name==nam && els[i].checked){
				return true;
			}
		}
		return false;
	},
	isCheck:function(el){
		var opt=formValidator.getFieldValue(el);
		var i=0;
		var nam=el.name;
		var els=document.getElementsByTagName('input');
		for(i=0;i<els.length;i++){
			if(els[i].type=='checkbox' && els[i].name==nam && els[i].checked){
				return true;
			}
		}
		return false;
	},
	isMaxLen:function(el){
		var e=formValidator.getFieldValue(el);
		var classes=el.className.split(' ');
		var max=0;
		for(var i=0;i<classes.length;i++){
			if(classes[i].indexOf('isMaxLen-')!=-1){
				max=parseInt(classes[i].substring(classes[i].indexOf('isMaxLen-')+9));
				break;
			}
		}
		classes=i=null;
		if(e.length>max){return false;}
		return true;
	},
	isPasswd:function(el){
		var p=formValidator.getFieldValue(el);
		var filter=/^([0-9a-zA-Z]+)$/;
		var filterLowerCase=/^(.*[a-z]+.*)$/;
		var filterUpperCase=/^(.*[A-Z]+.*)$/;
		var filterNumber=/^(.*[0-9]+.*)$/;
		if((p.length>=8 && p.length<=20 && filter.test(p) && filterLowerCase.test(p) && filterUpperCase.test(p) && filterNumber.test(p))||p.length==0){return true;}
		return false;
	},
	isDependancyBlank:function(el){
		if($j(el).attr('dependant')!=''){
			var $dependant=$j($j(el).attr('dependant'));
			return !($dependant.val() != $dependant.attr('original') && formValidator.getFieldValue(el).length==0);
		}
		return false;
	},
	isPostalCode:function(el){
		var p=formValidator.getFieldValue(el);
		if ((p=='N/A')||(p=='n/a')||(p=='')) {
			return true;
		}
		var filter=/^([0-9]+)$/;
		if(!filter.test(p)){
			return false;
		}
		if(p.length==6){
			return true;
		}
		return false;
	},	
	reset:function(form){
		var errMsgObj=document.getElementById('warnmsg');
		if(errMsgObj){errMsgObj.className='hidden';}
		for(var i=0;i<formValidator.validateArr.length;i++){
			var e=formValidator.validateArr[i].element;
			var refId=formValidator.validateArr[i].validid;
			var obj;
			do{
				obj=document.getElementById('lblvalid'+(refId--));
			}while(!obj);
			if(obj){obj.className='';}
		}
		var f=document.getElementsByTagName('form')[0];
		if(f){
			var els=f.elements;
			for(var i=0;i<els.length;i++){
				var el=els[i];
				if(el.nodeName=='SELECT'&&el.className.indexOf('others')!=-1){
					var oe=$j(el.name+'others');
					if(oe){
						oe.className='closed';
						var inputs=oe.getElementsByTagName('input');
						if(inputs.length>0){
							inputs[0].value='';
							inputs[0].disabled=true;
						}
					}
				}
			}
		}
		return true;
	},
	rewire:function($e){
		var url=$e.parents('.form').find('input[id^=formaction]').val();
		if(url!=''){
			$j('form').attr('action',url);
		}
		if($j('body.iframe .regimen-categories').length>0){
			$j('form').attr('target','_top');
		}
	}
};
$j(document).ready(function(){
	formValidator.init();
	$j(':input[type!=\'textarea\']').keydown(function(e){
		if(e.keyCode==13){
			e.preventDefault();
			if(typeof(formValidator)!='undefined'){
				formValidator.bSkip=($j(this).parents('.form').find(':input[validid]').length>0)?false:true;
			}
			formValidator.rewire($j(this));
			$j(this).parents('.form').find(':button,:submit,input.submit').click();
			return false;
		}
	});
	$j(':button,:submit,input.submit').click(function(e){
		if(typeof(formValidator)=='object'){
			formValidator.bSkip=($j(this).parents('.form').find(':input[validid]').length>0)?false:true;
		}
		formValidator.rewire($j(this));
	});
	$j('select.jssubmit').change(function(){
		if(typeof(formValidator)=='object'){
			formValidator.bSkip=($j(this).parents('.form').find(':input[validid]').length>0)?false:true;
		}
		formValidator.rewire($j(this));
		if(typeof(WebForm_OnSubmit)=='function'){
			WebForm_OnSubmit();
		}else{
			this.form.submit();
		}
	});
	$j('input.clear').click(function(e){
		if(typeof(formValidator)=='object'){
			formValidator.reset();
		}else{
			document.forms[0].reset();
		}
		e.preventDefault();
		return false;
	});
	$j('input.clearAndReset').click(function(e){
		if(typeof(formValidator)=='object'){
			formValidator.reset();
		}
		document.forms[0].reset();
		e.preventDefault();
		return false;
	});
	if($j('.form #infosource').length==1){
		$j('fieldset.options').hide();
		$j('.form #infosource').change(function(){
			for(var i=0;i<this.options.length;i++){
				if(this.options[i].value!=''){
					$j('#'+(this.options[i].value).toLowerCase().replace(' ','')).hide();
				}
			}
			$j('#'+$j(this).val().toLowerCase().replace(' ','')).show();
		});
	}
});

