var AutoForm = Class.create();
AutoForm.prototype =
{

  initialize : function() {
    this.initializeEvents();
  },

  initializeEvents : function() {
	if ( $('submit') ) {
      Event.observe(document, "keypress", this.validateOnReturnKey.bindAsEventListener(this));
      Event.observe("submit", "click", this.validateFields.bindAsEventListener(this));
    }

    /* Load vehicle options via ajax */
    for (var i=1; 5 > i; i++) {
      if ( $("vehicle" + i + "_year") ) {
	    if ( $("vehicle" + i + "_make").selectedIndex == '') $("vehicle" + i + "_make").disabled = true;
	    if ( $("vehicle" + i + "_model").selectedIndex == '') $("vehicle" + i + "_model").disabled = true;
        if ( $("vehicle" + i + "_submodel").selectedIndex == '') $("vehicle" + i + "_submodel").disabled = true;

        $("vehicle" + i + "_year").observe("change", this.onChangeVehicleYear.bindAsEventListener(this));
        $("vehicle" + i + "_make").observe("change", this.onChangeVehicleMake.bindAsEventListener(this));
        $("vehicle" + i + "_model").observe("change", this.onChangeVehicleModel.bindAsEventListener(this));
      }
    }

    if ( $("violation_wrapper") ) {
      this.addViolationEventHandlers(1);
      this.addViolationEventHandlers(2);
      this.addViolationEventHandlers(3);
      this.addViolationEventHandlers(4);
    }

    if ( $('add-violation') ) {
      $('add-violation').observe('click', this.onAddViolation.bindAsEventListener(this));
      var deletes = $$('.delete-violation');
      for (var i=0; i < deletes.length; i++) {
        Event.observe(deletes[i], 'click', this.onDeleteViolation.bindAsEventListener(this));
      };
    }

    if ($('step4')) {
	  // using .up() to add the click event to the whole lable tag instead of just the input
      $('add-person').up().observe('click', this.onAddPersonCheck.bindAsEventListener(this));
      $('add-vehicle').up().observe('click', this.onAddVehicleCheck.bindAsEventListener(this));
      for (var i=2;i<=4;i++) {
	    // add drivers to primary driver select
        if ($('vehicle'+i+'_primary_driver_id')) $('vehicle'+i+'_primary_driver_id').observe('focus', this.onFocusPrimaryDriver.bindAsEventListener(this));

        // add checkbox events
        $('vehicle'+i+'_add').up().observe('click', this.onClickVehicle.bindAsEventListener(this));
        $('insured'+i+'_add').up().observe('click', this.onClickPerson.bindAsEventListener(this));

        // update violation type when description is changed
        $('insured'+i+'_violation1').observe('change', function(e) {
		    var el             = Event.element(e);
		    var num            = el.id.match(/(\d)/)[1];
		    var violation_type = el.getElementsByTagName('option')[el.selectedIndex].parentNode.label;
		    if ( typeof violation_type == 'undefined' ) violation_type = '';
		    $(el.id + '_type').value = violation_type;
        });
      }
    }

    // event listeners for the coverage_amount cells
    if ($('step3')) {
      var tds = $$('#coverage td');
      for (var i=0; i<tds.length; i++)
        tds[i].observe('click', this.onCoverageClick.bindAsEventListener(this));
    }

    // default text for text inputs
    $$(".tfield").each( this.addDefaultValue );
    $$(".tfield").each(function(el) {
      el.observe('focus', function(event) {
        var el = Event.element(event);
        if ($F(el) == el.title) {
          el.value = '';
          el.removeClassName("default-text");
        }
      });

      el.observe('blur', function(event) {
        var el = Event.element(event);
        if ($F(el) == '') {
          el.value = el.title;
          el.addClassName("default-text");
        }
      });
    });

  },

  addDefaultValue: function(el) {
    if ($F(el) == '') {
      el.value = el.title;
      el.addClassName("default-text");
    }
  },

  removeDefaultValue: function(el) {
    if ($F(el) == el.title) {
      el.value = '';
      el.removeClassName("default-text");
    }
  },

  validateFields: function(e){
    $$(".tfield").each( this.removeDefaultValue );
    this.form_elements = $$(".validation-advice");
    var form           = new Validator(this.form_elements);
    this.is_valid      = form.isFormValid();
    
    if(!this.is_valid) Event.stop(e);
  },

  validateOnReturnKey: function(e){
    if(e.keyCode == Event.KEY_RETURN){
      this.validateFields(e);
      Event.stop(e);
    }
  },
  
  onChangeCurrentlyInsured : function() {
    if ( $("has_existing_carrier_1").checked ) {
      $$(".existing-carrier").invoke("show");
      $("existing_carrier_error").addClassName("validate-selected");
      $("policy_expires_on_error").addClassName("validate-policy");
      $("carrier_years_months_error").addClassName("validate-all-selection");
      $("has_existing_carrier_error").removeClassName("validate-one-selected");
      fadeOut("has_existing_carrier_error");
    } else {
      $$(".existing-carrier").invoke("hide");
      $("has_existing_carrier_error").addClassName("validate-one-selected");
      $("existing_carrier_error").removeClassName("validate-selected");
      $("policy_expires_on_error").removeClassName("validate-policy");
      $("carrier_years_months_error").removeClassName("validate-all-selection");
      
      $("has_existing_carrier_error").hide();
      $("existing_carrier_error").hide();
      $("policy_expires_on_error").hide();
      $("carrier_years_months_error").hide();
      
      $("existing_carrier").selectedIndex       = 0;
      $("policy_expires_mm_on").selectedIndex   = 0;
      $("policy_expires_dd_on").selectedIndex   = 0;
      $("policy_expires_yyyy_on").selectedIndex = 0;
      $("carrier_years").selectedIndex          = 0;
      $("carrier_months").selectedIndex         = 0;
    }
    //hide error msg when no radio is clicked 
    if ( $("has_existing_carrier_0").checked ) { fadeOut("has_existing_carrier_error"); }
  },

  onChangeVehicleYear : function(e) {
    var el = Event.element(e);
	var num = el.id.match(/(\d)/)[1];
    this.disableAndResetSelect("vehicle" + num + "_model");
    this.disableAndResetSelect("vehicle" + num + "_submodel");
    $("vehicle" + num + "_model_error").hide();
    $("vehicle" + num + "_submodel_error").hide();

    var el = Event.element(e);
    if (el.selectedIndex == 0) {
      this.disableAndResetSelect("vehicle" + num + "_make");
      $("vehicle" + num + "_make_error").hide();
    } else {
      $('vehicle' + num + '_make').disabled = 'disabled';
      this.loadVehicleOptions("vehicles_polk.php?year=" + $F("vehicle" + num + "_year"), "vehicle" + num + "_make", "Select Make...");
      fadeOut("vehicle" + num + "_year_error");
    }
  },

  onChangeVehicleMake : function(e) {
    var el = Event.element(e);
	var num = el.id.match(/(\d)/)[1];
    this.disableAndResetSelect("vehicle" + num + "_submodel");
    $("vehicle" + num + "_submodel_error").hide();
    $("vehicle" + num + "_model_error").hide();

    if (el.selectedIndex == 0) {
      this.disableAndResetSelect("vehicle" + num + "_model");
    } else {
      this.loadVehicleOptions("vehicles_polk.php?year=" + $F("vehicle" + num + "_year") + "&make=" + $F("vehicle" + num + "_make"), "vehicle" + num + "_model", "Select Model...");
      fadeOut("vehicle" + num + "_make_error");
    }
  },

  onChangeVehicleModel : function(e) {
    var el = Event.element(e);
	var num = el.id.match(/(\d)/)[1];
    if (el.selectedIndex == 0) {
      this.disableAndResetSelect("vehicle" + num + "_submodel");
    } else {
      fadeOut("vehicle" + num + "_model_error");
      new Ajax.Request("vehicles_polk.php?year=" + $F("vehicle" + num + "_year") + "&make=" + $F("vehicle" + num + "_make") + "&model=" + $F("vehicle" + num + "_model"), {
        method: "get",
        evalJSON: true,
        onSuccess: function(transport, json) {
          var el = $("vehicle" + num + "_submodel");

          // Clear options
          while ( el.hasChildNodes() ) {
            el.removeChild( el.firstChild );
          }

          // Add first option
          json.unshift({name: "Select Submodel...", code: ""})

          // Add the rest of the options
          for (var i=0; i < json.length; i++) {
            var opt = document.createElement("OPTION");
            
            //dont put in vehicle submodel
            if(json[i].name == "Vehicle Submodel") {
              opt.setAttribute("value", "");
              opt.setAttribute("title",json[i].name);
            } else {
              opt.setAttribute("value",json[i].name);
              opt.setAttribute("title",json[i].name);
            }

            var text = document.createTextNode(json[i].name);
            opt.appendChild(text);
            el.appendChild(opt);
          };

          el.disabled = false;

        }, 

        onComplete : function(transport) {
          var el = $("vehicle" + num + "_submodel");
          if ( el.options.length == 2 ) {
            if (num == 1) $(el.parentNode.parentNode).hide();
            fadeOut("vehicle" + num + "_submodel_error");
            // el.selectedIndex = 1;
            el.options[1].selected = true;
            el.options[1].setAttribute("selected", true);

          } else {
            if (num == 1) $(el.parentNode.parentNode).show();
          }
        }
      });
    }
  },

  disableAndResetSelect : function(el) {
    $(el).selectedIndex = 0;
    $(el).disabled = true;
  },

  loadVehicleOptions : function(url, select_to_update, title) {
    $(select_to_update).getElementsByTagName('OPTION')[0].innerHTML = 'loading...';
    $(select_to_update).getElementsByTagName('OPTION')[0].selected = 'selected';
    $(select_to_update).disabled = true;
    $(select_to_update + "_loading").show();

    new Ajax.Request(url, {
      method: "get",
      evalJSON: true,
      onSuccess: function(transport, json) {
        var el = $(select_to_update);
        
        // Clear options
        while ( el.hasChildNodes() ) {
          el.removeChild( el.firstChild );
        }
        
        // Add first option
        var opt = document.createElement("OPTION");
        opt.setAttribute("value","");
        var text = document.createTextNode(title);
        opt.appendChild(text);
        el.appendChild(opt);
        
        // Add the rest of the options
        for (var i=0; i < json.length; i++) {
          var opt = document.createElement("OPTION");
          opt.setAttribute("value",json[i]);
          opt.setAttribute("title",json[i]);
          var text = document.createTextNode(json[i]);
          opt.appendChild(text);
          el.appendChild(opt);
        };
        
        //updateSelectWidth(el);
        el.disabled = false;
      }, onComplete : function(transport) { $(select_to_update + "_loading").hide(); }
    });
  },
  

  addViolationEventHandlers : function(num) {
    $("violation" + num + "_description").observe("change", this.onChangeViolationType.bindAsEventListener(this));
  },

  onAddViolation : function(e) {
    var vios = $$("div.violation");
    for (var i=0; i< 4; i++) {
      if (!vios[i].visible()) {
        vios[i].show();
        break;
      }
    }
    if (i >= 3) $('add-violation').hide();

/*      $$(".violation").find(function(el) { return !el.visible(); }).show();
*/
    if (e) Event.stop(e);
  },

  onDeleteViolation : function(e) {
    var el  = Event.element(e);
    var num = el.id.match(/(\d)/)[1];

    // Show Add Violation button
    $("add-violation").show();

    this.deleteViolation(num);
   },

  // If the next violation is visible, we shift that violation into this violation"s
  // place and recurse on the next violation.
  // If the next violation is not visible we reset and hide this violation
  deleteViolation : function(num) {
    var next_num = 1 * num + 1; // Convert to integer and add 1

    if ( next_num <= 4 && $("violation" + next_num).visible() ) {
      this.shiftViolationUp(next_num);
      this.deleteViolation(next_num);
    } else {
      this.resetAndHideViolation(num);
    }
  },

  shiftViolationUp : function(num) {
    var dest_num = 1 * num - 1; // Convert to integer and subtract 1

    $("violation" + dest_num + "_mm_on").selectedIndex      = $("violation" + num + "_mm_on").selectedIndex;
    $("violation" + dest_num + "_yyyy_on").selectedIndex    = $("violation" + num + "_yyyy_on").selectedIndex;
    $("violation" + dest_num + "_type").selectedIndex       = $("violation" + num + "_type").selectedIndex;

    $("violation" + dest_num + "_type").value = $("violation" + num + "_type").value;
    $("violation" + dest_num + "_description").selectedIndex = $("violation" + num + "_description").selectedIndex;
    $("violation" + dest_num + "_description").options[$("violation" + num + "_description").selectedIndex].setAttribute("selected", true);

    // if type is claim, move it up
    if($F("violation" + dest_num + "_type") == "Claim") {
      $("violation" + dest_num + "_amount_paid").value = $F("violation" + num + "_amount_paid");
      $("violation" + dest_num + "_amount_paid").parentNode.show();
      $("violation" + dest_num + "_amount_paid").addClassName("validate-claim-amount");
    //reset if not claim
    } else {
      this.resetViolationAmountPaid(dest_num);
    }

    //clear out error msg if something was selected
    this.moveErrors("violation" + dest_num + "_on_error", "violation" + num + "_on_error");
    this.moveErrors("violation" + dest_num + "_description_error", "violation" + num + "_description_error");
    this.moveErrors("violation" + dest_num + "_amount_paid_error", "violation" + num + "_amount_paid_error");

    // set the validation to nothing if no violation
    if ( $("violation" + num + "_description").value ) {
      $("violation" + dest_num + "_on_error").addClassName("validate-violation-date");
    } else {
      $("violation" + dest_num + "_on_error").removeClassName("validate-violation-date");
    }
  },

  moveErrors : function(dest_error_el, error_el) {
    if($(error_el).visible()) {
    	$(error_el).hide();
    	$(dest_error_el).show();
    } else {
    	$(error_el).hide();
    	$(dest_error_el).hide();
    }
  },

  resetAndHideViolation : function(num) {
    $("violation" + num).hide();

    $("violation" + num + "_driver_id").selectedIndex   = 0;
    $("violation" + num + "_mm_on").selectedIndex       = 0;
    $("violation" + num + "_yyyy_on").selectedIndex     = 0;
    $("violation" + num + "_type").value                = '';
    $("violation" + num + "_description").selectedIndex = 0;

    // Clear and hide errors
    $("violation" + num + "_on_error").removeClassName("validate-violation-date");
    $("violation" + num + "_description_error").removeClassName("validate-selected");
    $("violation" + num + "_on_error").hide();
    $("violation" + num + "_description_error").hide();
    this.resetViolationAmountPaid(num);
  },

  onChangeViolationType : function(e) {
    var el             = Event.element(e);
    var num            = el.id.match(/(\d)/)[1];
    var opts           = el.getElementsByTagName('option');
    var violation_type = opts[el.selectedIndex].parentNode.label;
    if ( typeof violation_type == 'undefined' ) violation_type = '';
    $('violation' + num + '_type').value = violation_type;
    $("violation" + num + "_description_error").hide();

    if (el.selectedIndex == 0) {
      $("violation" + num + "_on_error").removeClassName("validate-violation-date");
      this.resetViolationAmountPaid(num);
    } else {
      $("violation" + num + "_on_error").addClassName("validate-violation-date");
      if (violation_type == "Claim") {
        $("violation" + num + "_amount_paid").parentNode.show();
        $("violation" + num + "_amount_paid_error").addClassName("validate-claim-amount");
      } else {
        this.resetViolationAmountPaid(num);
      }
    }
  },

  resetViolationAmountPaid : function(num) {
    $("violation" + num + "_amount_paid").parentNode.hide();
    $("violation" + num + "_amount_paid").value = "";
    $("violation" + num + "_amount_paid_error").removeClassName("validate-claim-amount");
    $("violation" + num + "_amount_paid_error").hide();
  },

  clearSelectOptions : function(el) {
    while ( el.hasChildNodes() ) {
       el.removeChild( el.firstChild );
    }
  },

  addSelectOptionsFromArray : function(el, a) {
    for (var i=0; i < a.length; i++) {
      var opt = document.createElement("OPTION");
      if(/(select)/i.test(a[i])) {
        opt.setAttribute("value","");
      } else {
        opt.setAttribute("value",a[i]);
      }
      opt.setAttribute("title",a[i]);
      var text = document.createTextNode(a[i]);
      opt.appendChild(text);
      el.appendChild(opt);
    };
  },

  onAddPersonCheck : function(e) {
    var el = Event.element(e);
    if (el.nodeName == 'LABEL') return;
    if (el.checked) {
      $('extra-persons').show();
      $('insured2_add').checked = true;
      this.toggleColumn('insured2_add', true);
      this.changeValidationExtraPersons(2, true);
    } else {
      $('extra-persons').hide();
      $('insured2_add').checked = false;
      this.toggleColumn('insured2_add', false);
      this.changeValidationExtraPersons(2, false);
    }
  },

  onAddVehicleCheck : function(e) {
    var el = Event.element(e);
    if (el.nodeName == 'LABEL') return;
    if (el.checked) {
      $('extra-vehicles').show();
      $('vehicle2_add').checked = true;
      this.toggleColumn('vehicle2_add', true);
      this.changeValidationExtraVehicles(2, true);
    } else {
      $('extra-vehicles').hide();
      $('vehicle2_add').checked = '';
      this.toggleColumn('vehicle2_add', false);
      this.changeValidationExtraVehicles(2, false);
    }
  },

  onClickPerson : function(e) {
    var el = Event.element(e);
    if (el.nodeName == 'LABEL') return;
	var num = el.id.match(/(\d)/)[1];
    if (el.checked) {
      this.toggleColumn(el.id, true);
      this.changeValidationExtraPersons(num, true);
    } else {
      this.toggleColumn(el.id, false);
      this.changeValidationExtraPersons(num, false);
    }
  },

  onClickVehicle : function(e) {
    var el = Event.element(e);
    if (el.nodeName == 'LABEL') return;
	var num = el.id.match(/(\d)/)[1];
    if (el.checked) {
      this.toggleColumn(el.id, true);
      this.changeValidationExtraVehicles(num, true);
    } else {
      this.toggleColumn(el.id, false);
      this.changeValidationExtraVehicles(num, false);
    }
  },

  toggleColumn : function(id, show) {
	var num = id.match(/(\d)/)[1];
	var tbl = Element.up(id, 'div');
	var rows = tbl.getElementsBySelector('tbody tr');
	for (var i=0; i<rows.length; i++) {
      var tds = rows[i].getElementsByTagName('TD');
      if (show)
        tds[num-2].removeClassName('hidden');
      else
        tds[num-2].addClassName('hidden');
    }
  },

  changeValidationExtraPersons : function(i, validate) {
    if (validate) {
      $("insured"+i+"_first_name_error").addClassName("validate-alpha");
      $("insured"+i+"_relationship_to_insured_error").addClassName("validate-selected");
      $("gender"+i+"_error").addClassName("validate-checked");
      $("insured"+i+"_marital_status_error").addClassName("validate-checked");
      $("dob"+i+"_on_error").addClassName("validate-dob");
      $("insured"+i+"_occupation_error").addClassName("validate-selected");
      $("insured"+i+"_education_level_error").addClassName("validate-selected");
      $("insured"+i+"_license_status_error").addClassName("validate-selected");
      $("insured"+i+"_age_licensed_error").addClassName("validate-driving-age");
      $("insured"+i+"_sr22_required_error").addClassName("validate-checked");
    } else {
      $("insured"+i+"_first_name_error").removeClassName("validate-alpha");
      $("insured"+i+"_relationship_to_insured_error").removeClassName("validate-selected");
      $("gender"+i+"_error").removeClassName("validate-checked");
      $("insured"+i+"_marital_status_error").removeClassName("validate-checked");
      $("dob"+i+"_on_error").removeClassName("validate-dob");
      $("insured"+i+"_occupation_error").removeClassName("validate-selected");
      $("insured"+i+"_education_level_error").removeClassName("validate-selected");
      $("insured"+i+"_license_status_error").removeClassName("validate-selected");
      $("insured"+i+"_age_licensed_error").removeClassName("validate-driving-age");
      $("insured"+i+"_sr22_required_error").removeClassName("validate-checked");
    }
  },

  changeValidationExtraVehicles : function(i, validate) {
    if (validate) {
      $("vehicle"+i+"_year_error").addClassName("validate-selected");
      $("vehicle"+i+"_make_error").addClassName("validate-selected");
      $("vehicle"+i+"_model_error").addClassName("validate-selected");
      $("vehicle"+i+"_submodel_error").addClassName("validate-selected");
      $("vehicle"+i+"_primary_driver_id_error").addClassName("validate-selected");
      $("vehicle"+i+"_primary_use_error").addClassName("validate-selected");
      $("vehicle"+i+"_daily_mileage_error").addClassName("validate-selected");
      $("vehicle"+i+"_annual_mileage_error").addClassName("validate-selected");
      $("vehicle"+i+"_comprehensive_deductible_error").addClassName("validate-selected");
      $("vehicle"+i+"_collision_deductible_error").addClassName("validate-selected");
      $("vehicle"+i+"_ownership_status_error").addClassName("validate-checked");
    } else {
      $("vehicle"+i+"_year_error").removeClassName("validate-selected");
      $("vehicle"+i+"_make_error").removeClassName("validate-selected");
      $("vehicle"+i+"_model_error").removeClassName("validate-selected");
      $("vehicle"+i+"_submodel_error").removeClassName("validate-selected");
      $("vehicle"+i+"_primary_driver_id_error").removeClassName("validate-selected");
      $("vehicle"+i+"_primary_use_error").removeClassName("validate-selected");
      $("vehicle"+i+"_daily_mileage_error").removeClassName("validate-selected");
      $("vehicle"+i+"_annual_mileage_error").removeClassName("validate-selected");
      $("vehicle"+i+"_comprehensive_deductible_error").removeClassName("validate-selected");
      $("vehicle"+i+"_collision_deductible_error").removeClassName("validate-selected");
      $("vehicle"+i+"_ownership_status_error").removeClassName("validate-checked");
    }
  },

  onFocusPrimaryDriver : function(e) {
    var el = Event.element(e);
    var opts = el.getElementsByTagName('option');
    this.updateOrAddOption(el, opts[2], 2);
    this.updateOrAddOption(el, opts[3], 3);
    this.updateOrAddOption(el, opts[4], 4);
  },

  updateOrAddOption : function(select, opt, driver) {
   var name = $F("insured" + driver + "_first_name");
   // clean the name
   name = name.replace(/[^A-Za-z]/ig, '');
   var txt = document.createTextNode(name);
   if ( !opt && name != '') {
      var new_opt = document.createElement("OPTION");
      new_opt.value = driver;
      new_opt.appendChild(txt);
      select.appendChild(new_opt);
    } else if ( opt && name != '') {
	  opt.innerHTML = '';
	  opt.appendChild(txt);
    } else if ( opt && name == '') {
      opt.parentNode.removeChild(opt);
    }
  },

  onCoverageClick : function(e) {
	var td = Event.findElement(e, 'TD');
	var ck = td.getElementsByTagName('INPUT')[0];
    td.addClassName('selected');
    // deselect others
    $(td).siblings().each(function(el) {$(el).removeClassName('selected')});
    ck.checked = 'checked';
  }
}

if (!(BrowserDetect.browser == "Explorer" && BrowserDetect.version < 6)) {
  FastInit.addOnLoad(function() {
    var auto_form = new AutoForm();
  });
}
