function validateNumber(FNumber,FAllowZero)
{
if (FAllowZero)
	var pattern = /\D/;
else
	var pattern = /\D|^0/;

if (pattern.test(FNumber.value))
{
	message = "This field accepts positive whole numbers only.\n\n";
	message += "Please try again.  Thank you.";
	alert(message);
	FNumber.value = FNumber.defaultValue;
	FNumber.focus();
	return false;
}
else
	return true;
}

function validateDecimal(FNumber,FAllowNeg)
{
if (FAllowNeg)
{
	var pattern = /[^\d\-\.]|[\d\.]\-|\.[\d]*\./;
	PosText = "";
}
else
{
	var pattern = /[^\d\.]|\.[\d]*\./;
	PosText = "postive ";
}
var dotOnly = /^\.$/;
if (pattern.test(FNumber.value) || dotOnly.test(FNumber.value))
{
	message = "This field accepts " + PosText + "numbers only.\n\n";
	message += "Please try again.  Thank you.";
	alert(message);
	FNumber.value = FNumber.defaultValue;
	FNumber.focus();
	return false;
}
else
	return true;
}

function validateFlexCache(FNumber,FType)
{
if (isWhitespace(FNumber.value))
	return true;

switch (FType)
{
	case "Card":
		var pattern = /\d{19}/;
		numDigits = 19;
		break;
	case "PIN":
		var pattern = /\d{4}/;
		numDigits = 4;
		break;
}
if (pattern.test(FNumber.value))
	return true;
else
{
	message = "This field must have " + numDigits + " digits.\n\n";
	message += "Please try again.  Thank you.";
	alert(message);
	FNumber.value = FNumber.defaultValue;
	FNumber.focus();
	return false;
}
}

function validateDate(FDate)
{
isValidDate = true;
if (FDate.value != "")
{
	if (isNaN(Date.parse(FDate.value)))
		isValidDate = false;
	else
	{
		dateArray = FDate.value.split("/");
		if (dateArray.length == 3)
		{
			if (dateArray[0].length > 2 || dateArray[1].length > 2 || dateArray[2].length > 4)
				isValidDate = false;

			monthVal = parseInt(dateArray[0],10);
			dayVal = parseInt(dateArray[1],10);
			yearVal = parseInt(dateArray[2],10);
			if (isNaN(monthVal) || isNaN(dayVal) || isNaN(yearVal))
				isValidDate = false;
			else if (monthVal < 1 || monthVal > 12)
				isValidDate = false;
			else if (dayVal < 1 || dayVal > 31)
				isValidDate = false;
			else if (yearVal < 1900 || yearVal >= 2078)
				isValidDate = false;
			else if (monthVal == 2)
			{
				if (yearVal % 4 == 0 && dayVal > 29)
					isValidDate = false;
				else if (yearVal % 4 != 0 && dayVal > 28)
					isValidDate = false;
			}
			else if ((monthVal == 4 || monthVal == 6 || monthVal == 9 || monthVal == 11) && dayVal == 31)
				isValidDate = false;
		}
		else
			isValidDate = false;
	}
}

if (isValidDate)
	return true;
else
{
	alert("You have entered an invalid date.\nPlease use the mm/dd/yyyy format.");
	FDate.value = FDate.defaultValue;
	FDate.focus();
	return false;
}
}

function validatePrice(FPrice)
{
if (validateDecimal(FPrice))
{
	FPrice.value = rectifyPrice(FPrice.value);
	return true;
}
else
	return false;
}

function rectifyPrice(FPrice)
{
FPrice = FPrice.toString();
if (FPrice == "")
	return "";
var PriceArray = FPrice.split(".");
if (PriceArray.length == 1)
	FPrice = PriceArray[0] + ".00";
else if (PriceArray[1].length == 0)
	FPrice = PriceArray[0] + ".00";
else if (PriceArray[1].length == 1)
	FPrice = PriceArray[0] + "." + PriceArray[1] + "0";
else
	FPrice = PriceArray[0] + "." + PriceArray[1].slice(0,2);
return FPrice;
}

function commaPrice(FPrice)
{
startPrice = roundTwoDigits(FPrice);
var priceArray = startPrice.split(".");
priceString = "." + priceArray[1];
for (i=priceArray[0].length; i >= 0; i=i-3)
{
	if (i-3 <= 0)
		priceString = priceArray[0].slice(0,i) + priceString;
	else
		priceString = "," + priceArray[0].slice(i-3,i) + priceString;
}
return priceString;
}

