var pEntryPrompt = "Please enter a ";
var pEmail = "valid email address (like foo@bar.com).";
var defaultEmptyOK = false;
var reEmail = /^.+\@.+\..+$/;
var reInteger = /^\d+$/;
var iEmail = "This field must be a valid email address (like roxen@bar.com). Please reenter it now.";
var reSignedInteger = /^(\+|\-)?\d+$/;
var reFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/
var reSignedFloat = /^((\+|\-)?(\d+(\.\d*)?)|((\d*\.)?\d+))$/
var phoneNumberDelimiters = "()- ";
var digitsInUSPhoneNumber = 10;
var ZIPCodeDelimiters = "-";
var ZIPCodeDelimeter = "-";
var validZIPCodeChars = digits + ZIPCodeDelimiters;
var digitsInZIPCode1 = 5;
var digitsInZIPCode2 = 9;
var digits = "0123456789";


function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   } 
   return this
}

/*
daysInMonth = makeArray(13);
daysInMonth[0] = 31;
daysInMonth[1] = 31;
daysInMonth[2] = 29;   
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;
*/

var daysInMonth=new Array("31","31","29","31","30","31","30","31","31","30","31","30","31");
daysInMonth[1]=parseInt(daysInMonth[1]);
daysInMonth[2]=parseInt(daysInMonth[2]);
daysInMonth[3]=parseInt(daysInMonth[3]);
daysInMonth[4]=parseInt(daysInMonth[4]);
daysInMonth[5]=parseInt(daysInMonth[5]);
daysInMonth[6]=parseInt(daysInMonth[6]);
daysInMonth[7]=parseInt(daysInMonth[7]);
daysInMonth[8]=parseInt(daysInMonth[8]);
daysInMonth[9]=parseInt(daysInMonth[9]);
daysInMonth[10]=parseInt(daysInMonth[10]);
daysInMonth[11]=parseInt(daysInMonth[11]);
daysInMonth[12]=parseInt(daysInMonth[12]);


function checkEmail (theField, emptyOK) {
   if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false)) 
       return false;
    else return true;
}

function warnInvalid (theField, s) { 
    alert(s);
    return false
}

function spaceTrim(InString) {
	var LoopCtrl=true;
	while (LoopCtrl) {
		if (InString.indexOf("  ") != -1) {
			Temp = InString.substring(0, InString.indexOf("  "))
			InString = Temp + InString.substring(InString.indexOf("  ")+1, 
			InString.length)
		} else	LoopCtrl = false;
	}
	if (InString.substring(0, 1) == " ") InString = InString.substring(1, InString.length)
	if (InString.substring (InString.length-1) == " ") InString = InString.substring(0, InString.length-1)
		
	return (InString)
}

function isDay(s) { 
  if (isEmpty(s)) {
	       if (isDay.arguments.length == 1) return defaultEmptyOK;
    	   else return (isDay.arguments[1] == true);   
	}		   
   return isIntegerInRange (s, 1, 31);
}


function isEmail(s) {
	if (isEmpty(s)) 
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
    //if (isWhitespace(s)) return false;
    var i = 1;
    var sLength = s.length;
    while ((i < sLength) && (s.charAt(i) != "@")) { 
		i++
    }
    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;
    while ((i < sLength) && (s.charAt(i) != ".")) { 
		i++
    }
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}

/*function isEmail (s) {
   if (isEmpty(s)) 
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
    else {
       return reEmail.test(s)
    }
}*/

function isSignedInteger (s) { 
  if (isEmpty(s)) 
       if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedInteger.arguments[1] == true);
   else {
       return reSignedInteger.test(s)
    }
}

function isSignedFloat (s) { 
  if (isEmpty(s)) 
       if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedFloat.arguments[1] == true);
   else {
       return reSignedFloat.test(s)
    }
}
//
function isNonnegativeInteger (s) {
   var secondArg = defaultEmptyOK;
    if (isNonnegativeInteger.arguments.length > 1)
        secondArg = isNonnegativeInteger.arguments[1];
    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}

