<!--
function ltrim(s)
{
  var str = "";
	var i, j;
  if((s != null) && (s.length > 0))
	{
	  i=0;
	  while(isSpace(s.charAt(i))) { i++; }
	  for(j=i; j<s.length; j++) { str += s.charAt(j); }
	}
	return str;
}

function rtrim(s)
{
  var str = "";
	var i, j;
  if((s != null) && (s.length > 0))
	{
    i = s.length - 1;
	  while(isSpace(s.charAt(i))) { i--; }
	  for(j=0; j<=i; j++) { str += s.charAt(j); }
	}
		return str;
}

function lrtrim(s)
{
  var str = "";
	str = ltrim(s);
	str = rtrim(str);
	return str;
}

function trim(s)
{
  var str, ch, i;
	str = "";
	for(i=0; i<s.length; i++)
	{
	  ch = s.charAt(i);
		if(!isSpace(ch)) str += ch;
	}
	return str;
}

function isLeapYear(y)
{ return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)); }

function dateDiff(sDate1,sDate2)
// return the difference in days from sDate1 to sDate2
// sDate has the form "yyyy-mm-dd"
{
  var da1, da2, d1, d2, i;
  da1 = sDate1.split("-");
	da2 = sDate2.split("-");
	d1 = new Date(parseInt(da1[0],10),parseInt(da1[1],10)-1,parseInt(da1[2],10));
  d2 = new Date(parseInt(da2[0],10),parseInt(da2[1],10)-1,parseInt(da2[2],10));
	return (Date.parse(d2) - Date.parse(d1)) / 1000 / 60 / 60 / 24;
}

function toDays(sDate)
// return the difference in days from today to sDate
// sDate has the form "yyyy-mm-dd"
{
  var now, today, dtea, dte;
  now = new Date();
  today = new Date(now.getFullYear(),now.getMonth(),now.getDate());
  dtea = sDate.split("-");
	dte = new Date(parseInt(dtea[0],10),parseInt(dtea[1],10)-1,parseInt(dtea[2],10));
	return (Date.parse(dte) - Date.parse(today)) / 1000 / 60 / 60 / 24;
}

function countChar(c,s)
// count how many character c in the string s
{
  var len, count, i;
	len = s.length;
	if(len == 0) return 0;
	count = 0;
	for(i=0; i<len; i++)
	{
	  if(s.charAt(i) == c) count++;
	}
	return count;
}

function isEmpty(s)
{ return ((s == null) || (s.length == 0)); }

function isChar(c)
{ return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))); }

function isDigit(c)
{ return ((c >= '0') && (c <= '9')); }

function isCharDigit(c)
{ return (isChar(c) || isDigit(c)); }

function isSpace(c)
{ return ((c == ' ') || (c == '\b') || (c == '\t')); }

function isDash(c)
{  return (c == '-'); }

function isUnderscore(c)
{  return (c == '_'); }

function isAtsign(c)
{  return (c == '@'); }

function isPeriod(c)
{  return (c == '.'); }

function isDigitPeriod(c)
{
  return (isDigit(c) || isPeriod(c));
}

function isCharDigitAtsignPeriodDashUnderscore(c)
{  return (isChar(c) || isDigit(c) || isAtsign(c) || isPeriod(c) || isDash(c) || isUnderscore(c)); }

function isCharDigitPeriodDashUnderscore(c)
{  return (isChar(c) || isDigit(c) || isPeriod(c) || isDash(c) || isUnderscore(c)); }

function isStrBad(sSrc,sBad)
{
  //example of bad character: badChars = "~`!#$%^&*()+={}[]<>?/|:;'\"\\";
	var i;
  for(i=0; i<sBad.length; i++)
	{
	  if(sSrc.indexOf(sBad.charAt(i)) >= 0) return true;
	}
	return false;
}

function isStrSpace(s)
{
  var i;
  if(isEmpty(s)) return true;
  for(i=0; i<s.length; i++)
    if(!isSpace(s.charAt(i))) return false;
  return true;
}

