// global variables
var objTimeOut=1;

//browser sniffer
var agt=navigator.userAgent.toLowerCase();
var is_mac    = (agt.indexOf("mac")!=-1);
var is_major  = parseInt(navigator.appVersion);
var msie_vers_start = agt.indexOf("msie")+5;
var msie_real_vers = parseFloat(agt.substring(msie_vers_start, msie_vers_start+3));
var is_linux  = (agt.indexOf("inux")!=-1);
var is_nav    = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1) && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1) && (agt.indexOf('webtv')==-1));
var is_nav6   = (is_nav && (agt.indexOf('netscape6') != -1));
var is_nav4up = (is_nav && (is_major >= 4));
var is_ie     = (agt.indexOf("msie") != -1);
var is_ie3    = (is_ie && (is_major < 4));
var is_ie4    = (is_ie && (is_major == 4) && (msie_real_vers < 5));
var is_ie4up  = (is_ie  && (is_major >= 4));
var is_ie5up  = (is_ie  && !is_ie3 && !is_ie4);
var is_aol    = (agt.indexOf("aol") != -1);
var is_aol4   = (is_aol && is_ie3);


if(!window.saveInnerWidth) {
  window.onresize = resizeIt;
  window.saveInnerWidth = window.innerWidth;
  window.saveInnerHeight = window.innerHeight;
}

// Return true if string s is a valid email address.
function isValidEmail(s) {
  var validEmail = new RegExp("^[a-z0-9]+([._-]{1}[a-z0-9]+)*@((([a-z0-9]+([._-]{1}[a-z0-9]+)*)+[.]{1}[a-z]{2,3})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))$","i");
  return validEmail.test(s);
}

function resizeIt() {
    if (saveInnerWidth < window.innerWidth || 
        saveInnerWidth > window.innerWidth || 
        saveInnerHeight > window.innerHeight || 
        saveInnerHeight < window.innerHeight ) 
    {
        window.history.go(0);
    }
}


function bgChange(id, color) {
  if (document.all) {
    document.all[id].style.backgroundColor=color;
  } else if (document.layers) {
    document.layers[id].bgColor=color;
  }
} 

if (window != top) top.location.href = location.href;
function validShortName(sn) {
  var validShortName = new RegExp("^[a-z0-9]+$","i");
  return validShortName.test(sn);
}

function validEmail(email) {
  var emailRegExp = new RegExp("^[a-z0-9]+([._-]{1}[a-z0-9]+)*@((([a-z0-9]+([._-]{1}[a-z0-9]+)*)+[.]{1}[a-z]{2,3})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))$","i");
  return emailRegExp.test(email);
}

function isValidPassphrase(hint, phrase) {
  var doLoop        = 1;
  var index         = 0;
  var fullToken     = 0;
  var invalidPhrase = 0;
  var token         = "";
  var buffer        = "";

  hint = " "+hint+" ";

  while (doLoop&&phrase.length>0) {
    buffer=phrase.charAt(index);
    if (buffer==" ") {
      if (token) {
        fullToken=1;
      } else {
        fullToken=0;
      }
    } else if (index+1==phrase.length) {
      fullToken=1;
      token+=buffer;
    } else {
      fullToken=0;
      token+=buffer;
    }
    if (fullToken) {
      if (hint.indexOf(" "+token+" ")!=-1) {
        doLoop=0;
        invalidPhrase=1;
      }
      token="";
    }
    index++;
    if (index==phrase.length) doLoop=0;
  }
  if (invalidPhrase) {
    return false;
  } else {
    return true;
  }
}
/* ********************************************************** */
/* Global Variables and Constants *************************** */
/* ********************************************************** */

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var blanks = " \t\n\r";  // aka whitespace chars


/* ********************************************************** */
/* Functions ************************************************ */
/* ********************************************************** */


// Returns true if string s is empty

function isEmpty(s)
  {
  return ((s == null) || (s.length == 0));
  }


// Returns true if string s is empty or all blank chars

function isBlank(s)
  {
  var i;

  // Is s empty?
  if (isEmpty(s))
    return 1;
  else
   return 0;

  // Search through string's chars one by one until we find first
  // non-blank char, then return false; if we don't, return true
  for (i=0; i<s.length; i++)
    {   
    // Check that current character isn't blank
    var c = s.charAt(i);
    if (blanks.indexOf(c) == -1) 
      return 0;
    }
  // All characters are blank
  return 1;

  }



