// fields is defined in the index html
var submitcount=0;
var alertCount=0;
var prevObj=null;

var objCache={};


//why doesn't Safari remember the return val of blurred?
var blurReturned=false;
var inBlur = false;

function validate(form,e) {
  if (submitcount==0) {
    ++submitcount;
    alertCount = 0;

    var ret = true;

    for (var field in fields) {

      var obj = form.elements[field];

      //do this in this order to avoid a short circuit eval...
      ret = validateField(e,obj,form,field,true) && ret;

//       if(ret == false)
//       {
//         return false;
//       }

    }
    return ret;
  }

  return false;

}

function focusInvalid(obj)
{
  obj.focus();

  if(obj.select)
    obj.select();

  if(submitcount > 0)
    submitcount--;

}

function validateFieldBlur(e,obj,form,field)
{
  var ret = true;

  if (submitcount==0 )
  {
    inBlur = true;

    alertCount = 0;
    ret = validateField(e,obj,form,field)
  }

  blurReturned = ret;

  inBlur = false;
  return ret;
}

function validateFieldFocus(e,obj,form,field)
{
  var ret = true;
  var obj;
  var form;
  var field;
  var fieldObj;
  var prevFieldObj;

  if (submitcount==0 && ! inBlur)
  {
    //for IE sake
    if(!e)
      e=event;

    if(!obj)
    {
      if(e.srcElement)
      {
        obj = e.srcElement;
      }
      else
      {
        obj = e.target;
      }
    }

    if(obj == prevObj)
      return ret;

    if(!form)
      form = obj.form;

    if(!field)
      field = obj.id;
    fieldObj = fields[field];

    if(prevObj)
      prevFieldObj = fields[prevObj.id];
    else
      prevFieldObj = null;

    if( blurReturned == true)
    {

      //if the group has changed
      if(prevFieldObj && prevFieldObj.group && fieldObj.group != prevFieldObj.group)
      {

        var allMembers = fields[prevFieldObj.group].members;

        alertCount = 0;

        for (var memberField in allMembers)
        {
          ret &= validateField(e,getObj(allMembers[memberField]),form, allMembers[memberField]);
        }

        if(ret)
          ret = validateField( e, prevObj, form, prevFieldObj.group);
      }
    }
    blurReturned = true;

    prevObj = obj;

  }


  return ret;
}

function validateField(e,obj,form,field,checkreq)
{
  var error='';
  var br="\n";

  //for IE sake
  if(!e && !obj)
    e=event;

  if(e && !obj)
  {
    if(e.srcElement)
    {
      obj = e.srcElement;
    }
    else
    {
      obj = e.target;
    }
  }

  if(field && obj.id != field && fields[field]['type'] && fields[field]['type'] == 'group')
  {
    if(!form)
      form = getObj('SendForm');
    obj = form.elements[fields[field].select_invalid];
  }

  if(!form)
    form = obj.form;

  //  alert( 'field='+ field +' id='+ obj.id ); /**debug**/

  if(! field )
    field = obj.id;

  if(!checkreq)
    checkreq = false;

  var fieldObj = fields[field];

  if (typeof(obj) == "undefined")
  {
    alert("Undefined " + field);
    obj.className = '';
    return true;
  }

  if(fieldObj.hide_obj)
  {
    var hideObj = getObj(fieldObj.hide_obj);

    if( hideObj.style.display == 'none'
      || hideObj.style.visiblity == 'hidden' )
    {
      obj.value = '';
      obj.className = '';
      return true;
    }
  }

  if(fieldObj.validate)
  {
    if(fieldObj['type'] == 'group')
    {
      if(typeof(fieldObj.validate) == 'function')
      {
        error = fieldObj.validate(fieldObj.members,form);
      }
      else
      {
        alert("Validate is not a function for field: " + field);
        obj.className = '';
        return true;
      }
    }
    else
    {
      if(typeof(fieldObj.validate) == 'function')
      {
        error = fieldObj.validate(obj,form);
      }
      else
      {
        alert("Validate is not a function for field: " + field);
        obj.className = '';
        return true;
      }
    }

  }
  else if (obj.type == "text") {
    if (obj.value == "") {

      if( eval(fieldObj.required))
      {
        switch (field) {
          case 'CMAL':
            error='missingreqverify';
            break;

          default: {
            error='missingreq';
            break;
          }
        }
      }

    }
    else if(fieldObj.number_only)
    {
      if( isNaN(obj.value) )
        error="req_num_only";
    }
    else
    {
      switch(field)
      {
        case 'EMAL':
        case 'EML1':
        case 'EML2':
          if(echeck(obj.value) == false)
            error='bademail';
          break;

        case 'CMAL':
          if(obj.value != form.elements['EMAL'].value)
            error='badCemail';
          break;

        case 'PRNU':
           error = validatePRNU(form.PN1.value, form.PN2.value, form.PN3.value, form.PN4.value);
           break;
      }
    }

  }
  else if (obj.type == "select-one") {
    if( eval(fieldObj.required))
    {
      if (obj.selectedIndex <= -1 || obj.options[obj.selectedIndex].value == "") {
        switch (field) {
          default: {
            error='missingsel';
            break;
          }
        }
      }
    }
  }
  else if (obj[0] && obj[0].type == "radio") {
    var foundchecked=0;
    for (var i=0; i < obj.length; i++) {
      if (obj[i].checked) {
        foundchecked=1;
        break;
      }
    }

    if( eval(fieldObj.required))
    {
      if (!foundchecked) {
        switch (field) {
          default:
            error='missingradio';
            break;
        }
      }
    }
  }

  if (error) {
    //this could be done better!!!
    // window.scroll(0,0);

    var message = '';

    var showAlert = true;

    switch (error) {
      case 'req_prnu_invalid':
      case 'req_srnu_invalid':
      case 'req_num_only':
        message = msg[error];
        break;

      case 'bademail':
        message = msg['req_valid_email'];
        break;

      case 'missingreqverify':
        showAlert = checkreq;
        //no break
      case 'badCemail':
        message = msg['req_verify_email'];
        break;

      case 'month':
      case 'day':
      case 'year':
        message = msg['req_valid_date'] ;
        break;

      case 'missingsel':
        message = msg['req_sel'];
        showAlert = checkreq;
        break;


      case 'ZIP_5_long':
        message = msg['req_zip_5_long'];
        break;

      case 'ZIP_4_long':
        message = msg['req_zip_4_long'];
        break;

      case 'ZIP_num_only':
        message = msg['req_zip_num_only'];
        break;

      case 'bad_CA_postal_length':
        message = msg['req_czip_6_long'];
        break;

      case 'bad_CA_postal_format':
        message = msg['req_czip_format'];
        break;


      case 'missingreq':
        showAlert = checkreq;
        //no break
      default:
        message = msg['req_edt'];
        break;
    }

    if(eval(fieldObj.required))
      message += br + msg['req_gen'];


    obj.className = 'INVALID';

    if( showAlert )
    {
      if(alertCount == 0)
      {
        alertCount++;
        alert(message);

        if(getObj(obj.id) != null)
        {
          if(error == 'missingradio')
          {
            setTimeout("focusInvalid(getObj('"+obj.id+"')[0]);",2);
          }
          else
          {
            setTimeout("focusInvalid(getObj('"+obj.id+"'));",2);
          }
        }
      }

    }

    return false;
  }

  obj.className = '';
  return true;
}


