// Copyright (c) 2010 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.

/**
 * ButtonCommand class for small buttons on menu items.
 */
var ButtonCommand = cr.ui.define('div');

ButtonCommand.prototype = {
  __proto__: HTMLDivElement.prototype,

  /**
   * Decorate Button item.
   */
  decorate: function() {
  },

  /**
   * Changes the selection state of the menu item.
   * @param {boolean} selected True to set the selection, or false otherwise.
   */
  set selected(selected) {
    if (selected) {
      this.classList.add('selected');
      this.menu_.selectedItem = this;
    } else {
      this.classList.remove('selected');
    }
  },

  /**
   * Activate the menu item.
   */
  activate: function() {
    sendActivate(this.menu_.getMenuItemIndexOf(this),
                 'close_and_activate');
  },
};

/**
 * EditCommand implements Copy and Paste command.
 */
var EditCommand = cr.ui.define('div');

EditCommand.prototype = {
  __proto__: ButtonCommand.prototype,

  /**
   * Initialize the menu item.
   * @override
   */
  init: function(menu, attrs, model) {
    this.menu_ = menu;
    this.attrs = attrs;
    if (this.attrs.font) {
      this.style.font = attrs.font;
    }
    menu.addHandlers(this, this);
    if (attrs.command_id == menu.config_.IDC_COPY) {
      menu.addLabelTo(this, menu.config_.IDS_COPY, this,
                      false /* no mnemonic */);
    } else {
      menu.addLabelTo(this, menu.config_.IDS_PASTE, this,
                      false /* no mnemonic */);
    }
  },
};

/**
 * EditMenuItem which has Copy and Paste commands inside.
 */
var EditMenuItem = cr.ui.define('div');

EditMenuItem.prototype = {
  __proto__: MenuItem.prototype,

  /**
   * Initialize
   */
  decorate: function() {
    this.className = 'menu-item';
    this.label_ = document.createElement('div');
    this.label_.className = 'menu-label';
    this.cut_ = document.createElement('div');
    this.cut_.className = 'edit-button left-button';
    this.copy_ = new EditCommand();
    this.copy_.className = 'edit-button center-button';
    this.paste_ = new EditCommand();
    this.paste_.className = 'edit-button right-button';

    this.appendChild(this.label_);
    this.appendChild(this.cut_);
    this.appendChild(this.copy_);
    this.appendChild(this.paste_);
  },

  /**
   * Activates the command.
   * @override
   */
  activate: function() {
    sendActivate(this.menu_.getMenuItemIndexOf(this),
                 'close_and_activate');
  },

  /**
   * @override
   */
  set selected(selected) {
    if (selected) {
      this.cut_.classList.add('selected');
      this.menu_.selectedItem = this;
    } else {
      this.cut_.classList.remove('selected');
    }
  },

  /**
   * Initialize the edit items with configuration info.
   * @override
   */
  initMenuItem_: function() {
    this.label_.textContent =
        this.menu_.config_.IDS_EDIT2;
    if (this.attrs.font) {
      this.label_.style.font = this.attrs.font;
      this.cut_.style.font = this.attrs.font;
    }
    this.menu_.addLabelTo(
        this, this.menu_.config_.IDS_CUT, this.cut_,
        false /* no mnemonic */);
    this.menu_.addHandlers(this, this.cut_);
  },
};

/**
 * ZoomCommand class implements Zoom plus and fullscreen.
 */
var ZoomCommand = cr.ui.define('div');

ZoomCommand.prototype = {
  __proto__: ButtonCommand.prototype,

  /**
   * Initialize the menu item.
   * @override
   */
  init: function(menu, attrs, model) {
    this.menu_ = menu;
    this.attrs = attrs;
    menu.addHandlers(this, this);
    if (attrs.command_id == menu.config_.IDC_ZOOM_PLUS) {
      this.textContent = '+';
    }
    if (this.attrs.font) {
      this.style.font = attrs.font;
    }
  },

  /**
   * Activate zoom plus and full screen commands.
   * @override
   */
  activate: function() {
    sendActivate(this.menu_.getMenuItemIndexOf(this),
                 this.attrs.command_id == this.menu_.config_.IDC_ZOOM_PLUS ?
                 'activate_no_close' : 'close_and_activate');
  },
};

