// JScript source code
//include in main page with
// <script src='../../_common/Javascript/RegExpressionChecks.js'></script>

var m_iErrorCount = 0;

// Call with
// onblur="checkDateTime(this);"
// onblur=" & chr(34) & "checkDateTime(this);" & chr(34) & "
function checkDateTime(txtBox)
{
	checkExpression(txtBox, 'datetime');
}

// Call with
// onblur="checkDate(this);"
// onblur=" & chr(34) & "checkDate(this);" & chr(34) & "
function checkDate(txtBox)
{
	checkExpression(txtBox, 'date');
}

// Call with
// onblur="checkTime(this);"
// onblur=" & chr(34) & "checkTime(this);" & chr(34) & "
function checkTime(txtBox)
{
	checkExpression(txtBox, 'time');
}

// Call with
// onblur="checkEmail(this);"
// onblur=" & chr(34) & "checkEmail(this);" & chr(34) & "
function checkEmail(txtBox)
{
	checkExpression(txtBox, 'email');
}

// Call with
// onblur="checkNumber(this);"
// onblur="checkNumber(this, null, intDecPlaces);"
// onblur="checkNumber(this, document.all('texboxid'), intDecPlaces);"
// onblur=" & chr(34) & "checkNumber(this);" & chr(34) & "
// onblur=" & chr(34) & "checkNumber(this, null, intDecPlaces);" & chr(34) & "
// onblur=" & chr(34) & "checkNumber(this, document.all('texboxid'), intDecPlaces);" & chr(34) & "
function checkNumber(txtBox, txtHidden, iDecPlaces)
{
	checkExpression(txtBox, 'number', txtHidden, iDecPlaces);
}

// Call with
// onblur="checkMoney(this);"
// onblur="checkMoney(this, document.all('texboxid'));"
// onblur=" & chr(34) & "checkMoney(this);" & chr(34) & "
// onblur=" & chr(34) & "checkMoney(this, document.all('texboxid'));" & chr(34) & "
function checkMoney(txtBox, txtHidden)
{
	checkExpression(txtBox, 'money', txtHidden);
}

// Call with
// onblur="checkPhone(this);"
// onblur="checkPhone(this, document.all('texboxid'));"
// onblur=" & chr(34) & "checkPhone(this);" & chr(34) & "
// onblur=" & chr(34) & "checkPhone(this, document.all('texboxid'));" & chr(34) & "
function checkPhone(txtBox, txtHidden)
{
	checkExpression(txtBox, 'phone', txtHidden);
}

// Call with
// onblur="checkSSN(this);"
// onblur="checkSSN(this, document.all('texboxid'));"
// onblur=" & chr(34) & "checkSSN(this);" & chr(34) & "
// onblur=" & chr(34) & "checkSSN(this, document.all('texboxid'));" & chr(34) & "
function checkSSN(txtBox, txtHidden)
{
	checkExpression(txtBox, 'ssn', txtHidden);
}

// Call with
// onblur="checkZip(this);"
// onblur="checkZip(this, document.all('texboxid'));"
// onblur=" & chr(34) & "checkZip(this);" & chr(34) & "
// onblur=" & chr(34) & "checkZip(this, document.all('texboxid'));" & chr(34) & "
function checkZip(txtBox, txtHidden)
{
	checkExpression(txtBox, 'zip', txtHidden);
}

