// Version
// 1.0	  Some of these functions were shamelessly swiped from a javascript form validation
//		  example lifted from the Netscape website and from www.internet.com.
//		  Almost all have been altered, some a lot, some a little				kgc 3/3/00
// 1.1	  Change date stuff for suspend/resume (2 date selects)					kgc 3/8/00
// 1.2    change daysofweek from select to text input								3/13/00
// 1.2.1  rewrite page instead of separate error window - cancel this!								3/20/00
// 1.2.2  05/31/00 checkEffectiveDate, put checkdate.setMonth after checkdate.setDate, was
//        causing 30 day months to be one month ahead.  hope this fixes it.
//	      do the same in checkSusRes for resdate and susdate  kgc
// 3.0	  07/17/00 Add PO Box and separate out floor no. dbw	
//
// 3.5    08/15/00 Added checkSchool function and changed subtype edits to allow
//                 for cents in the confirmation window.  vgw
// 3.5.1  08/15/00 Added checkProf function. dbw
// 4.0    08/30/00 Added checkIssues function and edit for discipline, term in issues. lrj
// 4.1    12/07/00 Modify edit processing to allow for "+" in e-mail address. lrj
// 4.2    01/10/01 Modify checkIssues for classroom indiviuals. lrj
// 4.3    04/12/01 Fixed date problem - when entered the 31st day of the month the day was being 
//                 converted to the 1st. kgc & lrj.  
// Several of these functions take an optional parameter eok (for "emptyOK")
// which determines whether the empty string will return true or false.
// Default behavior is controlled by global variable defaultEmptyOK.
// VARIABLE DECLARATIONS
var PopWin = new infoWin("PopWin");
var windowCtr = 0;
var errorMessageList = new Array();
var confirmList = new Array();
var NotRequired = true;
var Required = false;
var firstError;
var itsaGift = false;
var defaultEmptyOK = false;
var daysArray = new Array("","Sunday","Monday","Tuesday","Wednesday","Thursday",
						"Friday","Saturday");
var monthsArray = new Array("January","February","March","April","May","June",
						"July","August","September","October","November","December");
