//constants
var decimalPointDelimiter = "."
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9

function WarnTextBox(pField)
{
	if (pField == null)
		return;

	vMessage = pField.name + " is a required field!";
	if (WarnTextBox.arguments.length > 1)
		vMessage = pField.name + ": " + WarnTextBox.arguments[1];
				
	alert(vMessage);
	pField.focus();
	pField.select();
}

function WarnDropDown(pField)
{
	if (pField == null)
		return;
		
	vMessage = pField.name + " is a required field!";
	if (WarnDropDown.arguments.length > 1)
		vMessage = WarnDropDown.arguments[1];
				
	alert(vMessage);
	pField.focus();
}

function isEmpty(s)
{   
	return ((s == null) || (s.length == 0));
}

function isDigit (c)
{   
	return ((c >= "0") && (c <= "9"));
}

function isNegativeInteger (s)
{   
    return (isSignedInteger(s) && (parseInt (s) < 0) );
}

function isNonnegativeInteger (s)
{  
    return (isSignedInteger(s) && (parseInt (s) >= 0) );
}

function isPositiveInteger (s)
{
	return (isSignedInteger(s) && (parseInt (s) > 0) );
}

function isInteger(s)
{
	for (i = 0; i < s.length; i++)
    {   
        if (!isDigit(s.charAt(i))) 
			return false;
    }
    return true;
}

function isFloat (s)
{       
	var seenDecimalPoint = false;
    for (i = 0; i < s.length; i++)
    {   
		c = s.charAt(i)
        if ((c == decimalPointDelimiter) && !seenDecimalPoint) 
			seenDecimalPoint = true;
        else if (!isDigit(c)) 
			return false;
    }
    return true;
}

function isSignedInteger (s)
{   
    var startPos = 0;

    if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
       startPos = 1;    
    return (isInteger(s.substring(startPos, s.length)))
}

function IsNotValidPositiveNumber(s)
{
	return (isEmpty(s) || !isPositiveInteger(s));
}

function IsNotValidPositiveNumber_TextBox(pField)
{
	vIsRequired = true;
	if (IsNotValidPositiveNumber_TextBox.arguments.length > 1)
		vIsRequired = IsNotValidPositiveNumber_TextBox.arguments[1]
			
	if (isEmpty(pField.value))
	{
		if(vIsRequired)
		{
			WarnTextBox(pField);
			return true;	
		}
		else
			return false;
	}
	
	if (IsNotValidPositiveNumber(pField.value))
	{
		 WarnTextBox(pField, "Invalid Data!");
		 return true;
	}
	return false;
}

function isCreditCard(st) 
{
	// Encoding only works on cards with less than 19 digits
	if (st.length > 19)
		return (false);

	sum = 0; 
	mul = 1; 
	l = st.length;
	for (i = 0; i < l; i++) 
	{
		digit = st.substring(l-i-1,l-i);
		tproduct = parseInt(digit ,10)*mul;
		if (tproduct >= 10)
			sum += (tproduct % 10) + 1;
		else
			sum += tproduct;
		if (mul == 1)
			mul++;
		else
			mul--;
	}
	return (sum % 10) == 0;
}

function isVisa(cc)
{
	if (((cc.length == 16) || (cc.length == 13)) &&	(cc.substring(0,1) == 4))
		return isCreditCard(cc);
	return false;
}

function isMasterCard(cc)
{
	firstdig = cc.substring(0,1);
	seconddig = cc.substring(1,2);
	if(	((cc.length == 16) && (firstdig == 5) &&	((seconddig >= 1) && (seconddig <= 5))) ||
			((cc.length == 14) && (firstdig == 3) &&	(seconddig == 6))
		)
		return isCreditCard(cc);
	return false;
}

function isAmericanExpress(cc)
{
	firstdig = cc.substring(0,1);
	seconddig = cc.substring(1,2);
	if ((cc.length == 15) && (firstdig == 3) &&	((seconddig == 4) || (seconddig == 7)))
		return isCreditCard(cc);
	return false;
}

function isDinersClub(cc)
{
	firstdig = cc.substring(0,1);
	seconddig = cc.substring(1,2);
	if ((cc.length == 14) && (firstdig == 3) &&	((seconddig == 0) || (seconddig == 8)))
		return isCreditCard(cc);
	return false;
}

function isCarteBlanche(cc)
{
	return isDinersClub(cc);
}