function currencyPrice(FPrice,FCurrencySymbol,FExchangeRate)
{
if (FPrice == "TBD")
	return "TBD";
else if (FCurrencySymbol == "")
	return "$" + commaPrice(FPrice)
else
	return FCurrencySymbol + commaPrice(parseFloat(FPrice)*parseFloat(FExchangeRate))
}

function roundTwoDigits(FNumber)
{
startNumber = FNumber.toString();
var numberArray = startNumber.split(".");
if (numberArray.length == 1)
	return startNumber + ".00";
else if (numberArray[1].length == 1)
	return startNumber + "0";
else if (numberArray[1].length == 2)
	return startNumber;

wholeNumber = numberArray[0];
tenthsDigit = parseInt(numberArray[1].charAt(0));
hundredthsDigit = parseInt(numberArray[1].charAt(1));
decisionDigit = parseInt(numberArray[1].charAt(2));
if (decisionDigit >= 5)
{
	hundredthsDigit++;
	if (hundredthsDigit == 10)
	{
		hundredthsDigit = 0;
		tenthsDigit++;
		if (tenthsDigit == 10)
		{
			tenthsDigit = 0;
			wholeNumber++;
		}
	}
}
return wholeNumber + "." + tenthsDigit + hundredthsDigit;
}

function enforceMinimum(FNumber,FType,FMinimum)
{
if (FNumber.value == "")
	return true;

switch (FType)
{
case "Number":
	validation = validateNumber(FNumber,false);
	break;
case "Decimal":
	validation = validateDecimal(FNumber,false);
	break;
case "Price":
	validation = validatePrice(FNumber,false);
	break;
}
if (validation)
{
	if (FNumber.value < FMinimum)
	{
		alert("Ths value may not be less than " + FMinimum + ".\n\nPlease try again.  Thank you.");
		FNumber.value = FNumber.defaultValue;
		FNumber.focus();
		return false;
	}
	else
		return true;
}
else
	return false;
}

function validateEmail(FEmail)
{
FEmail.value = trim(FEmail.value);

var pattern = /^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$/i;
if (FEmail.value == "")
	return true;
else if (pattern.test(FEmail.value))
	return true;
else
{
	message = "You have entered an invalid e-mail address.\n\n";
	message += "Please try again.  Thank you.";
	alert(message);
	FEmail.value = FEmail.defaultValue;
	FEmail.focus();
	return false;
}
}

function isURL(FValue)
{
var pattern = /^ht{2}ps?:\/{2}/i;
if (pattern.test(FValue))
	return true;
else
	return false;
}

function validateURL(FURL)
{
if (FURL.value == "")
	return true;
else if (isURL(FURL.value))
	return true;
else
{
	message = "This field must begin with http:// or https://.\n\n"
	message += "Please try again.  Thank you."
	alert(message);
	FURL.value = FURL.defaultValue;
	FURL.focus();
	return false;
}
}

function changeState(FState,FCountry)
{
stateValue = selectValue(FState);
firstSemicolonPos = stateValue.indexOf(";");
lastSemicolonPos = stateValue.lastIndexOf(";");
if (firstSemicolonPos != -1)
{
	if (firstSemicolonPos == lastSemicolonPos)
		setSelectBox(FCountry,stateValue.slice(firstSemicolonPos+1));
	else
		setSelectBox(FCountry,stateValue.slice(firstSemicolonPos+1,lastSemicolonPos));
}
}

function changeCountry(FCountry,FState)
{
countryValue = selectValue(FCountry);
firstSemicolonPos = countryValue.indexOf(";");
lastSemicolonPos = countryValue.lastIndexOf(";");
if (firstSemicolonPos != -1)
{
	if (firstSemicolonPos == lastSemicolonPos)
		setSelectBox(FState,countryValue.slice(firstSemicolonPos+1));
	else
		setSelectBox(FState,countryValue.slice(firstSemicolonPos+1,lastSemicolonPos));
}
}