/**
 * ZoomMenuItem which has plus and fullscreen buttons inside.
 */
var ZoomMenuItem = cr.ui.define('div');

ZoomMenuItem.prototype = {
  __proto__: MenuItem.prototype,

  /**
   * Decorate Zoom button item.
   */
  decorate: function() {
    this.className = 'menu-item';

    this.label_ = document.createElement('div');
    this.label_.className = 'menu-label';
    this.minus_ = document.createElement('div');
    this.minus_.className = 'zoom-button left-button';
    this.minus_.textContent = '-';
    this.plus_ = new ZoomCommand();
    this.plus_.className = 'zoom-button right-button';
    this.percent_ = document.createElement('div');
    this.percent_.className = 'zoom-percent center-button';
    this.fullscreen_ = new ZoomCommand();
    this.fullscreen_.className = 'fullscreen';

    this.appendChild(this.label_);
    this.appendChild(this.minus_);
    this.appendChild(this.percent_);
    this.appendChild(this.plus_);
    this.appendChild(this.fullscreen_);
  },

  /**
   * Activates the cut command.
   * @override
   */
  activate: function() {
    sendActivate(this.menu_.getMenuItemIndexOf(this),
                 'activate_no_close');
  },

  /**
   * Updates zoom controls.
   * @params {JSON} params JSON object to configure zoom controls.
   */
  updateZoomControls: function(params) {
    this.attrs.enabled = params.plus;
    if (params.plus) {
      this.plus_.classList.remove('disabled');
    } else {
      this.plus_.classList.add('disabled');
    }
    this.attrs.enabled = params.minus;
    if (params.minus) {
      this.classList.remove('disabled');
    } else {
      this.classList.add('disabled');
    }
    this.percent_.textContent = params.percent;
  },

  /**
   * @override
   */
  set selected(selected) {
    if (selected) {
      this.minus_.classList.add('selected');
      this.menu_.selectedItem = this;
    } else {
      this.minus_.classList.remove('selected');
    }
  },

  /**
   * Initializes the zoom menu item with configuration info.
   * @override
   */
  initMenuItem_: function() {
    this.label_.textContent =
        this.menu_.config_.IDS_ZOOM_MENU2;
    this.menu_.addHandlers(this, this.minus_);

    if (this.attrs.font) {
      this.label_.style.font = this.attrs.font;
      this.minus_.style.font = this.attrs.font;
      this.percent_.style.font = this.attrs.font;
    }
  },
};

/**
 * WrenchMenu
 */
var WrenchMenu = cr.ui.define('div');

WrenchMenu.prototype = {
  __proto__: Menu.prototype,

  /**
   * Decorate Zoom button item.
   */
  decorate: function() {
    Menu.prototype.decorate.call(this);
    this.edit_ = new EditMenuItem();
    this.zoom_ = new ZoomMenuItem();
  },

  /**
   * Create a MenuItem for given {@code attrs}.
   * @override
   */
  createMenuItem: function(attrs) {
    switch(attrs.command_id) {
      case this.config_.IDC_CUT:
        return this.edit_;
      case this.config_.IDC_COPY:
        return this.edit_.copy_;
      case this.config_.IDC_PASTE:
        return this.edit_.paste_;
      case this.config_.IDC_ZOOM_MINUS:
        return this.zoom_;
      case this.config_.IDC_ZOOM_PLUS:
        return this.zoom_.plus_;
      case this.config_.IDC_FULLSCREEN:
        return this.zoom_.fullscreen_;
      default:
        return new MenuItem();
    }
  },

  updateZoomControls: function(params) {
    this.zoom_.updateZoomControls(params);
  },
};

function updateZoomControls(params) {
  var menu = document.getElementById('viewport');
  menu.updateZoomControls(params);
}