$(function() {
  Configurator = {
    initialize: function() {
      $('.textbox', Context.configurator_form).numeric();
      $('.textbox', Context.configurator_form).change(Configurator.update_url);
    },
    update_savings: function() {
      var num_users = parseInt($('.textbox', Context.office_users).val());
      var num_locations = parseInt($('.textbox', Context.office_locations).val());
      Configurator.savings = Calculator.savings_for(num_users, num_locations);
      $('#monthly_payment_items .savings_value').text(Configurator.savings + '%');
    },
    update_url: function() {
      var url = '#';
      $.each(Context.all_sections, function(i, e) {
        url += '/' + e + ',' + $('#' + e + ' .textbox').val();
      });
      window.location = url;
    },
    update_monthly_items: function(id, description, value, suffix) {
      var entry = $(id, Context.monthly_payment_items);
      if (value > 0) {
        if (value != 1) description += 's';
        if (suffix != undefined) description += ' ' + suffix;
        entry.text(value + ' ' + description).show();
      } else entry.hide();
    },
    update_equipment_list: function(id, description, value, suffix) {
      var entry = $(id, Context.one_time_payment_items);
      if (value > 0) {
        if (value != 1) description += 's';
        if (suffix != undefined) description += ' ' + suffix;
        entry.text(value + ' ' + description).show();
      } else entry.hide();
    },
    set_office_users: function(value) {
      var context = Context.office_users;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      var rate = Calculator.office_users_rate(value);
      $('.rate', context).text(rate);
      $('.value', context).text(rate).format();
      $('#office_users_count', Context.monthly_payment_items).text(value);
      Configurator.update_savings();
    },
    set_shared_spaces: function(value) {
      var context = Context.shared_spaces;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      $('.value', context).text(Calculator.shared_spaces_rate(value));
      Configurator.update_monthly_items('#shared_spaces_count', 'Shared Space', value);
    },
    set_local_numbers: function(value) {
      var context = Context.local_numbers;
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      $('.value', context).text(Calculator.local_numbers_rate(value));
      Configurator.update_monthly_items('#local_numbers_count', 'Additional Local Phone Number', value);
    },
    set_toll_free_numbers: function(value) {
      var context = Context.toll_free_numbers;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      $('.value', context).text(Calculator.toll_free_numbers_rate(value));
      Configurator.update_monthly_items('#toll_free_numbers_count', 'Additional Toll Free Number', value);
    },
    set_office_locations: function(value) {
      var context = Context.office_locations;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      $('.value', context).text(Calculator.office_locations_rate(value));
      Configurator.update_monthly_items('#office_locations_count', 'Additional QoS box rental', value, '(for additional locations)');
      Configurator.update_savings();
    },
    set_softphones: function(value) {
      var context = Context.softphones;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      $('.value', context).text(Calculator.softphones_rate(value));
      Configurator.update_equipment_list('#softphones_count', 'Software phone', value);
    },
    set_exec_phones: function(value) {
      var context = Context.exec_phones;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      var rate = Calculator.exec_phones_rate(value);
      $('.rate', context).text(rate);
      $('.value', context).text(rate).format();
      Configurator.update_equipment_list('#exec_phones_count', 'Polycom Exec/Attendant Phone', value, '(shipping & power supply included)');
    },
    set_standard_phones: function(value) {
      var context = Context.standard_phones;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      var rate = Calculator.standard_phones_rate(value);
      $('.rate', context).text(rate);
      $('.value', context).text(rate).format();
      Configurator.update_equipment_list('#standard_phones_count', 'Polycom Standard Phone', value, '(shipping & power supply included)');
    },
    set_economy_phones: function(value) {
      var context = Context.economy_phones;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      var rate = Calculator.economy_phones_rate(value);
      $('.rate', context).text(rate);
      $('.value', context).text(rate).format();
      Configurator.update_equipment_list('#economy_phones_count', 'Polycom Economy Phone', value, '(shipping & power supply included)');
    },
    set_conference_phones: function(value) {
      var context = Context.conference_phones;
      value = Configurator.bounded_value(context, value);
      if ($('.slider', context).size() > 0) $('.slider', context).slider('value', value);
      $('.textbox', context).val(value);
      var rate = Calculator.conference_phones_rate(value);
      $('.rate', context).text(rate);
      $('.value', context).text(rate).format();
      Configurator.update_equipment_list('#conference_phones_count', 'Polycom Soundstation Conference Phone', value, '(shipping & power supply included)');
    },
    bounded_value: function(context, value) {
      if ($('.slider', context).size() > 0) {
        var min = $('.slider', context).slider('option', 'min');
        var max = $('.slider', context).slider('option', 'max');
        if (value > max) value = max;
        if (value < min) value = min;
      }
      return value;
    },
    recalculate_monthly_total: function() {
      var total = parseInt($('.rate', Context.office_users).text()) +
        parseInt($('.value', Context.shared_spaces).text()) +
        parseInt($('.value', Context.local_numbers).text()) +
        parseInt($('.value', Context.toll_free_numbers).text()) +
        parseInt($('.value', Context.office_locations).text());
      $('.section_totals .monthly .value', Context.monthly_payment_items).text(total).format();
    },
    recalculate_one_time_total: function() {
      var total = parseInt($('.value', Context.softphones).text()) +
        parseInt($('.rate', Context.exec_phones).text()) +
        parseInt($('.rate', Context.standard_phones).text()) +
        parseInt($('.rate', Context.economy_phones).text()) +
        parseInt($('.rate', Context.conference_phones).text());
      $('.section_totals .one_time .value', Context.one_time_payment_items).text(total).format(); 
    }
  }
});