// VARIABLE DECLARATIONS
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// whitespace characters
var whitespace = " \t\n\r";
// decimal point character differs by language and culture
var decimalPointDelimiter = "."
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in US phone numbers
var validUSPhoneChars = digits + phoneNumberDelimiters;
// U.S. phone numbers have 10 digits.
// They are formatted as 123 456 7890 or (123) 456-7890.
var digitsInUSPhoneNumber = 10;
// non-digit characters which are allowed in ZIP Codes
var ZIPCodeDelimiters = "-";
// our preferred delimiter for reformatting ZIP Codes
var ZIPCodeDelimeter = "-"
// characters which are allowed in Social Security Numbers
var validZIPCodeChars = digits + ZIPCodeDelimiters
// U.S. ZIP codes have 5 or 9 digits.
// They are formatted as 12345 or 12345-6789.
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9

// ******************************************************************
// Set Globals for dates
// ******************************************************************
var DateObj   = new Date()
DateObj.setDate( DateObj.getDate());

var dDay     = DateObj.getDate();
var dMonth   = DateObj.getMonth() + 1;
var dYear    = DateObj.getYear();

if (dYear < 96)
	dYear = 2000 + dYear;
else
	if (dYear < 200)
		dYear = 1900 + dYear;
var strToday = ( dMonth + "/" + dDay + "/" + dYear )

// ******************************************************************
var gDisplayMsg;	// True = Display message, False = suppress message

var gDISPLAY_ON;	// Used as Constants
var gDISPLAY_OFF;	// Used as Constants

gDISPLAY_ON = 1;
gDISPLAY_OFF = 0;
gDisplayMsg = 0;	

// ******************************************************************
function setDisplayOn()
{
	gDisplayMsg = gDISPLAY_ON;
}
// ******************************************************************
function setDisplayOff()
{
	gDisplayMsg = gDISPLAY_OFF;
}
// ******************************************************************
function displayMessage(sMsg)
{
	if (gDisplayMsg == gDISPLAY_ON)
		alert(sMsg);
}
// ******************************************************************
function FindItemInList(objlist,searchValue)
{    
    for (var i=0; i < objlist.options.length; i++)
    {
		if (objlist.options[i].value == searchValue)
		{
			return objlist.options[i].index;
		}
	}
	return -1;
}
// ******************************************************************
function add_to_list(objListAvailable, objListSelected)
{
    var sText;
    var idx = 0;
    var iItemsInList = objListAvailable.options.length;
    var selectedNumber = 0;

	// Remove the dummy entry used to set the width
	if (objListSelected.options.length > 0)
		if (objListSelected.options[0].value == "NO_VALUE")
			objListSelected.options[0] = null;

    if ( iItemsInList == 0 )
    {
        window.alert('No items to add.');
        return;
    }

    while ( idx < iItemsInList )
    {
        if ( objListAvailable.options[idx].selected )
        {
	        sText = objListAvailable.options[idx].text;
			objListSelected.options[objListSelected.options.length] = new Option( sText, objListAvailable.options[idx].value );
			objListAvailable.options[idx]=null;
            iItemsInList = objListAvailable.options.length;
            selectedNumber += 1;
        }
        else
            idx++;
    }

    if ( selectedNumber == 0 )
        window.alert('Select an item then press ADD TO LIST button.');

	objListAvailable.value = '';
    objListAvailable.focus();
}
// ******************************************************************       
function remove_from_list(objListAvailable, objListSelected)
{
    var selectedNumber = 0;
    var iItemsInList = objListSelected.options.length;
    var idx = 0;
    var sText
            
	// Remove the dummy entry used to set the width
	if (objListSelected.options.length > 0)
		if (objListSelected.options[0].value == "NO_VALUE")
			{
			objListSelected.options[0] = null;
			iItemsInList = objListSelected.options.length;
			}

    if ( iItemsInList == 0 )
    {
        window.alert('No items to remove.');
        return;
    }
            
    while ( idx < iItemsInList )
    {
        if ( objListSelected.options[idx].selected )
        {
			sText = objListSelected.options[idx].text;
	        objListAvailable.options[objListAvailable.options.length] = new Option( sText, objListSelected.options[idx].value );
            selectedNumber += 1;
            objListSelected.options[idx] = null;
            iItemsInList = objListSelected.options.length;
        }
        else
            idx++;
    }
            
    if ( selectedNumber == 0 )
        window.alert('Select an item then press REMOVE FROM LIST button.');

	objListSelected.value = '';
    objListSelected.focus();
}
// ******************************************************************
function selectListItems(objList)
{
	for (var i=0; i < objList.length; i++)
		objList.options[i].selected = true;
}
// ******************************************************************
function selectListItem(objList,Index)
{
	objList.options[Index].selected = true;
}
// ******************************************************************
function getFieldTitle(fld)
{
var title;
	
	if ((fld.title == null) || (fld.title == ""))
	{
	 title = fld.name;
	}
	else
	{
	 title = fld.title;
	} 
	return title;      
}
// ******************************************************************
function isRequired(sFieldvalue)
{		
	if (isEmpty(sFieldvalue))
	{
		return false;
	}
	return true;
}

