172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/**
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @fileoverview This implements a tab control.
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * An individual tab within a tab control is, unsurprisingly, a Tab.
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Tabs must be explicitly added/removed from the control.
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Tab titles are based on the label attribute of each child:
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * <div>
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * <div label='Tab 1'>Hello</div>
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * <div label='Tab 2'>World</div>
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * </div>
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Results in:
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * ---------------
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * | Tab1 | Tab2 |
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * | ---------------------------------------
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * | Hello World |
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * -----------------------------------------
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsencr.define('gpu', function() {
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /**
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * Creates a new tab element. A tab element is one of multiple tabs
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * within a TabControl.
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @constructor
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @param {Object=} opt_propertyBag Optional properties.
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @extends {HTMLDivElement}
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   */
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var Tab = cr.ui.define('div');
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Tab.prototype = {
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    __proto__: HTMLDivElement.prototype,
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    decorate: function() {
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  };
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /**
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * Title for the tab.
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @type {String}
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   */
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  cr.defineProperty(Tab, 'label', cr.PropertyKind.ATTR);
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /**
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * Whether the item is selected.
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @type {boolean}
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   */
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  cr.defineProperty(Tab, 'selected', cr.PropertyKind.BOOL_ATTR);
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /**
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * Creates a new tab button element in the tabstrip
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @constructor
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @param {Object=} opt_propertyBag Optional properties.
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @extends {HTMLDivElement}
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   */
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var TabButton = cr.ui.define('a');
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabButton.prototype = {
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    __proto__: HTMLAnchorElement.prototype,
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    decorate: function() {
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.classList.add('tab-button');
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.onclick = function() {
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (this.tab_)
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          this.parentNode.parentNode.selectedTab = this.tab_;
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }.bind(this);
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    get tab() {
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return this.tab_;
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    set tab(tab) {
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (this.tab_)
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        throw Error('Cannot set tab once set.');
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tab_ = tab;
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tab_.addEventListener('titleChange', this.onTabChanged_.bind(this));
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tab_.addEventListener('selectedChange',
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 this.onTabChanged_.bind(this));
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.onTabChanged_();
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    onTabChanged_: function(e) {
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (this.tab_) {
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this.textContent = this.tab_.label;
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this.selected = this.tab_.selected;
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  };
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /**
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * Whether the TabButton is selected.
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @type {boolean}
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   */
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  cr.defineProperty(TabButton, 'selected', cr.PropertyKind.BOOL_ATTR);
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  /**
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * Creates a new tab control element.
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @param {Object=} opt_propertyBag Optional properties.
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @constructor
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   * @extends {HTMLDivElement}
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   */
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var TabControl = cr.ui.define('div');
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabControl.prototype = {
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    __proto__: HTMLDivElement.prototype,
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    selectedTab_: null,
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Initializes the tab control element.
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Any child elements pre-existing on the element will become tabs.
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    decorate: function() {
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.classList.add('tab-control');
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tabStrip_ = this.ownerDocument.createElement('div');
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tabStrip_.classList.add('tab-strip');
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tabs_ = this.ownerDocument.createElement('div');
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tabs_.classList.add('tabs');
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.insertBefore(this.tabs_, this.firstChild);
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.insertBefore(this.tabStrip_, this.firstChild);
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.boundOnTabSelectedChange_ = this.onTabSelectedChange_.bind(this);
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Reparent existing tabs to the tabs_ div.
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      while (this.children.length > 2)
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this.addTab(this.children[2]);
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Adds an element to the tab control.
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    addTab: function(tab) {
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (tab.parentNode == this.tabs_)
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        throw Error('Tab is already part of this control.');
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (!(tab instanceof Tab))
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        throw Error('Provided element is not instanceof Tab.');
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tabs_.appendChild(tab);
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab.addEventListener('selectedChange', this.boundOnTabSelectedChange_);
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      var button = new TabButton();
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      button.tab = tab;
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab.tabStripButton_ = button;
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tabStrip_.appendChild(button);
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (this.tabs_.length == 1)
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this.tabs_.children[0].selected = true;
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Removes a tab from the tab control.
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * changing the selected tab if needed.
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    removeTab: function(tab) {
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (tab.parentNode != this.tabs_)
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        throw new Error('Tab is not attached to this control.');
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab.removeEventListener('selectedChange', this.boundOnTabSelectedChange_);
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (this.selectedTab_ == tab) {
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (this.tabs_.children.length) {
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          this.tabs_.children[0].selected = true;
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        } else {
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          this.selectedTab_ = undefined;
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        }
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.tabs_.removeChild(tab);
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab.tabStripButton_.parentNode.removeChild(
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          tab.tabStripButton_);
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Gets the currently selected tab element.
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    get selectedTab() {
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return this.selectedTab_;
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Sets the currently selected tab element.
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    set selectedTab(tab) {
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (tab.parentNode != this.tabs_)
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        throw Error('Tab is not part of this TabControl.');
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab.selected = true;
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Hides the previously selected tab element and dispatches a
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * 'selectedTabChanged' event.
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    onTabSelectedChange_: function(e) {
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      var tab = e.target;
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (!e.newValue) {
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        // Usually we can ignore this event, as the tab becoming unselected
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        // needs no corrective action. However, if the currently selected
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        // tab is deselected, we do need to do some work.
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (tab == this.selectedTab_) {
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          var previousTab = this.selectedTab_;
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          var newTab;
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          for (var i = 0; i < this.tabs_.children.length; ++i) {
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            if (this.tabs_.children[i] != tab) {
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              newTab = this.tabs_.children[i];
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              break;
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            }
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          }
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          if (newTab) {
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            newTab.selected = true;
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          } else {
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            this.selectedTab_ = undefined;
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            cr.dispatchPropertyChange(
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                this, 'selectedTab', this.selectedTab_, previousTab);
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          }
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        }
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      } else {
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        var previousTab = this.selectedTab_;
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        this.selectedTab_ = tab;
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (previousTab)
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          previousTab.selected = false;
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        cr.dispatchPropertyChange(
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            this, 'selectedTab', this.selectedTab_, previousTab);
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    },
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Returns an array of all the tabs within this control.  This is
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * not the same as this.children because the actual tab elements are
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * attached to the tabs_ element.
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    get tabs() {
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return Array.prototype.slice.call(this.tabs_.children);
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  };
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return {
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Tab: Tab,
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TabControl: TabControl
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  };
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen});
251