// Call with
// onblur="checkCreditCard(this, null, 'visa');"
// onblur="checkCreditCard(this, null, 'mastercard');"
// onblur="checkCreditCard(this, null, 'amex');"
// onblur="checkCreditCard(this, document.all('texboxid'), 'visa');"
// onblur="checkCreditCard(this, document.all('texboxid'), 'mastercard');"
// onblur="checkCreditCard(this, document.all('texboxid'), 'amex');"
// onblur=" & chr(34) & "checkCreditCard(this, null, 'visa');" & chr(34) & "
// onblur=" & chr(34) & "checkCreditCard(this, null, 'mastercard');" & chr(34) & "
// onblur=" & chr(34) & "checkCreditCard(this, null, 'amex');" & chr(34) & "
// onblur=" & chr(34) & "checkCreditCard(this, document.all('texboxid'), 'visa');" & chr(34) & "
// onblur=" & chr(34) & "checkCreditCard(this, document.all('texboxid'), 'mastercard');" & chr(34) & "
// onblur=" & chr(34) & "checkCreditCard(this, document.all('texboxid'), 'amex');" & chr(34) & "
function checkCreditCard(txtBox, txtHidden, sCardType)
{
	switch (sCardType.toLowerCase())
	{
		case "visa":
			checkExpression(txtBox, 'visacredit', txtHidden);
			break;
		case "mastercard":
			checkExpression(txtBox, 'visacredit', txtHidden);
			break;
		case "amex":
			checkExpression(txtBox, 'amexcredit', txtHidden);
			break;
	}
}

function checkTest(txtBox)
{
	var decLoc, sValBefore, sValAfter
	sValue = txtBox.value;
	decLoc = sValue.indexOf(".");
	sValBefore = sValue.substr(0, decLoc);
	sValAfter = sValue.substr(decLoc, sValue.length);
	sValue = sValue.replace(/\D/g, '');
	txtBox.value = sValBefore.replace(/\D/g, '') + "." + sValAfter.replace(/\D/g, '');
}

function formatNumberForHidden(sNumber, iDecPlaces)
{
	var signLoc, decLoc, sValBefore, sValAfter, fTempNum
	signLoc = sNumber.indexOf("-");

	decLoc = sNumber.indexOf(".");

	if(decLoc == -1)
	{
		sNumber = sNumber.replace(/\D/g, '');
	}
	else
	{
		sValBefore = sNumber.substr(0, decLoc);
		sValAfter = sNumber.substr(decLoc, sNumber.length);
		sNumber = sValBefore.replace(/\D/g, '') + "." + sValAfter.replace(/\D/g, '');	
	}

	if(iDecPlaces != null)
	{
		fTempNum = parseFloat(sNumber);
		sNumber = fTempNum.toFixed(iDecPlaces).toString();
		//sNumber = fTempNum.toString();
	}

	if(signLoc > -1)
	{
		sNumber = "-" + sNumber;
	}
	
	return sNumber;
}

function formatNumberForDisplay(sNumber, iDecPlaces, sPrefix)
{
	var signLoc, decLoc, sValBefore, sValAfter, fTempNum
	signLoc = sNumber.indexOf("-");
	
	sNumber = formatNumberForHidden(sNumber, iDecPlaces);

	decLoc = sNumber.indexOf(".");

	if(decLoc == -1)
	{
		sNumber = sNumber.replace(/\D/g, '');
	}
	else
	{
		sValBefore = sNumber.substring(0, decLoc);
		sValBefore = sValBefore.replace(/\D/g, '');
		sValBefore = insertCommas(sValBefore);

		sValAfter = sNumber.substring(decLoc);
		sValAfter = sValAfter.replace(/\D/g, '');
		sNumber = sValBefore + "." + sValAfter;	
	}
	
	if(sPrefix != null)
	{
		sNumber = sPrefix + sNumber;
	}

	if(signLoc > -1)
	{
		sNumber = "-" + sNumber;
	}
	
	return sNumber;
}

function insertCommas(sNumber)
{
	var iModNum, sTempNum, i
	
	if(sNumber.length > 3)
	{
		iModNum = sNumber.length % 3;
		sTempNum = sNumber.substr(0, iModNum);
		for(i = iModNum; i < sNumber.length; i+=3)
		{
			if(i>0)
			{sTempNum += ",";}
			sTempNum += sNumber.substr(i, 3);
		}
	}
	else
	{
		sTempNum = sNumber;
	}
	
	return sTempNum;
}

