/*
-------------------------------------------------------
FORMATS NUMBERS (EX. SSN, PHONE, DATE, ETC.)
-------------------------------------------------------

---------INSTRUCTIONS----------------------------------
Include this FormatNumber.js file.

Format Numbers:
	OnKeyUp:
		1. Add OnKeyUp attribute to the TEXT Boxt or TEXTAREA.
		2. Set OnKeyUp="displayFormattedNumber(this,FORMAT)";
	
	OnClick:
		1. Add OnClick attribute to the OBJECT.
		2. Set OnClick="displayFormattedNumber(OBJECT,FORMAT)";
		
	OnLoad:
		1. Add OnLoad attribute to the OBJECT.
		2. Set OnLoad="formatNumber(NUMBER,FORMAT)";
					- OR -
		1. Add Script Tags for JavaScript.
		2. Insert formatNumber(NUMBER,FORMAT)"; inside of Tags.
		
HINT: PREDEFINED FORMATS HAVE BEEN CREATED FOR SSN, PHONE, AND DATE.
	  TO CREATE YOUR OWN FORMAT REPLACE YOUR NUMBER WITH A #.

HINT: ADD THE ATTRIBUTE maxDate AND/OR minDate TO THE INPUT OBECT
	  TO WITH THE PREFERED MAXIMUM OR MINIMUM DATE TO RESTRICT THE
	  DATE TO WITHIN THAT RANGE.
	  
-------------------------------------------------------
*/

var SSN = "###-##-####";
var PHONE = "###-###-####";
var DATE = "##/##/####";
var ZIP = "#####-####";
var PHONE_EXT = "##-####";

function formatNumber(strValue,format) {
	var lastChar = strValue.substring((strValue.length-1),strValue.length);
	var origStrValue = strValue;
	var dateFormat = DATE;
	
	strValue = removeFormatting(strValue);
	
	var formattedNumber = format;
	
	if (strValue.length == 0) {
		formattedNumber = "";
		
		if ((lastChar == format.substring(formattedNumber.length,(formattedNumber.length + 1))) || ((formattedNumber.length + 1) < origStrValue.length)) {
			formattedNumber += format.substring(formattedNumber.length,(formattedNumber.length + 1));
		}
	}
	else {
		//---PHONE_EXT---
		if (format == PHONE_EXT) {
			if (strValue.substring(0,1) == "4") {
				format = "#-####";
			}
		}
		formattedNumber = applyFormatting(strValue,format);
		
		//---DATE---
		if (format == DATE) {
			var dateSections = origStrValue.split("/");
			//Section #1 (Month)
			if (origStrValue.length > 2 && (origStrValue.substring(1,2) == "/" || origStrValue.substring(0,1) == "/")) {
				if (dateSections[0].length < 2) {
					dateFormat = ""
					for (var i=0; i<origStrValue.length; i++) {
						if (origStrValue.substring(i,(i+1)) == DATE.substring(2,3)) {
							dateFormat += DATE.substring(2,3);
						}
						else {
							dateFormat += "#";
						}
					}
				}
			}
			else if (origStrValue.length > 1 && origStrValue.substring(1,2) == "/") {
				if (dateSections[0].length < 2) {
					origStrValue = "0" + origStrValue;
				}
			}
			//Section #2 (Day)
			if (origStrValue.length > 5 && (origStrValue.substring(4,5) == "/" || origStrValue.substring(3,4) == "/")) {
				if (dateSections[1].length < 2) {
					dateFormat = ""
					for (var i=0; i<origStrValue.length; i++) {
						if (origStrValue.substring(i,(i+1)) == DATE.substring(2,3)) {
							dateFormat += DATE.substring(2,3);
						}
						else {
							dateFormat += "#";
						}
					}
				}
			}
			else if (origStrValue.length > 4 && origStrValue.substring(4,5) == "/") {
				if (dateSections[1].length < 2) {
					origStrValue = origStrValue.substring(0,3) + "0" + origStrValue.substring(3,origStrValue.length);
				}
			}
			
			formattedNumber = applyFormatting(removeFormatting(origStrValue),dateFormat);
			
		}
		
		/*
		//---PHONE---
		if (format == PHONE) {
			//---EXTENSION---  (5 DIGITS)
			if ((lastChar == "-" && origStrValue.length == 3) || (origStrValue.substring(0,1) != "(" && origStrValue.length > 1 && origStrValue.length < 7 && origStrValue.substring(1,2) == "-") || (origStrValue.length == 5 && removeFormatting(origStrValue).length == 5) || (origStrValue.substring(0,(origStrValue.length - 1)) == applyFormatting(strValue,"#-####"))) {
				format = "#-####";
				strValue = removeFormatting(formattedNumber);
				formattedNumber = applyFormatting(strValue,format);
			}
			//---WITHOUT AREA CODE---  (7 DIGITS)
			if ((lastChar == "-" && origStrValue.length == 5) || (origStrValue.substring(0,1) != "(" && origStrValue.length > 1 && origStrValue.length < 9 && origStrValue.substring(3,4) == "-") || (origStrValue.length == 7 && removeFormatting(origStrValue).length == 7) || (origStrValue.substring(0,(origStrValue.length - 1)) == applyFormatting(strValue,"###-####"))) {
				format = "###-####";
				strValue = removeFormatting(formattedNumber);
				formattedNumber = applyFormatting(strValue,format);
			}
		}
		*/
		
		if ((lastChar == format.substring(formattedNumber.length,(formattedNumber.length + 1))) || ((formattedNumber.length + 1) < origStrValue.length)) {
			formattedNumber += format.substring(formattedNumber.length,(formattedNumber.length + 1));
		}
		
	}
	return formattedNumber;
}