function validateState(FState,FCountry)
{
stateValue = selectValue(FState);
stateFirstSemicolonPos = stateValue.indexOf(";");
stateLastSemicolonPos = stateValue.lastIndexOf(";");
countryValue = selectValue(FCountry);
countryFirstSemicolonPos = countryValue.indexOf(";");
countryLastSemicolonPos = countryValue.lastIndexOf(";");

if (stateFirstSemicolonPos == -1)
	stateCountry = "";
{
	if (stateFirstSemicolonPos == stateLastSemicolonPos)
		stateCountry = stateValue.slice(stateFirstSemicolonPos+1);
	else
		stateCountry = stateValue.slice(stateFirstSemicolonPos+1,stateLastSemicolonPos);
}

if (countryFirstSemicolonPos == -1)
	countryState = "";
{
	if (countryFirstSemicolonPos == countryLastSemicolonPos)
		countryState = countryValue.slice(countryFirstSemicolonPos+1);
	else
		countryState = countryValue.slice(countryFirstSemicolonPos+1,countryLastSemicolonPos);
}

if (stateCountry == "" && countryState == "")
	return false;
else if (stateCountry == selectText(FCountry))
	return true;
else if (countryState == selectText(FState))
	return true;
else
	return false;
}

function setSelectBox(FSelectBox,FText)
{
selectTextFound = false;
for (Fi=0; Fi < FSelectBox.length; Fi++)
{
	if (trim(FSelectBox.options[Fi].text) == FText)
	{
		FSelectBox.selectedIndex = Fi;
		selectTextFound = true;
		break;
	}
}
return selectTextFound;
}

function setSelectValue(FSelectBox,FValue)
{
selectValueFound = false;
for (Fi=0; Fi < FSelectBox.length; Fi++)
{
	if (FSelectBox.options[Fi].value.toString() == FValue.toString())
	{
		FSelectBox.selectedIndex = Fi;
		selectValueFound = true;
		break;
	}
}
return selectValueFound;
}

function trim(FString)
{
return FString.replace(/^\s*|\s*$/g,"");
}

function selectText(FSelectBox)
{
textValue = FSelectBox.options[FSelectBox.selectedIndex].text;
return trim(textValue);
}

function selectValue(FSelectBox)
{
valueValue = FSelectBox.options[FSelectBox.selectedIndex].value;
return trim(valueValue);
}

function radioValue(FRadio)
{
valueValue = "";
if (FRadio[0] == null)
	valueValue = FRadio.value;
else
{
	for (i=0; i < FRadio.length; i++)
	{
		if (FRadio[i].checked)
		{
			valueValue = FRadio[i].value;
			break;
		}
	}
}
return trim(valueValue);
}

function refreshCart()
{
if (parent.frames[0].name == "NexternalCart")
	cartFrame = parent.frames[0];
else if (parent.frames[1].name == "NexternalCart")
	cartFrame = parent.frames[1];
cartFrame.location.replace("cart.asp?CheckCart=True&FromRefresh=True&Count=" + Math.random() + "&OverrideJava=True#Bottom");
}

function autoChange(FIsPopulated,FRadioCheckbox)
{
if ((FRadioCheckbox != null) && (FIsPopulated.value != ""))
	FRadioCheckbox.checked = true;
}

function autoCheck(FCheckboxA,FCheckboxB,FCheckUncheck)
{
if (FCheckboxB != null)
{
	if (FCheckUncheck && FCheckboxA.checked)
		FCheckboxB.checked = true;
	else if (!FCheckUncheck && !FCheckboxA.checked)
		FCheckboxB.checked = false;
}
}

function validateNoSpace(FInput)
{
if (FInput.value == "")
	return true;
else if (FInput.value.indexOf(" ") != -1)
{
	message = "This field does not accept spaces.\n\n";
	message += "Please try again.  Thank you.";
	alert(message);
	FInput.value = FInput.defaultValue;
	FInput.focus();
	return false;
}
else
	return true;
}

function getClientDate()
{
dateObj = new Date();
curMonth = dateObj.getMonth()+1;
curDay = dateObj.getDate();
curYear = dateObj.getYear();
if (curYear < 1000)
	curYear += 1900;
curHours = dateObj.getHours();
curMinutes = dateObj.getMinutes();
curSeconds = dateObj.getSeconds();

curDate = curMonth + "/" + curDay + "/" + curYear + " " + curHours + ":" + curMinutes + ":" + curSeconds;
return curDate;
}

