
  function trim(s)
  {
     // Remove leading white space
     var firstchar = s.substring(0, 1);
     while (firstchar==" " || firstchar=="\n" || firstchar=="\t")
     {
        s = s.substring(1, s.length);
        firstchar = s.substring(0, 1);
     }

     // Remove trailing white space
     var lastchar = s.substring(s.length-1, s.length);
     while (lastchar==" " || lastchar=="\n" || lastchar=="\t")
     {
        s = s.substring(0, s.length-1);
        lastchar = s.substring(s.length-1, s.length);
     }

     return s;
  }

  // remove leading, trailing, and in-between white space
  function trimAll(str)
  {
     return str.replace(/^\s+/,"").replace(/\s+$/,"").replace(/\s+/g," ");
  }

  function isDigit(num)
  {
     if (num.length>1)
     {
        return false;
     }

     var num_string="1234567890";
     if (num_string.indexOf(num)!=-1)
     {
        return true;
     }

     return false;
  }

  function isInteger(s)
  {
     if (trim(s)=="")
     {
        return false;
     }

     for(var i=0; i<s.length; i++)
     {
        if (!isDigit(s.charAt(i)))
        {
           return false;
        }
     }

     return true;
  }

  function isAlphaNumeric(s)
  {
     if (trim(s)=="")
     {
        return false;
     }

     s = s.toLowerCase();

     for(var i=0; i<s.length; i++)
     {
        var c = s.charAt(i);
        if ((c>='a' && c<='z') || (c>='0' && c<='9'))
        {
           continue;
        }
        else
        {
           return false;
        }
     }

     return true;
  }

  function hasAtLeastOneAlpha(s)
  {
     if (trim(s)=="")
     {
        return false;
     }

     s = s.toLowerCase();

     for(var i=0; i<s.length; i++)
     {
        var c = s.charAt(i);
        if (c>='a' && c<='z')
        {
           return true;
        }
     }

     return false;
  }

  function validEmailAddress(addr, isEmptyOk)
  {
     if (addr=='' && !isEmptyOk)
     {
        alert("Enter an email address.");
        return false;
     }

     if (addr=='' && isEmptyOk)
     {
        // empty address is allowed
        return true;
     }

     var invalidChars = '\/\'\\ ";:?!()[]\{\}^|';
     for (i=0; i<invalidChars.length; i++)
     {
        if (addr.indexOf(invalidChars.charAt(i),0) > -1)
        {
           alert("Email address contains invalid characters.");
           return false;
        }
     }

     for (i=0; i<addr.length; i++)
     {
        if (addr.charCodeAt(i)>127)
        {
           alert("Email address contains non-ascii characters.");
           return false;
        }
     }

     var atPos = addr.indexOf('@', 0);
     if (atPos==-1)
     {
        alert("Email address must contain \"@\".");
        return false;
     }

     if (atPos==0)
     {
        alert("Email address must not start with \"@\".");
        return false;
     }

     if (addr.indexOf('@', atPos+1)>-1)
     {
        alert("Email address must contain only one \"@\".");
        return false;
     }

     if (addr.indexOf('.', atPos)==-1)
     {
        alert("Email address must contain a period in the domain name.");
        return false;
     }

     if (addr.indexOf('@.',0)!=-1)
     {
        alert("Period must not immediately follow @ in the email address.");
        return false;
     }

     if (addr.indexOf('.@',0)!=-1)
     {
        alert("Period must not immediately precede @ in the email address.");
        return false;
     }

     if (addr.indexOf('..',0)!=-1)
     {
        alert("Email address must not contain \"..\".");
        return false;
     }

     var suffix = addr.substring(addr.lastIndexOf('.')+1);
     if (suffix!='com' && suffix!='net' && suffix!='org' && suffix!='edu' && suffix!='ca' && suffix!='in' && suffix!='uk' && suffix!='int' && suffix!='mil' && suffix!='gov' & suffix!='arpa' && suffix!='biz' && suffix!='aero' && suffix!='name' && suffix!='coop' && suffix!='info' && suffix!='pro' && suffix!='museum' && suffix!='nu' && suffix!='us' && suffix!='fm' && suffix!='cc')
     {
        alert("Invalid email address.");
        return false;
     }

     return true;
  }

  function validEmailAddressNoMessage(addr, isEmptyOk)
  {
     if (addr=='' && !isEmptyOk)
     {
        return false;
     }

     if (addr=='' && isEmptyOk)
     {
        // empty address is allowed
        return true;
     }

     var invalidChars = '\/\'\\ ";:?!()[]\{\}^|';
     for (i=0; i<invalidChars.length; i++)
     {
        if (addr.indexOf(invalidChars.charAt(i),0) > -1)
        {
           return false;
        }
     }

     for (i=0; i<addr.length; i++)
     {
        if (addr.charCodeAt(i)>127)
        {
           return false;
        }
     }

     var atPos = addr.indexOf('@', 0);
     if (atPos==-1)
     {
        return false;
     }

     if (atPos==0)
     {
        return false;
     }

     if (addr.indexOf('@', atPos+1)>-1)
     {
        return false;
     }

     if (addr.indexOf('.', atPos)==-1)
     {
        return false;
     }

     if (addr.indexOf('@.',0)!=-1)
     {
        return false;
     }

     if (addr.indexOf('.@',0)!=-1)
     {
        return false;
     }

     if (addr.indexOf('..',0)!=-1)
     {
        return false;
     }

     var suffix = addr.substring(addr.lastIndexOf('.')+1);
     if (suffix!='com' && suffix!='net' && suffix!='org' && suffix!='edu' && suffix!='ca' && suffix!='in' && suffix!='uk' && suffix!='int' && suffix!='mil' && suffix!='gov' & suffix!='arpa' && suffix!='biz' && suffix!='aero' && suffix!='name' && suffix!='coop' && suffix!='info' && suffix!='pro' && suffix!='museum' && suffix!='nu' && suffix!='us' && suffix!='fm' && suffix!='cc')
     {
        return false;
     }

     return true;
  }

  function addBookmark(url, title)
  {
     bookmarkUrl = url;
     bookmarkTitle = title;
     if (document.all)
     {
        window.external.AddFavorite(bookmarkUrl,bookmarkTitle);
     }
  }

  function updateMyPreference()
  {
     if (!document.categories.paymentpref[0].checked &&
         !document.categories.paymentpref[1].checked &&
         !document.categories.paymentpref[2].checked)
     {
        alert("Select a payment method.");
        return;
     }

     document.categories.paypal_email_address.value = trim(document.categories.paypal_email_address.value);

     if (document.categories.paymentpref[0].checked && !validEmailAddressNoMessage(document.categories.paypal_email_address.value, true))
     {
        alert("Invalid email address.");
        return;
     }

     document.categories.submit();
  }

  function textCounter(field, countfield, maxlimit)
  {
     if (field.value.length > maxlimit)
     {
        // if too long...trim it!
        field.value = field.value.substring(0, maxlimit);
     }
     else
     {
        // otherwise, update 'characters added' counter
        countfield.value = field.value.length;
     }
  }

  function replaceAll(str, from, to)
  {
     var idx = str.indexOf(from);

     while (idx > -1)
     {
        str = str.replace(from, to); 
        idx = str.indexOf(from);
     }

     return str;
  }

  function countWords(this_field, count_field)
  {
    var fullStr = this_field.value + " ";
    var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi;
    var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, "");
    var non_alphanumerics_rExp = /[^A-Za-z0-9]+/gi;
    var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " ");
    var splitString = cleanedStr.split(" ");
    var word_count = splitString.length - 1;
    if (fullStr.length < 2)
    {
       word_count = 0;
    }
    count_field.value = word_count;
  }

  function limitText(limitField, limitCount, limitNum)
  {
     if (limitField.value.length > limitNum)
     {
        limitField.value = limitField.value.substring(0, limitNum);
     }
     else
     {
        limitCount.value = limitNum - limitField.value.length;
     }
  }

