/* 
 * RPEOnePage 
 * A pure javascript front-end to the EstimatorAPI
 *
 */
var RPEOnePage = {

  BASE_DATA_URL : '',
  
  CAR_DATA : [],
  
  FIELDS : ['#car_brand', '#car_model', '#car_year'],
  LABELS : ['- Car Make -', '- Car Model -', '- Car Year -'],
    
  // Start up the short form mode implementation
  init : function(widgetKey) {
    RPEOnePage.BASE_DATA_URL = 'http://repairpal.com/widget/1/'+widgetKey+'/';
    RPEOnePage.pullCompleteCarData();
    RPEOnePage.bindEvents();
  },
  
  // Get the complete car list
  pullCompleteCarData : function() {
    RPEOnePage.disableCombo('#car_brand');
    RPEOnePage.requestData('complete_car_data', { callback : 'RPEOnePage.onCompleteCarDataLoaded' });
  },
  
  onCompleteCarDataLoaded : function(json) {
    RPEOnePage.CAR_DATA = json;
    RPEOnePage.loadCarBrands();
  },
  
  /** --------- Load Data into Fields from JSON Data -------- */
  
  loadCarBrands : function() {
    car_brands = {};
    $.each(RPEOnePage.CAR_DATA, function(name) { car_brands[name] = name });
    RPEOnePage.loadCombo('#car_brand', car_brands, 'car_brand');
    $('#car_brand').change();
  },

  loadCarModels : function(car_brand) {
    if (typeof(RPEOnePage.CAR_DATA[car_brand]) == 'undefined') return;
    
    car_models = {};
    $.each(RPEOnePage.CAR_DATA[car_brand], function(name) { car_models[name] = name });
    RPEOnePage.loadCombo('#car_model', car_models, 'car_model');
    $('#car_model').change();
  },

  loadCarYears : function(car_brand, car_model) {
    if (typeof(RPEOnePage.CAR_DATA[car_brand]) == 'undefined' || typeof(RPEOnePage.CAR_DATA[car_brand][car_model]) == 'undefined') return;
    
    car_type_ids_to_years = RPEOnePage.CAR_DATA[car_brand][car_model];
    RPEOnePage.loadCombo('#car_year', car_type_ids_to_years, 'car_type');
  },
  
  /** ------------- Event Hooks ---------------- */

  bindEvents : function() {  
    $('#car_brand').change(function() {
      selected = this.options[this.selectedIndex].value;
      if (selected.length > 0) RPEOnePage.loadCarModels(selected);
    });

    $('#car_model').change(function() {
      selected = this.options[this.selectedIndex].value;
      if (selected.length > 0) RPEOnePage.loadCarYears($('#car_brand option:selected').attr('value'), selected);
    });
    
    // Make sure fields are populated
    $('#get_estimate_button').click(function() {
      if ($('#car_brand option:selected').attr('value') < 0) {
        RPEOnePage.flashField('#car_brand');
        return false;
      }      
      if ($('#car_model option:selected').attr('value') < 0) {
        RPEOnePage.flashField('#car_model');
        return false;
      }
      if ($('#car_year option:selected').attr('value') < 0) {
        RPEOnePage.flashField('#car_year');
        return false;
      }
    });
  },
  
  /** ------- DOM Helpers ------------- */
  
  // Populate a combobox with data
  loadCombo : function(dom_id, map, param_name) {
    $(dom_id).attr('disabled', '').empty();
    var html = ['<option value="-1">', RPEOnePage.getFieldLabel(dom_id), '</options>'];
    
    $.each(map, function(item) {
       html.push('<option value="',map[item],'">',item,'</option>');
    });
     
    $(dom_id).html(html.join('')); 
  },

  // Disable combo boxes in cascade, so all subsequent combo boxes in the FIELDS are also disabled
  disableCombo : function(dom_id) {
    var dep_idx = $.inArray(dom_id, RPEOnePage.FIELDS);
    for (idx = dep_idx; idx < RPEOnePage.FIELDS.length; idx++) {
      RPEOnePage.disableSingleCombo(RPEOnePage.FIELDS[idx]);
    }
  },

  // Disable a combo box by emptying it, setting the only value to -1, and disabling the html field
  disableSingleCombo : function(dom_id) {
    var e = $(dom_id);
    e.empty();
    e.attr('disabled', 'disabled');
    // Check whether it's really a select (IE was dying when this hit an input type="hidden")
    if (e[0] && e[0].type.substring(0,6)=='select') {
      e.html('<option value="-1">'+RPEOnePage.getFieldLabel(dom_id)+'</option>');
    }
  },
  
  /** ------- Simple Helpers ------------- */
  
  flashField : function(dom_id) {
    $(dom_id).fadeOut("fast", function() { $(dom_id).fadeIn("fast") });
  },

  // Request data from the url, using JSONP
  requestData : function (method, args) {
    dataUrl = [RPEOnePage.BASE_DATA_URL, method, '.json?', $.param(args)];
    $.getScript(dataUrl.join(''));
  },

  // Get the default value for a given field dom_id 
  getFieldLabel : function(dom_id) {
    var idx = $.inArray(dom_id, RPEOnePage.FIELDS);
    return (RPEOnePage.LABELS[idx] || 'Loading');
  }
  
};