// ******************************************************************
function isEmpty(sFieldvalue)
{		
	if ((sFieldvalue == null) || (sFieldvalue == ""))
		{
			return true;
		}
	return false;
} 
// ********************************************************************************
function isNumeric(sFieldvalue)
{
var valid = "1234567890/.";
var title;		
    
    for (var i=0; i< sFieldvalue.length; i++) {
        if (valid.indexOf(sFieldvalue.charAt(i)) < 0) {
            return false;
        }
    }
    return true;
}
// ********************************************************************************
function isPhone(sFieldvalue)
{
var valid = "1234567890";

	var s = stripCharsInBag(sFieldvalue,phoneNumberDelimiters);
	
	if (!isEmpty(s)) 
	{	
		if (s.length < digitsInUSPhoneNumber)
		{
			return false;
		}else
		{
			for (var i=0; i< s.length; i++)
			{
				if (isNaN(s.charAt(i)))
					{ return false; }
			}
        }
    }
    return true;
}
function isAlphaNumeric(sFieldvalue) {
	var valid = digits + lowercaseLetters + uppercaseLetters
	for (var i=0; i< sFieldvalue.length; i++) {
        if (valid.indexOf(sFieldvalue.charAt(i)) < 0) {
            return false;
        }
    }
    return true;
}
/*
var valid = "1234567890 ()+"
var title;

    for (var i=0; i<sFieldvalue.length; i++) {
        if (valid.indexOf(sFieldvalue.charAt(i)) < 0) {			
            return false;
        }
    }
    return true;
*/
// ******************************************************************
function checkZIPCode (value)
{  
var s;

	s = stripCharsInBag(value,"-");
	
	//alert("s= " + s);
	if (!isEmpty(s)) 
	{
		//alert("1")
		if (!isNumber(s)) { return false; }
		
		//alert("length " + s.length);
		
		if ((s.length == digitsInZIPCode1) || (s.length == digitsInZIPCode2))
		{
			//alert("2");
			return true;
		}else
		{
			//alert("3");
			return false;
		}
	}
}
// ******************************************************************
function isNumber(value) 
{	for (var i=0; i < value.length; i++) {
		if (value.charAt(i) != '.') {
			a = parseInt(value.charAt(i));
			if (isNaN(a)) {
				return false;			
				break;
			}
		}
	}
	return true;
}
function isURL(value) {
	var s = value.substr(0, 7)
	if (s != 'http://') 
		return false
	else
		return true
}
// ******************************************************************
// ******************************************************************
function isNumberWithCommas(value) 
{	for (var i=0; i < value.length; i++) {
		a = parseInt(value.charAt(i));
		if (isNaN(a) && a != ',') {
			return false;			
			break;
		}
	}
	return true;
}
// ******************************************************************
function ensureSSN(value)
{
var s;

	s = stripCharsNotInBag(value,digits);	

	if (!isNumber(s))
	{
		return false;
	}
		
	if (s.length != 9)
	{
		return false;
	}
	
	return true;
}
// ********************************************************************************
// Removes all characters which do NOT appear in string bag 
// from string s.
function stripCharsNotInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}
// ********************************************************************************
// Removes all characters which appear in string bag from string s.
function stripCharsInBag (s, bag)
{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}
// ********************************************************************************
function isCurrency(value)
{
var iPos;
var iLen;

    iPos = value.lastIndexOf(".");
    iLen = value.length;

	s = stripCharsInBag(value,digits + "$.");
	if (s.length > 0)
	{
		return false;
	}
	
    if (Math.abs(iPos - iLen) == 3)
    {
		return true;
	}else
	{
		return false;
	}
}
// ********************************************************************************
function isPercent(value)
{
	return true;
}
// ********************************************************************************
function ensureChecked(fld)
{
var idx = 0;
var iItemsInList = fld.options.length;
	
    while ( idx < iItemsInList )
    {
        if ( fld.options[idx].checked ){ return true; } // One was checked
	}
	return false;	// No items were checked
	
	/* OR
	for (var i = 0; i < form.length; i++)
	{
		var e = form.elements[i];
		if (e.type == "checkbox")
		{
			if (e.checked) { return true };
		}
	}
	return false;
	*/
}
// ********************************************************************************
function ensureUpperCase (frm)
{
	for (var i=1; i<frm.item.length;i++)
	{
		frm.item[i].value = frm.item[i].value.toUpperCase();
	}
	return true;
}
// ********************************************************************************
function isDate(fld)
{
var strDatestyle = "US"; //United States date style
//var strDatestyle = "EU";  //European date style
var strDate;
var strDateArray;
var strDay;
var strMonth;
var strYear;
var intday;
var intMonth;
var intYear;
var booFound = false;
var datefield = fld;
var strSeparatorArray = new Array("-"," ","/",".");
var intElementNr;
var err = 0;
var strMonthArray = new Array(12);
	
	strMonthArray[0] = "Jan";
	strMonthArray[1] = "Feb";
	strMonthArray[2] = "Mar";
	strMonthArray[3] = "Apr";
	strMonthArray[4] = "May";
	strMonthArray[5] = "Jun";
	strMonthArray[6] = "Jul";
	strMonthArray[7] = "Aug";
	strMonthArray[8] = "Sep";
	strMonthArray[9] = "Oct";
	strMonthArray[10] = "Nov";
	strMonthArray[11] = "Dec";
	strDate = datefield.value;
	
	if (strDate.length < 1){return true;}
//	if (strDate.charAt(2) != "/") {return false;}
//	if (strDate.charAt(5) != "/") {return false;}

	firstSlash = strDate.indexOf("/")
	lastSlash = strDate.lastIndexOf("/")

	if (firstSlash == lastSlash) {return false;}
	if (stripCharsInBag(strDate,digits + "-/.").length > 0){return false;}
	for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++)
	{
		if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1){
			strDateArray = strDate.split(strSeparatorArray[intElementNr]);
		
			if (strDateArray.length != 3){
				err = 1;
				return false;
			}else
			{
				strDay = strDateArray[0];
				strMonth = strDateArray[1];
				strYear = strDateArray[2];
			}
			booFound = true;
   		}
	}

	if (booFound == false) {
		if (strDate.length>5) {
			strDay = strDate.substr(0, 2);
			strMonth = strDate.substr(2, 2);
			strYear = strDate.substr(4);
   		}
	}
		
	//Assume Year 2000
	if (strYear.length == 2) {
		strYear = '20' + strYear;
	}

	// US style
	if (strDatestyle == "US")
	{
		strTemp = strDay;
		strDay = strMonth;
		strMonth = strTemp;
	}

	intday = parseInt(strDay, 10);
	if (isNaN(intday))
	{
		err = 2;
		return false;
	}
	
	
	intMonth = parseInt(strMonth, 10);
	if (isNaN(intMonth))
	{
		for (i = 0;i<12;i++)
		{
			if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase())
			{
				intMonth = i+1;
				strMonth = strMonthArray[i];
				i = 12;
   			}
		}

		if (isNaN(intMonth))
		{
			err = 3;
			return false;
   		}
	}


	intYear = parseInt(strYear, 10);
	if (isNaN(intYear) || (intYear < 1000) || (intYear > 9999))
	{
		err = 4;
		return false;
	}

	if (intMonth>12 || intMonth<1)
	{
		err = 5;
		return false;
	}

	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1))
	{
		err = 6;
		return false;
	}

	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1))
	{
		err = 7;
		return false;
	}
	
	if (intMonth == 2)
	{
		if (intday < 1)
		{
			err = 8;
			return false;
		}
		if (LeapYear(intYear) == true)
		{
			if (intday > 29)
			{
				err = 9;
				return false;
			}
		}else
		{
			if (intday > 28)
			{
				err = 10;
				return false;
			}
		}
	}
	
	/*
	if (strDatestyle == "US") {
		datefield.value = strMonthArray[intMonth-1] + " " + intday + " " + strYear;
	}
	else
	{
		datefield.value = intday + " " + strMonthArray[intMonth-1] + " " + strYear;
	}
	*/
	return true;
}
// ********************************************************************************
function LeapYear(intYear)
{
	if (intYear % 100 == 0) {
		if (intYear % 400 == 0) { return true; }
	}else
	{
		if ((intYear % 4) == 0) { return true; }
	}

	return false;
}
// ********************************************************************************
// NAME: isValDate (fld)
// PARMS:  fld                 Form field object pointer
// Returns: true/false         Indicates valid or invalid date
// HISTORY
// 4/31/1998  TGH     Created
// ********************************************************************************
function isValDate( fld )
{
	var UserUTC;

	if ( fld.value != '' ) 
	{
		UserUTC = DateUtc( fld.value );
		if ( UserUTC == 0 )
		{
			fld.focus();
			return false;
		}
		else
		{
			if ( DateUtc( strToday ) < UserUTC )
			{
//				alert("Date cannot be in the future.");
				fld.focus();
				return false;
			}
		}
 	}
	return true;
} 
// ********************************************************************************
function DateUtc ( s )
{
	// returns the UTC date or zero if date is invalid.
var str, i, d, x 
var StrArr = new Array(3)

	firstSlash = s.indexOf("/")
	lastSlash = s.lastIndexOf("/")

	if (firstSlash == lastSlash)
	{
//		alert ( 'Date Err: Wrong number of elements. Format must be MM/DD/YYYY.  Remove leading zeros.' ); 
		return 0; 
	}
	else 
	{
		// Split components into StrArr
		StrArr[0]=s.substring(0,firstSlash)
		StrArr[1]=s.substring(firstSlash+1,lastSlash)
		StrArr[2]=s.substring(lastSlash+1,s.length)

		// Fix bugs in parseint
		if (StrArr[0] == '08')
			StrArr[0] = "8"
		if (StrArr[0] == '09')
			StrArr[0] = "9"
		if (StrArr[1] == '08')
			StrArr[1] = "8"
		if (StrArr[1] == '09')
			StrArr[1] = "9"

		// MEO
		if (StrArr[2].length == 2)
		{
			if (StrArr[2] < '50')
				StrArr[2] = '20' + StrArr[2];
			else
				StrArr[2] = '19' + StrArr[2];
		}

		for (j=0; j < 3; j++)
		{
			 if ( isNaN( parseInt( StrArr[j] ) ) )
			{
//				alert('An element was not numeric. Format must be MM/DD/YYYY'); 
				return 0;
			}
		} 
		mo = parseInt( StrArr[0] );
		da = parseInt( StrArr[1] );
		yr = parseInt( StrArr[2] ); 
					
		if ( yr < 1997 ) 
		{
//			alert( '4 digit year greater than 1996 required. Format must be MM/DD/YYYY');
			return 0;
		}
		if ( (mo < 1) || (mo > 12) )
		{
//			alert( "'" + mo + "' '" + da + "' '" + yr +  "' Invalid month. Format must be MM/DD/YYYY");
//			alert( "Invalid month. Format must be MM/DD/YYYY");
			return 0;
		}
		if ( (da < 1) || (da > 31) )
		{
//			alert( 'Invalid day. Format must be MM/DD/YYYY');
			return 0;
		} 
		d = new Date();
		d.setYear( yr );
		d.setMonth( mo - 1 );
		d.setDate( da ); 
		if ( d.getDate() != da )
		{
//			alert( 'Invalid day for month. Format must be MM/DD/YYYY');
			return 0;
		}
		else
		{
			return Date.UTC(yr, mo - 1, da);
		}
	}
}
// ********************************************************************************
function validate (form) 
{
var e, title
var msg
var num
var empty_fields = "";
var errors = "";
var bFoundChecked = false;
var lastRadioName = "";
	//ensureUpperCase(form);

	num = form.length
	for (var i = 0; i < form.length; i++) {
		e = form.elements[i];
		
		if ((e.type == "text") || (e.type == "textarea"))
		{
			//e.value = e.value.toUpperCase();
		}
		
		title = "'" + getFieldTitle(e) + "'";
				
		//if ((e.title == null) || (e.title == "")) {
		//	title = e.name; }
		//else { title = e.title; 
		//}			
				
		
		if (e.type == "select-multiple")
		{
			if (e.isRequired)
			{
				//alert("Name" + title);
				//alert("length" + e.length);
				//alert("val" + e.options[0].value);
				if (e.length == 0 || e.options[0].value == 'NO_VALUE' )
				{				
					errors += "- The field " + title + " is a required field. Please enter a value.\n";
					continue;
				}
			}
		}
		if ((e.type == "radio") && (e.isRequired) && (lastRadioName != e.name)) {
			for (k=0;k<eval("form." + e.name + ".length");k++) {
				if (eval("form." + e.name + "[k].checked")){
					bFoundChecked=true;
				}
			}	
			if ((!bFoundChecked)) {
				errors += "- The field " + title + " is a required field. Please enter a value.\n";
				
			}
			lastRadioName = e.name;
			bFoundChecked = false;
			continue;					
		}

		if ((e.type == "text") || (e.type == "textarea") || (e.type == "select-one") || (e.type == "password")|| (e.type == "hidden"))
		{	
			//if (e.value.length <= 0) 
			//{	empty_fields += "\n        " + title;
			//		continue;
			//}
			
			if (e.isRequired)
			{
			var val
			var idx
							
				// This is for the difference in IE vs. Netscape
				// Netscape doesn't support 'e.value' as a Select type method
				if (e.type == "select-one")
				{
					idx = e.selectedIndex;
					val = e.options[idx].value;
				}
				
				else
				{
					val = e.value;	
				}
				
				if (isEmpty(val)){
					errors += "- The field " + title + " is a required field. Please enter a value.\n";
					continue;
					}
			}
			if (!isEmpty(e.value))
			{
				if (e.isZipCode) 
				{	
					num = e.value;
					if (!checkZIPCode(num))
					{
						errors += "- The field " + title + " must be a valid zip code.\n";
						continue;
					}
					
					//if (e.value.length != 5 || !isNumber(num)) 
					//{	errors += "- The field " + title + " must be a valid zip code.\n";
					//	continue;
					//}
				}				
				if (e.isPhone) 
				{	num = e.value;
					
					if (!isPhone(num))
					{
						errors += "- The field " + title + " must be a valid phone number (Example: 999-999-9999).\n";
						continue;
					} 
					//num = stripCharsInBag(num, phoneNumberDelimiters);
					//if ((num.length != digitsInUSPhoneNumber)	 || !isNumber(num)) 
					//{	errors += "- The field " + title + " must be a valid phone number (Example: 999-999-9999).\n";
					//	continue;
					//}					
				}				
				if (e.isDate) 
				{
					if (!isDate(e)){
						errors += "- The field " + title + " must be a valid date. (e.g. mm/dd/yyyy)\n";
						continue;
					}
				}
				if (e.isnotFutureDate)
				{
					if (isDate(e))
					{
						if (DateUtc( e.value ) > DateUtc( strToday ))
						{
							errors += "- The field " + title + " must not be a future date. \n";
							continue;
						}
					}
				}
				if (e.isNumber) 
				{	num = e.value
					if (!isNumber(num)) 
					{	errors += "- The field " + title + " must be a valid number.\n";
						continue;
					}
				}
				if (e.isEmail) 
				{	val = e.value
					if ((val.indexOf("@") == -1) || (val.indexOf(".") == -1)) 
					{	errors += "- The field " + title + " must be a valid email address (Example: me@myStore.com).\n";
						continue;
					}
				}
				if (e.isCurrency) 
				{
					if (!isCurrency(e.value))
					{
						errors += "- The field " + title + " must be valid currency amount.\n";
						continue;
					}
				}
				if (e.isSSN)
				{
					if (!ensureSSN(e.value))
					{
						errors += "- The field " + title + " must be a valid SSN number.\n";
						continue;					
					}
				}
				if (e.isPercent) 
				{
					errors += "- The field " + title + " must be a valid percentage.\n";
					continue;
				}	
				if (e.maxLength > 0)
				{
					if (e.value.length > e.maxLength)
					{
						errors += "- The field " + title + " must be a less than or equal to " + e.maxLength + ".\n";
						continue;				
					}
				}
				if (e.requiredMaxAndMinLength > 0)
				{
					var s = new Array();
					var lenMinMax = e.requiredMaxAndMinLength
					var temp;
					s = e.value.split(",");
					for(c = 0; c < s.length; c++)
					{	
						temp = s[c];
								
						if ((temp.length > e.requiredMaxAndMinLength) || (temp.length < e.requiredMaxAndMinLength))
						{
							errors += "- The field " + title + " must be equal to " + lenMinMax + " digits in length\n";
							break;
						}
						
					}
				}
				if (e.isReasonableYear)
				{
					if ((e.value < 1600) || (e.value > dYear + 1))
					{
						errors += "- The field " + title + " is not a reasonable year. \n";
						continue;
					}
				}
				if (e.isAlphaNumeric) {
					if (!isAlphaNumeric(e.value))
						errors += "- The field " + title + " can only contain numbers and letters. \n"
				}
				if (e.isURL) {
					if (!isURL(e.value))
						errors += "- The field " + title + " must be a valid url (i.e. http://www.mysite.com). \n"
				}
			}
		}			
	}

	if (!empty_fields && !errors) return true;
	
	//msg = "__________________________________________________\n\n"
	//msg = "The form was not submitted because of the following error(s).\n\n";
	msg = "Please correct these error(s) and re-submit.\n\n";
	
	//msg += "__________________________________________________\n\n"		
	
	if (empty_fields) {
		msg += "- The following required field(s) are empty:" + empty_fields + "\n";
		if (errors) msg += "\n";
	}		
	msg += errors;
	alert (msg);
	return false;
}