  function ccValidate(f)
  {   // Validates the credit card form used in classCredit
    var errMessage="";
        var errFound=false;

    if (f.forename.value=="" || f.surname.value=="" || isblank(f.forename.value) || isblank(f.surname.value))
        {
      errMessage+="Please enter your Name\n";
          if (!errFound) {f.forename.focus(); errFound=true;}
    }

    e=f.cardNumber;
    if (e.value=="" || e.value==null || isblank(e.value))
        {
      errMessage+="Please enter your Card number\n";
          if (!errFound) {f.cardNumber.focus(); errFound=true;}
    }

    else {
          var opt=f.cardType.selectedIndex; // Get index of selected option
          var ccType=f.cardType[opt].text;  // Retrieve displayed text of selected option
          var z=IsCCNumberValid(e.value, ccType);

      if (z==0)
          {
            errMessage+="The Card number is invalid for that type\n";
            if (!errFound) {f.cardNumber.select(); errFound=true;}
          }

    }

        if (f.cardEndYear.value<f.cardStartYear.value ||(f.cardEndYear.value==f.cardStartYear.value && f.cardEndMonth.value<=f.cardStartMonth.value))
        {
          errMessage+="Card End date must be later than card Start date\n";
          if (!errFound) {f.cardEndMonth.focus(); errFound=true;}
        }

    if (errMessage!="")
        {
     alert (errMessage);
     return false;
    }
        else return true;
  }

  function IsCCNumberValid(ccNumber, cardType)
  { // Validates a credit card number for Mastercard, Visa, Amex & Diners Club
        ccNumber=ccNumber.replace(/ /g,"");  // Remove any blanks before validating
    if (ccNumber=="M1111") {return 1;}  // Value for testing
    var retval=0;
    if(cardType!=null)
    {
           if(cardType == "Mastercard"){retval = isMCRD(ccNumber);}
       else if(cardType == "Visa"){retval = isVISA(ccNumber);}
       else if(cardType == "American Express"){retval = isAMEX(ccNumber);}
       else if(cardType == "Diners Club"){retval = isDCCB(ccNumber);}
    }
    else
    {
       if(!retval){retval = isMCRD(ccNumber);}
       if(!retval){retval = isVISA(ccNumber);}
       if(!retval){retval = isAMEX(ccNumber);}
       if(!retval){retval = isDCCB(ccNumber);}
    }
    return retval;
  }

  function isMCRD(ccNum)
  { // Validates a Mastercard number
    var preFix = ccNum.substr( 0, 2);
    if(preFix == "51" ||
       preFix == "52" ||
       preFix == "53" ||
       preFix == "54" ||
       preFix == "55")
    {
       if(ccNum.length == 16){return  modTen(ccNum);}
    }
    else
    {
      return 0;
    }
  }

  function isVISA(ccNum)
  { // Validates a Visa number
        var preFix = ccNum.substr(0, 1);
    if(preFix == "4"){
       if(ccNum.length == 13 || ccNum.length == 16){return  modTen(ccNum);}
        }
    else
    {
       return 0;
    }
  }

  function isAMEX(ccNum)
  { // Validates an Amex number
    var preFix = ccNum.substr(0, 2);
    if(preFix == "34" || preFix == "37"){
       if(ccNum.length == 15){return  modTen(ccNum);}
           else {return 0;}
        }
    else
    {
       return 0;
    }
  }

  function isDCCB(ccNum)
  { // Validates a Diners Club number
        preFix = ccNum.substr(0, 3);
    if(preFix == "300" ||
       preFix == "301" ||
       preFix == "302" ||
       preFix == "303" ||
       preFix == "304" ||
       preFix == "305")
    {
       if(ccNum.length == 14){return  modTen(ccNum);}
       else {return 0;}
    }
        preFix = ccNum.substr(0, 2);
    if(preFix == "36" || preFix == "38"){
       if(ccNum.length == 14){
           return  modTen(ccNum);
           }
           else {return 0;}
        }
    else
    {
       return 0;
    }
  }


  function modTen(ccNum)
  { // Modulus 10 calculator used by all credit cards
        var numLen = ccNum.length;
    var tot=0;
    for(var x = numLen; x > 0; x-=2){
          var a=ccNum.substr(x - 1, 1)-0;  // Extract alternate digits as numbers
          tot=tot+a; // and add to the checksum
        }
    for(x = numLen - 1; x > 0; x-=2)
    {
       var y = (ccNum.substr(x - 1, 1)-0) * 2;  // Extract the other alternate digits as numbers, double
                                                    // and add each digit of the result to the checksum
       var z=y+"";
       if(z.length == '1'){tot+=y;}
       if(z.length == '2'){tot=tot+1; tot=tot+y-10; }
    }
        tot=tot+"";
    if(tot.substr(tot.length - 1, 1) == '0'){return 1;}
    else{return 0;}
  }


  function checkDate(d,m,y)
  { // Checks for valid date in range 1/1/1900 to 31/12/2099
    if (!isNumeric(d) || !isNumeric(m) || !isNumeric(y)) {return false;}
        if (m<1 || m>12) {return false;}
        if (y<1900 || y>2099) {return false;}
    var daysInMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
        if (y%1000==0 ||(y%4==0 && y%100!=0)) {daysInMonth[1]=29;}
        if (d<1 || d>daysInMonth[m-1]) {return false;}
        return true;
  }


  function checkEmail(email)
  { // this checks for a valid format email address
    var pattern=/^[a-zA-Z0-9]+([.|_|-][a-zA-Z0-9]+)?[@]{1}[a-zA-Z0-9]+([.|_|-][a-zA-Z0-9]+)?[.]{1}[a-zA-Z0-9]{2,3}$/;
    var result=email.match(pattern);
    if (result==null)
      {
       return false;
      }
      else  return true;
  }

  function checkPass(pass)
  { // This checks password is 6-12 chars, starts with a letter and contains
    // only alphanumerics

        if (pass.length<6 || pass.length>12) {return false;}
        var pattern=/^[a-zA-Z][a-zA-Z0-9]{0,11}$/;
    var result=pass.match(pattern);
    if (result==null)
      {
       return false;
      }
      else  return true;
  }

  function checkPhoneNo(phone)
  { // This checks a phone number contains at least 11 digits. It
    // ignores blanks and hyphens
        var p=phone.replace(/ |-/g,""); // Remove blanks or hyphens
        if (p.length<11 || !isNumeric(p)) {return false;}
        else {return true;}
  }

  function checkTime(h,m)
  {
    if (!isNumeric(h) || !isNumeric(m)) {return false;}
        if (h<0 || h>23) {return false;}
        if (m<0 || m>59) {return false;}
        return true;
  }

  function checkURL(URL)
  { // this checks for a valid format URL
        var patternFormat=/^(http\:\/\/)?(www\.)?[a-zA-Z0-9]+([.|_|-][a-zA-Z0-9]+)?[.]{1}[a-zA-Z0-9]{2,3}$/;
    var result=URL.match(patternFormat);
    if (result==null)
      {
       return false;
      }
      else  return true;
  }

  function compareDates(f, date1Name, date2Name)
  { // This function validates the two dates and if both are valid it compares them.
    // It returns results as follows:
    // -1  One or both of the dates is invalid
    // 0 The dates are equal
    // 1 The first date is later than the second
    // 2 The second date is later than the first
     var opt=eval("f." + date1Name + "Day.selectedIndex");
     var day=eval("f." + date1Name + "Day.options[opt].text");
     opt=eval("f." + date1Name + "Month.selectedIndex");
     var month=eval("f." + date1Name + "Month.options[opt].value");
     opt=eval("f." + date1Name + "Year.selectedIndex");
     var year=eval("f." + date1Name + "Year.options[opt].text");

     if (!checkDate(day, month, year)) {return -1;}
     var tempMonth=month-1;    // Date expects an offset Month
     var firstDate=new Date(year, tempMonth, day);

     var opt=eval("f." + date2Name + "Day.selectedIndex");
     var day=eval("f." + date2Name + "Day.options[opt].text");
     opt=eval("f." + date2Name + "Month.selectedIndex");
     var month=eval("f." + date2Name + "Month.options[opt].value");
     opt=eval("f." + date2Name + "Year.selectedIndex");
     var year=eval("f." + date2Name + "Year.options[opt].text");

     if (!checkDate(day, month, year)) {return -1;}
     var tempMonth=month-1;    // Date expects an offset Month
     var secondDate=new Date(year, tempMonth, day);
     if (firstDate.getTime()==secondDate.getTime())  {return 0;}
     if (firstDate.getTime()>secondDate.getTime())  {return 1;}
     return 2;
  }

  function dateEntered (f, dateName)
  {
     var opt=eval("f." + dateName + "Day.selectedIndex");
     var day=eval("f." + dateName + "Day.options[opt].text");
     opt=eval("f." + dateName + "Month.selectedIndex");
     var month=eval("f." + dateName + "Month.options[opt].text");
     opt=eval("f." + dateName + "Year.selectedIndex");
     var year=eval("f." + dateName + "Year.options[opt].text");

     if (day == "DD" && month == "MM" && year == "YYYY") {return false;}
     else {return true}
  }

  function empty(s)
  {
    if (s=="" || s==null || isblank(s)) {return true;}
        else {return false;}
  }

  function getElement(id)
  {
    if (document.getElementById) {var elmt=document.getElementById(id);}
    else
    {
      if (document.all) {var elmt=document.all[id];}
          else
          {
            if (document.layers) {var elmt=document.layers[id];}
            else elmt=false;
          }
    }
    //if (!elmt) {alert (id + " not found");} else  {alert (id + " found");}
    return elmt;
  }

  function isblank (s)
  { // Returns false if field contains any non-blank chars other than new line
    for (var i=0; i<s.length; i++) {
      var c=s.charAt(i);
          if (c!=" " && c!="\n" && c!="") {
          return false;
          }
    }
    return true;
  }


  function isNumeric (number, decPlaces)
  { // This function checks for numerics with a maximum of decPlaces decimal places
    var pattern="/^[0-9]+$/";
    if (decPlaces!='0')
    { // Decimal places allowed
      var dPlaces=2;
      if (decPlaces > 0 && decPlaces <= 9) {dPlaces=decPlaces;}
      pattern=eval("/^([-])?[0-9]+([.][0-9]{1," + dPlaces + "})?$/");
    }
    var result=number.match(pattern);
    return result;
  }

  function newWindow(url, w, h)
  { // Opens URL w in a new window positioned top left and ensures it has the focus
    if (!w) {var wide=400;} else {wide=w;}
        if (!h) {var high=450;} else {high=h;}
        var paras="width=" + wide + ",height=" + high + "align=center scrollbars=yes, left=0, top=0, screenx=0, screeny=0, resizable";
    var x=window.open(url, "newWindow", paras);
        x.window.focus();
  }

  function setRelatedSelect(mainSelectID, dependSelectID, clonedOptions, sel2Default)
  {
    var tempOptions = eval(clonedOptions);
    var sel1 = getElement(mainSelectID);
    var sel2 = getElement(dependSelectID);
    if (sel1.options[sel1.selectedIndex].value == 0)  {sel2.disabled = true;} else {sel2.disabled = false;}
    while (sel2.options.length) {sel2.remove(0);}
    // Create regular expression objects for "select" and the value of the selected option of the main select box as class names
    var pattern1 = /( |^)(select)( |$)/;
    var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)");
    // Iterate through all cloned options
    var optCount = 0;
    for (var i = 0; i < tempOptions.length; i++)
    {
      // If the classname of a cloned option either equals "select" or equals the value of the selected option of the main select box
      if (sel1.options[sel1.selectedIndex].value == 0 || tempOptions[i].className.match(pattern2) || tempOptions[i].className=="any")
      {
        // Clone the option from the hidden option pool and append it to the dynamic select box
        sel2.appendChild(tempOptions[i].cloneNode(true));

        if (sel2Default)
        {  // If a default has been provided, ensure the option is still selected
           if (tempOptions[i].value == sel2Default)
           {
             sel2.options[optCount].selected = true;
           }
        }
        optCount++;
      }
    }
  }

  function validateDate(f, dateName, future)
  {
     var opt=eval("f." + dateName + "Day.selectedIndex");
     var day=eval("f." + dateName + "Day.options[opt].text");
     opt=eval("f." + dateName + "Month.selectedIndex");
     var month=eval("f." + dateName + "Month.options[opt].value");
     opt=eval("f." + dateName + "Year.selectedIndex");
     var year=eval("f." + dateName + "Year.options[opt].text");
     if (!checkDate(day, month, year)) {return false;}
     if (future!=null)
     {
       var tempMonth=month-1;    // Date expects an offset Month
       var theDate=new Date(year, tempMonth, day);
       var today=new Date();
       today.setHours(0,0,0,0);
       if (future=="Future" )
       {
         if (theDate.getTime()<today.getTime()) {return false;} else {return true;}
       }
       else
       {
         if (theDate.getTime()>today.getTime()) {return false;} else {return true;}
       }
     }
     else {return true;}
  }