// RegEx patterns
var reOneOrMoreDigits = /[\d+]/;
var reNoDigits = /[^\d]/gi;

// onKeyDown Event Handler
function onKeyDownH(e)
{
	var textBox;
	var keyCode;

	switch (emod)
	{
		case "IE4+":
			e = window.event;

			keyCode = e.keyCode;
			textBox = e.srcElement;

			break;
		case "NN4":
			keyCode = e.which;
			textBox = e.target;

			break;
		case "W3C":
			keyCode = e.which;
			textBox = e.target;

			break;
	}

	return doMask(textBox, keyCode);
}

// function to apply mask to textbox
function doMask(textBox, keyCode)
{
	// enter, backspace, delete, tab and left & right arrow keys are allowed thru
	if(keyCode == 13 || keyCode == 8 || keyCode == 9 || keyCode == 46 || keyCode == 37 || keyCode == 39)
		return true;

	// get character from keyCode....dealing with the "Numeric KeyPad" 
	// keyCodes so that it can be used
	var keyCharacter = cleanKeyCode(keyCode);
	 
	// grab the textBox value and the mask
	var val = textBox.value;
	var mask = textBox.getAttribute('mask');

	// check if key is a digit
	if(reOneOrMoreDigits.test(keyCharacter) == false)
		return false;

	// get value minus any masking by removing all non-numerics
	val = val.replace(reNoDigits,'');			

	// add current keystroke
	val = ReplaceSelChars(textBox, keyCharacter);

	// mask it...val holds the existing TextBox.value + the current keystroke
	textBox.value = val.maskValue(mask);

	// place the cursor at the end of the textbox
	// if not done cursor is not in text box
	setCaretAtEnd(textBox);

	// prevent character from appearing twice by returning false
	return false;
}

// puts starting chars in field
function onFocusMask(textBox)
{
	var val = textBox.value;
	//var mask = textBox.mask;
	var mask = textBox.getAttribute('mask');

	if(val.length == 0 || val == null) {
		var i = mask.indexOf('#');
		textBox.value = mask.substring(0,i);
	}

	setCaretAtEnd(textBox);

	// set just in case.
	textBox.maxlength = mask.length;
}

// blank field if no digits entered
function onBlurMask(textBox)
{
	var val = textBox.value;

	// if no digits....nada entered.....blank it.
	if(reOneOrMoreDigits.test(val) == false)
	{
		textBox.value = '';
	}
	else
	{
		var val = textBox.value;
		var mask = textBox.getAttribute('mask');

		textBox.value = val.maskValue(mask);
	}
}

String.prototype.maskValue = function(mask)
{
	var retVal = mask;
	var val = this;

	//loop thru mask and replace #'s with current value one at a time
	for(var i=0;i<val.length;i++)
	{
		if(val.charAt(i) != mask.charAt(i))
		{
			retVal = retVal.replace(/#/i, val.charAt(i));
		}
		
	}

	// get rid of rest of #'s
	retVal = retVal.replace(/#/gi, "");

	return retVal;
}

// The Numeric KeyPad returns incorrect keyCodes.
//
// ie: KeyPad '1' returns keyCode 97 which String.fromCharCode converts to an 'a'.
function cleanKeyCode(key)
{
	switch(key)
	{
		case 96: return "0"; break;
		case 97: return "1"; break;
		case 98: return "2"; break;
		case 99: return "3"; break;
		case 100: return "4"; break;
		case 101: return "5"; break;
		case 102: return "6"; break;
		case 103: return "7"; break;
		case 104: return "8"; break;
		case 105: return "9"; break;
		default: return String.fromCharCode(key); break;
	}
}

function setCaretAtEnd (field)
{
	if (field.createTextRange)
	{
		var r = field.createTextRange();

		r.moveStart('character', field.value.length);
		r.collapse();
		r.select();
	}
}

function ReplaceSelChars(textBox, keyCharacter)
{
	if (document.selection) // IE support
	{
		document.selection.createRange().text = keyCharacter;
	}
	else if (textBox.selectionStart || textBox.selectionStart == '0') //MOZILLA/NETSCAPE support
	{
		textBox.focus();
		var startPos = textBox.selectionStart;
		var endPos = textBox.selectionEnd;

		textBox.value = textBox.value.substring(0, startPos) + keyCharacter + textBox.value.substring(endPos, textBox.value.length);
	}
	else
	{
		textBox.value += keyCharacter;
	}

	return textBox.value;
}

function onloadH(e)
{
	/*get the event model*/
	emod = (e) ? (e.eventPhase) ? "W3C" : "NN4" : (window.event) ? "IE4+" : "unknown";

	/*A*/
	if (emod == "NN4")
	{
		document.captureEvents(Event.KEYDOWN);
	}
	
	document.onkeydown = onKeyDownH;

	return true;
}

/*define the event handler for the onload event*/
window.onload = onloadH;

/*global vars*/
var emod; /*the event model*/