function fixDateFormatting(obj) {
	var origStrValue = obj.value;
	var dateSections = origStrValue.split("/");
	var formattedDate = "";
	var formattedMonth = "";
	var formattedDay = "";
	var formattedYear = "";
	
	if (origStrValue.length > 1 && origStrValue.substring(1,2) == "/") {
		if (dateSections[0].length < 2) {
			origStrValue = "0" + origStrValue;
		}
	}
	if (origStrValue.length > 4 && origStrValue.substring(4,5) == "/") {
		if (dateSections[1].length < 2) {
			origStrValue = origStrValue.substring(0,3) + "0" + origStrValue.substring(3,origStrValue.length);
		}
	}
	
	formattedDate = applyFormatting(removeFormatting(origStrValue),DATE);
	
	try {
		formattedMonth = (formattedDate.split("/")[0] - 1);
		formattedDay = formattedDate.split("/")[1];
		formattedYear = formattedDate.split("/")[2];
		if (formattedMonth && formattedDay && formattedYear) {
			obj.value = formattedDate;
		}
	}
	catch(e) {}
}

function applyFormatting(strValue,format) {
	var numberPlacement = 0;
	var strValuePlacement = 0;
	var formattedNumber = format;

	while(formattedNumber.indexOf("#") != -1) {
		numberPlacement = formattedNumber.indexOf("#");
		if (strValue.length == (strValuePlacement + 1)) {
			formattedNumber = formattedNumber.substring(0,numberPlacement) + strValue.substring(strValuePlacement,(strValuePlacement + 1));
		}
		else {
			formattedNumber = formattedNumber.substring(0,numberPlacement) + strValue.substring(strValuePlacement,(strValuePlacement + 1)) + formattedNumber.substring((numberPlacement + 1),formattedNumber.length);
		}
		strValuePlacement += 1;
	}
	return formattedNumber;
}

function removeFormatting(strValue) {
	var unFormattedNumber = "";
	var validNumbers = "1,2,3,4,5,6,7,8,9,0";
	validNumbers = validNumbers.split(",");
	
	for (var i=0; i<strValue.length; i++) {
		for (var x=0; x< validNumbers.length; x++) {
			if (strValue.substring(i,(i + 1)) == validNumbers[x]) {
				unFormattedNumber += validNumbers[x];
				break;
			}
		}
	}
	return unFormattedNumber;
}

