var className={has:function(el,cn){if(!el||typeof cn!="string"){return false;}return(el.className&&el.className.search&&el.className.search(new RegExp("\\b"+cn+"\\b"))!=-1);},add:function(el,cn){if(!el||typeof cn!="string"){return false;}if(!className.has(el,cn)){el.className+=" "+cn;}return true;},remove:function(el,cn){var c;if(!el||typeof cn!="string"){return false;}if(className.has(el,cn)){c=el.className.replace(new RegExp("\\b"+cn+"\\b"),"");c=c.replace(/^ +| +$/g,"");c=c.replace(/ {2,}/g," ");el.className=c;}return true;},toggle:function(el,cn){if(!el||typeof cn!="string"){return false;}if(hasClass(el,cn)){removeClass(el,cn);}else{addClass(el,cn);}return true;},getElementsByClassName:function(root,tag,cn){var list=new Array();var l=0;var els,i;if(!root||!tag||typeof cn!="string"){return null;}els=root.getElementsByTagName(tag);for(i=els.length-1;i>=0;i--){if(className.has(els[i],cn)){list[l++]=els[i];}}return list.reverse();}};var formValidation={init:function(form,labelClassOnError,cleanUp,onSuccess,onFail){var errorHandler=this.errorHandler;var idToLabel=new Object();var els,vals,i,j;if(!form||typeof labelClassOnError!="string"){return;}els=form.getElementsByTagName("label");for(i=els.length-1;i>=0;i--){if(els[i].htmlFor){idToLabel[els[i].htmlFor]=els[i];}}els=form.elements;for(i=els.length-1;i>=0;i--){vals=els[i].validators;if(vals){for(j=vals.length-1;j>=0;j--){vals[j].errorHandler=errorHandler;}}}form.idToLabel=idToLabel;form.labelClassOnError=labelClassOnError;form.onSuccess=onSuccess;form.onFail=onFail;$(form).bind("submit",function(){var result=formValidation.performValidation.call(this);if(cleanUp){$(this).unbind("submit",arguments.callee);}return result;});},uninit:function(form){var els,vals,i,j;if(!form){return;}this.resetLabels(form);els=form.elements;for(i=els.length-1;i>=0;i--){vals=els[i].validators;if(vals){for(j=vals.length-1;j>=0;j--){vals[j].errorHandler=null;}}}form.idToLabel=form.labelClassOnError=form.errorMessages=form.onSuccess=form.onsubmit=null;},getHighlightLabels:function(el,obj){var labels=new Array();var l=0;var idToLabel=el.form.idToLabel;var thing=(obj.highlightId)?obj.highlightId:el.id;var ids=new Array();var highlightEl,i;if(typeof thing=="function"){ids=thing();}else{if(typeof thing=="string"){ids=[thing];}else{if(thing&&thing.length>0){ids=thing;}}}for(i=0;i<ids.length;i++){highlightEl=idToLabel[ids[i]];if(highlightEl){labels[l++]=highlightEl;}}return labels;},errorHandler:function(el){var form=el.form;var labels=formValidation.getHighlightLabels(el,this);var cn=form.labelClassOnError;var i;for(i=labels.length-1;i>=0;i--){className.add(labels[i],cn);}$(".error_msg",form).show();if(!form.errEl&&!form.errObj){form.errEl=el;form.errObj=this;}},resetLabels:function(form){var idToLabel=form.idToLabel;var cn=form.labelClassOnError;var id;for(id in idToLabel){className.remove(idToLabel[id],cn);}form.errEl=form.errObj=null;},performValidation:function(){var els=this.elements;var result=true;var el,vals,i,j;formValidation.resetLabels(this);$(".error_msg",this).hide();for(i=els.length-1;i>=0;i--){el=els[i];vals=el.validators;if(vals){for(j=vals.length-1;j>=0;j--){if(vals[j].reset){vals[j].reset(el);}}}el.performValidation=true;}for(i=0;i<els.length;i++){el=els[i];vals=el.validators;if(vals){for(j=0;j<vals.length;j++){if(el.performValidation&&!vals[j].validator(el)){if(vals[j].errorHandler){vals[j].errorHandler(el);}result=false;}}}}if(!result&&this.onFail){this.onFail();}if(result&&this.onSuccess){this.onSuccess();}return result;},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,"");},dateExtractor:function(obj,prefix){var result=new Object();if(typeof prefix!="string"){prefix="";}result.day=(obj[prefix+"day"])?parseInt(formValidation.getFieldValue(obj[prefix+"day"]),10):-1;result.month=(obj[prefix+"month"])?parseInt(formValidation.getFieldValue(obj[prefix+"month"]),10):-1;result.year=(obj[prefix+"year"])?parseInt(formValidation.getFieldValue(obj[prefix+"year"]),10):-1;return result;},dateInPastValidator:function(el){var givenDay,givenMonth,givenYear;var currentDay,currentMonth,currentYear;var deltaDay,deltaMonth,deltaYear;var given,current,d;d=formValidation.dateExtractor(this);givenDay=d.day;givenMonth=d.month-1;givenYear=d.year;if(d.day==-1){givenDay=1;}d=formValidation.dateExtractor(this,"current");currentDay=d.day;currentMonth=d.month-1;currentYear=d.year;if(d.day==-1){currentMonth++;currentDay=0;}deltaDay=(this.deltaDay)?this.deltaDay:0;deltaMonth=(this.deltaMonth)?this.deltaMonth:0;deltaYear=(this.deltaYear)?this.deltaYear:0;given=new Date(givenYear+deltaYear,givenMonth+deltaMonth,givenDay+deltaDay);current=new Date(currentYear,currentMonth,currentDay);return(given<current);},dateFormatValidator:function(el){var v=formValidation.getFieldValue(el);var re,sep,d,dmy,day,month,year,date;var dateFormat=this.dateFormat;var isDateSyntax=function(str,re){return(str.replace(re,"").length==0);};switch(dateFormat){case"dd-mmm-yy":sep="-";re=new RegExp("\\d{2}"+sep+"[a-zA-Z]{3}"+sep+"\\d{2}");if(!isDateSyntax(v,re)){return false;}d=v.split(sep);idx=monthNameToMonth(d[1]);if(idx==-1){return false;}dmy=[d[0],idx,parseInt(d[2])+2000];break;case"dd-mm-yyyy":default:sep="-";re=new RegExp("\\d{2}"+sep+"\\d{2}"+sep+"\\d{4}");if(!isDateSyntax(v,re)){return false;}d=v.split(sep);dmy=[d[0],d[1],d[2]];break;}day=parseInt(dmy[0],10);month=parseInt(dmy[1],10)-1;year=parseInt(dmy[2],10);date=new Date(year,month,day);if(date.toString()=="Invalid Date"){return false;}return(date.getDate()==day)&&(date.getMonth()==month)&&(date.getFullYear()==year);},notBlankValidator:function(el){return(formValidation.getFieldValue(el).length>0);},characterRangeValidator:function(el){var characterRanges={symbol1:["0021","002F"],symbol2:["003A","0040"],symbol3:["005B","0060"],symbol4:["007B","007E"],numAlphSymb:["0021","007E"],spacing:["000A","000D"],upper:["0041","005A"],lower:["0061","007A"],digit:["0030","0039"],cjkUnifiedIdeographs:["4E00","9FBF"],cjkUnifiedIdeographsExtensionA:["3400","4DBF"],cjkUnifiedIdeographsExtensionB:["20000","2A6DF"],cjkCompabilityIdeographs:["F900","FAFF"],cjkCompabilityIdeographsSupplement:["2F800","2FA1F"],kanbun:["3190","319F"],cjkRadicalsSupplement:["2E80","2EFF"],kangxiRadicals:["2F00","2FDF"],cjkStrokes:["31C0","31EF"],bopomofo:["3100","312F"],bopomofoExtended:["31A0","31BF"],cjkSymbolsAndPunctuation:["3000","303F"],halfwidthAndFullwidthForms:["FF00","FFEF"],verticalForms:["FE10","FE1F"]};for(var i in characterRanges){characterRanges[i][0]=parseInt(characterRanges[i][0],16);characterRanges[i][1]=parseInt(characterRanges[i][1],16);}var value=formValidation.getFieldValue(el);var ranges=this.ranges;var min=new Array();var max=new Array();var isValid,i,j,c;if(typeof this.symbols=="string"){value=stripSymbols(value,this.symbols);}for(i=ranges.length-1;i>=0;i--){j=ranges[i];if(typeof j=="string"){min[i]=characterRanges[j][0];max[i]=characterRanges[j][1];}else{if(j instanceof Array){min[i]=j[0];max[i]=j[1];}}}for(i=value.length-1;i>=0;i--){c=value.charCodeAt(i);isValid=false;for(j=min.length-1;j>=0;j--){if(c>=min[j]&&c<=max[j]){isValid=true;break;}}if(!isValid){return false;}}return true;},checkboxCheckedValidator:function(el){return el.checked;},anyCheckedValidator:function(el){var activated=false;inputs=this.inputs;for(var i=inputs.length-1;i>=0;i--){if(inputs[i].checked){activated=true;break;}}return activated;},lengthValidator:function(el){var len=formValidation.getFieldValue(el).length;var ranges=this.ranges;var min,max,i;for(i=ranges.length-1;i>=0;i--){min=ranges[i][0];max=ranges[i][1];if(len>=min&&len<=max){return true;}}return false;},emailLocalValidator:function(el){return(formValidation.getFieldValue(el).search(/[^\w+.-]/)==-1);},numOnlyValidator:function(el){return(formValidation.getFieldValue(el).search(/\D/)==-1);},numGreaterThanZero:function(el){if((parseInt(formValidation.getFieldValue(el)))<1){return false;}else{return true;}},optionSelectedValidator:function(el){return(el.value!="");},domainValidator:function(el){var labels=formValidation.getFieldValue(el).replace(/\.$/,"").split(".");var i;if(labels.length<2){return false;}for(i=labels.length-1;i>=0;i--){if(labels[i].search(/^[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/)==-1){return false;}}return true;},emailValidator:function(el){var email=formValidation.getFieldValue(el);var atpos=email.indexOf("@");var local,domain;if(atpos>-1){local=email.substring(0,atpos);domain=email.substring(atpos+1);return(formValidation.emailLocalValidator(local)&&formValidation.domainValidator(domain));}return false;},firstNotBlankGroupActivator:function(el){var getFieldValue=formValidation.getFieldValue;var groups=this.groups;var activated=-1;var group,i,j;for(i=0;i<groups.length;i++){group=groups[i];for(j=group.length-1;j>=0;j--){if(getFieldValue(group[j]).length>0){activated=i;break;}}if(activated!=-1){break;}}for(i=groups.length-1;i>=0;i--){group=groups[i];for(j=group.length-1;j>=0;j--){group[j].performValidation=(i==activated);}}return(activated!=-1);},allOrNoneActivator:function(el){var getFieldValue=formValidation.getFieldValue;var fields=this.fields;var activated=false;var i;for(i=fields.length-1;i>=0;i--){if(getFieldValue(fields[i]).length>0){activated=true;break;}}for(i=fields.length-1;i>=0;i--){fields[i].performValidation=activated;}return true;},NAllOrNoneActivator:function(el){var getFieldValue=formValidation.getFieldValue;var fields=this.fields;var activated=true;var i;for(i=fields.length-1;i>=0;i--){if(getFieldValue(fields[i]).length>0){activated=false;break;}}for(i=fields.length-1;i>=0;i--){fields[i].performValidation=activated;}return true;}};function stripSymbols(str,symbols){var i,j,c;for(i=symbols.length-1;i>=0;i--){c=symbols.charAt(i);while((j=str.indexOf(c))>-1){str=str.substring(0,j)+str.substring(j+1);}}return str;}function monthNameToMonth(str){var monthNames=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"];var idx=-1;str=str.toLowerCase();for(var i=0;i<monthNames.length;i++){if(monthNames[i]==str){idx=i;break;}}if(idx==-1){return idx;}else{return idx+1;}}jlib._labelHandler=function(){var field=this.field;var action;switch(field.nodeName){case"INPUT":switch(field.type){case"text":case"password":action="focus";break;case"checkbox":case"radio":action="click";break;}break;case"SELECT":case"TEXTAREA":action="focus";break;}if(action&&field[action]&&!field.disabled){field[action]();return false;}return true;};jlib.labelInit=function(root){var _labelHandler,els,label,field,i;if(!root){return;}_labelHandler=jlib._labelHandler;els=root.getElementsByTagName("label");for(i=els.length-1;i>=0;i--){label=els[i];if(label.htmlFor){field=document.getElementById(label.htmlFor);if(field){label.style.cursor="default";label.field=field;label.onclick=_labelHandler;}}}};jlib.labelUninit=function(root){var els,label,i;if(!root){return;}els=root.getElementsByTagName("label");for(i=els.length-1;i>=0;i--){label=els[i];if(label.field){label.field=null;label.onclick=null;}}};