var hCarousel = null;
var formStep = "1"
var errorCount = 0;

var selectedType = '';
var selectedSubType = '';

var typeMap = {
  class_a: {idx: 0, name: "Class A Motorhome", rvtype: "Class A", subtype: ""},
  class_b: {idx: 1, name: "Class B Motorhome", rvtype: "Class B", subtype: ""},
  class_c: {idx: 2, name: "Class C Motorhome", rvtype: "Class C", subtype: ""},
  travel_trailer: {idx: 4, name: "Travel Trailer", rvtype: "Travel Trailer", subtype: ""},
  fifth_wheel: {idx: 3, name: "Fifth Wheel", rvtype: "Fifth Wheel", subtype: ""},
  tent_trailer: {idx: 6, name: "Tent Trailer", rvtype: "Tent Trailer", subtype: "Hybrid"},
  toy_hauler: {idx: 5, name: "Toy Hauler", rvtype: "Travel Trailer", subtype: "Toy Hauler"},
  truck_camper: {idx: 7, name: "Truck Camper", rvtype: "Truck Camper", subtype: ""},
  pop_up: {idx: 8, name: "Pop Up", rvtype: "Tent Trailer", subtype: "Pop Up"}
};

function addError(msg) {
  if (msg=='') return;
  $('form_errors_wrapper').style.display = '';
  $('form_errors_ul').insert({bottom: '<li>' + msg + '</li>'});
  errorCount++;
}

function setError(msg) {
  errorCount = 0;
  $('form_errors').innerHTML = '<ul id="form_errors_ul"></ul>';
  addError(msg);
}

function setStepInd(current, total) {
  var i = 1;
  if (total==0) {
    $('form_steps').style.display='none';
    return;
  } else {
    $('form_steps').style.display='';
  }
  while(i<=4) {
    $('form_step_ind_'+i).removeClassName('current');
    $('form_step_ind_'+i).style.display='none';
    i++;
  }
  i = 1;
  while(i<=total) {
    $('form_step_ind_'+i).style.display='';
    i++;
  }
  $('form_step_ind_'+current).addClassName('current');
}

function showStep(step) {
  $('form_errors_wrapper').style.display = 'none';
  setError('');

  setStepInd(0,0);

  $$('.form_page').each(function(e) {
    e.style.display = 'none';
  });
  $$('.form_step_'+step).each(function(e) {
    e.style.display = 'block';
  });

  $('form_button_previous').style.display = 'none';
  $('form_button_next').style.display = 'none';

  $$('.hide').each(function(e) {
    if (selectedType!='' && e.hasClassName(selectedType)) {
      e.style.display = '';
    } else {
      e.style.display = 'none';
    }
  });

  // Google Analytics
  var interest_value = null;
  try {
    interest_value = Form.getInputs('form_main','radio','interest').find(function(radio) { return radio.checked; }).value;
  } catch(e) {}
  if (interest_value==null) {
    interest_value = '';
  }
  switch(step) {
    case "2":
      pageTracker._trackPageview('/select_type/' + selectedType);
      break;
    case "3a":
      pageTracker._trackPageview('/looking_for/' + escape(interest_value));
      break;
    case "3b":
      pageTracker._trackPageview('/looking_for_value');
      break;
    case "3c":
      pageTracker._trackPageview('/looking_to_sell');
      break;
    case "4a":
      pageTracker._trackPageview('/looking_for/' + escape(interest_value) + '/knows_model');
      break;
    case "4b":
      pageTracker._trackPageview('/looking_for/' + escape(interest_value) + '/knows_floorplan');
      break;
    case "4c":
      pageTracker._trackPageview('/looking_for/' + escape(interest_value) + '/research');
      break;
    case "5":
      pageTracker._trackPageview('/confirm_contact_details');
      break;
    case "6":
      pageTracker._trackPageview('/submit');
      break;
  }
}