function isYear (s){
   if (isEmpty(s)) 
       if (isYear.arguments.length == 1) return defaultEmptyOK;
       else return (isYear.arguments[1] == true);
    if (!isNonnegativeInteger(s)) return false;
    return ((s.length == 2) || (s.length == 4));
}

function isFloat (s) { 
  if (isEmpty(s)) 
       if (isFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isFloat.arguments[1] == true);

    return reFloat.test(s)
}

function isInteger (s){
   var i;
    if (isEmpty(s)) 
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);

    return reInteger.test(s)
}

function daysInFebruary (year) {
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isDate (year, month, day) {
   if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;
    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);
    if (intDay > daysInMonth[intMonth]) return false; 
    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
    return true;
}

function isIntegerInRange (s, a, b) {
   if (isEmpty(s)) 
       if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
       else return (isIntegerInRange.arguments[1] == true);

    if (!isInteger(s, false)) return false;
	if (s == "08") s = "8";
	if (s == "09") s = "9";
    var num = parseInt(s);
    return ((num >= a) && (num <= b));
}

function isEmpty(s){   
	return ((s == null) || (s.length == 0))
}

function isMonth (s)
{  
	if (isEmpty(s)) 
       if (isMonth.arguments.length == 1) return defaultEmptyOK;
       else return (isMonth.arguments[1] == true);
    return isIntegerInRange (s, 1, 12);
}

function isPositiveInteger (s) {
   var secondArg = defaultEmptyOK;

    if (isPositiveInteger.arguments.length > 1) secondArg = isPositiveInteger.arguments[1];
    return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}

function dateAdd(datepart,num,sdate) {
	var days=0;
	var CurDay=0,CurMonth=0,CurYear=0;
	var ndate="";
	if (datepart =="d") days=num;
	if (datepart == "w") days=num * 7;
	CurDay=sdate.getDate();
	CurMonth=sdate.getMonth()+1
	CurYear=sdate.getYear();
	if (num >=0) {
		//add dates
		if (datepart != "m") {
			var MonthDays;
			for (i=1;i<=days;i++) {
				CurDay=CurDay+1;
				MonthDays = ((CurMonth == 2)?daysInFebruary(CurYear) : daysInMonth[CurMonth]);
				if (CurDay > MonthDays) {
					CurMonth=CurMonth+1;
					if (CurMonth > 12) {
						CurYear=CurYear+1;
						CurMonth=1;
					}
					CurDay=1;
				}
			}
		} else {
			for (i=1;i<=num;i++) {
				CurMonth=CurMonth+1;
				if (CurMonth > 12) {
					CurYear=CurYear+1;
					CurMonth=1;
				}
			}
		}
	} else {
		//subtract dates
		days=0-days;
		if (datepart != "m") {
			for (i=1;i<=days;i++) {
				CurDay=CurDay-1;
				if (CurDay == 0) {
					CurMonth=CurMonth-1;
					if (CurMonth==0) {
						CurYear=CurYear-1;
						CurMonth=12;
					}
					CurDay = ((CurMonth == 2) ? daysInFebruary(CurYear):daysInMonth[CurMonth]);
				}
			}
		} else {
			if (num >= CurMonth) {
				for (i=1;i<=num;i++) {
					CurMonth=CurMonth-1;
					if (CurMonth == 0) {
						CurYear=CurYear-1;
						CurMonth=12;
					}
				}
			} else {
				CurMonth = CurMonth - num;
			}
		}
	}
	if(CurYear<1900) CurYear=(CurYear>100?2000+CurYear-100:1900+CurYear);
	ndate=new Date(CurYear,CurMonth-1,CurDay);
	return ndate;
}