function isDiscover(cc)
{
	first4digs = cc.substring(0,4);
	if ((cc.length == 16) && (first4digs == "6011"))
		return isCreditCard(cc);
	return false;
}

function isJCB(cc)
{
	first4digs = cc.substring(0,4);
	if (
			(cc.length == 16) && 
			(
				(first4digs == "3088") || (first4digs == "3096") ||
				(first4digs == "3112") || (first4digs == "3158") ||
				(first4digs == "3337") || (first4digs == "3528")
			)
		)
		return isCreditCard(cc);
	return false;
}

function isAnyCard(cc)
{
	if (!isCreditCard(cc))
		return false;
	if (!isMasterCard(cc) && !isVisa(cc) && !isAmericanExpress(cc) && !isDinersClub(cc) &&	!isDiscover(cc) && !isEnRoute(cc) && !isJCB(cc)) 
		return false;
	return true;
}

function isCardMatch (cardType, cardNumber)
{
	cardType = cardType.toUpperCase();

	if ((cardType == "VISA") && (!isVisa(cardNumber)))
		return false;

	if ((cardType == "MASTERCARD" || cardType == "MASTER CARD") && (!isMasterCard(cardNumber)))
		return false;

	if ( ( (cardType == "AMERICAN EXPRESS") || (cardType == "AMEX") ) && (!isAmericanExpress(cardNumber))) 
		return false;        
	        
	if ((cardType == "DISCOVER" || cardType == "DISCOVER/NOVUS") && (!isDiscover(cardNumber)))
		return false;
		
	if ((cardType == "JCB") && (!isJCB(cardNumber)))
		return false;
			
	if ((cardType == "DINERS" || cardType == "DINERSCLUB" || cardType == "DINERS CLUB") && (!isDinersClub(cardNumber)))
		return false;
					
	if ((cardType == "CARTEBLANCHE") && (!isCarteBlanche(cardNumber)))
		return false;

	return true;
}

function IsEmptyTextBox(pField)
{
	if (pField == null) 
		return true;
		
	if (isEmpty(pField.value))
	{	
		WarnTextBox(pField);
		return true;
	}
	return false;
}

function IsNotValidCardNumber(pField)
{
	if (pField == null) 
		return false;
		
	vIsRequired = true;
	if (IsNotValidCardNumber.arguments.length > 1)
		vIsRequired = IsNotValidCardNumber.arguments[1]
	
	if (isEmpty(pField.value))
	{
		if(vIsRequired)
		{
			WarnTextBox(pField);
			return true;	
		}
		else
			return false;
	}
	
	if (!isCreditCard(pField.value))
	{
		alert("Incorrect CardNumber!");
		pField.focus();
		pField.select();
		return true;
	}
	return false;
}

function IsNotSelectedDropDown(pField, pInvalidValue)
{
	if (pField == null) 
		return false;
		
	if (pField.value == pInvalidValue)
	{
		WarnDropDown(pField);
		return true;
	}
	return false;
}

function IsNotValidDate(pDateFieldId, pRequired) //Format: DD/MM/YY or DD/MM/YYYY
{	
	if (pDateFieldId == null) 
		return false;
		
	if (isEmpty(pDateFieldId.value))
	{
		if (pRequired)
		{
			alert("Invalid date (mm/dd/yyyy)!");
			pDateFieldId.focus();
			pDateFieldId.select();
			return true;		
		}
		else
			return false;
	}	
		
	vArray = pDateFieldId.value.split("/");	
	vTokensCount = vArray.length;
		
	if (vTokensCount != 3)
	{
		alert("Invalid date (mm/dd/yyyy)!");
		pDateFieldId.focus();
		pDateFieldId.select();
		return true;
	}
	
    for (i = 0; i < pDateFieldId.value.length; i++)
    {   
        var c = pDateFieldId.value.charAt(i);

        if ((c < '0' || c > '9') && c!= '/') 
        {
			alert("Invalid date (mm/dd/yyyy)!");
			pDateFieldId.focus();
			pDateFieldId.select();
			return true;
        }
    }
	
	vMonth = parseInt(vArray[0], 10);
	vDay = parseInt(vArray[1], 10);
	vYear = parseInt(vArray[2], 10);	
		
	if ((vMonth < 1 || vMonth > 12) || 
		(vDay < 1 || vDay > 31) || 
		((vArray[2].length != 2 && vArray[2].length != 4) || vYear < 1) )
	{
		alert("Invalid data (mm/dd/yyyy)!");
		pDateFieldId.focus();
		pDateFieldId.select();
		return true;
	}
	if (vArray[2].length == 2)
		pDateFieldId.value = vArray[0] + "/" + vArray[1] + "/20" + vArray[2];
	return false;
}

