/*------------------------------------------------------------------------\
| License:                                                                |
|   Please keep this infomation, and Free use                             |
|   Copyright 2004 . http://fcuaa.fcu.edu.tw/~d8327299/                   |
| Title:      Mask                                                        |
| Programmer: yestaro@yahoo.com.tw                                        |
| Comment:                                                                |
| Version: 1.01 2005/11/25                                                |
| Version: 1.00 2004/06/22 (2004/11/07 rebuild)                           |
| Limitation:                                                             |
\------------------------------------------------------------------------*/

//--------------- CONSTRUCTOR ---------------
function MaskFormatter(mask) {
	this._mask = mask;
	this.symbolsReg = null;
	
	var rText =	"";
	for (var i=0; i < mask.length; i++) {
		if (MaskFormatter.LEGAL_SYMBOLS[mask.charAt(i)] == null) {
			rText += mask.charAt(i);
		}
	}

	if (rText.length > 0) {
		rText = "[" + rText + "]";
		this.symbolsReg = new RegExp(rText,"g");
	}
}

//---------------    Static Field    ------------
MaskFormatter.LEGAL_SYMBOLS = new Object();
MaskFormatter.LEGAL_SYMBOLS["#"] = /[0-9]/;
MaskFormatter.LEGAL_SYMBOLS["U"] = /[A-Z]/;
MaskFormatter.LEGAL_SYMBOLS["L"] = /[a-z]/;
MaskFormatter.LEGAL_SYMBOLS["A"] = /[a-zA-Z0-9]/;
MaskFormatter.LEGAL_SYMBOLS["?"] = /[a-zA-Z]/;
MaskFormatter.LEGAL_SYMBOLS["*"] = "";

//---------------    FIELD    ---------------
MaskFormatter.prototype.placeholder = ' ';


//---------------		 METHOD		---------------
MaskFormatter.prototype.stringToValue = function (str) {
	return (this.symbolsReg != null)?str.replace(this.symbolsReg,""):str;
}

MaskFormatter.prototype.valueToString = function (val) {
	with (this) {
		var elv = stringToValue(val);
		var loop = elv.length;
		for (var i=0; i < elv.length; i++) {
		  if (MaskFormatter.LEGAL_SYMBOLS[_mask.charAt(i)] == null) {
					elv = elv.substring(0,i) + _mask.charAt(i) + elv.substring(i);
					i++;
			}
		}
		elv = trim(elv);
		return elv;
	}
}

MaskFormatter.prototype.install = function (el) {
	with (this) {
		if (el._install != _mask) {
			el.maxLength = _mask.length;
			el._install = _mask;
   		el.style.imeMode = "disabled";
			/** handle the key delete, backspace, arrow */
			el.onkeydown = function() {
			  var eCode = event.keyCode;
				if (eCode == 46 || eCode == 8) {
					event.returnValue = false;
					var cIndx = _getCursor(el);
					if (eCode == 8) cIndx--;
					if (MaskFormatter.LEGAL_SYMBOLS[el._install.charAt(cIndx)] != null) {
						var elv = el.value;
						var plc = (cIndx < placeholder.length)?placeholder.charAt(cIndx):placeholder;
            el.value = elv.substring(0,cIndx) + plc + elv.substring(cIndx+1);
            _setCursor(el, cIndx);
					} else if (eCode == 8) {
						event.keyCode = 37;
						event.returnValue = true;
					}
				}
			}
			el.onkeyup = function () {
				var cIndx = _getCursor(el);
				if (MaskFormatter.LEGAL_SYMBOLS[el._install.charAt(cIndx)] == null
					&& event.keyCode != 37 && event.keyCode != 39
					&& event.keyCode != 8 && event.keyCode != 46
					&& event.keyCode != 17 && event.keyCode != 16 ) {
					_setCursor(el, cIndx+1);
				}
			}

			var cIndx = _getCursor(el);
			_fixValue(el, _mask, placeholder);
			
			for (var i=cIndx; i < _mask.length; i++) {
				if (MaskFormatter.LEGAL_SYMBOLS[_mask.charAt(i)] == null) {
					cIndx++;
				} else {
				  break;
				}
			}
			_setCursor(el, cIndx);
		}
		
		var cIndx = _getCursor(el);
		if (_maskLockKey(el, cIndx, _mask)) {
			_setCursor(el, cIndx);
		}
		
	}
}
//---------------		 PRIVATE HELPER METHOD		---------------
function _fixValue(el, mask, space) {
			var elv = el.value;
			var maskStr = "";
			for (var i=0; i < mask.length; i++) {
			  var c = mask.charAt(i);
			  var r = MaskFormatter.LEGAL_SYMBOLS[c];
			  if ( r == null ) {
					maskStr += c;
				} else if (i < elv.length && c != "*" && r.test(elv.charAt(i))) {
					maskStr += elv.charAt(i);
				} else {
					maskStr += (i < space.length)?space.charAt(i):space;
				}
			}
			el.value = maskStr;
}

function _maskLockKey(el, cIndx, cMask) {
		var c = String.fromCharCode(event.keyCode);
		var b = true;
		switch (cMask.charAt(cIndx)) {
			case "#":
				if (event.keyCode < 48 || event.keyCode > 57) b = false;
				break;
			case "U":
				if (event.keyCode < 123 && event.keyCode > 96) event.keyCode -= 32;
				if (event.keyCode < 65 || event.keyCode > 90) b = false;
				break;
			case "L":
				if (event.keyCode < 91 && event.keyCode > 64) event.keyCode += 32;
				if (event.keyCode < 97 || event.keyCode > 122) b = false;
				break;
			case "A":
			case "?":
				if (!MaskFormatter.LEGAL_SYMBOLS[cMask.charAt(cIndx)].test(c)) b = false;
				break;
			case "*":
				break;
			default:
			  b = false;
				break;
		}
		if (b) {
		  var elv = el.value;
			el.value = elv.substring(0,cIndx) + elv.substring(cIndx+1);
		} else {
		  event.returnValue = false;
		}
		return b;
}

function _getCursor(el) {
	var workRange=document.selection.createRange();
	workRange.moveStart("character", -el.value.length);
	var indx = workRange.text.length;
	workRange.collapse(false);
	return indx;
}

function _setCursor(el, indx) {
	el.select();
	var workRange=document.selection.createRange();
	workRange.moveEnd("character", indx - workRange.text.length);
	workRange.collapse(false);
	workRange.select();
}

function trim(strvalue) { 
ptntrim = /(^\s*)|(\s*$)/g; 
return strvalue.replace(ptntrim,""); 
} 

//---------------    MyFormater    ---------------
		/** 參數範例
                   AAA-###         // 機車牌照
                   ####-######     // 大哥大號碼遮罩
		var jsMS = new MaskFormatter("AA-####");
		var jsIV = InputVerifier.getInstance(jsMS);
                  */
		var jsMS_card = new MaskFormatter("############");
		var jsMS_inv = new MaskFormatter("UU########");
		var jsMS_dev_tel = new MaskFormatter("####");
	
function mask(type,value){
	if ( type == 'card' ) { 	jsMS_card.install(value); }
	if ( type == 'inv' ) { 	jsMS_inv.install(value); }
	if ( type == 'dev_tel' ) { 	jsMS_dev_tel.install(value); }
	
}






