document.observe("dom:loaded", initialise_price_comparison_form);

//var enable_usage_from_bill = (location.search.toQueryParams().bill == "true");
var enable_slider = (location.search.toQueryParams().slider == "true");


// List of form components that will be displayed / hidden depending on the state of the form
var form_components =  [
  'location_container',
  'supplier_tariff_usage_container',
  'adjust_usage_container',
  'register_ratio_container',
  'results_container',
  'negative_result',
  'positive_result',
  'other_results_blurb',
  'results_footer',
  'customer_type_warning',
  'location_warning',
  'positive_results_disclaimer',
  'negative_results_disclaimer',
  'savings_guarantee_link'
];

// List of error fields that will be cleared on form state changes
var error_fields = [
  'location-error-text',
  'supplier-error-text',
  'tariff-error-text',
  'usage-error-text'
];

// All form states and their behaviour
var target_state = null;
var savings_calculator_state = 'initial';
var form_states = {
  'initial': {
    'show_components': ['location_container'],
    'on_change':       ['build_locations'],
    'reset':           ['supplier', 'tariff', 'usage', 'register_ratio'],
    'clear_errors':    true
  },
  
  'business_selected': {
    'show_components': ['customer_type_warning'],
    'clear_errors':    true    
  },

  'location_selected': {
    'show_components': ['location_container', 'supplier_tariff_usage_container'],
    'on_change':       ['build_suppliers', 'set_location_cookie'],
    'reset':           ['tariff', 'usage'],
    'disable':         ['tariff', 'usage'],
    'clear_errors':    true
   },

  'supplier_selected': {
    'show_components': ['location_container', 'supplier_tariff_usage_container'],
    'on_change':       ['build_tariffs'],
    'enable':          ['tariff'],
    'reset':           ['usage'],
    'disable':         ['usage'],
    'clear_errors':    true
  },

  'other_supplier': {
    'show_components': ['location_container', 'supplier_tariff_usage_container'],
    'on_change':       ['build_tariffs'],
    'reset':           ['tariff','usage'],
    'enable':          ['tariff','usage'],
    'clear_errors':    true
  },  
  
  'tariff_selected': {
    'show_components': ['location_container', 'supplier_tariff_usage_container'],
    'on_change':       ['build_usage', 'set_tariff_cookie'],
    'enable':          ['usage'],
    'reset':           ['usage'],
    'disable':         [],
    'clear_errors':    true
  },
      
  'usage_selected': {
    'show_components': ['location_container', 'supplier_tariff_usage_container'],
    'on_change':       ['reset_annual_usage', 'reset_register_ratio'],
    'enable':          [],
    'reset':           []
  },

  'price_calculated': {
    'show_components': ['location_container', 'supplier_tariff_usage_container', 'results_container', 'results_footer', 'adjust_usage_container', 'positive_result', 'positive_results_disclaimer', 'savings_guarantee_link'],
    'on_change':       ['toggle_slider'],
    'clear_errors':    true
  },
  'negative_price_calculated': {
    'show_components': ['location_container', 'supplier_tariff_usage_container', 'results_container', 'results_footer', 'adjust_usage_container', 'negative_result', 'negative_results_disclaimer'],
    'on_change':       ['toggle_slider'],
    'clear_errors':    true
  },
  'other_price_calculated': {
    'show_components': ['location_container', 'supplier_tariff_usage_container', 'results_container', 'other_results_blurb'],
    'on_change':       [],
    'clear_errors':    true
  },
  'other_location': {
    'show_components': ['location_container','location_warning'],
    'clear_errors':    true
  }

};


function initialise_price_comparison_form() {
  if($('price_comparison_form') == null) {
    return;
  }

  $$("#customer_type_container input[type=radio]").each(function(element) { element.observe("click", customer_type_selected); }); 

  $("location").observe("change", location_selected);
  $("location").observe("focus", show_help);
  $("location").observe("blur", hide_help);
  
  $("supplier").observe("change", supplier_selected);
  $("supplier").observe("focus", show_help);
  $("supplier").observe("blur", hide_help);

  $("tariff").observe("change", tariff_selected);
  $("tariff").observe("focus", show_help);
  $("tariff").observe("blur", hide_help);

  $("usage").observe("change", usage_selected);
  $("usage").observe("focus", show_help);
  $("usage").observe("blur", hide_help);

  $("calculate").observe("click", function(e) {
    calculate_prices();
    
    // Prevent the navigation to the link href
    Event.stop(e);
  });

  $("start_over_1").observe("click", function() {
    state_change('initial', false);
  });

  $("annual_usage").observe("change", validate_annual_usage);
  $("increase_annual_usage").observe("click", function() {
    change_annual_usage(500);
  });
  $("decrease_annual_usage").observe("click", function() {
    change_annual_usage(-500);
  });

  set_up_savings_guarantee_link();

	if(enable_slider) {
	  var slider_element = $("slider");
		register_ratio_slider = new Control.Slider(slider_element.down(".handle"), slider_element, {
      range: $R(0.2, 0.8), 
      sliderValue: 0.4,
		  values: [0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7],
		  alignY: -5,
		  onChange: change_register_ratio
		});	
	}
  
  state_change('initial', false);
}

