  function calculateAge(day, month, year)
  { // Calculates the age, given a date
    var thisDate=new Date();
    var thisYear=thisDate.getFullYear();
    var thisMonth=Number(thisDate.getMonth()) + 1;
    var thisDay=Number(thisDate.getDate());
    month=Number(month);
    day=Number(day);
    var age=thisYear-year;
    if (thisMonth>month) {return age;}
    if (thisMonth<month) {return age-1;}
    if (thisDay>=day) {return age;}
    else {return age-1;}
  }

  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 checkForm(f)
  {
//  alert ("Here in checkForm");
//  alert ("Name=" + f.name);

/*   To test the chosen option in a Select statement:
              var opt=f.selectname.selectedIndex;
                  var field=f.selectname.options[opt].text;

 (Can use value instead of text if the option statements have a value clause)
*/
    if (f.buttonPressed.value=="Cancel") {return true;}
    if (f.buttonPressed.value=="Delete")
    {
      if (confirm("Are you really sure you want to delete this record?"))
      {return true;}
      else {return false;}
    }
    var errMsg="";
    switch (f.name)
    {
      case "contactForm":
        // Validation checks for form tableNameForm go here

        if (empty(f.contactName.value))
        {
           if (errMsg=="") {f.contactName.select();}
           errMsg+="Please enter your name\n";
        }

        if (empty(f.email.value))
        {
          if (errMsg=="") {f.email.select();}
          errMsg+="Please enter your Email address\n";
        }
        else
        {
          if (!checkEmail(f.email.value))
          {
            if (errMsg=="") {f.email.select();}
            errMsg+="That Email address is invalid\n";
          }
        }

        if (empty(f.comments.value))
        {
          if (!f.design.checked && !f.registration.checked && !f.hosting.checked && !f.database.checked && !f.ecommerce.checked)
          {
            if (errMsg=="") {f.comments.select();}
            errMsg+="Please enter details of your enquiry, or indicate your area(s) of interest\n";
          }
        }
      break;

      case "siteTypeForm":
        if (empty(f.siteType.value))
        {
          if (errMsg=="") {f.siteType.focus();}
          errMsg+="Please enter the Site Type\n";
        }
       break;

      case "clientSiteForm":
        if (empty(f.clientName.value))
        {
          if (errMsg=="") {f.clientName.focus();}
          errMsg+="Please enter the Client Name\n";
        }

        if (empty(f.webAddress.value))
        {
          if (errMsg=="") {f.webAddress.focus();}
          errMsg+="Please enter the Website Address\n";
        }

        if (empty(f.description.value))
        {
          if (errMsg=="") {f.description.focus();}
          errMsg+="Please enter the Description\n";
        }

        /*
        if (empty(f.field09.value))
        {
          if (errMsg=="") {f.field09.focus();}
          errMsg+="Please enter your field09\n";
        }

        if (empty(f.field10.value))
        {
          if (errMsg=="") {f.field10.focus();}
          errMsg+="Please enter your field10\n";
        }
        */
      break;


      default:
      return true;
    }

    if (errMsg!="")
    {
      alert(errMsg);
      return false;
    }
    else
    {
      var boxCount=false;
      for (var i=0; i<f.clientSiteBoxCount.value; i++)
      {
        var siteTypeID = eval("f.clientSite" + i + ".checked");
        if (siteTypeID) {boxCount=true;}
      }

      if (!boxCount)
      {
        if (confirm ("There are no Site Types selected. OK?"))  {return true;}
        else {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
    // NB this does not check anything beyond the basic address - ie no parameters
    var pattern=/^(http:\/\/)?[a-zA-Z0-9]+([.|_|-][a-zA-Z0-9]+)*[.]{1}[a-zA-Z0-9]{2,3}/;
    var result=URL.match(pattern);
    if (result==null)
      {
       return false;
      }
      else  return true;
  }

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

  function formatDecimal(number)
  { // This takes a number and converts it to a string with 2 decimal places. If it has more than
    // 2 places to start with, it will not be changed
    var stringValue=String(number);
    var point=stringValue.search(/\./);
    if (point==-1) {stringValue+=".00";}
    else
    {
      if (point==stringValue.length-1) {stringValue+="00";}
      else
      {
        if (point==stringValue.length-2) {stringValue+="0";}
      }
    }
    return stringValue;
  }

  function formatEmail(name, site, suffix)
  {
     if (empty(suffix)) {suffix="co.uk";}

     var emailAddress=name + "@" + site + "." + suffix;
     document.write ("<a href='mailto:" + emailAddress + "'>" + emailAddress + "</a>\n");
  }

  function generateRandomNo(x, y)
  { // This function generates a random integer between x & y
    var range = y - x + 1;
    return Math.floor(Math.random() * range) + x;
  }

  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;
          }
    }
    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;
      var strPlaces=String(decPlaces);
      var result=strPlaces.match(pattern);
      if (result)  {dPlaces=decPlaces;}
      pattern=eval("/^[0-9]+([.][0-9]{1," + dPlaces + "})?$/");
    }
    var result=number.match(pattern);
    return result;
  }


  function makeTime(f, timeName)
  { // Returns a string containng the time in hh:mm form
    var opt=eval("f." + timeName + "Hour.selectedIndex");
        var hour=eval("f." + timeName + "Hour.options[opt].text");
        opt=eval("f." + timeName + "AmPm.selectedIndex");
        var amPm=eval("f." + timeName + "AmPm.options[opt].text");
        opt=eval("f." + timeName + "Minutes.selectedIndex");
        var minutes=eval("f." + timeName + "Minutes.options[opt].text");
        if (amPm=="pm" && hour!=12) {hour=Number(hour)+12;}
        else
        {
          if (hour<10) {hour="0"+hour;}
        }
        if (minutes<10) {minutes="0" + minutes;}
        return hour+":"+minutes;
  }


  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, location=yes, menubar=yes, resizable=yes, status=yes, toolbar=yes";
    var x=window.open(url, "newWindow", paras);
    x.window.focus();
  }

  function validateDate(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].value");
        opt=eval("f." + dateName + "Year.selectedIndex");
        var year=eval("f." + dateName + "Year.options[opt].text");
        return checkDate(day, month, year);
  }

  function validateSlashDate(ddmmyy)
  {
    var dateArray=ddmmyy.split("/");
        var d=dateArray[0];
        var m=dateArray[1];
        var y=dateArray[2];
        if (empty(d) || empty(m) || empty(y)) {return false;}
        var valid=checkDate(d, m, y);
        return valid;
  }


  var ns=false;
  var ns4=false;
  var ie=false;
  if (navigator.appName.indexOf("Netscape") != -1)
  {
    ns=true;
    if  (navigator.appVersion.indexOf("4.") != -1) {ns4=true;}
  }
  else
  {
    var ns=false;
    if (navigator.appName.indexOf("Microsoft Internet Explorer") != -1)  {ie=true;}
  }

  if (document.layers)
  {
    setLeft="e.left";
    setTop="e.top";
  }
  else
  {
    setLeft="e.style.left";
    setTop="e.style.top";
  }


  function hideDiv(divName)
  {
    var e=getElement(divName);
    if (!ns4)
    {
      e.style.left="-1000px";
      e.style.top="-1000px";
      e.style.zIndex="-5";
    }
    else
    {
         moving.left="-1000px";
         moving.top="-1000px";
         moving.zIndex="-5";
    }
  }

  function displayDiv(movingDiv, moverDiv)
    {
      var moving=getElement(movingDiv);
      var mover=getElement(moverDiv);
      if (!ns4)
      {
         moving.style.left=100;
         moving.style.top=100;
         moving.style.zIndex="5";
      }
      else
      {
         moving.left=0;
         moving.top=0;
         moving.zIndex="5";
      }

    }

    function setPointer(e)
    {
      if (ie) {e.style.cursor="hand";}  else {e.style.cursor="pointer";}
    }
