// JavaScript Document
/*本文件包含
behaviour.js
json.js
/validation.js
livevalidation_prototype.js
i18n.js
*/
//behaviour.js

var Behaviour={list:new Array,register:function(sheet){Behaviour.list.push(sheet);},start:function(){Behaviour.addLoadEvent(function(){Behaviour.apply();});},apply:function(){for(h=0;sheet=Behaviour.list[h];h++){for(selector in sheet){list=document.getElementsBySelector(selector);if(!list){continue;}
for(i=0;element=list[i];i++){sheet[selector](element);}}}},addLoadEvent:function(func){var oldonload=window.onload;if(typeof window.onload!='function'){window.onload=func;}else{window.onload=function(){oldonload();func();}}}}
Behaviour.start();function getAllChildren(e){return e.all?e.all:e.getElementsByTagName('*');}
document.getElementsBySelector=function(selector){if(!document.getElementsByTagName){return new Array();}
var tokens=selector.split(' ');var currentContext=new Array(document);for(var i=0;i<tokens.length;i++){token=tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;if(token.indexOf('#')>-1){var bits=token.split('#');var tagName=bits[0];var id=bits[1];var element=document.getElementById(id);if(tagName&&element.nodeName.toLowerCase()!=tagName){return new Array();}
currentContext=new Array(element);continue;}
if(token.indexOf('.')>-1){var bits=token.split('.');var tagName=bits[0];var className=bits[1];if(!tagName){tagName='*';}
var found=new Array;var foundCount=0;for(var h=0;h<currentContext.length;h++){var elements;if(tagName=='*'){elements=getAllChildren(currentContext[h]);}else{elements=currentContext[h].getElementsByTagName(tagName);}
for(var j=0;j<elements.length;j++){found[foundCount++]=elements[j];}}
currentContext=new Array;var currentContextIndex=0;for(var k=0;k<found.length;k++){if(found[k].className&&found[k].className.match(new RegExp('\\b'+className+'\\b'))){currentContext[currentContextIndex++]=found[k];}}
continue;}
if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)){var tagName=RegExp.$1;var attrName=RegExp.$2;var attrOperator=RegExp.$3;var attrValue=RegExp.$4;if(!tagName){tagName='*';}
var found=new Array;var foundCount=0;for(var h=0;h<currentContext.length;h++){var elements;if(tagName=='*'){elements=getAllChildren(currentContext[h]);}else{elements=currentContext[h].getElementsByTagName(tagName);}
for(var j=0;j<elements.length;j++){found[foundCount++]=elements[j];}}
currentContext=new Array;var currentContextIndex=0;var checkFunction;switch(attrOperator){case'=':checkFunction=function(e){return(e.getAttribute(attrName)==attrValue);};break;case'~':checkFunction=function(e){return(e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b')));};break;case'|':checkFunction=function(e){return(e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?')));};break;case'^':checkFunction=function(e){return(e.getAttribute(attrName).indexOf(attrValue)==0);};break;case'$':checkFunction=function(e){return(e.getAttribute(attrName).lastIndexOf(attrValue)==e.getAttribute(attrName).length-attrValue.length);};break;case'*':checkFunction=function(e){return(e.getAttribute(attrName).indexOf(attrValue)>-1);};break;default:checkFunction=function(e){return e.getAttribute(attrName);};}
currentContext=new Array;var currentContextIndex=0;for(var k=0;k<found.length;k++){if(checkFunction(found[k])){currentContext[currentContextIndex++]=found[k];}}
continue;}
if(!currentContext[0]){return;}
tagName=token;var found=new Array;var foundCount=0;for(var h=0;h<currentContext.length;h++){var elements=currentContext[h].getElementsByTagName(tagName);for(var j=0;j<elements.length;j++){found[foundCount++]=elements[j];}}
currentContext=found;}
return currentContext;}
//json.js
if(!this.JSON){JSON=function(){function f(n){return n<10?'0'+n:n;}Date.prototype.toJSON=function(){return this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z';};var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};function stringify(value,whitelist){var a,i,k,l,r=/["\\\x00-\x1f\x7f-\x9f]/g,v;switch(typeof value){case'string':return r.test(value)?'"'+value.replace(r,function(a){var c=m[a];if(c){return c;}c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"':'"'+value+'"';case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}if(typeof value.toJSON==='function'){return stringify(value.toJSON());}a=[];if(typeof value.length==='number'&&!(value.propertyIsEnumerable('length'))){l=value.length;for(i=0;i<l;i+=1){a.push(stringify(value[i],whitelist)||'null');}return'['+a.join(',')+']';}if(whitelist){l=whitelist.length;for(i=0;i<l;i+=1){k=whitelist[i];if(typeof k==='string'){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+':'+v);}}}}else{for(k in value){if(typeof k==='string'){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+':'+v);}}}}return'{'+a.join(',')+'}';}}return{stringify:stringify,parse:function(text,filter){var j;function walk(k,v){var i,n;if(v&&typeof v==='object'){for(i in v){if(Object.prototype.hasOwnProperty.apply(v,[i])){n=walk(i,v[i]);if(n!==undefined){v[i]=n;}}}}return filter(k,v);}if(/^[\],:{}\s]*$/.test(text.replace(/\\./g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof filter==='function'?walk('',j):j;}throw new SyntaxError('parseJSON');}};}();}
//validation.js

var Validator=Class.create();Validator.prototype={initialize:function(className,error,test,options){if(typeof test=='function'){this.options=$H(options);this._test=test;}else{this.options=$H(test);this._test=function(){return true};}
this.error=error||'Validation failed.';this.className=className;},test:function(v,elm){return(this._test(v,elm)&&this.options.all(function(p){return Validator.methods[p.key]?Validator.methods[p.key](v,elm,p.value):true;}));}}
Validator.methods={pattern:function(v,elm,opt){return Validation.get('IsEmpty').test(v)||opt.test(v)},minLength:function(v,elm,opt){return v.length>=opt},maxLength:function(v,elm,opt){return v.length<=opt},min:function(v,elm,opt){return v>=parseFloat(opt)},max:function(v,elm,opt){return v<=parseFloat(opt)},notOneOf:function(v,elm,opt){return $A(opt).all(function(value){return v!=value;})},oneOf:function(v,elm,opt){return $A(opt).any(function(value){return v==value;})},is:function(v,elm,opt){return v==opt},isNot:function(v,elm,opt){return v!=opt},equalToField:function(v,elm,opt){return v==$F(opt)},notEqualToField:function(v,elm,opt){return v!=$F(opt)},include:function(v,elm,opt){return $A(opt).all(function(value){return Validation.get(value).test(v,elm);})}}
var Validation=Class.create();Validation.prototype={initialize:function(form,options){this.options=Object.extend({onSubmit:true,stopOnFirst:false,immediate:false,focusOnError:true,useTitles:false,onFormValidate:function(result,form){},onElementValidate:function(result,elm){}},options||{});this.form=$(form);if(this.options.onSubmit)Event.observe(this.form,'submit',this.onSubmit.bind(this),false);if(this.options.immediate){var useTitles=this.options.useTitles;var callback=this.options.onElementValidate;Form.getElements(this.form).each(function(input){Event.observe(input,'blur',function(ev){Validation.validate(Event.element(ev),{useTitle:useTitles,onElementValidate:callback});});});}},onSubmit:function(ev){if(!this.validate())Event.stop(ev);},validate:function(){var result=false;var useTitles=this.options.useTitles;var callback=this.options.onElementValidate;if(this.options.stopOnFirst){result=Form.getElements(this.form).all(function(elm){return Validation.validate(elm,{useTitle:useTitles,onElementValidate:callback});});}else{result=Form.getElements(this.form).collect(function(elm){return Validation.validate(elm,{useTitle:useTitles,onElementValidate:callback});}).all();}
if(!result&&this.options.focusOnError){Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()}
this.options.onFormValidate(result,this.form);return result;},reset:function(){Form.getElements(this.form).each(Validation.reset);}}
Object.extend(Validation,{validate:function(elm,options){options=Object.extend({useTitle:false,onElementValidate:function(result,elm){}},options||{});elm=$(elm);var cn=elm.classNames();return result=cn.all(function(value){var test=Validation.test(value,elm,options.useTitle);options.onElementValidate(test,elm);return test;});},test:function(name,elm,useTitle){var v=Validation.get(name);var prop='__advice'+name.camelize();try{if(Validation.isVisible(elm)&&!v.test($F(elm),elm)){if(!elm[prop]){var advice=Validation.getAdvice(name,elm);if(advice==null){var errorMsg=useTitle?((elm&&elm.title)?elm.title:v.error):v.error;advice='<div class="validation-advice" id="advice-'+name+'-'+Validation.getElmID(elm)+'" style="display:none">'+errorMsg+'</div>'
switch(elm.type.toLowerCase()){case'checkbox':case'radio':var p=elm.parentNode;if(p){new Insertion.Bottom(p,advice);}else{new Insertion.After(elm,advice);}
break;default:new Insertion.After(elm,advice);}
advice=Validation.getAdvice(name,elm);}
if(typeof Effect=='undefined'){advice.style.display='block';}else{new Effect.Appear(advice,{duration:1});}}
elm[prop]=true;elm.removeClassName('validation-passed');elm.addClassName('validation-failed');return false;}else{var advice=Validation.getAdvice(name,elm);if(advice!=null)advice.hide();elm[prop]='';elm.removeClassName('validation-failed');elm.addClassName('validation-passed');return true;}}catch(e){throw(e)}},isVisible:function(elm){while(elm.tagName!='BODY'){if(!$(elm).visible())return false;elm=elm.parentNode;}
return true;},getAdvice:function(name,elm){return $('advice-'+name+'-'+Validation.getElmID(elm))||$('advice-'+Validation.getElmID(elm));},getElmID:function(elm){return elm.id?elm.id:elm.name;},reset:function(elm){elm=$(elm);var cn=elm.classNames();cn.each(function(value){var prop='__advice'+value.camelize();if(elm[prop]){var advice=Validation.getAdvice(value,elm);advice.hide();elm[prop]='';}
elm.removeClassName('validation-failed');elm.removeClassName('validation-passed');});},add:function(className,error,test,options){var nv={};nv[className]=new Validator(className,error,test,options);Object.extend(Validation.methods,nv);},addAllThese:function(validators){var nv={};$A(validators).each(function(value){nv[value[0]]=new Validator(value[0],value[1],value[2],(value.length>3?value[3]:{}));});Object.extend(Validation.methods,nv);},get:function(name){return Validation.methods[name]?Validation.methods[name]:Validation.methods['_LikeNoIDIEverSaw_'];},methods:{'_LikeNoIDIEverSaw_':new Validator('_LikeNoIDIEverSaw_','',{})}});Validation.add('IsEmpty','',function(v){return((v==null)||(v.length==0));});Validation.addAllThese([['required','此项不能为空',function(v){return!Validation.get('IsEmpty').test(v);}],['validate-number','请输入有效的数值',function(v){return Validation.get('IsEmpty').test(v)||(!isNaN(v)&&!/^\s+$/.test(v));}],['validate-digits','此项仅允许录入数字',function(v){return Validation.get('IsEmpty').test(v)||!/[^\d]/.test(v);}],['validate-alpha','此项仅允许录入英文字母',function(v){return Validation.get('IsEmpty').test(v)||/^[a-zA-Z]+$/.test(v)}],['validate-alphanum','此项仅允许录入英文字母或数字',function(v){return Validation.get('IsEmpty').test(v)||!/\W/.test(v)}],['validate-date','请输入有效的日期日期',function(v){var test=new Date(v);return Validation.get('IsEmpty').test(v)||!isNaN(test);}],['validate-email','请输入有效的电子邮件地址，例如：username@example.com',function(v){return Validation.get('IsEmpty').test(v)||/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)}],['validate-url','请输入有效的URL地址',function(v){return Validation.get('IsEmpty').test(v)||/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)}],['validate-date-au','请输入有效的日期。例如：输入17/03/2006来表示2006年3月17日',function(v){if(Validation.get('IsEmpty').test(v))return true;var regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!regex.test(v))return false;var d=new Date(v.replace(regex,'$2/$1/$3'));return(parseInt(RegExp.$2,10)==(1+d.getMonth()))&&(parseInt(RegExp.$1,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear());}],['validate-currency-dollar','请输入有效的美元数值. 例如：$100.00 ',function(v){return Validation.get('IsEmpty').test(v)||/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)}],['validate-selection','请做出选择',function(v,elm){return elm.options?elm.selectedIndex>0:!Validation.get('IsEmpty').test(v);}],['validate-one-required','请选择一个选项',function(v,elm){var p=elm.parentNode;var options=p.getElementsByTagName('INPUT');return $A(options).any(function(elm){return $F(elm);});}],['validate-integer','请输入一个整数',{pattern:/^[-+]?[\d]+$/}],['validate-ip','请输入合法的IP地址',{pattern:/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/}],['validate-datetime-CN','请输入有效的日期及时间',{pattern:/^(((([0-9][0-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$/}],['validate-date-CN','请输入有效的日期',{pattern:/^(((([0-9][0-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/}],['validate-year','请输入有效的年份',{pattern:/^(([0-9][0-9]|[2-9]\d)\d{2})$/}],['validate-month','请输入有效的月份',{pattern:/^(0?[13456789]|1[012])$/}],['validate-chinese','请输入中文',{pattern:/^[\u4e00-\u9fa5]+$/}],['validate-phone','请输入有效的电话号码',{pattern:/^((0[1-9]{3})?(0[12][0-9])?[-])?\d{6,8}$/}],['validate-mobile-phone','请输入有效的手机号码',{pattern:/^0?[1][35][0-9]{9}$/}],['validate-zip','请输入有效的邮政编码',{pattern:/^[1-9]\d{5}$/}],['validate-qq','请输入有效的QQ号码',{pattern:/^[1-9]\d{4,8}$/}]]);
//livevalidation_prototype.js

var LiveValidation=Class.create();Object.extend(LiveValidation,{VERSION:'1.3 prototype',TEXTAREA:1,TEXT:2,PASSWORD:3,CHECKBOX:4,SELECT:5,FILE:6,massValidate:function(validations){var returnValue=true;for(var i=0,len=validations.length;i<len;++i){var valid=validations[i].validate();if(returnValue)returnValue=valid;}
return returnValue;}});LiveValidation.prototype={validClass:'LV_valid',invalidClass:'LV_invalid',messageClass:'LV_validation_message',validFieldClass:'LV_valid_field',invalidFieldClass:'LV_invalid_field',initialize:function(element,optionsObj){if(!element)throw new Error("LiveValidation::initialize - No element reference or element id has been provided!");this.element=$(element);if(!this.element)throw new Error("LiveValidation::initialize - No element with reference or id of '"+element+"' exists!");this.elementType=this.getElementType();this.validations=[];this.form=this.element.form;this.options=Object.extend({validMessage:'Thankyou!',onValid:function(){this.insertMessage(this.createMessageSpan());this.addFieldClass();},onInvalid:function(){this.insertMessage(this.createMessageSpan());this.addFieldClass();},insertAfterWhatNode:this.element,onlyOnBlur:false,wait:0,onlyOnSubmit:false},optionsObj||{});var node=this.options.insertAfterWhatNode||this.element;this.options.insertAfterWhatNode=$(node);Object.extend(this,this.options);if(this.form){this.formObj=LiveValidationForm.getInstance(this.form);this.formObj.addField(this);}
this.boundFocus=this.doOnFocus.bindAsEventListener(this);Event.observe(this.element,'focus',this.boundFocus);if(!this.onlyOnSubmit){switch(this.elementType){case LiveValidation.CHECKBOX:this.boundClick=this.validate.bindAsEventListener(this);Event.observe(this.element,'click',this.boundClick);case LiveValidation.SELECT:case LiveValidation.FILE:this.boundChange=this.validate.bindAsEventListener(this);Event.observe(this.element,'change',this.boundChange);break;default:if(!this.onlyOnBlur){this.boundKeyup=this.deferValidation.bindAsEventListener(this);Event.observe(this.element,'keyup',this.boundKeyup);}
this.boundBlur=this.validate.bindAsEventListener(this);Event.observe(this.element,'blur',this.boundBlur);}}},destroy:function(){if(this.formObj){this.formObj.removeField(this);this.formObj.destroy();}
Event.stopObserving(this.element,'focus',this.boundFocus);if(!this.onlyOnSubmit){switch(this.elementType){case LiveValidation.CHECKBOX:Event.stopObserving(this.element,'click',this.boundClick);case LiveValidation.SELECT:case LiveValidation.FILE:Event.stopObserving(this.element,'change',this.boundChange);break;default:if(!this.onlyOnBlur)Event.stopObserving(this.element,'keyup',this.boundKeyup);Event.stopObserving(this.element,'blur',this.boundBlur);}}
this.validations=[];this.removeMessageAndFieldClass();},add:function(validationFunction,validationParamsObj){this.validations.push({type:validationFunction,params:validationParamsObj||{}});return this;},remove:function(validationFunction,validationParamsObj){this.validations=this.validations.reject(function(v){return(v.type==validationFunction&&v.params==validationParamsObj);});return this;},deferValidation:function(e){if(this.wait>=300)this.removeMessageAndFieldClass();if(this.timeout)clearTimeout(this.timeout);this.timeout=setTimeout(this.validate.bind(this),this.wait);},doOnBlur:function(){this.focused=false;this.validate();},doOnFocus:function(){this.focused=true;},getElementType:function(){switch(true){case(this.element.nodeName.toUpperCase()=='TEXTAREA'):return LiveValidation.TEXTAREA;case(this.element.nodeName.toUpperCase()=='INPUT'&&this.element.type.toUpperCase()=='TEXT'):return LiveValidation.TEXT;case(this.element.nodeName.toUpperCase()=='INPUT'&&this.element.type.toUpperCase()=='PASSWORD'):return LiveValidation.PASSWORD;case(this.element.nodeName.toUpperCase()=='INPUT'&&this.element.type.toUpperCase()=='CHECKBOX'):return LiveValidation.CHECKBOX;case(this.element.nodeName.toUpperCase()=='INPUT'&&this.element.type.toUpperCase()=='FILE'):return LiveValidation.FILE;case(this.element.nodeName.toUpperCase()=='SELECT'):return LiveValidation.SELECT;case(this.element.nodeName.toUpperCase()=='INPUT'):throw new Error('LiveValidation::getElementType - Cannot use LiveValidation on an '+this.element.type+' input!');default:throw new Error('LiveValidation::getElementType - Element must be an input, select, or textarea!');}},doValidations:function(){this.validationFailed=false;for(var i=0,len=this.validations.length;i<len;++i){var validation=this.validations[i];switch(validation.type){case Validate.Presence:case Validate.Confirmation:case Validate.Acceptance:this.displayMessageWhenEmpty=true;this.validationFailed=!this.validateElement(validation.type,validation.params);break;default:this.validationFailed=!this.validateElement(validation.type,validation.params);break;}
if(this.validationFailed)return false;}
this.message=this.validMessage;return true;},validateElement:function(validationFunction,validationParamsObj){var value=(this.elementType==LiveValidation.SELECT)?this.element.options[this.element.selectedIndex].value:this.element.value;if(validationFunction==Validate.Acceptance){if(this.elementType!=LiveValidation.CHECKBOX)throw new Error('LiveValidation::validateElement - Element to validate acceptance must be a checkbox!');value=this.element.checked;}
var isValid=true;try{validationFunction(value,validationParamsObj);}catch(error){if(error instanceof Validate.Error){if(value!==''||(value===''&&this.displayMessageWhenEmpty)){this.validationFailed=true;this.message=error.message;isValid=false;}}else{throw error;}}finally{return isValid;}},validate:function(){if(!this.element.disabled){var isValid=this.doValidations();if(isValid){this.onValid();return true;}else{this.onInvalid();return false;}}else{return true;}},enable:function(){this.element.disabled=false;return this;},disable:function(){this.element.disabled=true;this.removeMessageAndFieldClass();return this;},createMessageSpan:function(){var span=document.createElement('span');var textNode=document.createTextNode(this.message);span.appendChild(textNode);return span;},insertMessage:function(elementToInsert){this.removeMessage();var className=this.validationFailed?this.invalidClass:this.validClass;if((this.displayMessageWhenEmpty&&(this.elementType==LiveValidation.CHECKBOX||this.element.value==''))||this.element.value!=''){$(elementToInsert).addClassName(this.messageClass+(' '+className));if(nxtSibling=this.insertAfterWhatNode.nextSibling){this.insertAfterWhatNode.parentNode.insertBefore(elementToInsert,nxtSibling);}else{this.insertAfterWhatNode.parentNode.appendChild(elementToInsert);}}},addFieldClass:function(){this.removeFieldClass();if(!this.validationFailed){if(this.displayMessageWhenEmpty||this.element.value!=''){if(!this.element.hasClassName(this.validFieldClass))this.element.addClassName(this.validFieldClass);}}else{if(!this.element.hasClassName(this.invalidFieldClass))this.element.addClassName(this.invalidFieldClass);}},removeMessage:function(){if(nxtEl=this.insertAfterWhatNode.next('.'+this.messageClass))nxtEl.remove();},removeFieldClass:function(){this.element.removeClassName(this.invalidFieldClass);this.element.removeClassName(this.validFieldClass);},removeMessageAndFieldClass:function(){this.removeMessage();this.removeFieldClass();}}
var LiveValidationForm=Class.create();Object.extend(LiveValidationForm,{instances:{},getInstance:function(element){var rand=Math.random()*Math.random();if(!element.id)element.id='formId_'+rand.toString().replace(/\./,'')+new Date().valueOf();if(!LiveValidationForm.instances[element.id])LiveValidationForm.instances[element.id]=new LiveValidationForm(element);return LiveValidationForm.instances[element.id];}});LiveValidationForm.prototype={initialize:function(element){this.element=$(element);this.fields=[];this.oldOnSubmit=this.element.onsubmit||function(){};this.element.onsubmit=function(e){var ret=(LiveValidation.massValidate(this.fields))?this.oldOnSubmit.call(this.element,e)!==false:false;if(!ret)Event.stop(e)}.bindAsEventListener(this);},addField:function(lvObj){this.fields.push(lvObj);},removeField:function(victim){this.fields=this.fields.without(victim);},destroy:function(force){if(this.fields.length!=0&&!force)return false;this.element.onsubmit=this.oldOnSubmit;LiveValidationForm.instances[this.element.id]=null;return true;}}
var Validate={Presence:function(value,paramsObj){var params=Object.extend({failureMessage:"Can't be empty!"},paramsObj||{});if(value===''||value===null||value===undefined)Validate.fail(params.failureMessage);return true;},Numericality:function(value,paramsObj){var suppliedValue=value;var value=Number(value);var paramsObj=paramsObj||{};var params={notANumberMessage:paramsObj.notANumberMessage||"Must be a number!",notAnIntegerMessage:paramsObj.notAnIntegerMessage||"Must be an integer!",wrongNumberMessage:paramsObj.wrongNumberMessage||"Must be "+paramsObj.is+"!",tooLowMessage:paramsObj.tooLowMessage||"Must not be less than "+paramsObj.minimum+"!",tooHighMessage:paramsObj.tooHighMessage||"Must not be more than "+paramsObj.maximum+"!",is:((paramsObj.is)||(paramsObj.is==0))?paramsObj.is:null,minimum:((paramsObj.minimum)||(paramsObj.minimum==0))?paramsObj.minimum:null,maximum:((paramsObj.maximum)||(paramsObj.maximum==0))?paramsObj.maximum:null,onlyInteger:paramsObj.onlyInteger||false};if(!isFinite(value))Validate.fail(params.notANumberMessage);if(params.onlyInteger&&((/\.0+$|\.$/.test(String(suppliedValue)))||(value!=parseInt(value))))Validate.fail(params.notAnIntegerMessage);switch(true){case(params.is!==null):if(value!=Number(params.is))Validate.fail(params.wrongNumberMessage);break;case(params.minimum!==null&&params.maximum!==null):Validate.Numericality(value,{tooLowMessage:params.tooLowMessage,minimum:params.minimum});Validate.Numericality(value,{tooHighMessage:params.tooHighMessage,maximum:params.maximum});break;case(params.minimum!==null):if(value<Number(params.minimum))Validate.fail(params.tooLowMessage);break;case(params.maximum!==null):if(value>Number(params.maximum))Validate.fail(params.tooHighMessage);break;}
return true;},Format:function(value,paramsObj){var value=String(value);var params=Object.extend({failureMessage:"Not valid!",pattern:/./,negate:false},paramsObj||{});if(!params.negate&&!params.pattern.test(value))Validate.fail(params.failureMessage);if(params.negate&&params.pattern.test(value))Validate.fail(params.failureMessage);return true;},Email:function(value,paramsObj){var params=Object.extend({failureMessage:"Must be a valid email address!"},paramsObj||{});Validate.Format(value,{failureMessage:params.failureMessage,pattern:/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i});return true;},Length:function(value,paramsObj){var value=String(value);var paramsObj=paramsObj||{};var params={wrongLengthMessage:paramsObj.wrongLengthMessage||"Must be "+paramsObj.is+" characters long!",tooShortMessage:paramsObj.tooShortMessage||"Must not be less than "+paramsObj.minimum+" characters long!",tooLongMessage:paramsObj.tooLongMessage||"Must not be more than "+paramsObj.maximum+" characters long!",is:((paramsObj.is)||(paramsObj.is==0))?paramsObj.is:null,minimum:((paramsObj.minimum)||(paramsObj.minimum==0))?paramsObj.minimum:null,maximum:((paramsObj.maximum)||(paramsObj.maximum==0))?paramsObj.maximum:null}
switch(true){case(params.is!==null):if(value.length!=Number(params.is))Validate.fail(params.wrongLengthMessage);break;case(params.minimum!==null&&params.maximum!==null):Validate.Length(value,{tooShortMessage:params.tooShortMessage,minimum:params.minimum});Validate.Length(value,{tooLongMessage:params.tooLongMessage,maximum:params.maximum});break;case(params.minimum!==null):if(value.length<Number(params.minimum))Validate.fail(params.tooShortMessage);break;case(params.maximum!==null):if(value.length>Number(params.maximum))Validate.fail(params.tooLongMessage);break;default:throw new Error("Validate::Length - Length(s) to validate against must be provided!");}
return true;},Inclusion:function(value,paramsObj){var params=Object.extend({failureMessage:"Must be included in the list!",within:[],allowNull:false,partialMatch:false,caseSensitive:true,negate:false},paramsObj||{});if(params.allowNull&&value==null)return true;if(!params.allowNull&&value==null)Validate.fail(params.failureMessage);if(!params.caseSensitive){var lowerWithin=[];params.within.each(function(item){if(typeof item=='string')item=item.toLowerCase();lowerWithin.push(item);});params.within=lowerWithin;if(typeof value=='string')value=value.toLowerCase();}
var found=(params.within.indexOf(value)==-1)?false:true;if(params.partialMatch){found=false;params.within.each(function(arrayVal){if(value.indexOf(arrayVal)!=-1)found=true;});}
if((!params.negate&&!found)||(params.negate&&found))Validate.fail(params.failureMessage);return true;},Exclusion:function(value,paramsObj){var params=Object.extend({failureMessage:"Must not be included in the list!",within:[],allowNull:false,partialMatch:false,caseSensitive:true},paramsObj||{});params.negate=true;Validate.Inclusion(value,params);return true;},Confirmation:function(value,paramsObj){if(!paramsObj.match)throw new Error("Validate::Confirmation - Error validating confirmation: Id of element to match must be provided!");var params=Object.extend({failureMessage:"Does not match!",match:null},paramsObj||{});params.match=$(paramsObj.match);if(!params.match)throw new Error("Validate::Confirmation - There is no reference with name of, or element with id of '"+params.match+"'!");if(value!=params.match.value)Validate.fail(params.failureMessage);return true;},Acceptance:function(value,paramsObj){var params=Object.extend({failureMessage:"Must be accepted!"},paramsObj||{});if(!value)Validate.fail(params.failureMessage);return true;},Custom:function(value,paramsObj){var params=Object.extend({against:function(){return true;},args:{},failureMessage:"Not valid!"},paramsObj||{});if(!params.against(value,params.args))Validate.fail(params.failureMessage);return true;},now:function(validationFunction,value,validationParamsObj){if(!validationFunction)throw new Error("Validate::now - Validation function must be provided!");var isValid=true;try{validationFunction(value,validationParamsObj||{});}catch(error){if(error instanceof Validate.Error){isValid=false;}else{throw error;}}finally{return isValid}},Error:function(errorMessage){this.message=errorMessage;this.name='ValidationError';},fail:function(errorMessage){throw new Validate.Error(errorMessage);}}

//i18n.js


var I18N={defaultLanguage:'zh-CN',translations:{},$:function(key,args){var t=this.translations[this.language]
var dt=this.translations[this.defaultLanguage]
if(!t)t=dt
var v=t[key]||dt[key]
var s=(typeof v=='string'?v:v.apply(this,args))
return s},guessLanguage:function(){var lan=navigator.userLanguage;return(navigator.language||navigator.browserLanguage||navigator.userLanguage||this.defaultLanguage)}}
I18N.language=I18N.guessLanguage()
TL=function(){return I18N.$.apply(I18N,arguments)}
I18N.translations['zh-CN']={'success':'成功','fail':'错误','theme':'主题','login':'登录','ChangePassword':'修改密码','PasswordChanged':'密码修改成功！','SignupFail':'注册用户失败，稍后请重试！','PleaseInputUserName':'请输入用户名！6位以上英文或中文字符,最多12位','PleaseInputEmail':'请输入电子邮箱','PleaseInputPassword':'请输入密码！6位以上字母或数字组合，最多12位','PleaseInputConfirmPassword':'请输入确认密码','PleaseInputCaptcha':'请输入验证码','PasswordNotMatch':'确认密码与注册密码不一致','PleaseInputCorrectEmail':'电子邮箱输入有误','UserNameTooShort':'用户名不足6位','PasswordTooShort':'密码不足6位','PleaseInputAge':'请输入年龄！','PleaseInputGender':'请输入性别！','PleaseInputProvince':'请输入所在省市！','PleaseInputCity':'请输入所在城市！','UMustAgree':"您必须同意条款",'PhoneNumberMustNumber':'号码必须为数字！','PleaseInputDevice':'请输入关注终端','UsernameMustBeginWithCh':'用户名只能以字母或汉字开头!','UsernameMust1':'用户名只能使用字母、汉字或数字!','PleaseInputUploadImage':'请指定上传的图档','UnSupportedImageFormat':'不支持的文件格式','AppNameMustCharAndNumber':'只能使用英文或数字！'}
I18N.translations['zh-HK']={'success':'成功','fail':'錯誤','theme':'主題','login':'登入','ChangePassword':'修改密碼','PasswordChanged':'密碼修改成功！','SignupFail':'註冊用戶失敗，稍後請重試！','PleaseInputUserName':'請輸入用戶名！6個字元以上英文或中文字元,最多12字元','PleaseInputEmail':'請輸入電郵地址','PleaseInputPassword':'請輸入密碼！6個字元以上英文字母或數字組合，最多12字元','PleaseInputConfirmPassword':'請輸入確認密碼','PleaseInputCaptcha':'請輸入驗證碼','PasswordNotMatch':'確認密碼與註冊密碼不一致','PleaseInputCorrectEmail':'電郵地址輸入有誤','UserNameTooShort':'用戶名不足6個字元','PasswordTooShort':'密碼不足6個字元','PleaseInputAge':'請輸入年齡！','PleaseInputGender':'請輸入性別！','PleaseInputProvince':'請輸入所在省市！','PleaseInputCity':'請輸入所在城市！','UMustAgree':"您必須同意條款",'PhoneNumberMustNumber':'號碼必須為數字！','PleaseInputDevice':'請輸入關注終端','UsernameMustBeginWithCh':'用戶名只能以字母或漢字開頭!','UsernameMust1':'用戶名只能使用字母、漢字或數字!','PleaseInputUploadImage':'請指定上傳的圖檔','UnSupportedImageFormat':'不支持的文件格式','AppNameMustCharAndNumber':'只能使用字母或數字！'};