/*
  // remove leading, trailing, and in-between white space
  // (replaces all whitespace with a single space character)
  function stripAllWhitespace(str)
  {
     return str.replace('/\s\s+/gi', ' ');
  }

  function countWords(this_field, count_field)
  {
    if (trim(this_field.value)=="")
    {
       count_field.value = 0;
    }

    var cleaned_string = stripAllWhitespace(this_field.value);
    var split_string = cleaned_string.split(" ");
    var word_count = split_string.length;

    count_field.value = word_count;
  }
*/

   function replace(string, text, by)
   {
     // Replaces 'text' with 'by' in string
     var strLength = string.length, txtLength = text.length;
     if ((strLength == 0) || (txtLength == 0)) {
       return string;
     }

     var i = string.indexOf(text);
     if ((!i) && (text != string.substring(0,txtLength))) {
       return string;
     }
     if (i == -1) {
       return string;
     }

     var newstr = string.substring(0,i) + by;

     if (i+txtLength < strLength) {
       newstr += replace(string.substring(i+txtLength,strLength),text,by);
     }

     return newstr;
   }

   function validDate(month,day,year)
   {
     var validity=true;

     if (month<=0 || day<=0 || year<=0) {
       validity = false;
     }

     if (validity) {
       // months of April, June, Sept, Nov cannot have 31 days
       if (month == 4 || month == 6 || month == 9 || month == 11) {
         if (day == 31) {
           validity = false;
         }
       }
       else {
         // check for days in February
         if (month == 2) {
           if ((year%4) == 0) {
             if (day > 29) {
               validity = false;
             }
           } else {
             if (day > 28) {
               validity = false;
             }
           }
         }
       }
     }
/*
     var today = new Date();
     var dateEntered = new Date(year, month-1, day);

     if (dateEntered.getTime()>today.getTime())
     {
        validity = false;
     }
*/
     return validity;
   } 

   function validDateEnteredInForm(day, month, year)
   {
     if ((day!="" || month!="" || year!="") &&
          !(day!="" && month!="" && year!=""))
     {
        return false;
     }

     if (day!="" && month!="" && year!="" &&
         !validDate(month, day, year))
     {
        return false;
     }

/*
     var today = new Date();
     var dateEntered = new Date(year, month-1, day);

     if (dateEntered.getTime()>today.getTime())
     {
        return false;
     }
*/
     return true;
   }

   function requiredDateOk(month, day, year)
   {
     if (day=="0" ||  month=="0" || year=="0")
     {
        return false;
     }

     if (!validDate(month, day, year))
     {
        return false;
     }

     return true;
   }
