//Change to Upper Case Test
function stringToUppercase(inputString)
{
  return inputString.toUpperCase();
}

//Remove Whitespace Characters
function TrimWhiteSpace(strText) {
	while (strText.substring(0,1) == ' ')
		strText = strText.substring(1, strText.length);
	while (strText.substring(strText.length-1,strText.length) == ' ')
		strText = strText.substring(0, strText.length-1);
  return strText;
}

//Check if character is whitespace
function isWhiteSpace(s) {
	var i;
	var whitespace = " \t\n\r";
    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.
	for (i = 0; i < s.length; i++)	{
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (whitespace.indexOf(c) == -1) return false;
    }
    // All characters are whitespace.
    return true;
}

//Replace characters
function replaceCharacters(conversionString,inChar,outChar)
{
  var convertedString = conversionString.split(inChar);
  convertedString = convertedString.join(outChar);
  return convertedString;
}

//Check for number
function isNotaNumber (inputString)
{
  return isNaN(inputString);
}

//Change text color
function changeColor(object,colorString) {
    if (document.getElementById && document.getElementById(object) != null) {
         node = document.getElementById(object).style.color=colorString;
		}
    if (document.layers && document.layers[object] != null) {
         document.layers[object].color = colorString;
		}
    if (document.all) {
//         document.all[object].style.color = colorString;
		}	
}

