 var defaultEmptyOK = false;
 var whitespace = " \t\n\r";

//------------------------------------------------------------------------------

 function lTrim(sString, sChar) {
  var iCount = 0;
  var iLength = sString.length;

  if (sChar.indexOf(sString.charAt(0)) != -1) {
   while (iCount < iLength && sChar.indexOf(sString.charAt(iCount)) != -1) iCount++;

   sString = sString.substring(iCount, iLength);
  }

  return sString;
 }

//------------------------------------------------------------------------------

 function rTrim(sString, sChar) {
  var iCount = sString.length - 1;

  if (sChar.indexOf(sString.charAt(sString.length - 1)) != false) {
   while (iCount >= 0 && sChar.indexOf(sString.charAt(iCount)) != -1) iCount--;

   sString = sString.substring(0, iCount + 1);
  }

  return sString;
 }

//------------------------------------------------------------------------------

 function trim(sString, sChar) {
  return lTrim(rTrim(sString, sChar), sChar);
 }

//------------------------------------------------------------------------------

 function isWhitespace (sString) {
  var iCount;
  var sChar = "";

  if (isEmpty(sString)) return true;

  for (iCount = 0; iCount < sString.length; iCount++) {   
   sChar = sString.charAt(iCount);

   if (whitespace.indexOf(sChar) == -1) return false;
  }

  return true;                                  // all characters are whitespace
 }

//------------------------------------------------------------------------------

 function isEmpty(s) {
  return ((s == null) || (s.length == 0))
 }

//------------------------------------------------------------------------------

 function isEMail(s) {
  if (isEmpty(s)) 
   if (isEMail.arguments.length == 1) return defaultEmptyOK;
   else return (isEmail.arguments[1] == true);
   
  if (isWhitespace(s)) return false;                         // is s whitespace?
    
  // there must be >= 1 character before @, so we
  // start looking at character position 1 
  // (i.e. second character)
  var i = 1;
  var sLength = s.length;

  // look for @
  while ((i < sLength) && (s.charAt(i) != "@")) {
   i++
  }

  if ((i >= sLength) || (s.charAt(i) != "@")) return false;
  else i += 2;

  // look for .
  while ((i < sLength) && (s.charAt(i) != ".")) {
   i++
  }

  // there must be at least one character after the .
  if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
  else return true;
 }

//------------------------------------------------------------------------------

 function isNumeric(sString) {
  var checkOK = "0123456789";
  var bValid = true;
  var sChar = "";
  var iOuterCount;
  var iInnerCount;

  for (iOuterCount = 0;  iOuterCount < sString.length;  iOuterCount++) {
   sChar = sString.charAt(iOuterCount);

   for (iInnerCount = 0;  iInnerCount < checkOK.length;  iInnerCount++)
    if (sChar == checkOK.charAt(iInnerCount)) break;

   if (iInnerCount == checkOK.length) {
    bValid = false;
    break;
   }
  }

  return bValid;
 }

//------------------------------------------------------------------------------

 function isAlpha(sString) {
  var checkOK = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var bValid = true;
  var sChar = "";
  var iOuterCount;
  var iInnerCount;

  for (iOuterCount = 0;  iOuterCount < sString.length;  iOuterCount++) {
   sChar = sString.charAt(iOuterCount);

   for (iInnerCount = 0;  iInnerCount < checkOK.length;  iInnerCount++)
    if (sChar == checkOK.charAt(iInnerCount)) break;

   if (iInnerCount == checkOK.length) {
    bValid = false;
    break;
   }
  }

  return bValid;
 }

//------------------------------------------------------------------------------

 function isLeapYear(iYear) {
  return ((iYear % 4 == 0) && (iYear % 100 != 0)) || (iYear % 400 == 0);
 }

//------------------------------------------------------------------------------

 function monthToNumber(sMonth) {
  var sMonthName = sMonth.toLowerCase();
  var iMonth = 0

  switch (sMonthName) {
   case "january":
    iMonth = 1;
    break;

   case "february":
    iMonth = 2;
    break;

   case "march":
    iMonth = 3;
    break;

   case "april":
    iMonth = 4;
    break;

   case "may":
    iMonth = 5;
    break;

   case "june":
    iMonth = 6;
    break;

   case "july":
    iMonth = 7;
    break;

   case "august":
    iMonth = 8;
    break;

   case "september":
    iMonth = 9;
    break;

   case "october":
    iMonth = 10;
    break;

   case "november":
    iMonth = 11;
    break;

   case "december":
    iMonth = 12;
    break;
  }
  return iMonth;
 }

//------------------------------------------------------------------------------

 function numberToMonth(iMonth) {
  var iMonthNumber = parseInt(iMonth);
  var sMonth = "";

  switch (iMonthNumber) {
   case 1:
    sMonth = "January";
    break;

   case 2:
    sMonth = "February";
    break;

   case 3:
    sMonth = "March";
    break;

   case 4:
    sMonth = "April";
    break;

   case 5:
    sMonth = "May";
    break;

   case 6:
    sMonth = "June";
    break;

   case 7:
    sMonth = "July";
    break;

   case 8:
    sMonth = "August";
    break;

   case 9:
    sMonth = "September";
    break;

   case 10:
    sMonth = "October";
    break;

   case 11:
    sMonth = "November";
    break;

   case 12:
    sMonth = "December";
    break;
  }
  return sMonth;
 }

//------------------------------------------------------------------------------

 function validDate(iDayIn, iMonthIn, iYearIn) {
  var iDay = parseInt(iDayIn);
  var iMonth = parseInt(iMonthIn);
  var iYear = parseInt(iYearIn);
  var iFeb = 28;
  var iReturn = 0;

  if (iMonth == 2 && isLeapYear(iYear) == true) iFeb = 29;

  switch (iMonth) {
   case 2:
    if (iDay > iFeb) iReturn = iFeb;
    break;

   case 4:
    if (iDay > 30) iReturn = iMonth;
    break;

   case 6:
    if (iDay > 30) iReturn = iMonth;
    break;

   case 9:
    if (iDay > 30) iReturn = iMonth;
    break;

   case 11:
    if (iDay > 30) iReturn = iMonth;
    break;
  }

  return iReturn;
 }

//------------------------------------------------------------------------------

 function falseDate(iValue) {
  var sError = "";

  switch(iValue) {
   case 4:
    sError = numberToMonth(iValue) + " has 30 days\n";
    break;

   case 6:
    sError = numberToMonth(iValue) + " has 30 days\n";
    break;

   case 9:
    sError = numberToMonth(iValue) + " has 30 days\n";
    break;

   case 11:
    sError = numberToMonth(iValue) + " has 30 days\n";
    break;

   case 28:
    sError = "February has 28 days\n";
    break;

   case 29:
    sError = "February has 29 days (leap year)\n";
    break;
  }

  return sError;
 }