// Removes all blank chars (as defined by blanks) from s

function stripBlanks(s)
  {
  return stripCharsInBag(s, blanks)
  }


// Removes leading blank chars (as defined by blanks) from s

function stripLeadingBlanks(s)
  { 
  var i = 0;
  while ((i < s.length) && (blanks.indexOf(s.charAt(i)) != -1))
     i++;
  return s.substring(i, s.length);
  }

// Removes trailing blank chars (as defined by blanks) from s


function stripTrailingBlanks(s)
  { 
  var i = s.length - 1;
  while ((i >= 0) && (blanks.indexOf(s.charAt(i)) != -1))
     i--;
  return s.substring(0, i+1);
  }


// Removes leading+trailing blank chars (as defined by blanks) from s

function stripLeadingTrailingBlanks(s)
  { 
  s = stripLeadingBlanks(s);
  s = stripTrailingBlanks(s);
  return s;
  }


// Returns true if character c is an English letter (A .. Z, a..z)

function isLetter(c)
  {
  return (((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")));
  }


// Returns true if character c is a digit (0 .. 9)

function isDigit(s)
  {
    for (i = 0; i < s.length; i++)
    {   
      // Check that current character is letter
      var c = s.charAt(i);
  
      if (!((c >= "0") && (c <= "9")))
        return 0;
    }
  
    return 1;
  }


// Returns true if string s is English letters (A .. Z, a..z) only

function isAlphabetic(s)
  {
  var i;

  if (isBlank(s)) 
     return false;

  // Search through string's chars one by one until we find a 
  // non-alphabetic char, then return false; if we don't, return true

  for (i = 0; i < s.length; i++)
  {   
  // Check that current character is letter
  var c = s.charAt(i);

  if (!isLetter(c))
    return false;
  }

  // All characters are letters
  return true;
  }


// Returns true if string s is English letters (A .. Z, a..z) and numbers only

function isAlphanumeric(s)
  {
  var i;

  if (isBlank(s)) 
     return false;

  // Search through string's chars one by one until we find a 
  // non-alphanumeric char, then return false; if we don't, return true

  for (i = 0; i < s.length; i++)
    {   
    // Check that current character is number or letter
    var c = s.charAt(i);

    if (! (isLetter(c) || isDigit(c) ) )
    return false;
    }

  // All characters are numbers or letters
  return true;
  }



// Returns array containing index(es) of checked option(s) 
// in select box, or -1 if no options are selected

function getCheckedSelectOptions(select)
  {
  var arr = new Array();
  for (var i=0,j=0; i<select.length; i++)
    if (select.options[i].selected)
      arr[j++] = i;
  if (arr.length > 0)
    return arr;
  else
    return -1;
  }

function isValidCreditCard(ccno, cctype)
  {
  var ccval = parseInt(ccno.substring(0, 6));

  // Test for VISA
  if (cctype == 4) 
   {
    if ((ccval >= 400000) && (ccval <= 499999))
        return 1;
    else
        return 0;
   }

  // Test for Master Card
  if (cctype == 3) 
   {
    if ((ccval >= 500000) && (ccval <= 599999))
        return 1;
    else
        return 0;
   }

  // Test for Discover
  if (cctype == 2) 
   {
    if ((ccval >= 601100) && (ccval <= 601199))
        return 1;
    else
        return 0;
   }

  // Test for Amex
  if (cctype == 1) 
   {
    if (((ccval >= 340000) && (ccval <= 349999)) ||
       ((ccval >= 370000) && (ccval <= 379999))) 
        return 1;
    else
        return 0;
   }

 }

//-------------------------------------------------------------------
// REGFORM

var iDefault  = "This is a required field and may not be blank."
var iDate     = "Invalid date.  Date must be in the form mm/dd/ccyy.  Please enter a valid date."
var iEmail    = "Invalid Email address.  Email address must be in the form user@company.com.  Please enter a Email address."
var iPhone    = "Invalid phone number.  Phone number must be in the form 999-999-9999 [ext.9999].  Please enter a valid phone number."
var iSSN      = "Invalid SSN.  SSN must be in the form 999-99-9999.  Please enter a valid SSN."
var iTime     = "Invalid time.  Time must be in the form hh:mm AM or hh:mm PM.  Please enter a valid time."
var iCB       = "This is a required check box and must be selected before continuing."
var daysInMonth = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function warnInvalid(e, msg) {
	e.focus();
	e.select();
	alert(msg);
	return false;
}

function valDefault(e) {
  if (!isBlank(e.value)) return true;
	else return warnInvalid(e, iDefault);
}

function valCB(e) {
  if (e.checked == true) return true;
	else return warnInvalid(e, iCB);
}

function valDate(e) {
  var regExp = /\s/;
	if (regExp.test(dt)) return warnInvalid(e, iDate);
	var dt=replaceDelim(e.value);
	if (!regExp.test(dt)) return warnInvalid(e, iDate);
	var a=dt.split(/\s/);
	if (a.length != 3) return warnInvalid(e, iDate);
	if (!isDate(a[0],a[1],a[2])) return warnInvalid(e, iDate);
	e.value=formatDate(a[0],a[1],a[2]);
	return true;
}

function valEmail(e) {
	var regExp  = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
	//check for valid email
	if (regExp.test(e.value)) return true;
	else return warnInvalid(e, iEmail);
}

function valPhone(e) {
  // Make sure it contains at least one number.
	var regExp =/[0-9]+/;
	if (!regExp.test(e.value)) return warnInvalid(e, iPhone);
	
	//split at aplha or . (phone + EXT.)
	var a=e.value.split(/[A-Za-z.]+/);

	if (a.length > 2) return warnInvalid(e, iPhone);

	//remove ()- and spaces
	regExp = /([()-]|\s)/g;	a[0] = a[0].replace(regExp,'');
	//remove leading 0 or 1
	regExp = /^[0,1]/; a[0] = a[0].replace(regExp,'');

	//is a[0] 10 digits and does not start with 0 or 1?
	regExp = /^[2-9]\d{9}$/;
	if (regExp.test(a[0])) {
		if (a.length > 1) {
		  a[1]=stripLeadingTrailingBlanks(a[1]);
			regExp = /^\d+$/;
			if (!regExp.test(a[1])) return warnInvalid(e, iPhone);
		}

		// add '-' s 
		e.value = a[0].replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3');
		if (a.length > 1) e.value += ' ext.' + a[1];
		return true;
	}	else {
		return warnInvalid(e, iPhone);
	}
}

function valSSN(e) {
	var regExp = /^\d{3}\-\d{2}\-\d{4}$/;
	//check for valid SSN
	if (regExp.test(e.value)) return true;
	else return warnInvalid(e, iSSN);
}

function valTime(e) {
	e.value = e.value.toUpperCase();
	var regExp = /^(0?[1-9]|1[0-2]):[0-5]\d\s(AM|PM)$/;
	//check for valid time
	if (regExp.test(e.value)) {
		regExp = /^(0)/;
		//trim leading 0
		if (regExp.test(e.value)) e.value = e.value.replace(regExp, '');
		return true;
	}
	else return warnInvalid(e, iTime);
}

function replaceDelim(s) {
	var regExp = /-|\//g;
	//replace -/ with space
	return s.replace(regExp, ' ');
} 

function formatDate(m, d, y) {
	if (m.length==1) m='0'+m;
	if (d.length==1) d='0'+d;
	if (y.length==1) y='200'+y;
	if (d.length==0)
		return (m+'/'+y);
	else
		return (m+'/'+d+'/'+y);
}

function isMonth(s) {
	if (isEmpty(s)) return false;
	var i=s-0; //convert to int
	if (s!=i) return false;
	return ((i>=1) && (i<=12));
}

function isDay(s) {
	if (isEmpty(s)) return false;
	var i=s-0; //convert to int
	if (s!=i) return false;
	return ((i>=1) && (i<=31));
}

function isYear(s) {
	if (isEmpty(s)) return false;
	var i=s-0; //convert to int
	if (s!=i) return false;
	return ((i>=0) && (i<=9999));
}

function daysInFebruary(y) {
	return (((y % 4 == 0) && ((!(y % 100 == 0)) || (y % 400 == 0))) ? 29 : 28);
}

function isDate(m, d, y) {
	if (!(isYear(y) && isMonth(m) && isDay(d))) return false;
	if (d > daysInMonth[m-1]) return false;
	if ((m == 2) && (d > daysInFebruary(y))) return false;
	return true;
}