function isWhitespace(FValue)
{
var pattern = /^\s*$/;
if (pattern.test(FValue))
	return true;
else
	return false;
}

function isPOBox(FAddressLine1,FAddressLine2)
{
address1Chars = FAddressLine1.value.replace(/\W/g,"");

var poBoxTest = /^(pobox|pob|postofficebox)\d/i;
if (poBoxTest.test(address1Chars))
{
	if (isWhitespace(FAddressLine2.value))
		return true;
	else
	{
		address2Chars = FAddressLine2.value.replace(/\W/g,"");
		if (poBoxTest.test(address2Chars))
			return true;
		else
			return false;
	}
}
else
	return false;
}

function enforceMaximum(FNumber,FAllowZero,FType,FMaximum)
{
switch (FType)
{
case "Number":
	validation = validateNumber(FNumber,FAllowZero);
	break;
case "Decimal":
	validation = validateDecimal(FNumber,false);
	break;
case "Price":
	validation = validatePrice(FNumber,false);
	break;
}
if (validation)
{
	if (FNumber.value > FMaximum)
	{
		alert("Ths value may not exceed " + FMaximum + ".\n\nPlease try again.  Thank you.");
		FNumber.value = FNumber.defaultValue;
		FNumber.focus();
		return false;
	}
	else
		return true;
}
else
	return false;
}


function resetSelectBox(FSelectBox)
{
for (Fi=0; Fi < FSelectBox.length; Fi++)
{
	if (FSelectBox.options[Fi].defaultSelected)
	{
		FSelectBox.selectedIndex = Fi;
		break;
	}
}
}

function promptNew(FSelect,FName,FFindMatch,FDeleteNone,FMaxLength)
{
if (selectValue(FSelect) == 0 && selectValue(FSelect) != "")
{
	EnteredName = prompt("Please enter the new " + FName + ":","");
	if (EnteredName == null)
	{
		resetSelectBox(FSelect);
		return false;
	}
	else if (isWhitespace(EnteredName))
	{
		alert(FName + " cannot be blank.\n\nPlease try again.  Thank you.");
		return promptNew(FSelect,FName,FFindMatch,FMaxLength);
	}
	else if (EnteredName.length > FMaxLength)
	{
		alert(FName + " exceeds the " + FMaxLength + " character limit.\n\nPlease try again.  Thank you.");
		return promptNew(FSelect,FName,FFindMatch,FMaxLength);
	}
	else
	{
		matchFound = false;
		if (FFindMatch)
		{
			for (i=0; i < FSelect.length; i++)
			{
				if (FSelect.options[i].text == EnteredName)
				{
					FSelect.selectedIndex = i;
					matchFound = true;
					break;
				}
			}
		}
		if (!matchFound)
		{
			FSelect.options[FSelect.selectedIndex].value = EnteredName;
			FSelect.options[FSelect.selectedIndex].text = EnteredName;
			if (FDeleteNone && FSelect.options[0].value == "")
				FSelect.options[0] = null;
		}
		return true;
	}
}
else
	return true;
}

function browserName()
{
browserAgent = navigator.userAgent;
var patternFirefox = /firefox/i;
var patternNetscape = /netscape/i;
var patternOpera = /opera/i;
var patternSafari = /safari/i;
var patternIE = /msie/i;
var patternMac = /mac/i;

if (patternFirefox.test(browserAgent))
	return "Firefox";
else if (patternNetscape.test(browserAgent))
	return "Netscape";
else if (patternOpera.test(browserAgent))
	return "Opera";
else if (patternSafari.test(browserAgent))
	return "Safari";
else if (patternIE.test(browserAgent) && patternMac.test(browserAgent))
	return "MacIE";
else if (patternIE.test(browserAgent))
	return "IE";
else
	return "Other";
}

function persistOpera(FURL)
{
if (browserName() == "Opera")
{
	if (parent.frames[0].name == "NexternalProduct")
		productFrame = parent.frames[0];
	else
		productFrame = parent.frames[1];
	productFrame.location.href = FURL;
	return false;
}
else
	return true;
}

function magicWindow(FURL)
{
if (browserName() == "MacIE")
{
	if (FURL.indexOf("?") == -1)
		magicURL = FURL + "?MagicWindow=True"
	else
		magicURL = FURL + "&MagicWindow=True"
	windowName = "magicwindow" + Math.random().toString().slice(3,7);
	window.open(magicURL,windowName,"width=1,height=1,left=5000,screenX=5000");
	window.focus();
}
else
	ajaxCall(FURL,true);
return false;
}