function dateDiff(datepart,earlierdate,laterdate) {
	var ctr=0,eday=0,emon=0,eyear=0;
	var lday=0,lmon=0,lyear=0;
	var MonthDays=0,NumDays=0;
	if(earlierdate <= laterdate) {
		yr=earlierdate.getYear();
		if(yr<1900) yr=(yr>100?2000+yr-100:1900+yr);
		var edate=new Date(yr,earlierdate.getMonth(),earlierdate.getDate());
		yr=laterdate.getYear();
		if(yr<1900) yr=(yr>100?2000+yr-100:1900+yr);
		var ldate=new Date(yr,laterdate.getMonth(),laterdate.getDate());
	} else {
		yr=laterdate.getYear();
		if(yr<1900) yr=(yr>100?2000+yr-100:1900+yr);
		var edate=new Date(yr,laterdate.getMonth(),laterdate.getDate());
		yr=earlierdate.getYear();
		if(yr<1900) yr=(yr>100?2000+yr-100:1900+yr);
		var ldate=new Date(yr,earlierdate.getMonth(),earlierdate.getDate());
	}
	eday=edate.getDate();
	emon=edate.getMonth()+1;
	eyear=edate.getYear();
	if(eyear<1900) eyear=(eyear>100?2000+eyear-100:1900+eyear);
	lday=ldate.getDate();
	lmon=ldate.getMonth()+1;
	lyear=ldate.getYear();
	if(lyear<1900) lyear=(lyear>100?2000+lyear-100:1900+lyear);
	
	while(edate<ldate) {
		MonthDays = ((emon == 2)?daysInFebruary(eyear) : daysInMonth[emon]);
		if(datepart=="d") {
			eday=eday+1;
			if (eday>MonthDays) {
				eday=1;
				emon=emon+1;
			}
		} else if (datepart=="w") {
			if(eday+7>MonthDays) {
				eday=7-(MonthDays-eday);
				emon=emon+1;
			} else {
				eday=eday+7;
			}
		} else if(datepart=="m") {
			emon=emon+1;
		} else if(datepart=="y") {
			eyear=eyear+1;
		}
		if(emon>12) {
			if (datepart != "w") eday=1;
			emon=1;
			eyear=eyear+1;
		}
		edate=new Date(eyear,emon-1,eday);
		if(edate>ldate) break;
		ctr=ctr+1;
	} // end while
	if(earlierdate>laterdate) ctr=0-ctr;
	return ctr;
} // end function


function stripCharsInBag (s, bag) {
	var i;
    var returnString = "";
    for (i = 0; i < s.length; i++) {   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function warnInvalid (theField, s) {   
	theField.focus()
    theField.select()
    alert(s)
    return false
}

function isUSPhoneNumber (s) { 
	if (isEmpty(s)) 
       if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isUSPhoneNumber.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}

function reformat (s) { 
	var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}


function reformatUSPhone (USPhone) {
   return (reformat (USPhone, "(", 3, ")", 3, "-", 4))
}

function checkUSPhone (theField, emptyOK) {   
	if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	else {  
		var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
       	//if (!isUSPhoneNumber(normalizedPhone, false)) return warnInvalid (theField, iUSPhone);
       	if (!isUSPhoneNumber(normalizedPhone, false)) return(false);
       	else {  // if you don't want to reformat as (123) 456-789, comment next line out
          theField.value = reformatUSPhone(normalizedPhone)
          return true;
       }
    }
}	

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) || (s.length == digitsInZIPCode2)))
}

function reformatZIPCode (ZIPString) { 
	if (ZIPString.length == 5) return ZIPString;
    else return (reformat (ZIPString, "", 5, "-", 4));
}

function checkZIPCode (theField, emptyOK) {
	if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else { 
		var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
      	if (!isZIPCode(normalizedZIP, false))  return false;
      	else {  // if you don't want to insert a hyphen, comment next line out
        	theField.value = reformatZIPCode(normalizedZIP)
         	return true;
      	}
    }
}

