// this module does simple form validation
// to use it, you must add a setProperties statement for each element you want validated

function checkBrowser(){
  this.ver=navigator.appVersion;
  this.dom=document.getElementById?1:0;
  this.bw = this.dom;
  return this
}

// get the browser information
var vbw = new checkBrowser();


function ieKeyHandler() {
  if (window.event.keyCode == 13) {
    validateform( vbw.form );
  }        
//  document.write("b");
}

function nsKeyHandler( e ) {
  if (e.which == 13) {
    validateform( vbw.form );
  }      
}

// this doesn't work if there is more than one form
function initKeyHandler( form ) {
  if (vbw.ns4) {
    window.captureEvents(Event.KEYDOWN);
    window.onKeyDown = nsKeyHandler;
  }
  else {
    form.onKeyDown = "ieKeyHandler()";
//    document.write("a");
  }
  vbw.form = form;
}

function setProperties( element, label, required, datatype ) {
  element.label = label;
  element.required = required;
  element.datatype = datatype;
}

function showError( element, message ) {
  alert( message + element.label );
  element.focus();
  if (element.type != "select") element.select();
}


function validateForm( form ) {
  var emailRegExp = new RegExp( "^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_-])+(\\.[a-zA-Z0-9_-])+" );
  var phoneRegExp = new RegExp( "^([0-9 ()-])+$" );
  var auPhoneRegExp = new RegExp( "^\d{2} \d{4} \d{4}$" );
  var auMobileRegExp = new RegExp( "^\d{4} \d{3} \d{3}$" );
  
  // don't validate if browser not up to date
  if (!vbw.bw) {
//    form.submit();
    return true;
  }
  
  // do any special validations first
  if (typeof(form.specialvalidation) != "undefined") {
    if (!form.specialvalidation()) {
      return false;
    }
  }

  // validate form
  for (var iElement=0; iElement<form.length; iElement++ ) {
    element = form.elements[iElement];

    // check that it needs to be validated
    if ( typeof(element.label) == "undefined") continue;

    // in case of undefined
//    try {
    
    // input is required
    if ((element.required) && (element.value=="")) {
      showError( element, "You must enter a value for " );
      return false;
    }

    // check the type
    switch (element.datatype) {
      case "string":
      case "":
        break;
        
      case "email":
        if ((element.value != "") && !emailRegExp.test( element.value )) {
          showError( element, "You must enter a valid email address for " );
          return false;
        }
        break;
        
      case "phone":
        if ((element.value != "") && !phoneRegExp.test( element.value )) {
          showError( element, "You must enter a valid phone number for " );
          return false;
        }
        break;

      case "auphone":
        if ((element.value != "") && !auPhoneRegExp.test( element.value )) {
          showError( element, "You must enter a phone number in the format \"99 9999 9999\" for " );
          return false;
        }
        break;

      case "aumobile":
        if ((element.value != "") && !auMobileRegExp.test( element.value )) {
          showError( element, "You must enter a mobile phone number in the format \"9999 999 999\" for " );
          return false;
        }
        break;

      case "integer":
        if (isNaN(parseInt(element.value))) {
          showError( element, "You must enter a valid integer value for " );
          return false;
        }
        break;
      
      case "select":
        if (element.value==0) {
          showError( element, "You must select a value for " );
          return false;
        }
        break;
    }
//    }
//    catch (e) {
      // value undefined
//      continue;
//    }

  } // data validation
  
  // data conversion
  for (var iElement=0; iElement<form.length; iElement++ ) {
    element = form.elements[iElement];

    // check that it needs to be validated
    if (typeof(element.label) == "undefined") continue;
   
    // check the type
    switch (element.datatype) {
      case "date":
        //alert(element.name);
        element.value = eval("form."+element.name+"year.value") + "-" + ((eval("form."+element.name+"month.value")<10)?"0":"") + eval("form."+element.name+"month.value") + "-" + ((eval("form."+element.name+"day.value")<10)?"0":"") + eval("form."+element.name+"day.value");
        break;
      
      case "yesno":
        //alert(element.checked);
        
        // for an email form convert to yes/no responses
        // if unchecked, create a 0 value
        if (element.checked) {
          if ( typeof(form.ismailform) != "undefined" )
            element.value="Yes";
        } else {
          if ( typeof(form.ismailform) != "undefined" )
            element.value="No";
          else
            element.value=0;
          element.checked=true;
        }
      
    }
    
  } // data conversion
 
  // if got here, everything checks out so submit it
  //form.submit();
  return true;
}