function ajaxCall(FURL,FAsync)
{
if (browserName() == "MacIE")
	return "";
else if (window.XMLHttpRequest)
	ajaxReq = new XMLHttpRequest();
else if (window.ActiveXObject)
	ajaxReq = new ActiveXObject("Microsoft.XMLHTTP");
else
	return "";
if (FURL.indexOf("?") == -1)
	submitURL = FURL + "?count=" + Math.random();
else
	submitURL = FURL + "&count=" + Math.random();
if (FAsync)
{
	ajaxReq.onreadystatechange = function()
	{
		if (ajaxReq.readyState == 4)
		{
			switch (ajaxReq.responseText)
			{
				case "Session":
					sessionTimeout();
					break;
				case "Date":
					alert("You have entered an invalid date.\nYour changes have NOT been processed.\n\nPlease try again.  Thank you.");
					break;
			}
		}
	}
}
ajaxReq.open("GET",submitURL,FAsync);
ajaxReq.send(null);

if (!FAsync)
{
	switch (ajaxReq.responseText)
	{
		case "Session":
			sessionTimeout();
			return "";
			break;
		case "Date":
			alert("You have entered an invalid date.\nYour changes have NOT been processed.\n\nPlease try again.  Thank you.");
			return "";
			break;
		default:
			return ajaxReq.responseText;
			break;
	}
}
}

function sessionTimeout()
{
var startURL = findCookie("URL");
if (isWhitespace(startURL))
{
	startURL = "http://www.nexternal.com";
	var accountName = findQueryString(window,"CS");
	if (!isWhitespace(accountName))
		startURL += "/" + accountName;
}
window.top.location.href = startURL;
}

function addToFavorites(FURL,FName)
{
userBrowser = browserName();
switch(userBrowser)
{
	case "IE":
		window.external.AddFavorite(FURL,FName);
		break;
	case "Firefox":
		window.sidebar.addPanel(FName,FURL,"");
		break;
	default:
		alert("I'm sorry ...\n\n" + userBrowser + " does not support this functionality.");
		break;
}
}

function sizePopup(FIteration)
{
userBrowser = browserName();
if (FIteration > 1 && (userBrowser == "Firefox" || userBrowser == "Safari" || userBrowser == "Netscape"))
	return;
windowWidth = document.body.scrollWidth+30;
windowHeight = document.body.scrollHeight;
if (userBrowser == "Firefox")
	windowHeight += 57;
else if (userBrowser == "Safari")
	windowHeight += 30;
else if (userBrowser == "Netscape")
	windowHeight += 10;
else
	windowHeight += 62;
maxWidth = screen.availWidth-40;
maxHeight = screen.availHeight-40;
window.resizeTo(Math.min(windowWidth,maxWidth),Math.min(windowHeight,maxHeight));
}

function autoEnableDisable(FCheckbox,FField,FTrueFalse)
{
if (FField != null)
{
	if (FCheckbox.checked)
		FField.disabled = !FTrueFalse;
	else
		FField.disabled = FTrueFalse;
}
}

function findQueryString(FWindow,FParameter)
{
var queryString = FWindow.document.location.search;
var qsPairs = queryString.split("&");
for (var i=0; i < qsPairs.length; i++)
{
	var equalsPos = qsPairs[i].indexOf("=");
	if (equalsPos > -1)
	{
		var parameterStartChar = 0;
		if (qsPairs[i].charAt(0) == "?")
			parameterStartChar = 1;
		if (qsPairs[i].substring(parameterStartChar,equalsPos) == FParameter)
			return qsPairs[i].substring(equalsPos+1);
	}
}
return "";
}

function findCookie(FParameter)
{
var cookieString = document.cookie;
var parameterPos = cookieString.indexOf(FParameter + "=");
if (parameterPos == -1)
	return "";
else
{
	var parameterStart = parameterPos + FParameter.length + 1;
	var parameterEnd = cookieString.indexOf(";",parameterStart);
	if (parameterEnd == -1)
		parameterEnd = cookieString.length;
	return unescape(cookieString.substring(parameterStart,parameterEnd));
}
}