function getCursorPos(ctrl) {
	try {
		ctrl.setAttribute("maxLength",(ctrl.getAttribute("maxLength") + 1));
	}
	catch(e) {}
	
	var saveText = ctrl.value;  // save for restoring later
	ctrl.focus();
	if (document.selection) {
		var range = document.selection.createRange();
		var weirdStr = String.fromCharCode(1);   // a weird string to recognize the place
		range.text = weirdStr;
		var pos = ctrl.value.indexOf(weirdStr);  // get the position
		ctrl.value = saveText;                   // restore the previous text
		range = ctrl.createTextRange();
		range.move('character', pos);            // restore the cursor (also shows how to set the cursor)
		range.select();
	}
	else if (ctrl.selectionStart) {
		pos = ctrl.selectionStart;
	}
	
	try {
		ctrl.setAttribute("maxLength",(ctrl.getAttribute("maxLength") - 1));
	}
	catch(e) {}
	
	return pos;
}

function setCursorPos(ctrl, pos) {

   if (ctrl.type != 'text') {
      return false;
   }
   else if (pos > -1) {
		if (document.selection) {
			var rng = ctrl.createTextRange();
			rng.move('character', pos);
			rng.select();
		}
		else if (ctrl.selectionStart) {
			ctrl.selectionStart = pos;
			ctrl.selectionEnd = pos;
		}
   }

   return true;
}

function displayFormattedNumber(ctrl,format) {
	var keyPressed = keyhandler();
	var cursorPosition;
	var origValue;
	
	if (keyPressed != 37 && keyPressed != 39 && keyPressed != 16) { 
		cursorPosition = getCursorPos(ctrl);
		origValue = ctrl.value;
		ctrl.setAttribute("maxLength",format.length);
		ctrl.value = formatNumber(ctrl.value,format);
		ctrl.onkeypress = function () {
								var keyPressed = keyhandler();
								if (keyPressed == 13) {
									return false;
								}
							};
		if (format == DATE) {
			ctrl.onblur = function() {
								try {
									fixDateFormatting(this);
									
									var validDate = validateDate(this.value);
									if (validDate) {
										var minDate = this.getAttribute("minDate");
										var maxDate = this.getAttribute("maxDate");
										validDate = validateDateRange(this.value,minDate,maxDate);
									}
									if (!validDate) {
										try {
											this.focus();
											
										}
										catch(e) {}
									}
								}
								catch(e) {}
							};
		}
		
		//Backspace = 8, Left Arrow = 37, Right Arrow = 39, Delete = 46
		if (keyPressed != 8 && keyPressed != 37 && keyPressed != 39 && keyPressed != 46) {
			cursorPosition += (ctrl.value.length - origValue.length);
		}
		setCursorPos(ctrl,cursorPosition);
	}
	
}

function verifyFormattedNumber(ctrl,format) {
	if (ctrl.value.length > 0) {
		switch(format) {
			case ZIP:
				if (!(ctrl.value.length == format.length || ctrl.value.length == 5)) {
					window.alert("The number you have entered does not match the required format (" + format + " or #####).\n\n  Please make the necessary changes before continuing.");
					ctrl.focus();
					return false;
				}
				break;
			default:
				if (ctrl.value.length != format.length) {
					window.alert("The number you have entered does not match the required format (" + format + ").\n\n  Please make the necessary changes before continuing.");
					ctrl.focus();
					return false;
				}
				break;
		}
	}
	return true;
}


function keyhandler(e) {
    try {
		if (document.layers)
	        Key = e.which;
	    else
	        Key = window.event.keyCode;
	}
	catch(e) {
		Key = 0;
	}

    if (Key != 0)
        return Key;
}

/*
-------------------------------------------------------
END OF FormatNumber.js
-------------------------------------------------------
*/