//Check for proper email address formatting
function checkEmail(emailString)
{
	var filter=/^(\w+(?:\.\w+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	if (!filter.test(emailString)) {
		return false;
	} else {
		return true;
	}
}

// LUHN Formula for validation of credit card numbers.
function mod10( cardNumber ) {
	var ar = new Array( cardNumber.length );
	var i = 0,sum = 0;
 	for( i = 0; i < cardNumber.length; ++i ) {
   		ar[i] = parseInt(cardNumber.charAt(i));
 	}
 	for( i = ar.length -2; i >= 0; i-=2 ) { // you have to start from the right, and work back.
   		ar[i] *= 2;			// every second digit starting with the right most (check digit)
   		if( ar[i] > 9 ) ar[i]-=9;	// will be doubled, and summed with the skipped digits.
 	}					// if the double digit is > 9, ADD those individual digits together 
 	for( i = 0; i < ar.length; ++i ) {
   		sum += ar[i];		// if the sum is divisible by 10 mod10 succeeds
 	}
     	return (((sum%10)==0)?true:false);	 	
}

//Expired date check for credit cards.
function expired( month, year ) {	
 	var now = new Date();				// this function is designed to be Y2K compliant.
 	var expiresIn = new Date(year,month,0,0,0);	// create an expired on date object with valid thru expiration date
 	expiresIn.setMonth(expiresIn.getMonth()+1);	// adjust the month, to first day, hour, minute & second of expired month
 	if( now.getTime() < expiresIn.getTime() ) return false;
 	return true;					// then we get the miliseconds, and do a long integer comparison
}

//These are the color variables used when changing text color
var flagColor = '#FF0000';  //Color of text beside form field if data is invalid.
var normalColor = '#000000';  //Normal color of text beside form field.
var hiddenColor = '#EDE4D5';  //Hide text with same color as table background.

//All encompassing form field validation.
//Required fields are to be named "REQ_FieldName"
//Special Fields are:
//			REQ_EML => Email Address
//			REQ_PWD =>  Password Field
//			REQ_ZIP => Zip Code Field
//			REQ_CCN => Credit Card Number Field
//			REQ_CCD => Credit Card Expiration Date Field
//			REQ_CVV => Credit Card CVV Field
//Corresponding field labels (text for fields) are to be named Label_REQ_Fieldname for required fields.
function submitTheForm() {
	var stopprocessing = "false";  //Variable to indicate whether validation proces should proceed.  Also, indicates whether form should be submitted.
	var testRequiredField;  //First 3 letters of field name - if equal to "REQ", field is required.
	var testFieldType;  //Characters in field name that indicate type of field - position 4, length 3 - "EML" for email address, "ZIP" for zip code.
	var labelFieldName;  //Name of Lable corresponding to form field.
	var labelFieldNameAst;  //Name of Lable corresponding to form field required asterisk.
	var alertMessage;  //Alert message to display.
	var tempvar;  //Temporary value.
	var firstFocus;  //Variable used for first focus when required fields do not validate.
	var ChangetheColor;  //Variable used in making decision to change text color.
//Set all label colors to normal
	for (m=0;m<document.forms[0].elements.length;m++) {
		labelFieldName = "";
		labelFieldNameAst = "";
		ChangetheColor = "YES";
		if (document.forms[0].elements[m].name.substr(0, 3) == "REQ") {
			labelFieldName = 'Label_' + document.forms[0].elements[m].name;
		}
//		alert(labelFieldName);
		if (ChangetheColor == "YES") {
			changeColor(labelFieldName,normalColor);
			if (labelFieldNameAst != "") {
				changeColor(labelFieldNameAst,normalColor);
			}
		}
	}
//Prepare the Data
	for (i=0;i<document.forms[0].elements.length;i++) {
		if (document.forms[0].elements[i].type != "select-one") {
			document.forms[0].elements[i].value = TrimWhiteSpace(document.forms[0].elements[i].value);
		}
	}
//Determine if required fields have values
	for (j=0;j<document.forms[0].elements.length;j++) {
		labelFieldName = "";
		labelFieldNameAst = "";
		testRequiredField = "";
		testRequiredField = document.forms[0].elements[j].name;
		testRequiredField = testRequiredField.substr(0, 3);
		if (testRequiredField == "REQ") {
			if (document.forms[0].elements[j].type != "select-one") {
				if (isWhiteSpace(document.forms[0].elements[j].value)) {
					if (stopprocessing == "false") {
						firstFocus = j;
					}
					tempvar = document.forms[0].elements[j].name;
					labelFieldName = "Label_" + document.forms[0].elements[j].name;
					changeColor(labelFieldName,flagColor);
					if (labelFieldNameAst != "") {
						changeColor(labelFieldNameAst,flagColor);
					}
					stopprocessing = "true";
				}
			} else {
				if (document.forms[0].elements[j].options[document.forms[0].elements[j].selectedIndex].value == "-1") {
					if (stopprocessing == "false") {
						firstFocus = j;
					}
					tempvar = document.forms[0].elements[j].name;
					labelFieldName = "Label_" + tempvar;
					changeColor(labelFieldName,flagColor);
					if (labelFieldNameAst != "") {
						changeColor(labelFieldNameAst,flagColor);
					}
					stopprocessing = "true";
				}
			}
		}
	}
	if (stopprocessing == "true") {
		alertMessage = "Please enter the required information. Required items are indicated by the red text.";
		alert(alertMessage);
		document.forms[0].elements[firstFocus].focus();
	}
//Determine if fields have properly formatted data
	if (stopprocessing == "false") {
		for (k=0;k<document.forms[0].elements.length;k++) {
			testFieldType = "";
			if (stopprocessing == "false") {
				testFieldType = document.forms[0].elements[k].name;
				testFieldType = testFieldType.substr(4, 3);
				switch (testFieldType) { 
   					case "EML" : //Check email address for proper formatting.
      					if (!checkEmail(document.forms[0].elements[k].value)) {
							stopprocessing = "true";
							alertMessage = "Please enter a valid email address.";
							labelFieldName = "Label_" + document.forms[0].elements[k].name;
							changeColor(labelFieldName,flagColor);
							alert(alertMessage);
							document.forms[0].elements[k].focus();
						}
						break;
					case "ZIP" :  //Check zip code for proper formatting.
      					if ((isNotaNumber(document.forms[0].elements[k].value)) || (document.forms[0].elements[k].value.length < 5)) {							
							stopprocessing = "true";
							alertMessage = "Please enter a valid 5-digit zip code.";
							labelFieldName = "Label_" + document.forms[0].elements[k].name;
							changeColor(labelFieldName,flagColor);
							alert(alertMessage);
							document.forms[0].elements[k].focus();
						}
						break;
					case "PWD" :  //Check password for proper formatting.
						if (document.forms[0].elements[k].name == "REQ_PWD_Password") {
							if (document.forms[0].elements[k].value != document.forms[0].elements[eval(k+1)].value) {
								stopprocessing = "true";
								alertMessage = "Passwords do not match.";
								labelFieldName = "Label_" + document.forms[0].elements[k].name;
								labelFieldName2 = "Label_" + document.forms[0].elements[k+1].name;
								changeColor(labelFieldName,flagColor);
								changeColor(labelFieldName2,flagColor);
								document.forms[0].elements[k].value = "";
								document.forms[0].elements[eval(k+1)].value = "";
								alert(alertMessage);
								document.forms[0].elements[k].focus();
							}
						}
						break;
					case "CCN" :  //Check credit card number for proper formatting.
						if (document.forms[0].elements[k].name == "REQ_CCN_CreditCardNumber") {
      						if (isNotaNumber(document.forms[0].elements[k].value)) {							
								stopprocessing = "true";
								alertMessage = "Please enter a valid credit card number. Use only digits. Do not use spaces or hyphens.";
								labelFieldName = "Label_" + document.forms[0].elements[k].name;
								changeColor(labelFieldName,flagColor);
								alert(alertMessage);
								document.forms[0].elements[k].focus();
							}
							if (stopprocessing == "false") {
						       	var length = document.forms[0].elements[k].length;				//perform card specific length and prefix tests
       							cardtype = document.forms[0].CardType.value;
								cardnum = document.forms[0].elements[k].value;
								switch( cardtype ) {
       								case 'American Express':    			
										if( length != 15 ) {
 											stopprocessing = "true";
											labelFieldName = "Label_" + document.forms[0].elements[k].name;
											changeColor(labelFieldName,flagColor);
											alert("Please enter a valid credit card number.");					
											document.forms[0].elements[k].value = "";
											document.forms[0].elements[k].focus();
       									}
       									var prefix = parseInt( cardnum.substring(0,2));
       									if (stopprocessing != "true") {
											if( prefix != 34 && prefix != 37 ) {
		 	 									stop = "yes";
												labelFieldName = "Label_" + document.forms[0].elements[k].name;
												changeColor(labelFieldName,flagColor);
												alert("Please enter a valid credit card number.");					
												document.forms[0].elements[k].value = "";
												document.forms[0].elements[k].focus();
       										}
										}
       								break;
       								case 'Discover':
       									if( length != 16 ) {
		 	 								stopprocessing = "true";
											labelFieldName = "Label_" + document.forms[0].elements[k].name;
											changeColor(labelFieldName,flagColor);
											alert("Please enter a valid credit card number.");					
											document.forms[0].elements[k].value = "";
											document.forms[0].elements[k].focus();
      									}
       									var prefix = parseInt( cardnum.substring(0,4));
       									if (stopprocessing != "true") {
						   					if( prefix != 6011 ) {
	 	 										stopprocessing = "true";
												labelFieldName = "Label_" + document.forms[0].elements[k].name;
												changeColor(labelFieldName,flagColor);
												alert("Please enter a valid credit card number.");					
												document.forms[0].elements[k].value = "";
												document.forms[0].elements[k].focus();
											}
       									}
       								break;
       								case 'MasterCard':
      									if( length != 16 ) {
		 	 								stopprocessing = "true";
											labelFieldName = "Label_" + document.forms[0].elements[k].name;
											changeColor(labelFieldName,flagColor);
											alert("Please enter a valid credit card number.");					
											document.forms[0].elements[k].value = "";
											document.forms[0].elements[k].focus();
       									}
       									var prefix = parseInt( cardnum.substring(0,2));
       									if (stopprocessing != "true") {
						 					if( prefix < 51 || prefix > 55) {
		 	 									stopprocessing = "true";
												labelFieldName = "Label_" + document.forms[0].elements[k].name;
												changeColor(labelFieldName,flagColor);
												alert("Please enter a valid credit card number.");					
												document.forms[0].elements[k].value = "";
												document.forms[0].elements[k].focus();
											}
      									}
       								break;
       								case 'Visa':
      									if( length != 16 && length != 13 ) {
		 	 								stopprocessing = "true";
											labelFieldName = "Label_" + document.forms[0].elements[k].name;
											changeColor(labelFieldName,flagColor);
											alert("Please enter a valid credit card number.");					
											document.forms[0].elements[k].value = "";
											document.forms[0].elements[k].focus();
       									}
      									var prefix = parseInt( cardnum.substring(0,1));
       									if (stopprocessing != "true") {
						 					if( prefix != 4 ) {
		 	 									stopprocessing = "true";
												labelFieldName = "Label_" + document.forms[0].elements[k].name;
												changeColor(labelFieldName,flagColor);
												alert("Please enter a valid credit card number.");					
												document.forms[0].elements[k].value = "";
												document.forms[0].elements[k].focus();
											}
       									}
       								break;
       							}	 
							}
							if (stopprocessing == "false") {
      							if(!mod10( document.forms[0].elements[k].value )) { 		// run the check digit algorithm
		 	 						stopprocessing = "true";
									labelFieldName = "Label_" + document.forms[0].elements[k].name;
									changeColor(labelFieldName,flagColor);
									alert("Please enter a valid credit card number.");					
									document.forms[0].elements[k].value = "";
									document.forms[0].elements[k].focus();
       							}
	 						}
						}
						break;
					case "CCD" :  //Check credit card expiration date for proper formatting.
						if (document.forms[0].elements[k].name == "REQ_CCD") {
      						if (isNotaNumber(document.forms[0].elements[k].value)) {							
								stopprocessing = "true";
								alertMessage = "Please enter a valid credit card expiration date (mmyy). Use only digits. Do not use dashes, spaces, hyphens, or other characterers that are not digts.";
								labelFieldName = "Label_" + document.forms[0].elements[k].name;
								changeColor(labelFieldName,flagColor);
								alert(alertMessage);
								document.forms[0].elements[k].focus();
							}
						}
						if (stopprocessing == "false") {
							var carddate = document.forms[0].elements[k].value;
							var cardMonth = carddate.charAt(0);
							cardMonth += carddate.charAt(1);
	 						var cardYear = carddate.charAt(2);
							cardYear += carddate.charAt(3);
							cardYear = "20" + cardYear;
	 	   					if( expired( cardMonth, cardYear ) ) {	// check if entered date is already expired.
								stopprocessing = "true";
	 		 					alert("Please enter the expiration date of the credit card. Use only digits. Do not use spaces or hyphens.");
								document.forms[0].elements[k].value = "";
								document.forms[0].elements[k].focus();
      						}	 
						}
						break;
					case "CVV" : //Check for CVV number
						if (document.forms[0].elements[k].name == "REQ_CVV") {
      						if (isNotaNumber(document.forms[0].elements[k].value)) {							
								stopprocessing = "true";
								alertMessage = "Please enter a valid 3 or 4 digit security code.";
								labelFieldName = "Label_" + document.forms[0].elements[k].name;
								changeColor(labelFieldName,flagColor);
								alert(alertMessage);
								document.forms[0].elements[k].focus();
							}
						}
						break;
				}
			}
		}
	}
//If everything validates okay, submit the form.
	if (stopprocessing == "false") {
		document.forms[0].submit();
	}
}

//Set the status bar message.
function setStatusBar(msgStr) { self.status = msgStr; }

//Show hidden objects.
function show(object) {
    if (document.getElementById && document.getElementById(object) != null) {
         node = document.getElementById(object).style.visibility='visible';
		}
    if (document.layers && document.layers[object] != null) {
         document.layers[object].visibility = 'visible';
		}
    if (document.all) {
         document.all[object].style.visibility = 'visible';
		}	
}

//Hide objects.
function hide(object) {
	if (document.getElementById && document.getElementById(object) != null) {
         node = document.getElementById(object).style.visibility='hidden';
		}
    if (document.layers && document.layers[object] != null) {
        document.layers[object].visibility = 'hidden';
		}
    if (document.all) {
         document.all[object].style.visibility = 'hidden';
		}
}

//Open new browser window.
function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