function setStep(step) {
  switch(formStep) {
    case "1":
      switch(step) {
        case "next":
          setStep("2");
          break;
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
      }
      break;

    case "2":
      switch(step) {
        case "next":
          // validate form
          var interest_value = null;
          try {
            interest_value = Form.getInputs('form_main','radio','interest').find(function(radio) { return radio.checked; }).value;
          } catch(e) {}
          if (interest_value==null) {
            setError('Please select an option to continue');
            break;
          }
          switch(interest_value) {
            case "New":
            case "Used":
            case "New or Used":
              var data = $('form_main').serialize(true);
              var rvtype = escape(typeMap[selectedType].rvtype);
              var subtype = escape(typeMap[selectedType].subtype);
              var condition = escape(interest_value);
              new Ajax.Updater(
                'prices',
                prices_url+'?type=' + rvtype + "&sub_type=" + subtype + "&condition=" + condition,
                {evalScripts: true}
              );
              setStep("3a");
              break;
            case "Value":
              setStep("3b");
              break;
            case "Sell":
              setStep("3c");
              break;
          }
          break;
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "3a":
          showStep(step);
          setStepInd(2,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "3b":
        case "3c":
          showStep(step);
          setStepInd(2,2);
          $('form_button_previous').style.display = '';
          formStep = step;
          break;
      }
      break;

    //
    case "3a":
      switch(step) {
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "previous":
          setStep("2");
          break;
        case "next":
          // validate form
          var reason_value = null;
          try {
            reason_value = Form.getInputs('form_main','radio','reason').find(function(radio) { return radio.checked; }).value;
          } catch(e) {}
          if (reason_value==null) {
            setError('Please select an option to continue');
            break;
          }
          switch(reason_value) {
            case "knows_model":
              setStep("4a");
              break;
            case "knows_floorplan":
              setStep("4b");
              break;
            case "research":
              setStep("4c");
              break;
          }
          break;
        case "4a":
        case "4b":
        case "4c":
          showStep(step);
          setStepInd(3,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
      }
      break;
    case "3b":
    case "3c":
      switch(step) {
        case "previous":
          setStep("2");
          break;
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
      }
      break;

    // rv detail forms
    case "4a":
      switch(step) {
        case "previous":
          setStep("3a");
          break;
        case "3a":
          showStep(step);
          setStepInd(2,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "next":
          if (!validateFinal()) {
            break;
          }
          setStep("5");
          break;
        case "5":
          showStep(step);
          setStepInd(4,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
      }
      break;
    case "4b":
      switch(step) {
        case "previous":
          setStep("3a");
          break;
        case "3a":
          showStep(step);
          setStepInd(2,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "next":
          if (!validateFinal()) {
            break;
          }
          setStep("5");
          break;
        case "5":
          showStep(step);
          setStepInd(4,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
      }
      break;
    case "4c":
      switch(step) {
        case "previous":
          setStep("3a");
          break;
        case "3a":
          showStep(step);
          setStepInd(2,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "next":
          if (!validateFinal()) {
            break;
          }
          setStep("5");
          break;
        case "5":
          showStep(step);
          setStepInd(4,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
      }
      break;
    case "5":
      switch(step) {
        case "previous":
          var data = $('form_main').serialize(true);
          var reason_value = data['reason'];
          switch(reason_value) {
            case "knows_model":
              setStep("4a");
              break;
            case "knows_floorplan":
              setStep("4b");
              break;
            case "research":
              setStep("4c");
              break;
          }
          break;
        case "4a":
        case "4b":
        case "4c":
          showStep(step);
          setStepInd(3,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "2":
          showStep(step);
          setStepInd(1,1);
          $('form_button_next').style.display = '';
          formStep = step;
          break;
        case "next":
          var data = $('form_main').serialize(true);
          if (data["email"] != data["confirm_email"]) {
            setError('Email confirmation must match email address entered in previous step!');
            break;
          }
          setStep("6");
          break;
        case "6":
          showStep(step);
          $('horizontal_carousel').style.display = 'none';
          formStep = step;
          setTimeout("submitData()", 2000);
          break;
      }
      break;
    case "6":
      switch(step) {
        case "5":
          showStep(step);
          setStepInd(4,4);
          $('form_button_previous').style.display = '';
          $('form_button_next').style.display = '';
          $('horizontal_carousel').style.display = '';
          formStep = step;
          break;
      }
      break;
  }
}

function validateEmail(addr) {
  var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
  if (reg.test(addr) == false) {
    return false;
  }
  return true;
}

function validatePhone(num) {
  var reg = /^[\(]{0,1}[0-9]{3}[\)]{0,1}[ \-\.]{0,1}[0-9]{3}[\-\.]{0,1}[0-9]{4}$/;
  if (reg.test(num) == false) {
    return false;
  }
  return true;
}

function validateAreaCode(num) {
  var n = num.replace(/[^0-9]/, "");
  var ac = n.substr(0, 3);
  for(var i=0; i<area_codes.length; i++) {
    if (area_codes[i] == ac) return true;
  }
  return false;
}

function validateZip(zip) {
  var reg = /^([0-9]{5}|[A-Z0-9]{6})$/;
  if (reg.test(zip) == false) {
    return false;
  }
  return true;
}

function validateFinal() {
  setError('');

  var data = $('form_main').serialize(true);
  //console.debug(data);

  var reason_value = data['reason'];
  switch(reason_value) {
    case "knows_model":
      if (data["brand_id"].empty()) {
        addError("A manufacturer must be selected");
      }
      if (typeof(data["model_id"])!="undefined" && data["model_id"].empty()) {
        addError("A model must be selected");
      }
      break;
    case "knows_floorplan":
      if (data["floorplan_description"].strip().empty()) {
        addError("A floorplan description is required");
      }
      if (data["price_range_id"].empty()) {
        addError("A Price Range must be selected");
      }
      break;
    case "research":
      if (data["price_range_id"].empty()) {
        addError("A Price Range must be selected");
      }
      break;
  }

  if (data["first_name"].strip().empty()) {
    addError("First Name is required");
  }
  if (data["last_name"].strip().empty()) {
    addError("Last Name is required");
  }
  if (!validateEmail(data["email"])) {
    addError("A valid Email address is required");
  }
  if (!validatePhone(data["phone"])) {
    addError("A valid 10-digit Phone Number (including area code) is required");
  }
  if (!validateAreaCode(data["phone"])) {
    addError("Area Code appears to be invalid");
  }
  if (!validateZip(data["zip"])) {
    addError("A valid 5 digit US Zip or 6 character Canadian Postal code are required");
  }

  if (errorCount>0) {
    $("form_errors").scrollTo();
    return false;
  }
  return true;
}

function submitData() {
  var data = $('form_main').serialize();
  new Ajax.Request(submit_url, {
    method: 'post',
    postBody: data,
    onSuccess: function(transport) {
      if (transport.responseText.match(/^[0-9]+$/)) { // lead id
        document.location.href = thanks_url;
      } else {
        submissionError();
      }
    },
    onFailure: function(transport) {
      submissionError();
    }
  });
}

function submissionError() {
  setStep("5");
  setError("");
  addError("An error occured, rest assured we have been notified of the problem.");
  addError("In the mean time, you can try submitting again by clicking the Next button.");
}

function gup(name) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if (results == null) {
    return null;
  } else {
    return results[1];
  }
}

var lastHighlight = null;

function selectType(e) {
  if (typeof(e)==typeof('')) {
    e=$(e);
  }

  if (selectedType==e.id)
    return;
  selectedType = e.id;

  // scroll?
  if (typeMap[selectedType].idx < 4) {
    hCarousel.scrollTo(0);
  } else if (typeMap[selectedType].idx == 4) {
    // noop
  } else {
    hCarousel.scrollTo(5);
  }

  $$('.tw').each(function(eX) {
    eX.removeClassName('selected');
  });
  e.addClassName('selected');

  if (lastHighlight != null) {
    lastHighlight.cancel();
    lastHighlight.element.style.backgroundColor='';
  }
  lastHighlight = new Effect.Highlight(e);

  $$('.rvtype').each(function(e) {
    e.innerHTML = typeMap[selectedType].name;
  });

  $('rvtype_input').value = typeMap[selectedType].rvtype;
  $('rvsubtype_input').value = typeMap[selectedType].subtype;

  $('model_wrapper').style.display='none';
  new Ajax.Updater('brands', brands_url+'?type=' + escape(typeMap[selectedType].rvtype), {evalScripts: true})

  setStep("2");
}

function runLoad() {
  hCarousel = new UI.Carousel("horizontal_carousel", {elementSize: 150});

  Event.observe($('form_button_next'), 'click', function(event) {
    setStep("next");
  });
  Event.observe($('form_button_previous'), 'click', function(event) {
    setStep("previous");
  });

  $$('.tw').each(function(e) {
      e.onmouseover = function() {
        e.addClassName("hover");
      }
      e.onmouseout = function() {
        e.removeClassName("hover");
      }
      e.onclick = function() {
        selectType(e);
      }
  });
      
  var initType = null;
  initType = gup('type');
  if (initType != null) {
    if (typeof(typeMap[initType])!="undefined") {
      selectType(initType);
      return;
    }
  }
  showStep("1");
}
