var fV = {
   addEvent: function(elm, evType, fn, useCapture) {
       // cross-browser event handling for IE5+, NS6 and Mozilla 
        // By Scott Andrew
        if (elm.addEventListener) {
           elm.addEventListener(evType, fn, useCapture);
           return true;
       } else if (elm.attachEvent) { 
           var r = elm.attachEvent('on' + evType, fn);
           return r;
       } else {
       elm['on' + evType] = fn; 
       }
    },
  
   
   
   
   
   
   
   
   
   init: function() {
      var theform = document.getElementById("theform"); 
      fV.addEvent(theform, 'submit', fV.checkValidSubmit, false);
      theform.onsubmit = fV.checkSubmit; // Safari
      theform.validateSubmit = true;
   },
   
   
   
   
   
   
   checkValidSubmit: function(e) {     
     var frm = window.event ? window.event.srcElement : e ? e.target : null;
     if (!frm) return;
     var errText = [];
     var noSubmit=0;
     var ckd;
     var RadAry=new Array();
     var GrpAry=new Array(); 
     
     for (var i = 0; i < frm.elements.length; i++) {
       if(frm.elements[i].type=="radio" && validationSet[frm.elements[i].name]){
         if(validationSet[frm.elements[i].name]['required']){
           RadAry[RadAry.length]=frm.elements[i];
         }
       }else{
         if (frm.elements[i].type=="checkbox" && validationSet[frm.elements[i].name]){
           if(validationSet[frm.elements[i].name]['required']){
             if(frm.elements[i].checked!=true){
               noSubmit=1;
               errText[errText.length] = validationSet[frm.elements[i].name]['error'];
             } 
           }
         }else{
           if (frm.elements[i].type=="select-one" && validationSet[frm.elements[i].name]){
             if(validationSet[frm.elements[i].name]['required']){
               if(frm.elements[i].value=="default"){
                 noSubmit=1;
                 errText[errText.length] = validationSet[frm.elements[i].name]['error'];
               }
             }
           }else{
             if (frm.elements[i].name && validationSet[frm.elements[i].name]) {
               var failedE = fV.handleValidity(frm.elements[i]);

               if (failedE) {
                 noSubmit=1;
                 errText[errText.length] = validationSet[failedE.name]['error'];                  
               }               
             }                              
           }
         }
       }
     }
        
    if(RadAry.length!=0){
      GrpAry=new Array();
      GrpAry[0]=new Array();
      for (i2=0;i2<RadAry.length;i2++){ 
        GrpAry[GrpAry.length-1][GrpAry[GrpAry.length-1].length]=RadAry[i2];
        if (RadAry[i2+1]&&RadAry[i2+1].name!=RadAry[i2].name){ 
          GrpAry[GrpAry.length]=new Array(); 
        }
      }
      for (i3=0;i3<GrpAry.length;i3++){ 
        ckd=1; 
        for (i4=0;i4<GrpAry[i3].length;i4++){ 
          if (GrpAry[i3][i4].checked==true){ 
            ckd=0 
          } 
        } 
        if (ckd){ 
          noSubmit=1;
          errText[errText.length]=validationSet[GrpAry[i3][0].name]['error']; 
        } 
      } 
    }

    if(noSubmit==1){
      if(document.getElementById("errors")){
        var errMsg='Please fix the following errors and resubmit:<br />' + errText.join('<br />');
        document.getElementById("errors").innerHTML=errMsg;
        document.getElementById("errors").style.display="block";
      }else{
        var errMsg='Please fix the following errors and resubmit:\n' + errText.join('\n');
        alert(errMsg);
      }
      frm.submitAllowed = false;
      if (e && e.stopPropagation && e.preventDefault) {
        e.stopPropagation();
        e.preventDefault();
      }
      if (window.event) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
        return false;
      }
    } else {
      frm.submitAllowed = true;
    }
},    
   
  checkSubmit: function() {
    return this.submitAllowed;
  },   
  
    handleValidity: function(field) {
       if (!field.value) {
           if(validationSet[field.name]['required']==true){
               return field;
           }else{
               return null;
           }
       }
       if (field.value==validationSet[field.name]['default']){
           if(validationSet[field.name]['required']==true){
               return field;
           }else{
               return null;
           }
       }
       var re = validationSet[field.name]['regexp'];
       if(re){
         if (!field.value.match(re)) {
            return field;
          } else {
           return null;
         }
      }else{
        return null;
      }
   }
}

fV.addEvent(window, 'load', fV.init, false);