function IsNotValidExpDate(pDateFieldId) //Format: MMYY
{	
	if (pDateFieldId == null)
		return false;
	
	if(pDateFieldId.value.length != 4)
	{
		alert("Invalid ExpDate: MMYY");
		pDateFieldId.focus();
		pDateFieldId.select();
		return true;
	}
	
    for (i = 0; i < pDateFieldId.value.length; i++)
    {   
        if (!isDigit(pDateFieldId.value.charAt(i))) 
        {
			alert("Invalid ExpDate: MMYY");
			pDateFieldId.focus();
			pDateFieldId.select();
			return true;
        }
    }	
	return false;
}

function CardTypeDoesNotMatchCardNumber(pCardTypeField, pCardNumberField)
{
	if (!isCardMatch (pCardTypeField, pCardNumberField.value))
	{
		alert("Card Type and Card Number do not match");
		pCardNumberField.focus();
		pCardNumberField.select();
		return true;		
	}
	return false;
}

function isZIPCode (s)
{  
   return (isInteger(s) && ((s.length == digitsInZIPCode1) ||  (s.length == digitsInZIPCode2)))
}

function IsNotValidZipCode(pField)
{
	if (pField == null) 
		return false;
		
	vRequired = true;
	if (IsNotValidZipCode.arguments.length > 1)
		vRequired = IsNotValidZipCode.arguments[1]
		
	if (isEmpty(pField.value) && !vRequired)
		return false;
       
	if (!isZIPCode(pField.value))
	{
		alert("Invalid ZipCode: 5 or 9 Digits");
		pField.focus();
		pField.select();
		return true;
	}
	return false;
}

function IsNotValidFloatAmount_TextBox(pField)
{	
	if (pField == null) 
		return false;
		
	vIsRequired = true;
	if (IsNotValidFloatAmount_TextBox.arguments.length > 1)
		vIsRequired = IsNotValidFloatAmount_TextBox.arguments[1]
	
	if (isEmpty(pField.value))
	{
		if(vIsRequired)
		{
			WarnTextBox(pField);
			return true;	
		}
		else
			return false;
	}
	
	if(!isFloat(pField.value))
	{
		WarnTextBox(pField, "Invalid Amount!");
		return true;
	}
	return false;
}

function IsNotNumericString_TextBox(pField)	
{
	if (pField == null) 
		return false;

	vIsRequired = true;
	if (IsNotNumericString_TextBox.arguments.length > 1)
		vIsRequired = IsNotNumericString_TextBox.arguments[1]
			
	if (isEmpty(pField.value))
	{
		if(vIsRequired)
		{
			WarnTextBox(pField);
			return true;	
		}
		else
			return false;
	}

	if (!isInteger(pField.value))
	{
		WarnTextBox(pField, "Invalid Data");
		return true;
	}
	
	return false;
}

function CenterWindow(pWindowHandle, pHeight, pWidth) 
{
	if (navigator.appName == "Netscape") 
	{
		inputW = (parseInt(pWidth) + 12)
		inputH = (parseInt(pHeight) + 32)
	} else 
	{
		inputW = (parseInt(pWidth) + 10)
		inputH = (parseInt(pHeight) + 30)
	}
//grab screen size
	screenW = screen.width
	screenH = screen.height
//calculate center position values
	newX = ((screenW / 2) - (inputW / 2))
	newY = ((screenH / 2) - (inputH / 2))
//move new window to center
	pWindowHandle.moveTo(newX,newY)
}

function OpenWindowAndCenter(pURL, pHeight, pWidth)
{
	vWindowHandle = window.open(pURL,'_blank','height=' + pHeight + ', width=' + pWidth + ',resizable=no,scrollbars=yes');		
	CenterWindow(vWindowHandle, pHeight, pWidth);
	return vWindowHandle;
}