function dateDifference(startDate, startTime, endDate, endTime, returnFormat) {
	date1 = new Date();
	date2 = new Date();
	diff  = new Date();
	
	date1temp = new Date(startDate + " " + startTime);
	date1.setTime(date1temp.getTime());
	
	date2temp = new Date(endDate + " " + endTime);
	date2.setTime(date2temp.getTime());

	diff.setTime(date2.getTime() - date1.getTime());
	
	timediff = diff.getTime();
	return timediff;
	
}

function getDiffWeeks(timediff) {
	weeks = Math.floor(timediff / (1000 * 60 * 60 * 24 * 7));
	return weeks;
}	

function getDiffDays(timediff) {
	days = Math.floor(timediff / (1000 * 60 * 60 * 24)); 
	return days;
}	

function getDiffYear(timediff) {
	years = Math.floor(timediff / (1000 * 60 * 60 * 24 * 365)); 
	return years;
}	

function getDiffHours(timediff) {
	hours = Math.floor(timediff / (1000 * 60 * 60)); 
	return hours;
}

function getDiffMinutes(timediff) {
	mins = Math.floor(timediff / (1000 * 60)); 
	return mins;
}

function getDiffSeconds(timediff) {
	secs = Math.floor(timediff / 1000); 
	return secs;
}

function calculateAge(yr, mon, day, unit, decimals, rounding) {
	
	var one_day		=	1000*60*60*24
	var one_month	=	1000*60*60*24*30
	var one_year	=	1000*60*60*24*30*12
	var countunit 	= 	"years"
	var decimals 	= 	0
	var rounding 	= 	"rounddown"
	
	
	today=new Date()
	var pastdate=new Date(yr, mon-1, day)
	
	finalunit=(countunit=="days")? one_day : (countunit=="months")? one_month : one_year
	decimals=(decimals<=0)? 1 : decimals*10
	
	yearspast=today.getFullYear()-yr-1
	tail=(today.getMonth()>mon-1 || today.getMonth()==mon-1 && today.getDate()>=day)? 1 : 0
	pastdate.setFullYear(today.getFullYear())
	pastdate2=new Date(today.getFullYear()-1, mon-1, day)
	return(yearspast+tail)
}

function isValidDate(dateStr) {

	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; 
	var matchArray = dateStr.match(datePat); // is the format ok?
	if (matchArray == null) {
		alert(dateStr + " Date is not in a valid format.")
		return false;
	}
	month = matchArray[1]; // parse date into variables
	day = matchArray[3];
	year = matchArray[4];
	if (month < 1 || month > 12) { // check month range
		alert("Month must be between 1 and 12.");
		return false;
	}
	if (day < 1 || day > 31) {
		alert("Day must be between 1 and 31.");
		return false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		alert("Month "+month+" doesn't have 31 days!")
		return false;
	}
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day==29 && !isleap)) {
			alert("February " + year + " doesn't have " + day + " days!");
			return false;
	   	}
	}
	
	return true;
}

function isValidTime(timeStr) {

	var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
	
	var matchArray = timeStr.match(timePat);
	if (matchArray == null) {
	alert("Time is not in a valid format.");
	return false;
	}
	hour = matchArray[1];
	minute = matchArray[2];
	second = matchArray[4];
	ampm = matchArray[6];
	
	if (second=="") { second = null; }
	if (ampm=="") { ampm = null }
	
	if (hour < 0  || hour > 23) {
		alert("Hour must be between 1 and 12. (or 0 and 23 for military time)");
		return false;
	}
	if (hour <= 12 && ampm == null) {
		if (confirm("Please indicate which time format you are using.  OK = Standard Time, CANCEL = Military Time")) {
			alert("You must specify AM or PM.");
			return false;
	   }
	}
	if  (hour > 12 && ampm != null) {
		alert("You can't specify AM or PM for military time.");
		return false;
	}
	if (minute < 0 || minute > 59) {
		alert ("Minute must be between 0 and 59.");
		return false;
	}
	if (second != null && (second < 0 || second > 59)) {
		alert ("Second must be between 0 and 59.");
		return false;
	}
	return true;
}

