// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;
  var Preferences = options.Preferences;

  /////////////////////////////////////////////////////////////////////////////
  // ProxyOptions class:

  /**
   * Encapsulated handling of ChromeOS proxy options page.
   * @constructor
   */
  function ProxyOptions(model) {
    OptionsPage.call(this, 'proxy', localStrings.getString('proxyPage'),
                     'proxyPage');
  }

  cr.addSingletonGetter(ProxyOptions);

  /**
   * UI pref change handler.
   */
  function handlePrefUpdate(e) {
    ProxyOptions.getInstance().updateControls();
  }

  /**
   * Monitor pref change of given element.
   */
  function observePrefsUI(el) {
    Preferences.getInstance().addEventListener(el.pref, handlePrefUpdate);
  }

  ProxyOptions.prototype = {
    // Inherit ProxyOptions from OptionsPage.
    __proto__: OptionsPage.prototype,

    /**
     * Initializes ProxyOptions page.
     */
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      // Set up ignored page.
      options.proxyexceptions.ProxyExceptions.decorate($('ignoredHostList'));

      this.addEventListener('visibleChange', this.handleVisibleChange_);
      $('removeHost').addEventListener('click', this.handleRemoveExceptions_);
      $('addHost').addEventListener('click', this.handleAddException_);
      $('directProxy').addEventListener('click', this.disableManual_);
      $('manualProxy').addEventListener('click', this.enableManual_);
      $('autoProxy').addEventListener('click', this.disableManual_);
      $('proxyAllProtocols').addEventListener('click', this.toggleSingle_);

      observePrefsUI($('directProxy'));
      observePrefsUI($('manualProxy'));
      observePrefsUI($('autoProxy'));
      observePrefsUI($('proxyAllProtocols'));
    },

    proxyListInitalized_: false,

    /**
     * Update controls state.
     * @public
     */
    updateControls: function() {
      this.toggleSingle_();
      if ($('manualProxy').checked) {
        this.enableManual_();
      } else {
        this.disableManual_();
      }
      if (!this.proxyListInitalized_ && this.visible) {
        this.proxyListInitalized_ = true;
        $('ignoredHostList').redraw();
      }
    },

    /**
     * Handler for OptionsPage's visible property change event.
     * @private
     * @param {Event} e Property change event.
     */
    handleVisibleChange_: function(e) {
      this.updateControls();
    },

    /**
     * Handler for when the user clicks on the checkbox to allow a
     * single proxy usage.
     * @private
     * @param {Event} e Click Event.
     */
    toggleSingle_: function(e) {
      if($('proxyAllProtocols').value) {
        $('multiProxy').style.display = 'none';
        $('singleProxy').style.display = 'block';
      } else {
        $('multiProxy').style.display = 'block';
        $('singleProxy').style.display = 'none';
      }
    },

    /**
     * Handler for selecting a radio button that will disable the manual
     * controls.
     * @private
     * @param {Event} e Click event.
     */
    disableManual_: function(e) {
      $('proxyAllProtocols').disabled = true;
      $('proxyHostName').disabled = true;
      $('proxyHostPort').disabled = true;
      $('proxyHostSingleName').disabled = true;
      $('proxyHostSinglePort').disabled = true;
      $('secureProxyHostName').disabled = true;
      $('secureProxyPort').disabled = true;
      $('ftpProxy').disabled = true;
      $('ftpProxyPort').disabled = true;
      $('socksHost').disabled = true;
      $('socksPort').disabled = true;
      $('newHost').disabled = true;
      $('removeHost').disabled = true;
      $('addHost').disabled = true;
      $('advancedConfig').style.display = 'none';
    },

    /**
     * Handler for selecting a radio button that will enable the manual
     * controls.
     * @private
     * @param {Event} e Click event.
     */
    enableManual_: function(e) {
      $('proxyAllProtocols').disabled = false;
      $('proxyHostName').disabled = false;
      $('proxyHostPort').disabled = false;
      $('proxyHostSingleName').disabled = false;
      $('proxyHostSinglePort').disabled = false;
      $('secureProxyHostName').disabled = false;
      $('secureProxyPort').disabled = false;
      $('ftpProxy').disabled = false;
      $('ftpProxyPort').disabled = false;
      $('socksHost').disabled = false;
      $('socksPort').disabled = false;
      $('newHost').disabled = false;
      $('removeHost').disabled = false;
      $('addHost').disabled = false;
      $('advancedConfig').style.display = '-webkit-box';
      $('ignoredHostList').redraw();
    },

    /**
     * Handler for "add" event fired from userNameEdit.
     * @private
     * @param {Event} e Add event fired from userNameEdit.
     */
    handleAddException_: function(e) {
      var exception = $('newHost').value;
      $('newHost').value = '';

      exception = exception.trim();
      if (exception)
        $('ignoredHostList').addException(exception);
    },

    /**
     * Handler for when the remove button is clicked
     * @private
     */
    handleRemoveExceptions_: function(e) {
      var selectedItems = $('ignoredHostList').selectedItems;
      for (var x = 0; x < selectedItems.length; x++) {
        $('ignoredHostList').removeException(selectedItems[x]);
      }
    }
  };

  // Export
  return {
    ProxyOptions: ProxyOptions
  };

});