function IsValidCVV(pCardNumber, pCVVI, pCVV)
{
	if (pCVVI == 1 && pCVV == "")
	{
		alert("Please provide a CVV or Choose another CVV Indicator");
		return false;
	}
	
	if (pCVV != "")
	{
		if (isVisa(pCardNumber) && pCVV.length != 3)
		{
			alert("CVV for VISA must be 3 digits");
			return false;
		}
		if (isMasterCard(pCardNumber) && pCVV.length != 3)
		{
			alert("CVV for MASTERCARD must be 3 digits");
			return false;
		}
		if (isAmericanExpress(pCardNumber) && pCVV.length != 4)
		{
			alert("CVV for AMEX must be 4 digits");
			return false;
		}
		if (isDiscover(pCardNumber) && pCVV.length != 3)
		{
			alert("CVV for DISCOVER must be 3 digits");
			return false;
		}
	}
	return true;	
}

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)
	{
		fld.value = "";
		return true; //BackSpace
	}
	
	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
	while (len < 9) {
		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
	}
	return false
}

function GetTrack1(pTrackData)
{
	var vTrack1StartSentinal = pTrackData.indexOf("%");
	var vTrack1EndSentinal = pTrackData.indexOf("?", vTrack1StartSentinal);
	vTrack1 = ""
	if (vTrack1StartSentinal != -1 && vTrack1EndSentinal != -1)
		vTrack1 = pTrackData.substring(vTrack1StartSentinal+1, vTrack1EndSentinal)
	return vTrack1;
}

function ParseTrack1(pTrack1)
{
	var re = /^B([\d|\s]+)\^(.+)\^(.+)$/;
	var arr = re.exec(pTrack1);
	var result = new Array();
	if (arr != null && arr.length == 4)
	{
		result[0] = RegExp.$2;
		result[1] = RegExp.$1;
		result[1] = result[1].replace(/\s/g, "");
		result[2] = (RegExp.$3).substring(0, 4);
	}
	return result;
}

function GetTrack2(pTrackData)
{
	var vTrack2StartSentinal = pTrackData.indexOf(";");
	var vTrack2EndSentinal = pTrackData.indexOf("?", vTrack2StartSentinal);
	var vTrack2 = ""
	if (vTrack2StartSentinal != -1 && vTrack2EndSentinal != -1)
		vTrack2 = pTrackData.substring(vTrack2StartSentinal+1, vTrack2EndSentinal)
	return vTrack2;
}

function ParseTrack2(pTrack2)
{
	re = /^([\d|\s]+)=(.+)$/;
	var arr = re.exec(pTrack2);
	var result = new Array();
	if (arr != null && arr.length == 3)
	{
		result[0] = RegExp.$1;
		result[0] = result[0].replace(/\s/g, "");		
		result[1] = (RegExp.$2).substring(0, 4);
	}
	return result;
}

function IsValidEmail(pField) 
{
	if (pField == null) 
		return false;

	vIsRequired = true;
	if (IsValidEmail.arguments.length > 1)
		vIsRequired = IsValidEmail.arguments[1]
			
	var pEmail = pField.value;

	if (isEmpty(pField.value))
	{
		if(vIsRequired)
		{
			WarnTextBox(pField);
			return false;	
		}
		else
			return true;
	}

	var pEmail = pField.value;
	var at="@"
	var dot="."
	var lat=pEmail.indexOf(at)
	var lstr=pEmail.length
	var ldot=pEmail.indexOf(dot)
	
	if (pEmail.indexOf(at)==-1)
	{
		WarnTextBox(pField, "Invalid Data");
		return false
	}

	if (pEmail.indexOf(at)==-1 || pEmail.indexOf(at)==0 || pEmail.indexOf(at)==lstr)
	{
		WarnTextBox(pField, "Invalid Data");
		return false
	}

	if (pEmail.indexOf(dot)==-1 || pEmail.indexOf(dot)==0 || pEmail.indexOf(dot)==lstr)
	{
		WarnTextBox(pField, "Invalid Data");
		return false
	}

	if (pEmail.indexOf(at,(lat+1))!=-1)
	{
		WarnTextBox(pField, "Invalid Data");
		return false
	}

	if (pEmail.substring(lat-1,lat)==dot || pEmail.substring(lat+1,lat+2)==dot)
	{
		WarnTextBox(pField, "Invalid Data");
		return false
	}

	if (pEmail.indexOf(dot,(lat+2))==-1)
	{
		WarnTextBox(pField, "Invalid Data");
		return false
	}
			
	if (pEmail.indexOf(" ")!=-1)
	{
		WarnTextBox(pField, "Invalid Data");
		return false
	}
	return true
}