var numbersArray = new Array("zero","one","two","three","four","five");
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// whitespace characters
var whitespace = " \t\n\r";
var invalidEmailChars = ",></$#!%^&*():;\"\\?= ";
var digitsInZIPCode1 = 5;
// non-digit characters which are allowed in ZIP Codes
var ZIPCodeDelimiters = "-";
// Barron's and WSJ have 12 digit account numbers
// no non-digit chars are allowed.   kgc
var digitsInAccountNum = 12;
var front = "<tr><td align='left' valign='top' width='10'><font face='verdana,arial,helvetica' size='2'>&#149;&nbsp;</td><td align='left' valign='top'><font face='verdana,arial,helvetica' size='2'>";
var front2 = "<tr><td align='left' valign='top' width='150'><font face='verdana,arial,helvetica' size='2'>";
var back = "</td></tr>\n";
var iSubtype = front + 'Select subscription term.' + back;
var iOnCampus = front + 'Select On- or Off-Campus for Delivery Address.' + back;
var iZIPCode = ' Zip Code must be a 5 digit US ZIP Code.' + back;
var iAccountNum = front + 'The Account Number you\'ve entered is invalid. Make sure you are typing all 12 digits from your label without spaces.' + back;
var iEmailAddress = front + 'E-mail Address is not valid.   Example: alpha@beta.com' + back;
var iLast_Co = front + 'Last Name or Company Name must be completed.' + back;
var iLastName = front + 'Last Name must be entered.' + back;
var iPhone = ' Phone Number you entered is not valid. ' + back;
var iStreetPOBlank = front + 'Street name or PO Box number must be entered.' + back;
var iStreetNameBlank = front + 'Street number requires street name to be entered.' + back;
var iStreetPONotBlank = front + 'Street name and PO Box number cannot both be entered.' + back;
var iAptSteFloor = front + 'Apartment, Suite, or Floor Number must be selected.' + back;
var iSelect = ' must be selected.' + back;
var iGenericString = ' must be entered.' + back;
var iCreditCardNo = front + 'Credit Card Number is not valid.' + back;
var iCreditCardExpire = front + 'Credit Card Expiration Date is not valid.' + back;
var iBillOpts = front + 'Credit Card or Bill Me must be selected.' + back;
var iWeekEnd = ' Date can be Monday through Friday only.' + back;
var iBusdays = ' Date is less than '
var iBusdays2 = ' business day(s) from today.' + back;
var iGreater = ' Date must be today or later.' + back;
var iInvalidDate = ' Date is invalid.' + back;
var iSelectADate = ' Date must be selected.' + back;
var iSameDate = front + 'Suspend Date and Resume Date cannot be the same.' + back;
var iSelectSusRes = front + 'Suspend and/or Resume Date must be selected.' + back;
var iResdateGreater = front + 'Resume Date must be at least one business day greater than Suspend Date.' + back;
var iSchool = ' Please select a valid school name or "Other".' + back;
var iSchoolOther = ' Please enter your school name in the <b>Other</b> school name box.' + back;
var iProf = ' Please select a valid professor or "Other".' + back;
var iProfOther = ' Please enter your professor name in the <b>Other</b> professor name box.' + back;
var pEntryPrompt = "Please enter ";
var pZIPCode = "5 digit ZIP Code (like 01020).";
var pAccountNum = "12 digit account number.";  // kgc
var pFirstName = "First Name.";
var pLastName = "Last Name.";
var pCompanyName = "Company Name.";
var pStreetNum = "Street Number.";
var pStreetName = "Street Name.";
var pPOBox = "PO Box.";
var pCity = "City.";
var pState = "State.";
var pApt = "Apartment, Suite or Floor.";
var pFloorNo = "Floor Number.";
var pBillorCC = "Bill Me or Credit.";
var pEmailAddress = "E-mail Address.";
var pPhone = "7 digit Phone Number.";
var pAreaCode = "3 digit Area Code.";
var pHomeAreaCode = "3 digit Area Code for your Home Phone Number.";
var pHomePhone = "7 digit Home Phone Number.";
var pWorkAreaCode = "3 digit Area Code for your Business Phone Number.";
var pWorkPhone = "7 digit Business Phone Number.";
var pCreditCardNo = "Credit Card Number (no spaces please).";
var pCreditCardExp = "Credit Card Expiration Date.";
var pSubTerm = "Subscription Term.";
var pGiftCard = "to send a Gift Card.";
var pItsaGift = "if this is a Gift.";
var pStartDate = "Delivery start date.";
var pSuspendDate = "Delivery Suspend date.";
var pResumeDate = "Delivery Resume date.";
var pEffectiveDate = "Effective date.";
// Check whether string s is empty.
function isEmpty(s)
{   return ((s == null) || (s.length == 0));
}
// Returns true if string s is empty or
// whitespace characters only.
function isStringWhitespace (s)
{   var i;
    if (isEmpty(s)) 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;
}
// Removes all characters which appear in string bag from string s.
function stripCharsInBag (s, bag)
{   var i;
    var 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;
}
// Returns true if character c is a digit
// (0 .. 9).
function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}
// isInteger (STRING s [, BOOLEAN emptyOK])
// Returns true if all characters in string s are numbers.
function isInteger (s)
{   var i;
    if (isEmpty(s))
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (!isDigit(c)) return false;
    }
    return true;
}
function infoWin(name) {
	this.name = name;
	this.title = "";
	this.header = "Please try again."
	this.header2 = "The following required fields were not entered"
	this.header3 = "or were entered incorrectly:"
	this.windowHandle = null;
	this.width = 500;
	this.height = 300;
	this.bgcolor = "#ffffee";
	return this;
}
function show(which)
{	
	var winheight;
	var winwidth;
	var to_page;
	
	this.close();
	if(which == "Error")  {
		to_page = "<HTML>\n" + "<head>\n<title>" + this.title + " Errors" + "</title>\n</head>\n<BODY BGCOLOR='" +
			this.bgcolor + "' onLoad='window.focus();'><div align='center'><center>\n" +
			"<table width='475' border='0' cellspacing='3' cellpadding='3'>\n" +
			"<tr><td align='left' valign='top'><font FACE='verdana,arial,helvetica' color='red' size='4'>\n" +
			"<b>" + this.header + "</b></td></tr>\n" +
			"<tr><td rowspan='2' align='left' valign='top'><font FACE='verdana,arial,helvetica' color='red' size='2'>\n" +
			this.header2 + " " +
			this.header3 + "</td></tr></table>\n" +
			"<table width='475' border='0' cellspacing='3' cellpadding='3'>\n" +
			"<tr><td align='left' valign='top'><font FACE='verdana,arial,helvetica' size='3'></td></tr>\n" +
			errorMessageList.join("") +
			"</table>\n" +
			"<table width='475' border='0' cellspacing='3' cellpadding='3'>\n" +
			"<tr><td align='left'><br><form name='form2'>\n" +
			"<input type='button' value='Back to Form' \n" +
			" onClick='top.opener.focus(); if(top.opener.firstError) top.opener.firstError.focus();'>\n" +
			"</form></td></tr>\n</table>" +
			"</div></center>\n</BODY>\n</HTML>\n";
		winheight = (this.height  + (errorMessageList.length * 30))
		if (winheight > 450) winheight = 450;
		winwidth = this.width;
	}
	else  {
		to_page = "<HTML>\n" + "<head>\n<title>" + this.title + " Confirmation" + "</title>\n</head>\n" +
			"<BODY BGCOLOR='" + this.bgcolor + "' onLoad='window.focus();'>\n" +
			"<table width='500' border='0' cellspacing='1' cellpadding='1'>\n" +
			"<tr><td colspan='2' align='left' valign='top'><font FACE='verdana,arial,helvetica' color='black' size='3'>\n" +
			"<b>" + this.title + " Confirmation" + "</b></td></tr>\n" +
			"<tr><td colspan='2'></td></tr><tr><td colspan='2' align='left' valign='bottom'><font FACE='verdana,arial,helvetica' color='black' size='2'>\n" +
			"<b>Please confirm the following information:" + "</b></td></tr>\n" +
			//"</table>\n" +
			"<tr><td align='left' valign='bottom'><font FACE='verdana,arial,helvetica' size='1'>&nbsp;</td></tr></table>\n" +
			"<table width='500'" + " border='0' cellspacing='1' cellpadding='1'>" +
			confirmList.join("") +
			//"<table width='500'" + " border='0' cellspacing='1' cellpadding='1'>\n" +
			"<tr><td align='left' valign='top' width='150'><font face='verdana,arial,helvetica' size='2'><br><form name='form2'>\n" +
			"<input type='button' value='Submit Request' onClick='top.close(self);top.opener.focus();top.opener.document.theform.submit();'></td>\n" +
			"<td>&nbsp;&nbsp;</td><td align='left' valign='top'><br><font face='verdana,arial,helvetica' size='2'>" +
			"<input type='button' value='Edit - Return to Form' onClick='top.opener.focus();top.close(self);'>\n" +
			"</td></tr></form></table></BODY></HTML>\n";
		winheight = this.height + (confirmList.length * 30);	
		if (winheight > 450) winheight = 450;
		winwidth = this.width;	
	}
	errorMessageList.length = 0;
	confirmList.length = 0;
	this.windowHandle = window.open("",	"subwindow" + windowCtr++,
										"toolbar=no," +
										"location=no," +
										"directories=no," +
										"status=no," +
										"menubar=yes," +
										"scrollbars=yes," +
										"resizable=yes," +
										"width=" + winwidth + "," +
										"height=" + winheight);
	
	this.windowHandle.myopener = self;
	this.windowHandle.document.open();	
	this.windowHandle.document.write(to_page);
	this.windowHandle.document.close();
}
function TrapError()
{
	return true;
}
function DontTrapError()
{
	return false;
}
function close()  {
	top.onerror = TrapError;
	if (this.windowHandle)
		if(!this.windowHandle.closed)
			this.windowHandle.close();
		
	this.windowHandle = null;
                	
	top.onerror = DontTrapError;
}
new infoWin();
infoWin.prototype.show = show;
infoWin.prototype.close = close;
function isZIPCode (s)
{  if (isEmpty(s))
       if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
       else return (isZIPCode.arguments[1] == true);
   return (isInteger(s) && s.length == digitsInZIPCode1)
}
// Display prompt string s in status bar.
function prompt (s)
{   window.status = s
}
// Display data entry prompt string s in status bar.
function promptEntry (s)
{   window.status = pEntryPrompt + s
}
function AddToConfirm(name, value)
{
	confirmList[confirmList.length] = front2 + name + ":" + "</td><td>&nbsp;&nbsp;</td><td align='left' valign='top'><font face='verdana,arial,helvetica' size='2'>" + value + back;
	return;
}
function checkCheckbox(theField, name)
{
	if(theField.checked)  {
		AddToConfirm(name, "Yes");
		return true;
	}
	else {
		AddToConfirm(name, "No");
		return false;
	}
}	
// Check that string theField.value is not all whitespace.
function checkString (theField, name, emptyOK)
{
    if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isStringWhitespace(theField.value))) return true;
    if (isStringWhitespace(theField.value)) {
		errorMessageList[errorMessageList.length] = front + name + iGenericString
		if(!firstError)
			firstError = theField;	
		return false;
	}	
	else {
		AddToConfirm(name, theField.value);
		return true;
	}
}
function checkSelect (theField, name, validStart, emptyOK)
{
    if (checkSelect.arguments.length == 3) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (theField.selectedIndex < validStart)) return true;
    if (theField.selectedIndex < validStart) {
		errorMessageList[errorMessageList.length] = front + name + iSelect
		if(!firstError)
			firstError = theField;	
		return false;
	}	
	else if (theField.name == "Major" || theField.name == "Course" || theField.name == "Discipline") {
		AddToConfirm(name, theField.options[theField.selectedIndex].text);
		return true;
	}
	else {
		AddToConfirm(name, theField.options[theField.selectedIndex].value);
		return true;
	}
}
function checkSchool (theField, theOther, name, validStart, emptyOK)
{
    if (checkSchool.arguments.length == 4) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (theField.selectedIndex < validStart)) return true;
    if (theField.selectedIndex < validStart) 
    {
		errorMessageList[errorMessageList.length] = front + iSchool
		if(!firstError)
			firstError = theField;	
		return false;
	}	
	else if (theField.options[theField.selectedIndex].text == "Other")
	{
		 if (! theOther.value)
		 {
			errorMessageList[errorMessageList.length] = front + iSchoolOther
			if(!firstError)
				firstError = theField;	
			return false;
		 }
		 else 
		 {
			AddToConfirm(name, theOther.value);
			return true;
		 }
	}
	else 
	{
		AddToConfirm(name, theField.options[theField.selectedIndex].text);
		return true;
	}
}
function checkProf (theField, theOther, name, validStart, emptyOK)
{
    if (checkProf.arguments.length == 4) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (theField.selectedIndex < validStart)) return true;
    if (theField.selectedIndex < validStart) 
    {
		errorMessageList[errorMessageList.length] = front + iProf
		if(!firstError)
			firstError = theField;	
		return false;
	}	
	else if (theField.options[theField.selectedIndex].text == "Other")
	{
		 if (! theOther.value)
		 {
			errorMessageList[errorMessageList.length] = front + iProfOther
			if(!firstError)
				firstError = theField;	
			return false;
		 }
		 else 
		 {
			AddToConfirm(name, theOther.value);
			return true;
		 }
	}
	else 
	{
		AddToConfirm(name, theField.options[theField.selectedIndex].text);
		return true;
	}
}
function checkOptions(theField, invalidMsg, emptyOK)
{	var i;
	if (checkOptions.arguments.length == 2) emptyOK = defaultEmptyOK;
	for(i = 0; i < theField.length; i++)
	{
	   if(theField[i].checked) {
		if(theField[i].name == "SubType") {
		   var colon = theField[i].value.indexOf(':');
		   var amount = theField[i].value.substring(0, colon);
		   var units = "weeks";
		   if(parseInt(amount) > 52 ) {
			units = "years";
			amount /= 52;
		   }	
		   var dollars = theField[i].value.substring(colon+1);
		   var dolcents = dollars.split(':');
		   if (! dolcents[1]) dolcents[1] = "00";
		   AddToConfirm("Subscription Term",  amount + " " + units +
			" at $" + dolcents[0] + "." + dolcents[1] );
			//theField[i].value.substring(colon+1)	vgw
		}
		else if(theField[i].name == "OnCampus")
		{	AddToConfirm("On Campus", theField[i].value); }
		else
		   if(theField[i].name == "BillOpts")
			AddToConfirm("Bill Option", theField[i].value);
		return i;
	   }
	}
    	if(!emptyOK)  {
		errorMessageList[errorMessageList.length] = invalidMsg;
		if(!firstError)
			firstError = theField[0];
	}
	return i;	
}
// added this to handle a single subtype as a checkbox - 10/26/00 vgw
function checkSingleSubType(theField, invalidMsg, emptyOK)
{	
   if (checkSingleSubType.arguments.length == 2) emptyOK = defaultEmptyOK;
   if(theField.checked) 
   {
	 var colon = theField.value.indexOf(':');
	 var amount = theField.value.substring(0, colon);
	 var units = "weeks";
	 if(parseInt(amount) > 52 ) {
	 	units = "years";
		amount /= 52;
     }	
     var dollars = theField.value.substring(colon+1);
     var dolcents = dollars.split(':');
     if (! dolcents[1]) dolcents[1] = "00";
     AddToConfirm("Subscription Term",  amount + " " + units +
			" at $" + dolcents[0] + "." + dolcents[1] );
   }
   else
   {
	  if(!emptyOK)  
	  {
		errorMessageList[errorMessageList.length] = invalidMsg;
		if(!firstError) firstError = theField;
	  }
   }
}
function checkEffectiveDate(date_form, numBusdays, name, dayofweek, daySelect, monthSelect, yearSelect, emptyOK)
{	
	var today = new Date();
	var yrsel;
	var dayctr = 0;
	var busdayctr = 0;
	var weekDay;
	var errmsgnum = errorMessageList.length;
	if (checkEffectiveDate.arguments.length == 7) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && date_form.elements[monthSelect].selectedIndex == 0 &&
	   date_form.elements[yearSelect].selectedIndex == 0 &&
	   date_form.elements[daySelect].selectedIndex == 0)
			return true;
	
	if(date_form.elements[monthSelect].selectedIndex == 0 &&
	   date_form.elements[yearSelect].selectedIndex == 0 &&
	   date_form.elements[daySelect].selectedIndex == 0)  {
	      errorMessageList[errorMessageList.length] = front + name + iSelectADate;
		  if(!firstError)
			firstError = date_form.elements[monthSelect];
		  return false;
	}
	if(date_form.elements[monthSelect].selectedIndex == 0 ||
	   date_form.elements[yearSelect].selectedIndex == 0 ||
	   date_form.elements[daySelect].selectedIndex == 0)  {
	      errorMessageList[errorMessageList.length] = front + name + iInvalidDate;
		  if(!firstError)
			firstError = date_form.elements[monthSelect];
		  return false;
	}
	  
	// create the checkDate date object by giving it the date selected by the customer.
	// the causes the time to be zero. kgc and lrj 4/12/01 	
    //kgc 5/31/00 moved setDate before setMonth, was causing 30 day mos to be 1 month ahead..?????
     // var checkDate = new Date();
	 //   checkDate.setDate(date_form.elements[daySelect].selectedIndex);
     //   checkDate.setMonth(date_form.elements[monthSelect].selectedIndex - 1);
     //   checkDate.setYear(parseInt(date_form.elements[yearSelect].options[yrsel].text));
   
     yrsel = date_form.elements[yearSelect].selectedIndex;
     var checkDate = new Date(parseInt(date_form.elements[yearSelect].options[yrsel].text),
					 date_form.elements[monthSelect].selectedIndex - 1,
					 date_form.elements[daySelect].selectedIndex);

	    if(checkDate.getDay() == 0 || checkDate.getDay() == 6) 	{
		errorMessageList[errorMessageList.length] = front + name + iWeekEnd;
		if(!firstError)
			firstError = date_form.elements[monthSelect];
	}
	// make the time 0 to match the checkDate time above for the compare below.
	// arghhhh, the reason we changed how we assigned the date to the checkDate object 
	// was that it caused the resulting date to be incorrect.  and then that hosed the compare.
	// 4/12/01  kgc and lrj  

	today.setHours(0);
	today.setMinutes(0);
	today.setSeconds(0);
	var i = today.getDay();
	while(busdayctr < numBusdays)  {
		dayctr++;
		i++;
		if((i %= 7) != 0 && (i %= 7) != 6)
			busdayctr++;
	}
	// eliminate time from date before compare
	if((Math.floor(checkDate.getTime() / 3600000) - Math.floor(today.getTime() / 3600000)) < (24 * dayctr))  {
		if(numBusdays == 0)
			errorMessageList[errorMessageList.length] = front + name + iGreater;
		else
			errorMessageList[errorMessageList.length] = front + name + iBusdays + numbersArray[numBusdays] + iBusdays2;
		if(!firstError)
			firstError = date_form.elements[monthSelect];
	}
	if(errmsgnum == errorMessageList.length) {
		AddToConfirm(name + " Date", daysArray[checkDate.getDay()+1] + " " + monthsArray[checkDate.getMonth()] + " " + checkDate.getDate() + ", " + getFullYear(checkDate));
		return true;
	}
	else
		return false;
}
function checkSusRes(date_form,susDay,susMon,susYr,resDay,resMon,resYr)
{	var errmsg;
	var susTime;
	var resTime;
	var goodSus = false;
	var goodRes = false;
		//create the susDate and resDate date object by giving it the date selected by the customer.
		//the causes the time to be zero. kgc and lrj 4/12/01
		//var susDate = new Date();
	var susYrSel = date_form.elements[susYr].selectedIndex;
	var susDate = new Date(parseInt(date_form.elements[susYr].options[susYrSel].text),
		date_form.elements[susMon].selectedIndex - 1,
		date_form.elements[susDay].selectedIndex);
	        //kgc 5/31/00 moved setDate before setMonth, was causing 30 day mos to be 1 month ahead..?????
	//susDate.setDate(date_form.elements[susDay].selectedIndex);
	//susDate.setYear(parseInt(date_form.elements[susYr].options[susYrSel].text));	
	//susDate.setMonth(date_form.elements[susMon].selectedIndex - 1);
	var resYrSel = date_form.elements[resYr].selectedIndex;
	var resDate = new Date(parseInt(date_form.elements[resYr].options[resYrSel].text),
		date_form.elements[resMon].selectedIndex - 1,
		date_form.elements[resDay].selectedIndex);
	//var resDate = new Date();
        //kgc 5/31/00 moved setDate before setMonth, was causing 30 day mos to be 1 month ahead..?????
	//resDate.setDate(date_form.elements[resDay].selectedIndex);
	//resDate.setYear(parseInt(date_form.elements[resYr].options[resYrSel].text));
	//resDate.setMonth(date_form.elements[resMon].selectedIndex - 1);
        if (date_form.elements[susMon].selectedIndex != 0 &&
			date_form.elements[susYr].selectedIndex != 0 &&
			date_form.elements[susDay].selectedIndex != 0)
		goodSus = true;
	if (date_form.elements[resMon].selectedIndex != 0 &&
			date_form.elements[resYr].selectedIndex != 0 &&
			date_form.elements[resDay].selectedIndex != 0)
		goodRes = true;
	
	if (date_form.elements[susMon].selectedIndex == 0 &&
	   date_form.elements[susYr].selectedIndex == 0 &&
	   date_form.elements[susDay].selectedIndex == 0 &&
	   date_form.elements[resMon].selectedIndex == 0 &&
	   date_form.elements[resYr].selectedIndex == 0 &&
	   date_form.elements[resDay].selectedIndex == 0)
		   errmsg = iSelectSusRes;
	else
		if (goodSus && goodRes)  {
			resTime = Math.floor(resDate.getTime() / 3600000);
			susTime = Math.floor(susDate.getTime() / 3600000);
			if( susTime == resTime)
			   errmsg = iSameDate;
			else
			   if((resTime - susTime) < 24 )
			      errmsg = iResdateGreater;
		}		
	if(errmsg) {
		errorMessageList[errorMessageList.length] = errmsg;
		if(!firstError)
			firstError = date_form.elements[susMon];
	}
	return true;		
}		
function checkLast_Co (LastNameField, CompNameField, invalidMsg)
{
    if (isStringWhitespace(LastNameField.value) && isStringWhitespace(CompNameField.value) )	
    {
		// lastname and company name are empty, no good!
		errorMessageList[errorMessageList.length] = iLast_Co;
		if(!firstError)
			firstError = LastNameField;	
		return false;
    }	
    else {
		if(!isStringWhitespace(LastNameField.value))
			AddToConfirm("Last Name", LastNameField.value);
		if(!isStringWhitespace(CompNameField.value))
			AddToConfirm("Company Name", CompNameField.value);
		return true;
    }
}
function checkZIPCode (theField, name, emptyOK)
{   if (checkZIPCode.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isStringWhitespace(theField.value))) return true;
    else
    { var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
      if (!isZIPCode(normalizedZIP, false)) {
	 		errorMessageList[errorMessageList.length] = front + name + iZIPCode;
	 		if(!firstError)
				firstError = theField;	
			return false;
      }
      else {
		if (name == "")
			AddToConfirm("Zip Code", theField.value);
		else	
			AddToConfirm(name + " Zip Code", theField.value);
		return true;
      }
   }
}
function validateAcctNo(AcctNo)
{
	var weight = new Array(4,3,2,9,8,7,6,5,4,3,2);	
	var result = 0;
	var i;
		
	for( i = 0; i < AcctNo.length - 1; i++)
		result += parseInt(AcctNo.charAt(i)) * weight[i];
		
	if(AcctNo.charAt(4) == "6") {
		// convert to string
		result = result + "";
		result = result.substring(result.length - 2);
	}	
	result %= 11;
	if(result == 0)  {
		if(parseInt(AcctNo.charAt(11)) != 1)  {
			return false;
		}
	}
	else if(result == 1)  {
		if(parseInt(AcctNo.charAt(11)) != 0)  {
			return false;
		}
	}
	else   {
		result = 11 - result;
		if(result != parseInt(AcctNo.charAt(11)))  {
			return false;
		}
	}
	return true;		
}
	