function isStrDigitPeriod(s)
{
  var i;
  for(i=0; i<s.length; i++)
    if(!isDigitPeriod(s.charAt(i))) return false;
  return true;
}

function isStrDigit(s)
{
  var i;
  if(isEmpty(s)) return false;
  for(i=0; i<s.length; i++)
    if(!isDigit(s.charAt(i))) return false;
  return true;
}

function isStrFloat(s)
{
  var ch, i, firstDot, secondDot;
  if(isStrSpace(s)) return false;
  for(i=0; i<s.length; i++)
  {
    ch = s.charAt(i);
    if(!isDigit(ch) && !isPeriod(ch)) { return false; }
  }
  firstDot = s.indexOf(".",0);
  if(firstDot > -1)
  {
    secondDot = s.indexOf(".",firstDot+1);
    if(secondDot > -1) return false;
  }
  return true;
}

function isAlpha(s)
{
  var i;
  if(isEmpty(s)) return false;
  for(i=0; i<s.length; i++)
    if(!isChar(s.charAt(i))) return false;
  return true;
}

function isAlphaNum(s)
{
  var i;
  if(isEmpty(s)) return false;
  for(i=0; i<s.length; i++)
    if((!isChar(s.charAt(i))) && (!isDigit(s.charAt(i)))) return false;
  return true;
}

function isEmail(s)
{
  var i, l, atPos, periodPos;
  l = s.length;
  if(l == 0) return false;
  for(i=0; i<l; i++)
    if(!isCharDigitAtsignPeriodDashUnderscore(s.charAt(i))) return false;

  atPos = s.indexOf("@",1);
  if(atPos == -1) { return false; }

  if(s.indexOf("@",atPos+1) > -1) { return false; }
  
  periodPos = s.indexOf(".",atPos);
  if(periodPos == -1) { return false; }

  if(periodPos+4 > l) { return false; }

  return true;
}

