text: // 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.
  
  /**
   * @fileoverview The recently closed menu: button, model data, and menu.
   */
  
  cr.define('ntp4', function() {
    'use strict';
  
    var localStrings = new LocalStrings();
  
    /**
     * Returns the text used for a recently closed window.
     * @param {number} numTabs Number of tabs in the window.
     * @return {string} The text to use.
     */
    function formatTabsText(numTabs) {
      if (numTabs == 1)
        return localStrings.getString('closedwindowsingle');
      return localStrings.getStringF('closedwindowmultiple', numTabs);
    }
  
    var Menu = cr.ui.Menu;
    var MenuItem = cr.ui.MenuItem;
    var MenuButton = cr.ui.MenuButton;
    var RecentMenuButton = cr.ui.define('button');
  
    RecentMenuButton.prototype = {
      __proto__: MenuButton.prototype,
  
      decorate: function() {
        MenuButton.prototype.decorate.call(this);
        this.menu = new Menu;
        cr.ui.decorate(this.menu, Menu);
        this.menu.classList.add('recent-menu');
        document.body.appendChild(this.menu);
  
        this.needsRebuild_ = true;
        this.hidden = true;
      },
  
      /**
       * Shows the menu, first rebuilding it if necessary.
       * TODO(estade): the right of the menu should align with the right of the
       * button.
       * @override
       */
      showMenu: function() {
        if (this.needsRebuild_) {
          this.menu.textContent = '';
          this.dataItems_.forEach(this.addItem_, this);
          this.needsRebuild_ = false;
        }
  
        MenuButton.prototype.showMenu.call(this);
      },
  
      /**
       * Sets the menu model data.
       * @param {Array} dataItems Array of objects that describe the apps.
       */
      set dataItems(dataItems) {
        this.dataItems_ = dataItems;
        this.needsRebuild_ = true;
        this.hidden = dataItems.length == 0;
      },
  
      /**
       * Adds an app to the menu.
       * @param {Object} data An object encapsulating all data about the app.
       * @private
       */
      addItem_: function(data) {
        var isWindow = data.type == 'window';
        var a = this.ownerDocument.createElement('a');
        a.className = 'recent-menu-item';
        if (isWindow) {
          a.href = '';
          a.classList.add('recent-window');
          a.textContent = formatTabsText(data.tabs.length);
        } else {
          a.href = data.url;
          a.style.backgroundImage = 'url(chrome://favicon/' + data.url + ')';
          a.textContent = data.title;
          // TODO(estade): add app ping url.
        }
  
        function onActivate(e) {
          // TODO(estade): don't convert to string.
          chrome.send('reopenTab', [String(data.sessionId)]);
          e.preventDefault();
        }
        a.addEventListener('activate', onActivate);
  
        this.menu.appendChild(a);
        cr.ui.decorate(a, MenuItem);
      },
    };
  
    return {
      RecentMenuButton: RecentMenuButton,
    };
  });
  