function checkAccountNum (theField, emptyOK)
{
    if (checkAccountNum.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isStringWhitespace(theField.value))) return true;
    else
      if ((theField.value.length == digitsInAccountNum) && (isInteger (theField.value, false)) &&
				(validateAcctNo(theField.value)))  {
		AddToConfirm("Account Number", theField.value);		
		return true;
	  }
      else	{
		errorMessageList[errorMessageList.length] = iAccountNum;
		if(!firstError)
			firstError = theField;
		return false;
	  }	
}
function checkPOBox(StreetNoValue, StreetNameValue, POBoxValue)
{
var POBoxCombo;
if ((StreetNameValue.value.length == 0) &&
    (POBoxValue.value.length == 0))
       {
        errorMessageList[errorMessageList.length] = iStreetPOBlank;
        if (!firstError)
           {
            firstError = StreetNoValue;
           }
            return false;
       }
else {
if ((StreetNoValue.value.length > 0) &&
    (StreetNameValue.value.length == 0))
       {
        errorMessageList[errorMessageList.length] = iStreetNameBlank;
        if (!firstError)
           {
            firstError = StreetNameValue;
           }
            return false;
       }
else {
if ((StreetNameValue.value.length > 0) &&
    (POBoxValue.value.length > 0))
       {
        errorMessageList[errorMessageList.length] = iStreetPONotBlank;
        if (!firstError)
           {
            firstError = StreetNoValue;
           }
            return false;
       }
   else {
        if (!isStringWhitespace(POBoxValue.value)) {
           POBoxCombo = 'PO Box ' + POBoxValue.value;
           AddToConfirm("Address Line 1", POBoxCombo); }
        if (!isStringWhitespace(StreetNameValue.value))
           AddToConfirm("Address Line 1", StreetNoValue.value + ' ' + StreetNameValue.value);
        return true;
        }
}
}
}
function checkAptNum(FloorNoPresent, FloorNoValue, name)
{
var floorNumberCombo;
if (FloorNoPresent.selectedIndex == 0)
   if (!(FloorNoValue.value.length == 0))
       {
        errorMessageList[errorMessageList.length] = iAptSteFloor;
        if (!firstError)
           {
            firstError = FloorNoPresent;
           }
            return false;
       }
   else
        return true;
if (isStringWhitespace(FloorNoValue.value))
   {
     errorMessageList[errorMessageList.length] = front + name + iGenericString;
     if(!firstError)
        firstError = FloorNoValue;
        return false;
   } else
   {
        if (FloorNoPresent.value == "Other") {
        	floorNumberCombo = FloorNoValue.value; }           
        else {
        	floorNumberCombo = FloorNoPresent.options[FloorNoPresent.selectedIndex].value + " " + FloorNoValue.value; }
        AddToConfirm("Address Line 2", floorNumberCombo);
        return true;
   }  
}
function isCreditCard(ccnumber)
{
   var i = 0;
   var j = 2;
   var sum = 0;	
   var product;	
   if (isEmpty(ccnumber))
   if (isCreditCard.arguments.length == 1) return defaultEmptyOK;
       else return (isCreditCard.arguments[1] == true);	
   if(isStringWhitespace(ccnumber))
	   return false;
	
   if ( !(((ccnumber.length == 16 || ccnumber.length == 13) &&
            ccnumber.charAt(0) == '4') ||   			// visa
	   (ccnumber.length == 16 &&   				// discover and mastercard
	   ((ccnumber.indexOf("6011") == 0) || ccnumber.charAt(0) == '5')) ||
	   (ccnumber.length == 15 && ccnumber.indexOf("37") == 0 ) ||  //  Amex
	   (ccnumber.length == 14 &&  				// diners
	   (ccnumber.indexOf("30") == 0 || ccnumber.indexOf("36") == 0 ||
	   ccnumber.indexOf("38") == 0))))
		return false;		
  // start with 1 for Amex and 13 digit Visa
  if (ccnumber.length == 15 || ccnumber.length == 13)
	  j = 1;
  	
  while (i <= ccnumber.length - 2) {
	product = parseInt(ccnumber.charAt(i)) * j
	if (product >= 10)
	   sum += ((product % 10) + Math.floor(product / 10)); 	
	else
	   sum += product;
		
	if (j == 1)
		j++;
	else
		j--;
	i++;
  }		
  var ckdigit;
  ckdigit = sum % 10;
  if (ckdigit != 0)
	 ckdigit = 10 - ckdigit;
  return (ckdigit == parseInt(ccnumber.charAt(ccnumber.length - 1)));	
}
function checkCreditCard(theField, emptyOK)
{
	if (checkCreditCard.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isStringWhitespace(theField.value))) return true;
	if(!isCreditCard(theField.value))
	{
	 	errorMessageList[errorMessageList.length] = iCreditCardNo;
	 	if(!firstError)
			firstError = theField;	
		return false;
	}
	else  {
		AddToConfirm("Credit Card Number", theField.value);
		return true;
	}
}
function getFullYear(theDate)
{	// doing this to combat older browser year handling
	var year = theDate.getYear();
	if(year < 1000)
		year += 1900;
	return year;
}
function isExpireDate(expDate, emptyOK)
{
	var today = new Date();
	var curMonth;
	var curYear;
	var ccMonth;
	var ccYear;
	
	if (isEmpty(expDate))
		if (isExpireDate.arguments.length == 1) return defaultEmptyOK;
		else return (isExpireDate.arguments[1] == true);
	if (isStringWhitespace(expDate) || !(isDigit(expDate)) || expDate.length != 4)
		return false;
	
	curMonth = today.getMonth() + 1;
	curYear = ((getFullYear(today) + "").substring(2)) - 0;
	ccMonth = expDate.substring(0,2) - 0;
	ccYear = expDate.substring(2) - 0;
	return !(((ccYear == curYear) && (ccMonth < curMonth)) ||
		ccMonth < 1 || ccMonth > 12 || ccYear > curYear + 10);
}
function checkExpireDate(theField, emptyOK)
{
	if (checkExpireDate.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isStringWhitespace(theField.value))) return true;
    else if (!isExpireDate(theField.value, false))
	{
	 	errorMessageList[errorMessageList.length] = iCreditCardExpire;
	 	if(!firstError)
			firstError = theField;	
		return false;
	}
	else  {
		AddToConfirm("Card Expiration Date", monthsArray[parseInt(theField.value.substring(0,2), 10) - 1] +
			" " + (parseInt(theField.value.substring(2)) + 2000));
		return true;
	}
}
function isCCExpDate(ccMonth, ccYear)
{
	var today = new Date();
	var curMonth;
	var curYear;
		
	curMonth = today.getMonth() + 1;
	curYear = getFullYear(today) - 0;
	return !(((ccYear == curYear) && (ccMonth < curMonth)) ||
		ccMonth < 1 || ccMonth > 12 || ccYear > curYear + 10);
}
function checkCCExpDate(monSelect, yearSelect, emptyOK)
{
	if (checkCCExpDate.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (monSelect.selectedIndex == 0 &&
		yearSelect.selectedIndex == 0)) return true;
	var month = monSelect.selectedIndex;
	var year = parseInt(yearSelect.options[yearSelect.selectedIndex].text);
	if ((monSelect.selectedIndex == 0 || yearSelect.selectedIndex == 0) ||
		(!isCCExpDate(month, year)))
	{
	 	errorMessageList[errorMessageList.length] = iCreditCardExpire;
	 	if(!firstError)
			firstError = monSelect;	
		return false;
	}
	else  {
		AddToConfirm("Card Expiration Date", monthsArray[month-1] + " " + year);
		return true;
	}
}
function isEmail(emailAddr, emptyOK)
{
	var i;
	var dotCtr = 0;
	var atCtr = 0;
	var dotAfterAt = false;
	
	if (isEmpty(emailAddr))
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
    if (isStringWhitespace(emailAddr) || emailAddr.charAt(0) == "." ||
			emailAddr.charAt(emailAddr.length-1) == "." || emailAddr.charAt(0) == "@" ||
			emailAddr.charAt(emailAddr.length-1) == "@")
		return false;
    for(i = 0; i < emailAddr.length; i++)
    {
		if(invalidEmailChars.indexOf(emailAddr.charAt(i)) > -1)
			return false;
		if(emailAddr.charAt(i) == ".") {
			dotCtr += 1;
			if (atCtr > 0) dotAfterAt = true;
		}
		if(emailAddr.charAt(i) == "@")
			atCtr += 1;
	}
	return !( dotCtr == 0 || atCtr == 0 || !dotAfterAt ||
			emailAddr.indexOf("..") > -1 || emailAddr.indexOf(".@") > -1 ||
			emailAddr.indexOf("@.") > -1 ||
			emailAddr.indexOf("@@") > -1 );
}
	
