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

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

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

    for (var field in fields) {

      var obj = form.elements[field];

      var ret = validateField(e,obj,form,field,true);

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

  return false;
  
}

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

  if(obj.select)
    obj.select();
  
  if(submitcount > 0)
    submitcount--;

}

function validateFieldBlur(e)
{
  var ret = true;
  
  if (submitcount==0 )
  {
    inBlur = true;
    
    ret = validateField(e);
  }

  blurReturned = ret;

  inBlur = false;
  return ret;
}

function validateFieldFocus(e)
{
  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(e.srcElement)
    {
      obj = e.srcElement;
    }
    else
    {
      obj = e.target;
    }

    if(obj == prevObj)
      return ret;
    

    form = obj.form;
    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;

        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)
    e=event;

  if(!obj)
  {
    if(e.srcElement)
    {
      obj = e.srcElement;
    }
    else
    {
      obj = e.target;
    }
  }
  
  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);
    return true;
  }

  if(fieldObj.hide_obj)
  {
    var hideObj = getObj(fieldObj.hide_obj);
         
    if( hideObj.style.display == 'none'
      || hideObj.style.visiblity == 'hidden' )
    {
      obj.value = '';
      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);
        return true;
      }
    }
    else
    {
      if(typeof(fieldObj.validate) == 'function')
      {
        error = fieldObj.validate(obj,form);
      }
      else
      {
        alert("Validate is not a function for field: " + field);
        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 = '';
        
    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':
      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'];
        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':
      default:
        message = msg['req_edt'];
        break;
    }

    if(eval(fieldObj.required))
      message += br + msg['req_gen'];
        
    if( checkreq || (error != 'missingreq'
                    && error != 'missingsel'
                    && error != 'missingreqverify'))
    {
      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;
  }
  
  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 (document.getElementById) {
	      return document.getElementById(name);
	}
	else if (document.all) {
	      return document.all[name];
	}
	else if (document.layers){
      return document.layers[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=validateFieldBlur;
      obj.onfocus=validateFieldFocus;
    }
    
  }

}

initPage();


