
Validator=Class.create();Validator.clearFep=function(){var fep=$('fep');if(!fep)return;wak.css.hide(fep);$('fepContent').innerHTML="";var errorElem=$(fep.__errorElemId);if(errorElem){errorElem.onkeydown=null;if(errorElem.type&&errorElem.type.search("select")==0){errorElem.onclick=errorElem.__onclick;}
wak.css.removeClass(errorElem,errorElem.__errorClass);}
fep.__errorElemId=null;if(fep.__delegate&&fep.__delegate.onClearFep){fep.__delegate.onClearFep(fep,fep.__parentElem);fep.__delegate=null;}};Validator.fepIsDisplayed=function(){return!wak.css.testComputedStyle('fep','visibility','hidden');}
Validator.keyFilters={'number':"0123456789",'zip':"0123456789-",'float':"0123456789.",'decimal2':"0123456789.",'phoneNumber':"01234567890()-+. ",'date':"01234567890/"}
Validator.negKeyFilters={'tableRowName':"<>;"}
Validator.zipToken='keyFilter="zip" onkeypress="return Validator.keystrokeMonitor(event);"';Validator.numberToken='keyFilter="number" onkeypress="return Validator.keystrokeMonitor(event);"';Validator.floatToken='keyFilter="float" onkeypress="return Validator.keystrokeMonitor(event);"';Validator.decimal2Token='keyFilter="decimal2" onkeypress="return Validator.keystrokeMonitor(event);"';Validator.phoneNumberToken='keyFilter="phoneNumber" onkeypress="return Validator.keystrokeMonitor(event);"';Validator.tableRowNameToken='keyFilter="tableRowName" onkeypress="return Validator.keystrokeMonitor(event);"';Validator.dateToken='keyFilter="date" onkeypress="return Validator.keystrokeMonitor(event);"';Validator.keystrokeMonitor=function(event){var e=event||window.event;var code=e.charCode||e.keyCode;var wakEvent=wak.event.create(e);if(e.charCode==0)return true;if(e.ctrlKey||e.altKey)return true;if(code<32)return true;var filterName=wakEvent.target.getAttribute("keyFilter");var legalChars=Validator.keyFilters[filterName];var illegalChars=Validator.negKeyFilters[filterName];if(!legalChars&&!illegalChars){wak.log.error("Validator.keystrokeMonitor -- unrecognized key filter: "+filterName);return true;}
var messageElement=null;var messageid=wakEvent.target.getAttribute("messageid");if(messageid)
messageElement=document.getElementById(messageid);var c=String.fromCharCode(code);if((legalChars&&legalChars.indexOf(c)!=-1)||(illegalChars&&illegalChars.indexOf(c)==-1)){if(messageElement)messageElement.style.visibility="hidden";switch(filterName){case"zip":var value=$F(wakEvent.target);if(c=='-'&&-1!=value.search("-")){if(e.preventDefault)e.preventDefault();if(e.returnValue)e.returnValue=false;return false;}
break;case"float":var value=$F(wakEvent.target);if(c=='.'&&-1!=value.search("\\.")){if(e.preventDefault)e.preventDefault();if(e.returnValue)e.returnValue=false;return false;}
break;case'decimal2':var value=$F(wakEvent.target);if(c=='.'&&-1!=value.search("\\.")){if(e.preventDefault)e.preventDefault();if(e.returnValue)e.returnValue=false;return false;}
break;}
return true;}else{if(messageElement)messageElement.style.visibility="visible";if(e.preventDefault)e.preventDefault();if(e.returnValue)e.returnValue=false;return false;}}
Validator.getValidEmailRegex=function(){var ATOM="[^\\x00-\\x1F^\\(^\\)^\\<^\\>^\\@^\\,^\\(;^\\:^\\\\^\\\"^\\.^\\[^\\]^\\s]";var DOMAIN="("+ATOM+"+(\\."+ATOM+"+)*";var IP_DOMAIN="\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]";var string="^"+ATOM+"+(\\."+ATOM+"+)*@"+DOMAIN+"|"+IP_DOMAIN+")$";return new RegExp(string,"i");}
Validator.prototype={_validRuleEntries:{'type':true,'label':true,'required':true,'trackChanged':true,'rpcParamName':true,'mustMatch':true,'userData':true},_validTypes:{'int':true,'float':true,'decimal2':true,'string':true,'email':true,'emailList':true,'password':true,'select':true,'radio':true,'checkbox':true,'date':true,'phoneNumber':true,'tableRowName':true,'creditCardNumber':true},_rowSuffix:null,_onChangeCallback:null,_rules:null,_errorClass:"lmFieldError",_generalErrorMsg:"Fix the indicated problems and try again.",_generalErrorElem:null,_fepOffsetElemOrId:null,_fepParentElemOrId:null,_suppressElemCheck:false,_delegate:null,_validEmailRegex:null,ctor:function(errClass,errMsg,errElemOrId,delegate,fepOffsetElemOrId,fepParentElemOrId){this._errorClass=errClass;this._generalErrorMsg=errMsg;this._generalErrorElem=$(errElemOrId);this._rules={};this._delegate=delegate;this._fepOffsetElemOrId=fepOffsetElemOrId?fepOffsetElemOrId:'lmBody1';this._fepParentElemOrId=fepParentElemOrId?fepParentElemOrId:'lmBody1';this._validEmailRegex=Validator.getValidEmailRegex();},setDelegate:function(delegate){this._delegate=delegate;},setRowSuffix:function(suffix){var oldRules=this._rules;if(!suffix)suffix='';this._rules={};for(var elemId in oldRules){var newElemId=elemId;if(this._rowSuffix){newElemId=newElemId.replace(this._rowSuffix,'');}
newElemId=newElemId+suffix;this.addInputRule(newElemId,oldRules[elemId]);}
this._rowSuffix=suffix;},showGroupError:function(msg){if(!wak.isDefined(msg)){msg=this._generalErrorMsg;}
if(this._generalErrorElem){wak.css.display(this._generalErrorElem,true);this._generalErrorElem.innerHTML=msg;}},clearGroupError:function(){if(this._generalErrorElem){wak.css.display(this._generalErrorElem,false);$(this._generalErrorElem).innerHTML='';}},positionFep:function(targetElemOrId,offsets){var body1=wak.elem('lmBody1');var target=wak.elem(targetElemOrId);var fep=wak.elem('fep');var dbg=false;var targetB=wak.geometry.bounds(target);var bodyB=wak.geometry.bounds(body1);var fepB=wak.geometry.bounds(fep);var left=0;if(targetB.width>bodyB.width*.75){left=targetB.left+Math.max(targetB.width*.2,40);}else{var bodyMidPoint=bodyB.left+(bodyB.width*.5);var targetMidPoint=targetB.left+(targetB.width*.5);var offsetToLeft=targetMidPoint>bodyMidPoint?true:false;if(offsetToLeft){left=targetMidPoint-fepB.width+13;if(dbg)wak.log.error('left: '+left+' = '+targetMidPoint+' - '+fepB.width+' + 13');wak.css.removeClass('fepTop','lmFepTopLeft');wak.css.addClass('fepTop','lmFepTopRight');}else{left=targetMidPoint-13;if(dbg)wak.log.error('left: '+left+' = '+targetMidPoint+' - 13');wak.css.removeClass('fepTop','lmFepTopRight');wak.css.addClass('fepTop','lmFepTopLeft');}}
fepB.left=left;fepB.top=targetB.top+targetB.height;if(offsets){for(var field in offsets){fepB[field]+=offsets[field];}}
if(this._fepOffsetElemOrId){var offsetB=wak.geometry.bounds(this._fepOffsetElemOrId);fepB.left=fepB.left-offsetB.left;fepB.top=fepB.top-offsetB.top;}
fep.style.left=fepB.left+'px';fep.style.top=fepB.top+'px';},scrollToError:function(elemOrId){var elem=$(elemOrId);var elemB=wak.geometry.bounds(elem);var visB=wak.geometry.visibleBounds();var fepB=wak.geometry.bounds('fep');if(elemB.top-25<visB.top){elem.scrollIntoView(true);window.scrollBy(0,-25);return;}
if(fepB.top+fepB.height>visB.top+visB.height){totalHeight=(fepB.top+fepB.height)-elemB.top;if(totalHeight<visB.height){$('fep').scrollIntoView(false);return;}}
if(elemB.top+elemB.height>visB.top+visB.height){elem.scrollIntoView(false);return;}},showFep:function(errorElemOrId,msg){var errorElem=$(errorElemOrId);var fep=$('fep');if(fep&&fep.__parentElem&&$I(fep.__parentElem)!=$I(this._fepParentElemOrId)){var parentElem=$(fep.__parentElem);parentElem.removeChild(fep);fep=null;}
if(!fep){var parentElem=$(this._fepParentElemOrId);fep=parentElem.appendChild(wak.html.parseHTMLFragment(g_fep));fep.__parentElem=parentElem;}
if(fep){var fepContent=$('fepContent');if(fepContent&&fepContent.innerHTML==""){fepContent.innerHTML=msg;wak.event.listen('fepClose','click',Validator.clearFep);this.positionFep(errorElem);if(this._delegate&&this._delegate.onShowFep){fep.__delegate=this._delegate;this._delegate.onShowFep(this,fep,fep.__parentElem);}
wak.css.addClass(errorElem,this._errorClass);errorElem.__errorClass=this._errorClass;if(this._rules[errorElem.id]&&this._rules[errorElem.id].type!="date"){errorElem.focus();}
wak.css.show('fep');this.scrollToError(errorElem);fep.__errorElemId=errorElem.id;errorElem.onkeydown=Validator.clearFep;if(errorElem.type&&(errorElem.type.search("select")==0||errorElem.type.search("checkbox")==0)){errorElem.__onclick=errorElem.onclick;errorElem.onclick=Validator.clearFep;}}
var ie6Iframe=$('fepIFrame');if(ie6Iframe){var bounds=wak.geometry.bounds('fep');ie6Iframe.style.width=bounds.width+'px';ie6Iframe.style.height=bounds.height+'px';}}},showError:function(inputElemOrId,msg){var errorElemId=$(inputElemOrId).id+"Error";var errorElem=$(errorElemId);if(errorElem){if(!wak.isDefined(errorElem.__originalErrorElemInnerHTML)){errorElem.__originalErrorElemInnerHTML=errorElem.innerHTML;}
errorElem.innerHTML=msg;wak.css.addClass(errorElem,this._errorClass);wak.css.addClass(inputElemOrId,this._errorClass);wak.css.display(errorElem,true);wak.css.display(inputElemOrId,true);}else{this.showGroupError();this.showFep(inputElemOrId,msg);}},clearError:function(inputElemOrId){var errorElemId=$(inputElemOrId).id+"Error";var errorElem=$(errorElemId);if(errorElem&&wak.isDefined(errorElem.__originalErrorElemInnerHTML)){errorElem.innerHTML=errorElem.__originalErrorElemInnerHTML;wak.css.removeClass(errorElem,this._errorClass);}},clearAllErrors:function(){for(var elemId in this._rules){var rule=this._rules[elemId];clearError(elemId);}
this.clearGroupError();Validator.clearFep();},storeOriginalValue:function(inputElem,rule,force){if(!wak.isDefined(inputElem.__originalValue)||force){inputElem.__originalValue=$F(inputElem);}},hasChangedValue:function(inputElem,doNotify){var result=false;if(wak.isDefined(inputElem.__originalValue)){var value=$F(inputElem);if(!wak.string.isEqualSmart(value,inputElem.__originalValue)){result=true;if(doNotify&&this._delegate&&this._delegate.valueHasChanged){this._delegate.valueHasChanged(inputElem,inputElem.__originalValue);}}}
return result;},onDatePickerOpen:function(elemOrId){var elem=$(elemOrId);if(this._rules[elem.id]){var fep=$('fep');if(fep&&fep.__errorElemId==elem.id){Validator.clearFep();}}},onDatePickerClose:function(elemOrId,aDate,defaultText){var elem=$(elemOrId);if($F(elem)!=defaultText){this.validateInput(elem,true);}},validateEmail:function(email){var res=this._validEmailRegex.exec(email);return res&&res[3];},validateAllFields:function(suppressErrors,userData){if(!this._rules){wak.log.error("Validator.validateAllFields -- No rules have been set.");return{};}
Validator.clearFep();var invalidInputs={};for(var elemId in this._rules){var result=this.validateInputSilent(elemId,userData);if(result){invalidInputs[elemId]=result.errMsg;}else if($(elemId)){wak.css.removeClass(elemId,this._errorClass);}}
for(var elemId in this._rules){var rule=this._rules[elemId];var inputElem=$(elemId);if(this._delegate&&this._delegate.shouldValidateInput&&!this._delegate.shouldValidateInput(this,elemId,rule,userData)){continue;}
var value=$F(inputElem);var checkboxMustBeChecked=rule.type=='checkbox'&&rule.userData&&rule.userData.mustBeChecked;if(rule.required&&rule.type!='checkbox'&&wak.string.isEmpty(value)||(rule.type=='checkbox'&&checkboxMustBeChecked&&!value)){var errMsg='"'+rule.label+'" is a required field.';if(rule.userData&&rule.userData.reqErrorMsg){errMsg=rule.userData.reqErrorMsg;}
if(!invalidInputs[elemId]){invalidInputs[elemId]=errMsg;}}}
var errors=false;for(var elemId in invalidInputs){errors=true;break;}
if(!errors&&this._delegate&&this._delegate.validateAllFields){invalidInputs=this._delegate.validateAllFields(this,userData);}
for(var elemId in invalidInputs){if(!suppressErrors)this.showError(elemId,invalidInputs[elemId]);errors=true;break;}
if(errors){if(suppressErrors){this.showGroupError();if(!Validator.fepIsDisplayed()){wak.animate.scroll(0);}}
return invalidInputs;}else if(this._generalErrorElem){wak.css.display(this._generalErrorElem,false);this.clearGroupError();}
this.clearGroupError();return null;},validateInput:function(inputOrInputId,userData){var result=this.validateInputSilent(inputOrInputId,userData);if(result){this.showError(result.elemId,result.errMsg);}},validateInputSilent:function(inputOrInputId,userData){if(this._delegate&&this._delegate.shouldValidateInput&&!this._delegate.shouldValidateInput(this,inputOrInputId,this._rules[$I(inputOrInputId)],userData)){return null;}
var inputElem=$(inputOrInputId);if(!inputElem){wak.log.error("Validator.validateInput -- Can't find input for id: ",inputOrInputId);return null;}
var errorElem=$(inputElem.id+"Error");var value=$F(inputElem);this.clearError(inputElem);var rule=this._rules[inputElem.id];if(!rule){return null;}
this.hasChangedValue(inputElem,true);if(!value){return null;}
var type=rule['type'];var result=null;var errMsg=null;switch(type){case'int':if(!value.match("^\\d{1,9}$")){errMsg="Enter only numbers into this field";result=inputElem;}
if(rule.userData&&wak.isDefined(rule.userData['max'])){var max=rule.userData['max'];if(value>max){errMsg="Must be less than or equal to "+max;result=inputElem;}}
if(rule.userData&&wak.isDefined(rule.userData['min'])){var min=rule.userData['min'];if(value<min){errMsg="Must be greater than or equal to "+min;result=inputElem;}}
break;case'float':if(!value.match("^[-]*\\d+$")&&!value.match("^[-]*\\d+\.\\d*$")&&!value.match("^[-]*\\d*\.\\d+$")){errMsg="Enter only numbers like 3 or 1.75 or .5";result=inputElem;}
if(rule.userData&&wak.isDefined(rule.userData['max'])){var max=rule.userData['max'];if(value>max){errMsg="Must be less than or equal to "+max;result=inputElem;}}
if(rule.userData&&wak.isDefined(rule.userData['min'])){var min=rule.userData['min'];if(value<min){errMsg="Must be greater than or equal to "+min;result=inputElem;}}
break;case'decimal2':if(!value.match("^\\d+$")&&!value.match("^\\d+\.\\d{0,2}$")&&!value.match("^\\d*\.\\d{1,2}$")){errMsg="Enter only numbers like: 3, 19.50, 1.75 or .25";result=inputElem;}
if(rule.userData&&wak.isDefined(rule.userData['max'])){var max=rule.userData['max'];if(value>max){errMsg="Must be less than or equal to "+max;result=inputElem;}}
if(rule.userData&&wak.isDefined(rule.userData['min'])){var min=rule.userData['min'];if(value<min){errMsg="Must be greater than or equal to "+min;result=inputElem;}}
break;case'email':if(!this.validateEmail(value)){errMsg="Must look like: person@company.com";result=inputElem;}
break;case'emailList':var listOfEmails=value.split(/[,;]/);numEmails=listOfEmails.length;for(var i=0;i<numEmails;i++){var anEmail=listOfEmails[i].trim();if(!this.validateEmail(anEmail)){if(numEmails==1){errMsg="Must look like: person@company.com";}else{errMsg="Must look like: person@company.com, anotherperson@place.com";}
result=inputElem;}}
break;case'password':if(value.length<6||value.length>24){errMsg="Must consist of 6-24 characters";result=inputElem;}else if(!value.match(/^[-\w\d!@#$%^&*()_+=;.,\\]+$/)){errMsg="Must contain only letters, numbers, and the following puctuation marks: !@#$%^&*()_-+=;.,";result=inputElem;}
break;case'phoneNumber':if(!value.match("^[0-9 \(\)\-\.+]+$")){errMsg="Can only contain numbers and the following letters: ()-.+;";result=inputElem;}
break;case'creditCardNumber':if(!this.isMaskedCcNumber(value)){if(value.match(/[^\s\d\-]+/)){errMsg="Can only contain numbers, spaces, and dashes.";result=inputElem;}else{var numsOnly=value.replace(/[^\d]/g,'');if(!this.isValidCcNumber(numsOnly)){errMsg="Invalid credit card number.";result=inputElem;}}}
break;case'string':if(rule.userData&&wak.isDefined(rule.userData['maxLength'])){var max=rule.userData['maxLength'];if(max&&max>0&&value.length>max){errMsg="Must contain less than "+max+"characters";result=inputElem;}}
break;case'tableRowName':if(value.match("[<>;]+")){errMsg="Name must not contain the following characters: >, <, or ;";result=inputElem;}
if(value.length>24){errMsg="Must not contain more than 24 characters";result=inputElem;}
case'select':if(value==""){errMsg="Must select a value for this field";result=inputElem;}
break;case'radio':if(value==0){errMsg="Must choose one of these options";result=inputElem;}
break;case'checkbox':break;case'date':var date=Date.parseSimpleDate(value);if(!date||isNaN(date.valueOf())){errMsg="This is an invalid date, please enter a month and day";result=inputElem;}
break;default:wak.log.error("Validator.validateInput -- invalid 'type' value in switch statement, type:",type);break;}
var matchFieldName=rule['mustMatch'];if(matchFieldName&&$F(inputElem)!=$F(matchFieldName)){errMsg="Must retype to match the value in '"+this._rules[matchFieldName].label+"' field";result=inputElem;}
var answer=null;if(result){answer={'elemId':inputElem,'errMsg':errMsg};}
if(!answer&&this._delegate&&this._delegate.validateInput){answer=this._delegate.validateInput(this,inputElem,rule,userData);}
return answer;},getRpcParams:function(changedOnly,validOnly,params,ignoreMissingElems){if(!params)params={};for(var elemId in this._rules){var rule=this._rules[elemId];var rpcParamName=rule['rpcParamName'];var elem=$(elemId);if(ignoreMissingElems&&!elem)continue;var value=$F(elemId);if(rpcParamName!="void"&&(!changedOnly||!this.hasChangedValue(elem,false))&&(!validOnly||rule.type=='checkbox'||(!wak.string.isEmpty(value)&&!this.validateInputSilent(elemId)))){if(wak.string.isEmpty(rpcParamName)){rpcParamName=elemId;}
params[rpcParamName]=value;}}
return params;},checkInputRule:function(inputOrInputId,rule){if(!rule||!wak.isDefined(inputOrInputId)){wak.log.error("Validator.checkInputRule -- rule is null or missing elemId property",rule);}
var inputElem=$(inputOrInputId);if(!this._suppressElemCheck&&!inputElem){wak.log.error("Validator.checkInputRule -- not able to find input for inputOrInputId",inputOrInputId);return false;}
var result=true;for(var prop in rule){if(!this._validRuleEntries[prop]){wak.log.error("Validator.checkInputRule -- Invalid rule prop: "+prop+"on element name: "+inputOrInputId);result=false;}
if(prop=="type"){var type=rule['type'];if(!this._validTypes[type]){wak.log.error("Validator.checkInputRule -- Invalid type specified, elemName: "+inputOrInputId+" type: "+type);result=false;}}
if(prop=="mustMatch"&&rule[prop]&&!$(rule[prop])){wak.log.error("Validator.checkInputRule -- Invalid mustMatch specified, elemName: "+inputOrInputId+" mustMatch: "+rule[prop]);return null;}}
return result;},addInputRule:function(inputOrInputId,rule){var inputElem=$(inputOrInputId);if(!this._suppressElemCheck&&!this._suppressElemCheck&&!inputElem){wak.log.error("Validator.addInputRule -- can't find elem for id: ",inputOrInputId);return false;}
if(!rule){wak.log.error("Validator.addInputRule -- null rule argument");return false;}
if(this.checkInputRule(inputElem,rule)){var eid=$I(inputOrInputId);this._rules[eid]=rule;if(inputElem&&!rule.type=="date"){inputElem.onblur=function(){this.validateInput(inputElem.id,true);}.bindEventListener(this);this.storeOriginalValue(inputElem,rule,false);}}
return true;},removeInputRule:function(inputOrInputId){var eid=$I(inputOrInputId);if(this._rules[eid])delete this._rules[eid];},getRules:function(){return this._rules;},getRule:function(elemOrElemId){return this._rules[$I(elemOrElemId)];},appendInputRule:function(inputOrInputId,type,labelText,required,trackChanged,rpcParamName,mustMatch,userData){var inputElem=$(inputOrInputId);if(!this._suppressElemCheck&&!inputElem){wak.log.error("Validator.appendInputRule -- unable to find obj for inputOrInputId: \""+inputOrInputId+"\"");return null;}
var rule={'type':type,'label':labelText,'required':required,'trackChanged':trackChanged,'rpcParamName':rpcParamName,'mustMatch':mustMatch,'userData':userData}
return this.addInputRule(inputOrInputId,rule)?rule:null;},setElemValues:function(obj,force){if(!obj)return;for(var elemId in this._rules){var rule=this._rules[elemId];if(rule.rpcParamName!="void"){var rpcName=rule.rpcParamName?rule.rpcParamName:elemId;var rawName='__'+rpcName+'Raw';var elem=$(elemId);if(elem&&(rule.type=='checkbox'||(wak.string.isEmpty($F(elem))||force))){if(rule.type=='checkbox'){elem.checked=obj[rpcName];}else if(rule.type=='decimal2'){var value=obj[rpcName];var aNum=Number(value);if(value!=null&&aNum!=NaN){elem.value=aNum==0?aNum:aNum.toFixed(2);}}else if(rule.type=='date'){var value=obj[rpcName];var sValue=value.getSimpleDateString();elem.value=sValue;}else{var value=obj[rawName]?obj[rawName]:obj[rpcName];if(!wak.isDefined(value)||value==null)value='';elem.value=value;}}
this.storeOriginalValue(elem,rule,true);}}},clearElemValues:function(){for(var elemId in this._rules){var rule=this._rules[elemId];var elem=$(elemId);if(elem){if(rule.type!='checkbox'){elem.value='';}else{elem.checked=0;}}}},getElemIdForRpcName:function(rpcName){for(var elemId in this._rules){var rule=this._rules[elemId];if(rule.rpcParamName==rpcName){return elemId;}}
if(this._rules[rpcName]){return rpcName;}
return null;},trackFieldLength:function(inputOrInputId,maxLen,displayFieldElemOrID){var elem=$(inputOrInputId);var lastValue=null;if(!this._suppressElemCheck&&!elem){wak.log.error("Validator.trackFieldLength -- unable to find obj for inputOrInputId: \""+inputOrInputId+"\"");return null;}
composedDisplayFieldElemOrID=(displayFieldElemOrID!=null)?displayFieldElemOrID:elem.id+'CharsRemaining';var displayFieldElem=$(composedDisplayFieldElemOrID);if(!this._suppressElemCheck&&!displayFieldElem){var isAutoGenerated="";if(displayFieldElemOrID==null){isAutoGenerated="auto-generated ";}
wak.log.error("Validator.trackFieldLength -- unable to find obj for "+isAutoGenerated+"displayFieldElemOrID: \""+composedDisplayFieldElemOrID+"\"");return null;}
var setCharsRemaining=function(){var charsLeft=maxLen-elem.value.length;displayFieldElem.innerHTML="("+charsLeft+" characters remaining)";}
var downListener=function(event){event=new WakEvent(event);if(event.target.value.length>maxLen){lastValue=event.target.value.substr(0,maxLen);}else{lastValue=event.target.value;}}
var upListener=function(event){event=new WakEvent(event);var evt=event.evt;var curValue=event.target.value;if(curValue.length>maxLen){event.target.value=lastValue;}else{setCharsRemaining();}}
if(elem.value.length>maxLen){elem.value=elem.value.substr(0,maxLen);}
wak.event.listen(elem,'keydown',downListener);wak.event.listen(elem,'keyup',upListener);setCharsRemaining();},resetOriginalValues:function(){for(var elemId in this._rules){var rule=this._rules[elemId];this.storeOriginalValue($(elemId),rule,true);}},hasChanges:function(){var result=false;for(var elemId in this._rules){var rule=this._rules[elemId];var elem=$(elemId);var value=$F(elemId);if(!wak.string.isEqualSmart(value,elem.__originalValue)){result=true;break;}}
return result;},showAddressInvalidError:function(elemOrId,data){if(data){var correctionMade=false;var addressInvalidMsg='';var fieldCorrectedMsg='';data.each(function(d){switch(d.subcode){case"AddressInvalid":addressInvalidMsg=d.msg;break;case"FieldCorrected":if(d.field!="addrCountry"){var targetElemId=this.getElemIdForRpcName(d.field);var postedValue=$F(targetElemId);var targetLabel=this._rules[targetElemId].label;$(targetElemId).value=d.correction;fieldCorrectedMsg+="<br>Changed "+targetLabel+" from: "+postedValue+" to: "+d.correction;}}}.bind(this));this.showError(elemOrId,addressInvalidMsg+fieldCorrectedMsg);}},isMaskedCcNumber:function(ccNumber){var res=false;var mr=ccNumber.match(/^[\s\d\-x]+$/);if(mr){var numsOnly=ccNumber.replace(/[^\d]/g,'');res=numsOnly&&numsOnly.length==4;}
return res;},isValidCcNumber:function(ccNumber){if(ccNumber.length>19)
return false;if(ccNumber.length<14||ccNumber.length>16){return false;}
sum=0;mul=1;l=ccNumber.length;for(i=0;i<l;i++){digit=ccNumber.substring(l-i-1,l-i);tproduct=parseInt(digit,10)*mul;if(tproduct>=10){sum+=(tproduct%10)+1;}else{sum+=tproduct;}
(mul==1)?mul++:mul--;}
return(sum%10)==0?true:false;},isValidCcNumberForType:function(ccType,ccNumber){var numsOnly=ccNumber.replace(/[^\d]/g,'');var res=this.isValidCcNumber(numsOnly);if(res){res=false;switch(ccType){case'MASTERCARD':if(numsOnly.length==16){var preNum=numsOnly.substr(0,2);if(51<=preNum&&preNum<=55){res=true;}}
break;case'VISA':if((numsOnly.length==13||numsOnly.length==16)&&numsOnly.substr(0,1)==4){res=true;}
break;case'AMERICAN_EXPRESS':if(numsOnly.length==15){var preNum=numsOnly.substr(0,2);if(preNum==34||preNum==37){res=true;}}
break;case'DISCOVER':if(numsOnly.length==16&&numsOnly.substr(0,4)==6011){res=true;}
break;case'DINERS_CLUB':if(numsOnly.length==14){var preNum1=numsOnly.substr(0,2);var preNum2=numsOnly.substr(0,3);if(preNum1==36||preNum1==38||(preNum2>=300&&preNum2<=305)){res=true;}}}}
return res;}};