function US_Good(fieldName, obj){
  /*
  Called from Tom's "Validate (form)" function
  if (fields[i] == "ZIPC") error = US_Good(fields[i],obj);
  if (fields[i] == "ZIP4") error = US_Good(fields[i],obj);
  */
  error = '';
  if (fieldName == "ZIPC"){
    if (obj.value=='') {
      return "missingreq";
    }else if (obj.value.length!=5) {
      error = "ZIP_5_long";
    }else if (isNaN(obj.value) ) {
      error = "ZIP_num_only";
    }
  }
  if (fieldName == "ZIP4"){
    if (obj.value=='') {
      return;
    }else if (obj.value.length!=4 && obj.value.length!=0) {
      error = "ZIP_4_long";
    }else if (isNaN(obj.value) ) {
      error = "ZIP_num_only";
    }
  }
  return error;
}

function CA_Good(obj){
  var str = obj.value;

  switch(str.length)
  {
    case 0:
      return "missingreq";
    case 6:
    case 7:
      break;
    default:
      return "bad_CA_postal_format";
  }

  str=str.toUpperCase();        // in case of lowercase characters

  obj.value = str;

  var postalRgx = /^[A-HJ-NP-Z]\d[A-HJ-NP-Z]\s?\d[A-HJ-NP-Z]\d$/;

  if(!postalRgx.test(str))
    return "bad_CA_postal_format";

  return;
}



function blockShow(id, show) {
  var obj = getObj(id);

  if(show == true)
  {
    obj.style.visibility = 'visible';
    obj.style.display = '';
  }
  else
  {
    obj.style.visibility = 'hidden';
    obj.style.display = 'none';
  }
}

function getObj(name) {
    if(objCache[name])
      return objCache[name];

	if (document.getElementById) {
	      objCache[name] = document.getElementById(name);
	}
	else if (document.all) {
	      objCache[name] = document.all[name];
	}
	else if (document.layers){
          objCache[name] = document.layers[name];
	}

    return objCache[name];
}

function initPage()
{
  getObj('JS_ENABLED').value=1;

  for (var field in fields) {
    var fieldObj = fields[field];

    var obj = getObj(field);

    if(obj)
    {
      if(fieldObj.onchange)
      {
        obj.onchange=fieldObj.onchange;
        fieldObj.onchange();
      }

      obj.onblur=function(event){return validateFieldBlur(event,this,this.form,this.id)};
      obj.onfocus=function(event){return validateFieldFocus(event,this,this.form,this.id)};
    }

  }

}

initPage();