function state_change(state, show_savings_guarantee_link) {
  target_state = state;
  if(form_states[state]['clear_errors']) {
    clear_error_messages();  
  }

  for(var i = 0 ; i < form_components.length ; i++) {
    if(form_states[state]["show_components"].indexOf(form_components[i]) >= 0) {
      if (form_components[i] == 'savings_guarantee_link' && savings_guarantee["link"]) {
        if (show_savings_guarantee_link){
          $(form_components[i]).show();
        }
      } else {
        $(form_components[i]).show();
      }
    } else {
      $(form_components[i]).hide();
    }
  }
  
  if(form_states[state]['reset']) {
    for(var i = 0 ; i < form_states[state]['reset'].length ; i++) {
      var element = $(form_states[state]['reset'][i]);

      if(element.nodeName == 'SELECT') {
        var options = '<option value="" selected="true"></option>';
        element.innerHTML = "";
        element.insert(options);
      }
      
      element.value = "";
    }
  }
  
  if(form_states[state]['on_change']) {
    for(var i = 0 ; i < form_states[state]['on_change'].length ; i++) {
      eval(form_states[state]['on_change'][i] + "();");
    }  
  }

  if(form_states[state]['disable']) {
    for(var i = 0 ; i < form_states[state]['disable'].length ; i++) {
      var element = $(form_states[state]['disable'][i]);
      element.disabled = true;
    }  
  }

  if(form_states[state]['enable']) {
    for(var i = 0 ; i < form_states[state]['enable'].length ; i++) {
      var element = $(form_states[state]['enable'][i]);
      element.disabled = false;
    }  
  }
  savings_calculator_state = state;
  target_state = null;
}


function set_up_savings_guarantee_link() {
  if (savings_guarantee["link"]) {
    $("savings_guarantee_link").innerHTML = savings_guarantee["link"];
  }
}

function customer_type_selected() {
  if($("customer_type_residential").checked) {
    state_change("initial", false);
  } else {
    state_change("business_selected", false);
  }
}

function build_locations() {
  var location_options = '<option value="" selected="selected">Select your area</option>';
  var location_names = [];
  $H(network_areas).each(function(network_area) {
      location_names[location_names.length] = network_area.value.name;
  });
  location_names = location_names.sort();
  
  
  location_names.each(function(location_name) {
    $H(other_supplier_tariffs).each(function(location) {
      var network_area = network_areas[location.key];
      if(network_area != null && network_area.name == location_name) {
          location_options += '<option value="' + location.key + '">' + location_name + '</option>';
      }
    });    
  });
  
  location_options += '<option value="other">Other</option>';

  var location_element = $('location');
  location_element.innerHTML = '';
  location_element.insert(location_options);
  location_element.value = "";
  
}

function build_suppliers() {
  var location = $F('location');
  
  var supplier_options = '<option value="" selected="selected">Select your supplier</option>';
  
  var suppliers = [];
  $H(other_supplier_tariffs[location]).each(function(supplier) {
    suppliers[suppliers.length] = supplier.key;
  });

  $A(suppliers).sort().each(function(supplier) {
    if (supplier!="") {    
       supplier_options += '<option>' + supplier + '</option>';
        }
  });

  var supplier_element = $('supplier');
  supplier_element.innerHTML = "";
  supplier_element.insert(supplier_options);
  supplier_element.value = "";  
}

function build_tariffs() {
  var location = $F('location');
  var supplier = $F('supplier');
  
  var tariffs = [];
  $H(other_supplier_tariffs[location][supplier]).each(function(tariff) {
    tariffs[tariffs.length] = tariff.key;
  });

  var tariff_options = '<option value="" selected="selected">Select your plan</option>';

  $A(tariffs).sort().each(function(tariff) {
    if (tariff != "") {
       tariff_options += '<option>' + tariff + '</option>';
        }
  });
  
  var tariff_element = $('tariff');
  tariff_element.innerHTML = "";
  tariff_element.insert(tariff_options);
  tariff_element.value = "";
}

