var ValidationHelper = {
  validateFamily : function(children) {
    var valid_inputs = [];
    var num_insured = children + 2;
    for ( var i = 1; i <= num_insured; i++ ) {
      if ($('lead_gender' + i).selectedIndex != 0 || i == 1) valid_inputs.push(this.validateInsured(i));
    }
    return $A(valid_inputs).all(function(n) { return n; });
  },

  validateSpouse : function() {
	  var spouse_gender = true;
	  var spouse_dob	 	= true;

    if($("lead_gender2").selectedIndex != 0 || 
			($("lead_dob2_mm_on").value != ""   && $("lead_dob2_mm_on").value != "MM") ||
			($("lead_dob2_dd_on").value != ""   && $("lead_dob2_dd_on").value != "DD") ||
			($("lead_dob2_yyyy_on").value != "" && $("lead_dob2_yyyy_on").value != "YYYY")){

		  spouse_gender = this.validateGender(2);
		  spouse_dob	 	= this.validateDateOfBirth(2);
		}else{
			$("lead_gender2").selectedIndex = 0;
			$("lead_dob2_mm_on").value 			= "MM";
			$("lead_dob2_dd_on").value 			= "DD";
			$("lead_dob2_yyyy_on").value 		= "YYYY";

			$("lead_gender2_error").hide()
			$("lead_dob2_on_error").hide();
		}

    return (spouse_gender && spouse_dob);
  },
  
  validateInsured : function(num) {
    var valid = true;
    var valid_inputs = [
      this.validateGender(num),
      this.validateHeight(num),
      this.validateWeight(num),
      this.validateDateOfBirth(num)
    ];

    var valid  = $A(valid_inputs).all(function(n) { return n; });
    return valid;
  },

  // validations for insured when genders are radios and heights are combined
  validateInsuredNew : function(num) {
    var valid = true;
    var valid_inputs = [
      this.validateGenderRadio(num),
      this.validateHeightCombined(num),
      this.validateWeight(num),
      this.validateDateOfBirth(num)
    ];

    var valid  = $A(valid_inputs).all(function(n) { return n; });
    return valid;
  },

  validateHasExistingCarrier : function() {
    var valid = Validation.get('validate-one-required').test($F('lead_has_existing_carrier_1'), $('lead_has_existing_carrier_1'))
    this.refreshValidationAdvice('lead_has_existing_carrier', valid, 'Please choose an option');
    return valid;
  },
  
  validateCurrentlyInsured : function() {
    var valid = true;
    if ($F('lead_has_existing_carrier_1')) {
	    valid = $('lead_existing_carrier').selectedIndex > 0;
    }

    this.refreshValidationAdvice('lead_existing_carrier', valid, 'Please select a carrier');
    return valid;
  },

  validateCoverageStartDate : function() {
    var valid = true;
	  valid = Validation.get('validate-coverage-start-date').test($F('lead_reqdate_mm_begin'),$('lead_reqdate_mm_begin'));

    this.refreshValidationAdvice('lead_reqdate_begin', valid, 'Please select a valid future date less than 3 months from now.');      
    return valid;
  },
  
  validateMedications : function() {
    var valid = true;
    if ($F('lead_takes_medications_1')) {
	    valid = Validation.get('required').test($F('lead_insured1_current_medications_detail'));
    }

    this.refreshValidationAdvice('lead_insured1_current_medications_detail', valid, 'Please list your medications');      
    return valid;
  },

  validatePreExistingConditions : function() {
    var valid = true;
    var pec_checkbox_field = $('lead_pre_existing_1') || $('lead_has_pre_existing_conditions_1');
    if ( $F(pec_checkbox_field) ) {
	    var conditions = $('pre_existing_conditions_row').getElementsByTagName('INPUT');
	    valid = $A(conditions).any(function(n) { return $F(n) != null; });
    }

    this.refreshValidationAdvice('lead_pre_existing_conditions', valid, 'Please check all pre-existing health conditions that apply to any of the people requesting coverage:');      
    return valid;
  },
  
  validateMedicareAB : function(is_select) {
    var valid = true;

		if(!is_select){
    	valid = ($F('lead_has_medicare_a_b_1') || $F('lead_has_medicare_a_b_0'));
		}else{
    	valid = Validation.get('validate-selection').test($F('lead_has_medicare_a_b'), $('lead_has_medicare_a_b'));
		}

    this.refreshValidationAdvice('lead_has_medicare_a_b', valid, 'Please select an option');      
    return valid;
  },
  
  validateHasESRD : function(is_select) {
    var valid = true;

		if(!is_select){
    	valid = ($F('lead_has_esrd_1') || $F('lead_has_esrd_0'));
		}else{
    	valid = Validation.get('validate-selection').test($F('lead_has_esrd'), $('lead_has_esrd'));
		}

    this.refreshValidationAdvice('lead_has_esrd', valid, 'Please select an option');      
    return valid;
  },
  
  validateSmoker : function() {
    var valid = true;
    valid = ($F('lead_is_smoker1_1') || $F('lead_is_smoker1_0'));
 
    this.refreshValidationAdvice('lead_is_smoker1', valid, 'Please select an option');      
    return valid;
  },
  
  validateGender : function(num) {
    var valid = Validation.get('validate-selection').test($F('lead_gender' + num), $('lead_gender' + num));
    this.refreshValidationAdvice('lead_gender' + num, valid, 'Please select a gender');      
    return valid;
  },
  
  validateHeight : function(num) {
    var valid = Validation.get('validate-all-selection').test($F('lead_insured' + num + '_height_inches'), $('lead_insured' + num + '_height_inches'));
    this.refreshValidationAdvice('lead_insured' + num + '_height', valid, 'Please select a valid height');      
    return valid;
  },
  
  validateWeight : function(num) {
    if (num > 2) {
      var valid = Validation.get('validate-child-weight').test($F('lead_insured' + num + '_weight'), $('lead_insured' + num + '_weight'));
    } else {
      var valid = Validation.get('validate-adult-weight').test($F('lead_insured' + num + '_weight'), $('lead_insured' + num + '_weight'));
    }
    
    this.refreshValidationAdvice('lead_insured' + num + '_weight', valid, 'Please enter a valid weight');      
    return valid;
  },
  
  validateDateOfBirth : function(num) {
    var valid = Validation.get('validate-three-part-dob').test($F('lead_dob' + num + '_yyyy_on'), $('lead_dob' + num + '_yyyy_on'));
    this.refreshValidationAdvice('lead_dob' + num + '_on', valid, 'Please enter a valid birthdate');      
    return valid;
  },

  validateContactInfo : function() {
    var valid_inputs = [
      this.validateFirstName(),
      this.validateLastName(),
      this.validateAddressLine1(),
      this.validateCity(),
      this.validateState(),
      this.validateZip(),
      this.validatePhone1(),
      this.validatePhone2(),
      this.validateEmail(),
      this.validatePrivacyPolicy()
    ];
    
    var valid = $A(valid_inputs).all(function(n) { return n; });
    return valid;
  },

  validateShortContactInfo : function() {
    var valid_inputs = [
      this.validateFirstName(),
      this.validateLastName(),
      this.validateAddressLine1(),
      this.validateZip(),
      this.validatePhone1(),
      this.validateEmail(),
      this.validatePrivacyPolicy()
    ];
    
    var valid = $A(valid_inputs).all(function(n) { return n; });
    return valid;
  },
  
  validateFirstName : function() {
    var valid = Validation.get('validate-name').test($F('lead_first_name'));
    this.refreshValidationAdvice('lead_first_name', valid, 'Please enter your first name');      
    return valid;
  },
  
  validateLastName : function() {
    var valid = Validation.get('validate-name').test($F('lead_last_name'));
    this.refreshValidationAdvice('lead_last_name', valid, 'Please enter your last name');      
    return valid;
  },
  
  validateAddressLine1 : function() {
    var valid = Validation.get('required').test($F('lead_address1_street1'));
    this.refreshValidationAdvice('lead_address1_street1', valid, 'Please enter your address');      
    return valid;
  },
  
  validateCity : function() {
    var valid = Validation.get('required').test($F('lead_address1_city'));
    this.refreshValidationAdvice('lead_address1_city', valid, 'Please enter your city');      
    return valid;
  },
  
  validateState : function() {
    var valid = Validation.get('validate-selection').test($F('lead_address1_state'), $('lead_address1_state'));
    this.refreshValidationAdvice('lead_address1_state', valid, 'Please select your state');      
    return valid;
  },
  
  validateZip : function() {
    var valid = Validation.get('validate-zip').test($F('lead_address1_zip'));
    this.refreshValidationAdvice('lead_address1_zip', valid, 'Please enter a valid zip code');      
    return valid;
  },
  
  validatePhone : function(num) {
    // Check for one field first, otherwise default to 3 fields
    if ( $("lead_phone" + num ) ) {
      this.reformatPhone("lead_phone" + num);
      var phone_number = $F("lead_phone" + num);
    } else {
      var phone_number = $F('lead_phone' + num + '_area') + $F('lead_phone' + num + '_exchange') + $F('lead_phone' + num + '_station');
    }
    
    var valid = Validation.get('validate-mandatory-phone').test(phone_number);
    this.refreshValidationAdvice('lead_phone' + num, valid, 'Please enter a valid phone number');      
    return valid;
  },
  
  validatePhone1 : function() {
    return this.validatePhone(1);
  },
  
  validatePhone2 : function() {
    return this.validatePhone(2);
  },
  
  validateEmail : function() {
    var valid = Validation.get('validate-mandatory-email').test($F('lead_email1'));
    this.refreshValidationAdvice('lead_email1', valid, 'Please enter a valid email');
    return valid;
  },
  
  validatePrivacyPolicy : function() {
    var valid = Validation.get('validate-checked').test($F('lead_privacy_policy'));
    this.refreshValidationAdvice('lead_privacy_policy', valid, 'Please agree to the privacy policy');
    return valid;
  },
  
  reformatPhone : function(id) {
    var phone          = $F(id);
    var clean_phone    = phone.gsub(/\D/, '');
    var phone_area     = clean_phone.substr(0,3);
    var phone_exchange = clean_phone.substr(3,3);
    var phone_station  = clean_phone.substr(6,4);
  
    var phone_formatted = "";
    if (phone_area.length > 0) phone_formatted = phone_area;
    if (phone_exchange.length > 0) phone_formatted += "-" + phone_exchange;
    if (phone_station.length > 0) phone_formatted += "-" + phone_station;
  
    $(id).value = phone_formatted;
  
    return phone_formatted;
  },

  refreshValidationAdvice : function(element_id, valid, message) {
    var error_element = $(element_id + '_error');
    
    if (error_element) {
      if (valid) {
        if ( error_element.hasClassName("validation-advice") ) error_element.removeClassName("validation-advice");
        error_element.hide();
      } else {
        error_element.update(message);
        if ( !error_element.hasClassName("validation-advice") ) error_element.addClassName("validation-advice");
        error_element.show();
      }
    }
  },

  validateGenderRadio : function(num) {
    var valid = Validation.get('validate-gender-radios').test($('lead_gender' + num + '_m'));
    this.refreshValidationAdvice('lead_gender' + num, valid, 'Please select a gender');      
    return valid;
  },

  validateHeightCombined : function(num) {
    var valid = Validation.get('validate-one-part-height').test($F('lead_insured' + num + '_height_total_inches'));
    this.refreshValidationAdvice('lead_insured' + num + '_height', valid, 'Please select a valid height');      
    return valid;
  }
}
