var maskCh_DIGIT='#';var maskCh_ALPHANUM='a';var maskCh_ALPHAUPPER='L';var maskCh_ALPHA='l';var maskCh_AMPM='t';var maskCh_ESCAPE='\\';var VK_BACKSPACE=8;var VK_DELETE=46;var VK_LEFT=39;var VK_RIGHT=37;var VK_END=35;var VK_HOME=36;var EnumMaskDataType={Literal:0,Digit:1,AlphaNum:2,AlphaUp:3,Alpha:4,AmPm:5,Escape:6};
var RDMaskData=function(type,value){this._type=type||EnumMaskDataType.Literal;this._chValue=value||""}
RDMaskData.prototype.isInputData=function(){return(this._type!=EnumMaskDataType.Literal&&this._type!=EnumMaskDataType.Escape)}
RDMaskData.prototype.isValidInput=function(keyCode){var isValid=false;switch(this._type){case EnumMaskDataType.Digit:isValid=_isDigit(keyCode);break;case EnumMaskDataType.AlphaNum:isValid=_isAlphaNum(keyCode);break;case EnumMaskDataType.Alpha:case EnumMaskDataType.AlphaUp:isValid=_isAlpha(keyCode);break;case EnumMaskDataType.AmPm:isValid=_isAMPM(keyCode);break}return isValid}
RDMaskData.prototype.preProcessChar=function(char){if(this._type==EnumMaskDataType.AlphaUp||this._type==EnumMaskDataType.AmPm)return String(char).toUpperCase();else return char}
var RDMaskEdit=function(field,mask,reValidator){if(!field||field.disabled)return;
var edit=this.edit=field;var currValue=edit.value;this.mask=mask;this.dir='ltr';this.reValidator=reValidator?reValidator:null;this.placeholder='_';this._data=new Array();edit.value='';this.setMask();if(currValue!=''&&RDMaskEdit_validateMask(this,currValue)){this.setInputData(currValue)}rd_addEventListenerEx(edit,"focus",RDMaskEdit_onFocus,this);rd_addEventListenerEx(edit,"keydown",RDMaskEdit_onKeyDown,this);rd_addEventListenerEx(edit,"keypress",RDMaskEdit_onKeyPress,this);rd_addEventListenerEx(edit,"change",RDMaskEdit_onChange,this)}
RDMaskEdit.prototype.setMask=function(){var edit=this.edit;var maskChar;var mask=this.mask;for(var pos=0;(maskChar=mask.charAt(pos))!='';pos++){var maskData=new RDMaskData();this._data[this._data.length]=maskData;switch(maskChar){case maskCh_DIGIT:maskData._type=EnumMaskDataType.Digit;maskData._chValue=this.placeholder;break;case maskCh_ALPHANUM:maskData._type=EnumMaskDataType.AlphaNum;maskData._chValue=this.placeholder;break;case maskCh_ALPHA:maskData._type=EnumMaskDataType.Alpha;maskData._chValue=this.placeholder;break;case maskCh_ALPHAUPPER:maskData._type=EnumMaskDataType.AlphaUp;maskData._chValue=this.placeholder;break;case maskCh_AMPM:maskData._type=EnumMaskDataType.AmPm;maskData._chValue='A';break;case maskCh_ESCAPE:maskChar=this.getNextMaskChar();if(maskChar!=''){maskData._type=EnumMaskDataType.Literal;maskData._chValue=maskChar}else{maskData._type=EnumMaskDataType.Escape;maskData._chValue=maskCh_ESCAPE}break;default:maskData._type=EnumMaskDataType.Literal;maskData._chValue=maskChar;break}}this.update()}
RDMaskEdit.prototype.showMask=function(){var data=this._data;var len=data.length;var sText="";for(var pos=0;pos<len;pos++){sText+=data[pos]._chValue}this.edit.value=sText}
RDMaskEdit.prototype.setInputData=function(data){var sData=String(data);var isSuccess=true;for(var pos=0;pos<this._data.length;pos++){var maskData=this._data[pos];if(maskData.isInputData()){var chCode=sData.charCodeAt(pos);if(isNaN(chCode))break;var ch=String.fromCharCode(chCode);if(ch==this.placeholder||maskData.isValidInput(chCode)){maskData._chValue=maskData.preProcessChar(ch)}else{isSuccess=false}}}this.update();return isSuccess}
RDMaskEdit.prototype.update=function(startPos,moveBack){this.showMask();if(startPos>=0){this.updateInputPos(startPos,moveBack)}}
RDMaskEdit.prototype.updateInputPos=function(startPos,toPrev){if(toPrev)var newPos=RDMaskEdit_getPrevInputPos(this,startPos);else var newPos=RDMaskEdit_getNextInputPos(this,startPos);rd_setSelection(this.edit,newPos,newPos)}
RDMaskEdit.prototype.isInputData=function(pos){if(this._data.length==0)return true;var isInput=false;var maskData=this._data[pos];if(maskData){isInput=maskData.isInputData()}return isInput}
RDMaskEdit.prototype.getNextMaskChar=function(){var nextCh='';var sel=rd_getSelection(this.edit);var pos=sel.start;var mask=this.mask;if(pos<mask.length){nextCh=mask.charAt(pos)}return nextCh}
RDMaskEdit.prototype.getMaskCharAt=function(pos){var mask=this.mask;var ch=mask.charAt(pos);return ch}
function RDMaskEdit_onKeyDown(ev,maskEdit){var e=ev||window.event;var edit=maskEdit.edit;var keyCode=e.keyCode;switch(keyCode){case VK_BACKSPACE:var sel=rd_getSelection(maskEdit.edit);if(sel.start==sel.end){for(var pos=sel.start-1;pos>=0;pos--){if(RDMaskEdit_deleteAt(maskEdit,pos)){maskEdit.update(pos+1,true);break}}}else{}rd_cancelEvent(e);return false;case VK_DELETE:var sel=rd_getSelection(maskEdit.edit);if(sel.start==sel.end){for(var pos=sel.start;pos<maskEdit._data.length;pos++){if(RDMaskEdit_deleteAt(maskEdit,sel.start)){maskEdit.update(sel.start);break}}}else{}rd_cancelEvent(e);return false;case VK_LEFT:var sel=rd_getSelection(maskEdit.edit);RDMaskEdit_moveToNextInput(maskEdit,sel.start);rd_cancelEvent(e);return false;case VK_RIGHT:var sel=rd_getSelection(maskEdit.edit);RDMaskEdit_moveToPrevInput(maskEdit,sel.start);rd_cancelEvent(e);return false;case VK_HOME:RDMaskEdit_moveToPrevInput(maskEdit,-1);rd_cancelEvent(e);return false;case VK_END:RDMaskEdit_moveToNextInput(maskEdit,maskEdit._data.length+1);rd_cancelEvent(e);return false;default:if(ev.ctrlKey&&(keyCode==67||keyCode==86||keyCode==88||keyCode==90)){rd_cancelEvent(e);return false}}return true}
function RDMaskEdit_moveToNextInput(maskEdit,startPos){var newPos=RDMaskEdit_getNextInputPos(maskEdit,startPos);rd_setSelection(maskEdit.edit,newPos,newPos)}
function RDMaskEdit_moveToPrevInput(maskEdit,startPos){var newPos=RDMaskEdit_getPrevInputPos(maskEdit,startPos);rd_setSelection(maskEdit.edit,newPos,newPos)}
function RDMaskEdit_getNextInputPos(maskEdit,startPos){var nextPos=startPos+1;if(nextPos<0)nextPos=0;var dataLen=maskEdit._data.length;while(nextPos<dataLen){if(maskEdit._data[nextPos].isInputData())break;nextPos++}if(nextPos>dataLen)nextPos=dataLen;return nextPos}
function RDMaskEdit_getPrevInputPos(maskEdit,startPos){var prevPos=startPos-1;if(prevPos<0)prevPos=0;var dataLen=maskEdit._data.length;if(prevPos>=dataLen)prevPos=dataLen-1;while(prevPos>=0){if(maskEdit._data[prevPos].isInputData())break;prevPos--}if(prevPos<0)prevPos=0;return prevPos}
function RDMaskEdit_setAt(maskEdit,pos,keyCode){if(pos>=0&&pos<maskEdit._data.length){var maskData=maskEdit._data[pos];if(!maskData)return pos;if(maskData.isInputData()){var newChar=String.fromCharCode(keyCode);if(maskData.isValidInput(keyCode))maskData._chValue=maskData.preProcessChar(newChar);else return-1;maskEdit.update(pos)}else{maskEdit.updateInputPos(pos)}}return pos}
function RDMaskEdit_deleteAt(maskEdit,pos){var delCnt=0;if(pos>=0&&pos<maskEdit._data.length){var maskData=maskEdit._data[pos];if(!maskData)return delCnt;if(maskData.isInputData()){if(maskData._type==EnumMaskDataType.AmPm)maskData._chValue='A';else maskData._chValue=maskEdit.placeholder;delCnt++}}return delCnt}
function RDMaskEdit_onFocus(ev,maskEdit){var value=maskEdit.edit.value;if(value!=''){var edit=maskEdit.edit;edit.focus();var len=value.length;rd_setSelection(edit,len,len)}}
function RDMaskEdit_onChange(ev,maskEdit){var isValid=RDMaskEdit_validateMask(maskEdit,maskEdit.edit.value);if(!isValid){rd_cancelEvent(ev||window.event);maskEdit.edit.focus()}return isValid}
function RDMaskEdit_validateMask(maskEdit,value){var isValid=false;if(maskEdit.reValidator){try{if(maskEdit.reValidator.test(value))isValid=true}catch(e){}}else{isValid=true}return isValid}
function RDMaskEdit_onKeyPress(ev,maskEdit){if(maskEdit._data.length==0)return true;var e=ev||window.ev;var keyCode=e.charCode||e.keyCode;var bubbleUp=false;if(keyCode>=32){var sel=rd_getSelection(maskEdit.edit);if(sel.start==sel.end){var pos=sel.start;if(maskEdit.isInputData(pos)){pos=RDMaskEdit_setAt(maskEdit,pos,keyCode)}}else{}}else{bubbleUp=true}if(!bubbleUp)rd_cancelEvent(e);return bubbleUp}
function rd_getSelection(input){var sel={start:0,end:0};if(document.selection&&document.selection.createRange){var r=document.selection.createRange();var r2=r.duplicate();sel.start=0-r2.moveStart('character',-100000);sel.end=sel.start+r.text.length}else if(input.setSelectionRange){sel.start=input.selectionStart;sel.end=input.selectionEnd}return sel}
function rd_setSelection(input,start,end){if(input.createTextRange){var r=input.createTextRange();r.collapse(true);r.moveEnd('character',end);r.moveStart('character',start);r.select()}else if(input.setSelectionRange){input.setSelectionRange(start,end)}}
function _isDigit(code){return(48<=code&&57>=code)}
function _isAlphaNum(code){return _isAlpha(code)||_isDigit(code)}
function _isAlpha(code){return((65<=code&&90>=code)||(97<=code&&122>=code))}
function _isAMPM(code){return(97==code||65==code||80==code||112==code)}