	var reOneOrMoreDigits = /[\d+]/;
	var reNoDigits = /[^\d]/gi;

	function doMask(textBox) 
	{
		var keyCode = event.which ? event.which : event.keyCode;
	
		// enter, backspace, delete and tab keys are allowed thru
		if(keyCode == 13 || keyCode == 8 || keyCode == 9 || keyCode == 46) 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.mask;
	
		// simple Regex to 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 += keyCharacter;
	
		// mask it...val holds the existing TextBox.value + the current keystroke
		textBox.value = val.maskValue(mask);
		setCaretAtEnd(textBox);
		return false;
	}
	
	// puts starting chars in field
	function onFocusMask(textBox) 
	{
		var val = textBox.value;
		var mask = textBox.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 = '';
		}
	}
	
	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++) {
			retVal = retVal.replace(/#/i, val.charAt(i));
		}
	
		// get rid of rest of #'s
		retVal = retVal.replace(/#/gi, "");
		return retVal;
	}
	
	// The Numeric KeyPad returns keyCodes that ain't all that workable.
	// ie: KeyPad '1' returns keyCode 97 which String.fromCharCode converts to an 'a'.
	// This cheesy way allows the Numeric KeyPad to be used
	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 currencyFormat(fld, milSep, decSep, e) 
	{
		var sep = 0;
		var key = '';
		var i = j = 0;
		var len = len2 = 0;
		var strCheck = '0123456789';
		var aux = aux2 = '';
		var whichCode = (window.Event) ? e.which : e.keyCode;
	
		if (whichCode == 13) return true;  // Enter
		if (whichCode == 8) return true;  // Delete (Bug fixed)
		key = String.fromCharCode(whichCode);  // Get key value from key code
		if (strCheck.indexOf(key) == -1) return false;  // Not a valid key
		len = fld.value.length;
		for(i = 0; i < len; i++)
			if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != decSep)) break;
		aux = '';
		for(; i < len; i++)
			if (strCheck.indexOf(fld.value.charAt(i))!=-1) aux += fld.value.charAt(i);
		aux += key;
		len = aux.length;
		if (len == 0) fld.value = '';
		if (len == 1) fld.value = '0'+ decSep + '0' + aux;
		if (len == 2) fld.value = '0'+ decSep + aux;
		if (len > 2) {
			aux2 = '';
			for (j = 0, i = len - 3; i >= 0; i--) {
				if (j == 3) {
					aux2 += milSep;
					j = 0;
				}
				aux2 += aux.charAt(i);
				j++;
			}
			fld.value = '';
			len2 = aux2.length;
			for (i = len2 - 1; i >= 0; i--)
				fld.value += aux2.charAt(i);
			fld.value += decSep + aux.substr(len - 2, len);
		}
		return false;
	}

	function removeCommas(strValue) {
  	var objRegExp = /,/g; //search for commas globally

  	//replace all matches with empty strings
  	return strValue.replace(objRegExp,'');
	}

	function addCommas(nStr)
	{
		nStr += '';
		x = nStr.split('.');
		x1 = x[0];
		x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	}
	
	String.prototype.trim = function () {
		return this.replace(/^\s*/, "").replace(/\s*$/, "");
	}

	String.prototype.padL = function (nLength, sChar) {
		var sreturn = this;
		while (sreturn.length < nLength) {
			sreturn = String(sChar) + sreturn;
		}

		return sreturn;
	}

	function date_onkeydown() {
		if (window.event.srcElement.readOnly) return;
		var key_code = window.event.keyCode;
		var oElement = window.event.srcElement;

		if (window.event.shiftKey && String.fromCharCode(key_code) == "T") {
			var d = new Date();
			oElement.value = String(d.getMonth() + 1).padL(2, "0") + "/" + 
												String(d.getDate()).padL(2, "0") + "/" + d.getFullYear();
			window.event.returnValue = 0;
		}

		if (!window.event.shiftKey && !window.event.ctrlKey && !window.event.altKey) {
			if ((key_code > 47 && key_code < 58) || (key_code > 95 && key_code < 106)) {
				if (key_code > 95) key_code -= (95-47);
				oElement.value = oElement.value.replace(/[mdy]/, String.fromCharCode(key_code));
			}

			if (key_code == 8) {
				if (!oElement.value.match(/^[mdy0-9]{2}\/[mdy0-9]{2}\/[mdy0-9]{4}$/)) oElement.value = "mm/dd/yyyy";
				oElement.value = oElement.value.replace(/([mdy\/]*)[0-9]([mdy\/]*)$/,
				function ($0, $1, $2) {
					var idx = oElement.value.search(/([mdy\/]*)[0-9]([mdy\/]*)$/);
					if (idx >= 5) {
						return $1 + "y" + $2;
					} else if (idx >= 2) {
						return $1 + "d" + $2;
					} else {
						return $1 + "m" + $2;
					}
				}
			);
			window.event.returnValue = 0;
			}
		}

		if (key_code != 9) {
			event.returnValue = false;
		}
	}
