var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function validateForm(frm) {
  var ret=true;
  var elms = frm.elements;
  var it=null; nName=""; nType=""; elmChecked="";
  for (var i=0; i<elms.length; i++) {
    it=elms[i];
    nName=it.nodeName.toUpperCase();
    if (nName=="INPUT") {
      nType=it.type.toUpperCase();
      if (nType =="TEXT" || nType=="PASSWORD") {
        if (!validate(it)) return false;
      } else 
      if (nType=="RADIO" || nType=="CHECKBOX") {
        if (elmChecked.indexOf(it.name)==-1) {
          if (!checkRequiredGroup(document.getElementsByName(it.name))) return false;
          elmChecked+=(it.name+";");
        }        
      }
    } else
    if (nName=="SELECT") {
      if (!validate(it)) return false;
    } else
    if (nName=="TEXTAREA") {
      if (!validate(it)) return false;
    }
  }
  return true;
}

function validate(elm) {
  if (elm.getAttributeNode("mandatory") && elm.getAttribute("mandatory")=="yes") {
    if (!checkRequired(elm)) return false;
  }
  if (elm.getAttributeNode("datatype")) {
    var tp = elm.getAttribute("datatype");
    if (tp=="number") {
      if (!checkNumber(elm)) return false;
    } else if (tp=="email") {
      if (!checkEmail(elm)) return false;
    } else if(tp.indexOf("date")!=-1) {
      if (!checkDate(elm, tp.substring(tp.indexOf("(")+1, tp.indexOf(")")))) return false;
    }
  }
  return true;
}

function checkRequiredGroup(elms) {
  var it=null; isMandatory=false; isChecked=false;
  for (var i=0; i<elms.length; i++) {
    it=elms[i];
    if (it.getAttributeNode("mandatory") && it.getAttribute("mandatory")=="yes") isMandatory=true;
    if (it.checked) isChecked=true;    
  }
  if (isMandatory && !isChecked) {
    alert("The required information is incomplete or contains errors");
    elms[0].focus();
    return false;
  }
  return true;
}

function checkRequired(elm) {
  var ret=true;
  if (elm.value=="") ret=false;
  if (elm.value.replace(/\s*/gi, "")=="") ret=false;
  if (!ret) {
    alert("The required information is incomplete or contains errors");
    elm.focus();
    if (elm.select) elm.select();
  }
  return ret;
}

function checkNumber(elm) {
  if (elm.value=="") return true;
  var ret=true;
  if (isNaN(elm.value)) ret=false;
  if (!ret) {
    alert("The field must be a number");
    elm.focus();
    elm.select();
  }
  return ret;
}

function checkEmail(elm) {
  var ret=true;
  if (elm.value=="") return true;
  if (!elm.value.match(/\w+@\w+/i)) ret=false;
  if (!ret) {
    alert("Please enter a valid email address.");
    elm.focus();
    elm.select();    
  }
  return ret;
}

function checkDate(elm, format) {
  if (elm.value=="") return true;
  if (format=="") format="mm-dd-yyyy";
  var adt = elm.value.split("-");
  var afm = format.split("-");
  var d, m, y;
  var ret=true;
  for (var i=0; i<3; i++) {
    if (isNaN(adt[i])) {ret=false; break;}
    if (afm[i]=="dd") {
      d=parseInt(adt[i], 10);
    } else if(afm[i]=="mm") {
      m=parseInt(adt[i], 10);
    } else if(afm[i]=="yyyy") {
      y=parseInt(adt[i], 10);
    } else {
      ret=false; break;
    }
  }
  if (!ret) {alert("Invalid date value"); elm.focus(); elm.select(); return ret;}
  
  if (m<1 || m>12) {ret=false;} 
  var numDays = DAYS_IN_MONTH[m-1];
  if (m==2 && y%4==0) { numDays=29; }
  if (d<1 || d>numDays) {ret=false;}
  if (y<1) { ret=false; }  
  
  if (!ret) {alert("Invalid date value"); elm.focus(); elm.select();}
  return ret;
}