function checkEmail (theField, emptyOK)
{
	if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isStringWhitespace(theField.value))) return true;
    else if (!isEmail(theField.value, false))
    {
	 	errorMessageList[errorMessageList.length] = iEmailAddress;
		if(!firstError)
			firstError = theField;	
		return false;
	}
    else {
		AddToConfirm("E-mail Address", theField.value);
		return true;
	}
}
function checkPhoneNum(areaCode, phoneNum, phoneType, emptyOK)
{	
	var phone;
	var area;
	if (checkPhoneNum.arguments.length == 3) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && isStringWhitespace(areaCode.value) && isStringWhitespace(phoneNum.value)) return true;
    else
    {
		area = stripCharsInBag(areaCode.value, whitespace);
		phone = stripCharsInBag(phoneNum.value, whitespace + '-');
		if(area.length != 3 || phone.length != 7 || !isInteger(area) ||
				!isInteger(phone) )
		{
			errorMessageList[errorMessageList.length] = front + phoneType + iPhone;
			if(!firstError)
				firstError = areaCode;	
			return false;
		}
		else {
			var thephone = phone.substring(0,3) + "-" + phone.substring(3);
			if(phoneType == "")
				AddToConfirm("Phone Number", "(" + area + ") " + thephone);
			else
				AddToConfirm(phoneType + " Phone", "(" + area + ") " + thephone);
			return true;
		}
    }	
}
var weekday_showing = true;
function changeDays(numb, date_form, dayofweek, daySelect, monthSelect, yearSelect) {
	var month;
	var sel;
	var year;
	var day;
	var numDays;	
	month = date_form.elements[monthSelect].selectedIndex - 1;
	sel = date_form.elements[yearSelect].selectedIndex;
	year = parseInt(date_form.elements[yearSelect].options[sel].text);
	
	if (numb != 1) {
		numDays = numDaysIn(month, year);
		date_form.elements[daySelect].options.length = numDays + 1;
		for (i = 27; i < numDays + 1; i++) {
			date_form.elements[daySelect].options[i].text = i;
		}
	}
	day = date_form.elements[daySelect].selectedIndex;
	if(date_form.elements[monthSelect].selectedIndex == 0 ||
			date_form.elements[yearSelect].selectedIndex == 0 ||
			day == 0)
		date_form.elements[dayofweek].value = "";
	else
		date_form.elements[dayofweek].value = daysArray[getWeekDay(month,day,year) + 1];
		//date_form.elements[dayofweek].selectedIndex = getWeekDay(month,day,year) + 1;
}
function numDaysIn(month, year) {
	if (month==3 || month==5 || month==8 || month==10) return 30;
	else if ((month==1) && leapYear(year)) return 29;
	else if (month==1) return 28;
	else return 31;
}
function leapYear(year) {
	if (((year % 4 == 0) && year % 100 != 0) || year % 400 == 0)
		return true;
	else
		return false;
}
function getWeekDay(month, day, year) {
	var first_day;
	first_day = firstDayOfYear(year);
	for (num=0; num < month; num++) {
		first_day += numDaysIn(num, year);
	}
	first_day += day - 1;
	return first_day % 7;
}
function firstDayOfYear(year) {
	var diff;
	diff = year - 401;
	return parseInt((1 + diff + (diff / 4) - (diff / 100) + (diff / 400)) % 7);
}
function checkIssues(theField, invalidMsg, emptyOK)
{	var i;
	if (checkIssues.arguments.length == 2) emptyOK = defaultEmptyOK;
	for(i = 0; i < theField.length; i++)
	{
	   if(theField[i].checked) {
		if(theField[i].name == "SubType") {
		   var colon = theField[i].value.indexOf(':');
		   var term = theField[i].value.charAt(0);
         	   var units="";
		 
		   if (term == 'Y') units = "Full academic year"; 	// classroom & sponsor 
           if (term == 'F') units = "Fall semester";		// classroom & sponsor
		   if (term == 'S') units = "Spring semester";		// classroom & sponsor
		   if (term == 'A') units = "Full academic year";	// indiviual classroom
		  
		   var dollars = theField[i].value.substring(colon+1);
		   var dolcents = dollars.split(':');
		   if (! dolcents[1]) dolcents[1] = "00";
		   
		   if (term == 'A') {
			 AddToConfirm("Subscription Term",  units +
			" at $" + dolcents[0] + "." + dolcents[1] + " per copy" );
		   }
		   else
		   {
		  	 AddToConfirm("Subscription Term",  units +
			" at $" + dolcents[0] + "." + dolcents[1] );
			//theField[i].value.substring(colon+1)	vgw
	 		}
	 }	
  
       return i;
	}  
 }
  
   	if(!emptyOK)  {
		errorMessageList[errorMessageList.length] = invalidMsg;
		if(!firstError)
			firstError = theField[0];
	}
	return i;	
}