function isEmail2(sEmail)
{
  var pat;
	pat = /^[A-Za-z][A-Za-z0-9]*((_\w+)|(-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]{2,4}$/;
	return (sEmail.search(pat) != -1);
}

function isSSN(sSSN)
{
  var pat;
	pat = /^[0-9]{3}-{0,1}[0-9]{1,2}-{0,1}[0-9]{4}$/;
	return (sSSN.search(pat) != -1);
}

function isInteger(s)
{
  var pat;
	pat = /^[0-9]+$/;
	return (s.search(pat) != -1);	
}

function isDouble(s)
{
  var pat;
	pat = /^(([0-9]{1,})|([0-9]{0,}\.[0-9]{1,}))$/;
	return (s.search(pat) != -1);
}

function isPassword(s)
{
  var i, l;
  l = s.length;
  if(l < 5) return false;
  for(i=0; i<l; i++)
    if(!isCharDigitAtsignPeriodDashUnderscore(s.charAt(i))) return false;
  return true;
}

function warning(f,s)
{
  f.focus();
  f.select();
  alert(s);
  return false;
}

function isFuture(mm,dd,yyyy)
{
  var now, cm, cd, cy;
  now = new Date();
  cm = now.getMonth() + 1; //getMonth returns 0-11
  cd = now.getDate();      //getDate returns 1-31
  cy = now.getFullYear();

  if(yyyy > cy) return true;
  if(yyyy == cy)
  {
    if(mm > cm) return true;
    if(mm == cm)
    {
      if(dd > cd) return true;
    }
  }
  return false;
}

function isIpAddress(sIp)
{
  var ssIp, l, i, num;
  if(isStrSpace(sIp)) return false;
  if(!isStrDigitPeriod(sIp)) return false;
  ssIp = sIp.split(".");
  l = ssIp.length;
  if(l != 4) return false;
  for(i=0; i<4; i++)
    if(parseInt(ssIp[i],10) > 255) return false;
  return true;
}

function isDns(sDns)
{
  var i;
  if(isStrSpace(sDns)) return false;
  for(i=0; i<sDns.length; i++)
    if(!isCharDigitPeriodDashUnderscore(sDns.charAt(i))) return false;
  return true;
}

function isWellFormat(cardnum)
{
  var i, c, l;
  l = cardnum.length;
  if(l == 0) return false;

  for(i=0; i<l; i++)
  {
    c = cardnum.charAt(i);
    if(!(isSpace(c) || isDash(c) || isDigit(c)))
      return false;
  }
  return true;
}

function cleanCard(cardnum)
{
  var c, s, i;
  s = "";
  for(i=0; i<cardnum.length; i++)
  {
    c = cardnum.charAt(i);
    if(isDigit(c))
      s = s + c;
  }
  return s;
}

function isExpired(sMonth,sFullYear)
{
  var now, cm, cy, ccm, ccy, nowInMonths, cceInMonths;
	now = new Date();
	cm = now.getMonth() + 1; //getMonth returns 0-11
	cy = now.getFullYear();
	ccm = parseInt(sMonth,10);
	ccy = parseInt(sFullYear,10);
	nowInMonths = cy * 12 + cm;
	cceInMonths = ccy * 12 + ccm;
	return (cceInMonths < nowInMonths);
}

function isWellNumber(cardnum)
{
  var sum, temp, mul, l, i, d;
  sum = 0;
  mul = 1;
  l = cardnum.length;
  for(i=l-1; i>=0; i--)
  {
    d = cardnum.charAt(i);
    temp = parseInt(d,10) * mul;
    if(temp >= 10)
      sum += (temp % 10) + 1;
    else
      sum += temp;

    if(mul == 1)
      mul = 2;
    else
      mul = 1;
  }
  if((sum % 10) == 0) return true;
  return false;
}

function isMaster(sNum,sMonth,sFullYear)
{
  var temp, l, d1, d2;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if(l != 16) { return false;}
  d1 = temp.charAt(0);
  if(d1 != "5") { return false; }
  d2 = temp.charAt(1);
  if((parseInt(d2,10) < 1) || (parseInt(d2,10) > 5)) { return false; }
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isVisa(sNum,sMonth,sFullYear)
{
  var temp, l, c;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if((l != 13) && (l != 16)) { return false; }
  c = temp.charAt(0);
  if(c != "4") { return false; }
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isDiscover(sNum,sMonth,sFullYear)
{
  var temp, first4d, l;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if(l != 16) return false;
  first4d = temp.substring(0,4);
  if(first4d != "6011") return false;
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isAmericanExpress(sNum,sMonth,sFullYear)
{
  var temp, l, d1, d2;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if(l != 15) return false;
  d1 = temp.charAt(0);
  if(d1 != "3") { return false; }
  d2 = temp.charAt(1);
  if((d2 != "4") && (d2 != "7")) return false;
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isDinersClub(sNum,sMonth,sFullYear)
{
  var temp, l, d1, d2;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if(l != 14) return false;
  d1 = temp.charAt(0);
  if(d1 != "3") return false;
  d2 = temp.charAt(1);
  if((d2 != "0") && (d2 != "6") && (d2 != "8")) return false;
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isCarteBlanche(sNum,sMonth,sFullYear)
{
      // Same as isDinersClub()
  var temp, l, d1, d2;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if(l != 14) return false;
  d1 = temp.charAt(0);
  if(d1 != "3") return false;
  d2 = temp.charAt(1);
  if((d2 != "0") && (d2 != "6") && (d2 != "8")) return false;
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isEnRoute(sNum,sMonth,sFullYear)
{
  var temp, first4d, l;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if(l != 13) return false;
  first4d = temp.substring(0,4);
  if((first4d != "2014") && (first4d != "2149")) return false;
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isJCB(sNum,sMonth,sFullYear)
{
  var temp, first4d, l;
  if(!isWellFormat(sNum)) { return false; }
  if(isExpired(sMonth,sFullYear)) { return false; }
  temp = cleanCard(sNum);
  l = temp.length;
  if(l != 16) return false;
  first4d = temp.substring(0,4);
  if((first4d != "3088") && (first4d != "3096") && (first4d != "3112") && 
     (first4d != "3158") && (first4d != "3337") && (first4d != "3528"))
    return false;
  if(!isWellNumber(temp)) { return false; }
  return true;
}

function isValidCard(sType,sNum,sMonth,sFullYear)
{
  if(sType == "visa") return isVisa(sNum,sMonth,sFullYear);
  if(sType == "master") return isMaster(sNum,sMonth,sFullYear);
  if(sType == "discover") return isDiscover(sNum,sMonth,sFullYear);
  if(sType == "americanexpress") return isAmericanExpress(sNum,sMonth,sFullYear);
  if(sType == "dinersclub") return isDinersClub(sNum,sMonth,sFullYear);
  if(sType == "carteblanche") return isCarteBlanche(sNum,sMonth,sFullYear);
  if(sType == "enroute") return isEnRoute(sNum,sMonth,sFullYear);
  if(sType == "jcb") return isJCB(sNum,sMonth,sFullYear);
}

function logb(base,num)
{ return (Math.log(num) / Math.log(base)); }

function randNum(min,max)
{ return (Math.floor((Math.random() * (max - min + 1)) + min)); }

function decToHex(n)
{
  var hexNum, s, result;
  s = "";
  result = "";
  hexNum = "0123456789ABCDEF";
  if(n<16)
  {
    s = "0" + hexNum.charAt(n);
    return s;
  }
  
  while(n > 0)
  {
    r = n % 16;
    s = s + hexNum.charAt(r);
    n = Math.round(Math.floor(n/16));
  }

  for(i=s.length - 1; i>=0; i--)
    result = result + s.charAt(i);
  return result;
}

function randColor()
{
  var redval, greenval, blueval, colorval;
  redval = decToHex(Math.round((Math.random() * 5) * 51));
  greenval = decToHex(Math.round((Math.random() * 5) * 51));
  blueval = decToHex(Math.round((Math.random() * 5) * 51));
  colorval = "#" + redval + greenval + blueval;
  return ColorVal;
}

function leaf(y)
{ return (y % 100 == 0 ? false : y % 4 == 0); }

function getDays(m,y)
{
  var mdays = new Array(12);
  mdays[0] = 31;
  mdays[1] = leaf(y) ? 29 : 28;
  mdays[2] = 31;
  mdays[3] = 30;
  mdays[4] = 31;
  mdays[5] = 30;
  mdays[6] = 31;
  mdays[7] = 31;
  mdays[8] = 30;
  mdays[9] = 31;
  mdays[10] = 30;
  mdays[11] = 31;
  return (mdays[m]);
}

function getMonthName(m)
{
  var mnames = new Array("January","February","March","April","May","June",
               "July","August","September","October","November","December");
  return (mnames[m]);
}

function makeCalendar(m,y)
{
  var totaldays, monthname, firstday, s, i, j;
  totaldays = getDays(m,y);
  monthname = getMonthName(m);
  firstday = new Date(y,m,1);
  firstday = firstday.getDay();
  s = "";
  s = s + "<table width='150' border='1' cellspacing='0' cellpadding='1' "
  s = s + "style='font: 7pt Helvetica,sans-serif'>"
  s = s + "<tr><td align='center' colspan='7'><font face='Helvetica,sans-serif' size='3'>"
  s = s + monthname + " " + y + "</font></td></tr>"
  s = s + "<tr>"
  s = s + "<td align='center'>Sun</td><td align='center'>Mon</td><td align='center'>Tue</td>"
  s = s + "<td align='center'>Wed</td><td align='center'>Thu</td><td align='center'>Fri</td>"
  s = s + "<td align='center'>Sat</td>"
  s = s + "</tr>"
  s = s + "<tr>"

  for(i=0; i<firstday; i++)
    s = s + "<td>&nbsp;</td>";

  for(j=1; j<=totaldays; j++)
  {
    if(i == 7)
    {
      s = s + "</tr><tr>";
      i = 0;
    }
    s = s + "<td align='center'>" + j + "</td>"
    i++;
  }

  for(j=i; j<7; j++)
    s = s + "<td>&nbsp;</td>";

  s = s + "</tr></table>";
  document.write(s);
}

//-->