function alignTextBox(txtBox, sAlign)
{
	if(txtBox.style.textAlign != sAlign)
	{
		txtBox.style.textAlign = sAlign;
	}
}


function checkExpression(txtBox, type, txtHidden, iDecPlaces)
{
	if(m_iErrorCount > 1)
	{
		m_iErrorCount = 0;
		return;
	}
	sValue = txtBox.value;
	var emailREV = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
	var datetimeREV = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
	var dateREV = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?$/;
//	var dateREV = /^$/;
	var timeREV = /^((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))$|^(([01]\d|2[0-3])(:[0-5]\d){1,2})$/;
//	var timeREV = /^$/;
	var numberREV = /^\-?([1-9]{1}[0-9]{0,2}(\,\d{3})*(\.\d{0,})?|[1-9]{1}\d{0,}(\.\d{0,})?|0(\.\d{0,})?|(\.\d{1,})?)$/;
	var moneyREV = /^\$?\-?([1-9]{1}[0-9]{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2})?)$|^\-?\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2})?)$|^\(\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2})?)\)$/;
	var zipREV = /^\d{5}\-?(\d{4})?$/;
	switch (type.toLowerCase())
	{
		case "email":
			if(!(emailREV.test(sValue)) && (sValue != ""))
			{
				alert('Email Address is not in a valid format\n\nAddresses should be in the format of\n\n  name@isp.com');
				m_iErrorCount++;
				txtBox.focus();
			}
			else
			{
				m_iErrorCount = 0;
			}
			break;
			
		case "datetime":
			if(!(datetimeREV.test(sValue)) && (sValue != ""))
			{
				alert('Date/Time entered is not in a valid format\nPlease enter date/time as \nmm/dd/yyyy\nor\nmm/dd/yyyy hh:mm:ss {AM|PM}');
				m_iErrorCount++;
				txtBox.focus();
			}
			else
			{
				m_iErrorCount = 0;
			}
			break;
			
		case "date":
			if(!(dateREV.test(sValue)) && (sValue != ""))
			{
				alert('Date entered is not in a valid format\nPlease enter date as \nmm/dd/yyyy or mm/dd/yy');
				m_iErrorCount++;
				txtBox.focus();
			}
			else
			{
				m_iErrorCount = 0;
			}
			break;
			
		case "time":
			if(!(timeREV.test(sValue)) && (sValue != ""))
			{
				alert('Time entered is not in a valid format\nPlease enter time as \nhh:mm[:ss] {AM|PM} or hh:mm[:ss] (24 hr time)');
				m_iErrorCount++;
				txtBox.focus();
			}
			else
			{
				m_iErrorCount = 0;
			}
			break;
			
		case "number":
			if(!(numberREV.test(sValue)) && (sValue != ""))
			{
				alert('Number entered is not in a valid format\nPlease re-enter number using only \noptional minus [-], numbers [1-9],\ncommas (,) seperating thousands,\nand no more than one decimal point (.)');
				m_iErrorCount++;
				txtBox.focus();
			}
			else
			{
				if(sValue != "")
				{
					alignTextBox(txtBox, 'right');
					txtBox.value = formatNumberForDisplay(sValue, iDecPlaces, null);
					if(txtHidden != null)
					{
						txtHidden.value = formatNumberForHidden(sValue, iDecPlaces);
					}
				}
				else
				{
					if(txtHidden != null)
					{
						txtHidden.value = "";
					}
				}
				m_iErrorCount = 0;
			}
			break;
			
		case "money":
			if(!(moneyREV.test(sValue)) && (sValue != ""))
			{
				alert('Dollar value entered is not in a valid format\nPlease re-enter value in the following format\nBrackets indicate optional characters\n\n[-][$][###][,][###][.##]');
				m_iErrorCount++;
				txtBox.focus();
			}
			else
			{
				if(sValue != "")
				{
					alignTextBox(txtBox, 'right');
					txtBox.value = formatNumberForDisplay(sValue, 2, '$');
					if(txtHidden != null)
					{
						txtHidden.value = formatNumberForHidden(sValue, 2);
					}
				}
				else
				{
					if(txtHidden != null)
					{
						txtHidden.value = "";
					}
				}
				m_iErrorCount = 0;
			}
			break;
			
		case "zip":
			if(!(zipREV.test(sValue)) && (sValue != ""))
			{
				alert('Zip Code entered is not in a valid format\nPlease re-enter value in the following format\nBrackets indicate optional characters\n\n#####[-][####]');
				m_iErrorCount++;
				txtBox.focus();
			}
			else
			{
				sValue = sValue.replace(/\D/g, '');
				if(txtHidden != null)
				{
					txtHidden.value = sValue;
				}

				if(sValue.length == 9)
				{
					txtBox.value = sValue.replace(/(\d\d\d\d\d)(\d\d\d\d)/, "$1-$2");
				}
				else
				{
					txtBox.value = sValue;
				}
				m_iErrorCount = 0;
			}
			break;

		case "phone":
			if(sValue != "")
			{
				sValue = sValue.replace(/\D/g, '');
			
				if((sValue.length == 10) || (sValue.length == 11))
				{
					if(sValue.length == 11)
					{
						if(sValue.substr(0,1) != "1")
						{
							alert('The Phone Number entered is not in a valid format,\nPlease enter phone number including area code, [1](###) ###-####');
							m_iErrorCount++;
							txtBox.focus();
						}
						else
						{
							if(txtHidden != null)
							{
								txtHidden.value = sValue;
							}
							txtBox.value = sValue.replace(/(\d)(\d\d\d)(\d\d\d)(\d\d\d\d)/, "($2) $3-$4")
							m_iErrorCount = 0;
						}
					}
					else
					{
						if(txtHidden != null)
						{
							txtHidden.value = sValue;
						}
						txtBox.value = sValue.replace(/(\d\d\d)(\d\d\d)(\d\d\d\d)/, "($1) $2-$3")
						m_iErrorCount = 0;
					}
				}
				else
				{
					alert('Please enter phone number including area code, [1](###) ###-####');
					m_iErrorCount++;
					txtBox.focus();
				}
			}
			break;

		case "visacredit":
			if(sValue != "")
			{
				sValue = sValue.replace(/\D/g, '');
			
				if((sValue.length == 16))
				{
					if(txtHidden != null)
					{
						txtHidden.value = sValue;
					}
					txtBox.value = sValue.replace(/(\d\d\d\d)(\d\d\d\d)(\d\d\d\d)(\d\d\d\d)/, "$1-$2-$3-$4")
					m_iErrorCount = 0;
				}
				else
				{
					alert('Credit Card Number Should Contain 16 Numeric Characters');
					m_iErrorCount++;
					txtBox.focus();
				}
			}
			break;

		case "amexcredit":
			if(sValue != "")
			{
				sValue = sValue.replace(/\D/g, '');
			
				if((sValue.length == 15))
				{
					if(txtHidden != null)
					{
						txtHidden.value = sValue;
					}
					txtBox.value = sValue.replace(/(\d\d\d\d)(\d\d\d\d\d\d)(\d\d\d\d\d)/, "$1-$2-$3")
					m_iErrorCount = 0;
				}
				else
				{
					alert('Credit Card Number Should Contain 15 Numeric Characters');
					m_iErrorCount++;
					txtBox.focus();
				}
			}
			break;

		case "ssn":
			if(sValue != "")
			{
				sValue = sValue.replace(/\D/g, '');
			
				if((sValue.length == 9))
				{
					if(txtHidden != null)
					{
						txtHidden.value = sValue;
					}
					txtBox.value = sValue.replace(/(\d\d\d)(\d\d)(\d\d\d\d)/, "$1-$2-$3")
					m_iErrorCount = 0;
				}
				else
				{
					alert('Social Security Number Should Contain 9 Numeric Characters');
					m_iErrorCount++;
					txtBox.focus();
				}
			}
			break;

	}
}