function build_usage() {
  var low_consumption_band = current_low_consumption_band();
  var medium_consumption_band = current_medium_consumption_band();
  var high_consumption_band = current_high_consumption_band();

  var usage_element = $('usage');
  var usage_options = '<option value="" selected="selected">Select your usage</option><option value="'+low_consumption_band+'">Less than $120/Month</option><option value="'+medium_consumption_band+'">Between $120 and $200/Month</option><option value="'+high_consumption_band+'">More than $200/Month</option>';
  usage_element.innerHTML = "";
  usage_element.insert(usage_options);
  usage_element.value = "";  
}

function set_location_cookie() {
  var location = $F('location');
  Cookie.setData("location", location);
}

function set_tariff_cookie() {
  var location = $F('location');
  var supplier = $F('supplier');
    var tariff =   $F('tariff');
    var supplier_tariff = other_supplier_tariffs[location][supplier][tariff];    
    Cookie.setData("tariff", supplier_tariff[2] + (supplier_tariff[5] || ""));
}

function set_unit_price_cookie(unit_price) {
  Cookie.setData("unit_price", unit_price);
}

function reset_annual_usage() {
  $('annual_usage').value = "";
}

function reset_register_ratio() {
  $("register_ratio").value = "";
}

function clear_error_messages() {
  for(var i = 0 ; i < error_fields.length ; i++) {
    var error_field = $(error_fields[i]);
    error_field.hide();
  }  
}


function location_selected() {
  if(savings_calculator_state == 'initial' && pageTracker) {
    pageTracker._trackPageview('/savings-calculator-started');
  }
  
  var location = $F('location');
  if(location == "") {
    state_change('initial', false);
  } else if(location == "other") {
    state_change('other_location', false);
  } else {
    state_change('location_selected', false);
  }
}

function supplier_selected() {
  var supplier = $F('supplier');
  if(supplier == "") {
    state_change("location_selected", false);
  } else {    
    state_change("supplier_selected", false);
  }
}

function tariff_selected() {
  var tariff = $F('tariff');

  if(tariff == "") {
    state_change("supplier_selected", false);
  } else {
    state_change("tariff_selected", false);
  }
}

function usage_selected() {
  var supplier = $F('supplier');
  var tariff = $F('tariff');
  var usage = $F('usage');
  
  if(usage == "") {
    state_change("tariff_selected", false);
  } else {
    state_change("usage_selected", false);
  }
}

function month_selected() {
  if ($F('month') == "") {
    state_change("tariff_selected", false);
  } else {
    state_change("month_selected", false);  
  }
}

function days_selected() {
  state_change("days_selected", false);  
}

function bill_total_selected() {
  state_change("bill_total_selected", false);
}

function check_price_comparison_form()
{
  clear_error_messages();
   
  var error_occurred = false;
  
  if ($F("location") == "")
  {
    $("location-error-text").show();
    error_occurred = true;
  }
  if ($F("supplier") == "")
  {
    $("supplier-error-text").show();
    error_occurred = true;
  }
  if ($F("tariff") == "" || $F("tariff") == "other")
  {
    $("tariff-error-text").show();
    error_occurred = true;
  }

  var usage = $F("usage");
  if (usage == "") {
    $("usage-error-text").show();
    error_occurred = true;
  }

  return !error_occurred;  
}

function calculate_usage() {  
  // If the user has provided a usage figure in bottom or top parts of the calculator, use that figure
  var usage = parseInt($F('annual_usage'));
  if(usage) {
    return usage;
  }
  
  usage = parseInt($F('usage'));
  if(usage) {
    $('annual_usage').value = usage;
    return usage;
  }
  
  $('annual_usage').value = current_lut();
  return current_lut();
}

function current_lut() {
  var location = $F('location');	
  return network_areas[location] && network_areas[location]["lut"] || 8000;
}

function current_minimum_units() {
  var location = $F('location');
  return network_areas[location] && network_areas[location]["minimum"] || 4000;
}

function current_low_consumption_band() {
  var location = $F('location');	
  return network_areas[location] && network_areas[location]["low_consumption"] || 6000;
}

function current_medium_consumption_band() {
  var location = $F('location');	
  return network_areas[location] && network_areas[location]["medium_consumption"] || current_lut();
}

function current_high_consumption_band() {
  var location = $F('location');	
  return network_areas[location] && network_areas[location]["high_consumption"] || 12000;
}

function calculate_prices() {
  if(!check_price_comparison_form()) {
    return false;
  }

  calc = new RetailPriceCalculator();
  calc.location_name          = $F('location');
  calc.supplier_name          = $F('supplier');
  calc.tariff_name            = $F('tariff');
  calc.register_ratio         = $F("register_ratio");
  calc.annual_consumption     = calculate_usage();
  calc.powershop_tariff_data  = powershop_tariffs;
  calc.competitor_tariff_data = other_supplier_tariffs;
  calc.network_areas_data     = network_areas;
  calc.calculate();

  $$("#price-calc .MeterType02").invoke(calc.registers.length >= 2 ? "show" : "hide");
  $$("#price-calc .MeterType03").invoke(calc.registers.length >= 3 ? "show" : "hide");
  //
  // Set the unit price cookie for use in the product details screen
  var average_unit_price = (calc.powershop.price / calc.annual_consumption * 100).toFixed(2)
  set_unit_price_cookie(average_unit_price);
  
  $$('#price-calc div.PowershopPrices div.MeterType01 span.MeterTypePrice').invoke("update", format_currency(calc.powershop.price));
  $$('#price-calc div.PowershopPrices div.MeterType01 span.MeterTypeDetails').invoke("update", calc.annual_consumption + ' kWh x ' + average_unit_price + 'c');
  
  $$('#price-calc span.PowershopAverageUnitPrice').invoke("update", average_unit_price);
  $$('#price-calc div.PowershopPrices div.TotalCharges span.TotalValue').invoke("update", format_currency(calc.powershop.price));
  $$('#price-calc span.kwh').invoke("update", calc.annual_consumption);
  $$('#price-calc span.as_at').invoke("update", tariffs_valid_as_at);

  $$('#price-calc #conditions').invoke("update", calc.competitor.tariff.conditions);
  $$('#price-calc div.Conditions').invoke(calc.competitor.tariff.conditions ? "show" : "hide");

  if (calc.supplier_name != "Other") {
    var savings = Math.abs(calc.competitor.price - calc.powershop.price);
    $$('#price-calc div.OldSupplierPrices span.SupplierName_Contact').invoke("update", calc.supplier_name);
    $$('#price-calc span.SupplerTotalValue').invoke("update", format_currency(calc.competitor.price));
    $$('#price-calc span.EstimatedSavings_Value').invoke("update", format_currency(savings));
    $$('#price-calc span.EstimatedSavings2_Value').invoke("update", format_currency(savings));

    $$('#price-calc span.DailyChargesPrice').invoke("update", format_currency(calc.competitor.annual_fixed_price));
    $$('#price-calc span.DailyChargesDetails').invoke("update", '365 Days x ' + (calc.competitor.annual_fixed_price / 365 * 100).toFixed(3) + 'c');

    $$('#price-calc span.SupplierAverageUnitPrice').invoke("update", (calc.competitor.price / calc.annual_consumption * 100).toFixed(2));
    
    $$('#price-calc span.ppd').invoke("update", calc.competitor.charge.ppd * 100);
  
    for (var register_number=0; register_number<calc.registers.length; register_number++) {
      var register = calc.registers[register_number];
      var price = calc.competitor.register_prices[register_number];
      var weighted_usage = register.weighting * calc.annual_consumption;
      
      css_base = '#price-calc span.SupplierMeter' + (register_number + 1) + 'Type';
      
      $$(css_base + 'Desc').invoke("update", register.description);
      $$(css_base + 'Price').invoke("update", format_currency(price));

      if (weighted_usage.toFixed(3) > 0) {
        $$(css_base + 'Details').invoke("update", weighted_usage.toFixed(0) +  ' kWh x ' +  (100 * price / weighted_usage).toFixed(3) + 'c');
      } else {
        $$(css_base + 'Details').invoke("update", "");
      }      
    }
    
    $$('#price-calc span.DailyChargesDesc').invoke("update", 'Daily Charges');

    if (calc.location_name == "VECT") {
      $("vector_rebate").show();
    } else {
      $("vector_rebate").hide();
    }
    
    $("total_fine_print").show();
  } else {
    $$('#price-calc div.OldSupplierPrices span.SupplierName_Contact').invoke("update", 'Other');  
    $$('#price-calc span.SupplerTotalValue').invoke("update", "");
    $$('#price-calc span.EstimatedSavings_Value').invoke("update", "");
    $$('#price-calc span.EstimatedSavings2_Value').invoke("update", "");
    
    $$('#price-calc span.DailyChargesPrice').invoke("update", "");
    $$('#price-calc span.DailyChargesDetails').invoke("update", "");
    
    $$('#price-calc span.SupplierAverageUnitPrice').invoke("update", "");
    
    $$('#price-calc span.ppd').invoke("update", "");

    for (var i=1; i<=3; i++) {
      $$('#price-calc span.SupplierMeter'+i+'TypeDesc').invoke("update", "");
      $$('#price-calc span.SupplierMeter'+i+'TypePrice').invoke("update", "");    
      $$('#price-calc span.SupplierMeter'+i+'TypeDetails').invoke("update", "");
    }
    
    $$('#price-calc span.DailyChargesDesc').invoke("update", "");
    
    $("vector_rebate").hide();

    $("total_fine_print").hide();    
  }
  
  var previous_state = savings_calculator_state;
  var target_state = null;
  
  if (calc.supplier_name == "Other") {
    target_state = "other_price_calculated";
    if(pageTracker) {
      pageTracker._trackPageview('/savings-calculator-other-selected');
    }

  } else if(calc.competitor.price >= calc.powershop.price) {
    target_state = "price_calculated";
  } else {
    target_state = "negative_price_calculated";
  }

  if (enable_slider && registers.length == 2) {
    var first_register_weighting = registers[0][2];
    if (first_register_weighting != parseFloat($F("register_ratio"))) {
      // Set the slider value
    	register_ratio_slider.trackLength = 120;
    	register_ratio_slider.setValue(first_register_weighting);
    }
    
    toggle_slider();
  }

  if (calc.supplier_name != "Other" && savings_guarantee["low"] && savings_guarantee["high"] && savings < savings_guarantee["high"] && savings > savings_guarantee["low"]) {
    show_savings_guarantee_link = true;
  } else {
    show_savings_guarantee_link = false;
  }
  if(previous_state != target_state) {
    state_change(target_state, show_savings_guarantee_link);    
  }

  if (calc.competitor.price) {
    if (calc.competitor.price >= calc.powershop.price) {
      var track_savings = savings.toFixed(2);
    }
    else {
      var track_savings = '-' + savings.toFixed(2);
    }

    var calcEstimate = $F('location') + "|" + $F('supplier') + "|" + $F('tariff') + "|" + usage + "|" + track_savings; 

    if(pageTracker) pageTracker._setCustomVar(3,'savings_calculator','-' + savings.toFixed(2), 1);
    if(pageTracker) pageTracker._setCustomVar(4,'savings_calculator_result','-' + calcEstimate, 1);
  }

  return false;
}

function getCookie(c_name)
{
var i,x,y,ARRcookies=document.cookie.split(";");
for (i=0;i<ARRcookies.length;i++)
{
  x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
  y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
  x=x.replace(/^\s+|\s+$/g,"");
  if (x==c_name)
    {
    return unescape(y);
    }
  }
}


function toggle_slider() {
  $('register_ratio_container').hide();
}

function change_annual_usage(amount) {
  var annual_usage = parseInt($F("annual_usage"));
  if (isNaN(annual_usage)) {
    return;
  } else {
      $("annual_usage").value = annual_usage + amount;
      validate_annual_usage();
  }
}

function validate_annual_usage() {
    var usage = parseInt($F("annual_usage"));
    
    var minimum = current_minimum_units();
    if(usage < minimum) {
        $("annual_usage").value = minimum;
    } else if(usage > 40000) {
        $("annual_usage").value = 40000;
    }
    
    calculate_prices();
}



function change_register_ratio(value) {
  register_ratio_element = $('register_ratio');
  if(register_ratio_element.value != value) {
    register_ratio_element.value = value;
    calculate_prices();    
  }
  
  $$('#price-calc span.RegisterRatioOne').invoke("update", Math.round(value * 100));
  $$('#price-calc span.RegisterRatioTwo').invoke("update", Math.round((1 - value) * 100));
}

// Toggles the white boxes containing the price break downs
function toggle_details() {
  $$("#price-calc div.total-details").invoke("toggle");
  $$("#price-calc a.show_details").invoke("toggle");
  
  $$("#price-calc .supplier-heading").each(function(element) {
    element.toggleClassName("supplier-heading-details");
  });
  return false;
}

function set_results_class() {
  if(target_state == "other_price_calculated") {
    $("results_container").addClassName("no-supplier-selected");
  } else {
    $("results_container").removeClassName("no-supplier-selected");
  }
}

function show_help() {
  $(this).adjacent("div.SelectSettingsHelp").invoke("show");
}

function hide_help() {
  $(this).adjacent("div.SelectSettingsHelp").invoke("hide");
}

function format_currency(amount) {
  return "$" + amount.toFixed(2);
}

