15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fileoverview User pod row implementation.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('login', function() {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Number of displayed columns depending on user pod count.
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @type {Array.<number>}
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @const
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var COLUMNS = [0, 1, 2, 3, 4, 5, 4, 4, 4, 5, 5, 6, 6, 5, 5, 6, 6, 6, 6];
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Whether to preselect the first pod automatically on login screen.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {boolean}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var PRESELECT_FIRST_POD = true;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Wallpaper load delay in milliseconds.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {number}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var WALLPAPER_LOAD_DELAY_MS = 500;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Wallpaper load delay in milliseconds. TODO(nkostylev): Tune this constant.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {number}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var WALLPAPER_BOOT_LOAD_DELAY_MS = 100;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Maximum time for which the pod row remains hidden until all user images
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * have been loaded.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {number}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var POD_ROW_IMAGES_LOAD_TIMEOUT_MS = 3000;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Public session help topic identifier.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @type {number}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @const
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var HELP_TOPIC_PUBLIC_SESSION = 3041033;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Oauth token status. These must match UserManager::OAuthTokenStatus.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @enum {number}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var OAuthTokenStatus = {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNKNOWN: 0,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INVALID_OLD: 1,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VALID_OLD: 2,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    INVALID_NEW: 3,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VALID_NEW: 4
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Tab order for user pods. Update these when adding new controls.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @enum {number}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var UserPodTabOrder = {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    POD_INPUT: 1,     // Password input fields (and whole pods themselves).
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HEADER_BAR: 2,    // Buttons on the header bar (Shutdown, Add User).
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ACTION_BOX: 3,    // Action box buttons.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PAD_MENU_ITEM: 4  // User pad menu items (Remove this user).
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Focus and tab order are organized as follows:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (1) all user pods have tab index 1 so they are traversed first;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (2) when a user pod is activated, its tab index is set to -1 and its
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     main input field gets focus and tab index 1;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (3) buttons on the header bar have tab index 2 so they follow user pods;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (4) Action box buttons have tab index 3 and follow header bar buttons;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (5) lastly, focus jumps to the Status Area and back to user pods.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'Focus' event is handled by a capture handler for the whole document
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and in some cases 'mousedown' event handlers are used instead of 'click'
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handlers where it's necessary to prevent 'focus' event from being fired.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Helper function to remove a class from given element.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!HTMLElement} el Element whose class list to change.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} cl Class to remove.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function removeClass(el, cl) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    el.classList.remove(cl);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Creates a user pod.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @extends {HTMLDivElement}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var UserPod = cr.ui.define(function() {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var node = $('user-pod-template').cloneNode(true);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    node.removeAttribute('id');
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return node;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Stops event propagation from the any user pod child element.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Event} e Event to handle.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  function stopEventPropagation(e) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Prevent default so that we don't trigger a 'focus' event.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    e.preventDefault();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    e.stopPropagation();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Unique salt added to user image URLs to prevent caching. Dictionary with
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * user names as keys.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @type {Object}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UserPod.userImageSalt_ = {};
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserPod.prototype = {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: HTMLDivElement.prototype,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decorate: function() {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.tabIndex = UserPodTabOrder.POD_INPUT;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxAreaElement.tabIndex = UserPodTabOrder.ACTION_BOX;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Mousedown has to be used instead of click to be able to prevent 'focus'
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // event later.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.addEventListener('mousedown',
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.handleMouseDown_.bind(this));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.signinButtonElement.addEventListener('click',
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.activate.bind(this));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxAreaElement.addEventListener('mousedown',
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 stopEventPropagation);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxAreaElement.addEventListener('click',
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.handleActionAreaButtonClick_.bind(this));
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxAreaElement.addEventListener('keydown',
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.handleActionAreaButtonKeyDown_.bind(this));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuRemoveElement.addEventListener('click',
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.handleRemoveCommandClick_.bind(this));
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuRemoveElement.addEventListener('keydown',
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.handleRemoveCommandKeyDown_.bind(this));
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuRemoveElement.addEventListener('blur',
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.handleRemoveCommandBlur_.bind(this));
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      if (this.actionBoxRemoveUserWarningButtonElement) {
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        this.actionBoxRemoveUserWarningButtonElement.addEventListener(
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            'click',
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            this.handleRemoveUserConfirmationClick_.bind(this));
162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Initializes the pod after its properties set and added to a pod row.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initialize: function() {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.passwordElement.addEventListener('keydown',
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.parentNode.handleKeyDown.bind(this.parentNode));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.passwordElement.addEventListener('keypress',
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.handlePasswordKeyPress_.bind(this));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.imageElement.addEventListener('load',
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.parentNode.handlePodImageLoad.bind(this.parentNode, this));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Resets tab order for pod elements to its initial state.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resetTabOrder: function() {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.tabIndex = UserPodTabOrder.POD_INPUT;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.mainInput.tabIndex = -1;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handles keypress event (i.e. any textual input) on password input.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Event} e Keypress Event object.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handlePasswordKeyPress_: function(e) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // When tabbing from the system tray a tab key press is received. Suppress
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // this so as not to type a tab character into the password field.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (e.keyCode == 9) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        e.preventDefault();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Gets signed in indicator element.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!HTMLDivElement}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get signedInIndicatorElement() {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.signed-in-indicator');
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Gets image element.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!HTMLImageElement}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get imageElement() {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.user-image');
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Gets name element.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!HTMLDivElement}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get nameElement() {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.name');
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Gets password field.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!HTMLInputElement}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get passwordElement() {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.password');
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Gets Caps Lock hint image.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!HTMLImageElement}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get capslockHintElement() {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.capslock-hint');
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Gets user signin button.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!HTMLInputElement}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get signinButtonElement() {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.signin-button');
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Gets action box area.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {!HTMLInputElement}
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get actionBoxAreaElement() {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.action-box-area');
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Gets user type icon area.
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @type {!HTMLInputElement}
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    get userTypeIconAreaElement() {
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return this.querySelector('.user-type-icon-area');
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Gets action box menu.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!HTMLInputElement}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get actionBoxMenuElement() {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.action-box-menu');
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * Gets action box menu title.
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * @type {!HTMLInputElement}
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     */
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    get actionBoxMenuTitleElement() {
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return this.querySelector('.action-box-menu-title');
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    },
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    /**
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Gets action box menu title, user name item.
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {!HTMLInputElement}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get actionBoxMenuTitleNameElement() {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.action-box-menu-title-name');
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Gets action box menu title, user email item.
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {!HTMLInputElement}
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get actionBoxMenuTitleEmailElement() {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.action-box-menu-title-email');
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Gets action box menu, remove user command item.
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {!HTMLInputElement}
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get actionBoxMenuCommandElement() {
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.action-box-menu-remove-command');
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Gets action box menu, remove user command item div.
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {!HTMLInputElement}
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get actionBoxMenuRemoveElement() {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.action-box-menu-remove');
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * Gets action box menu, remove user command item div.
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * @type {!HTMLInputElement}
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     */
316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    get actionBoxRemoveUserWarningElement() {
317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return this.querySelector('.action-box-remove-user-warning');
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    },
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    /**
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * Gets action box menu, remove user command item div.
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * @type {!HTMLInputElement}
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     */
324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    get actionBoxRemoveUserWarningButtonElement() {
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return this.querySelector(
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          '.remove-warning-button');
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    },
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    /**
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Updates the user pod element.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update: function() {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.imageElement.src = 'chrome://userimage/' + this.user.username +
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          '?id=' + UserPod.userImageSalt_[this.user.username];
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.nameElement.textContent = this.user_.displayName;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.signedInIndicatorElement.hidden = !this.user_.signedIn;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var needSignin = this.needGaiaSignin;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.passwordElement.hidden = needSignin;
341ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.signinButtonElement.hidden = !needSignin;
342ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
343ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.updateActionBoxArea();
344ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    },
345ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
346ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    updateActionBoxArea: function() {
347ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.actionBoxAreaElement.hidden = this.user_.publicAccount;
348ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.actionBoxMenuRemoveElement.hidden = !this.user_.canRemove;
349ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxAreaElement.setAttribute(
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'aria-label', loadTimeData.getStringF(
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              'podMenuButtonAccessibleName', this.user_.emailAddress));
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuRemoveElement.setAttribute(
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'aria-label', loadTimeData.getString(
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               'podMenuRemoveItemAccessibleName'));
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuTitleNameElement.textContent = this.user_.isOwner ?
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          loadTimeData.getStringF('ownerUserPattern', this.user_.displayName) :
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.user_.displayName;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuTitleEmailElement.textContent = this.user_.emailAddress;
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this.actionBoxMenuTitleEmailElement.hidden =
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          this.user_.locallyManagedUser;
36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuCommandElement.textContent =
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          loadTimeData.getString('removeUser');
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.passwordElement.setAttribute('aria-label', loadTimeData.getStringF(
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'passwordFieldAccessibleName', this.user_.emailAddress));
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.userTypeIconAreaElement.hidden = !this.user_.locallyManagedUser;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The user that this pod represents.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {!Object}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_: undefined,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get user() {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.user_;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set user(userDict) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.user_ = userDict;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.update();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Whether Gaia signin is required for this user.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get needGaiaSignin() {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Gaia signin is performed if the user has an invalid oauth token and is
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // not currently signed in (i.e. not the lock screen).
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Locally managed users never require GAIA signin.
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.user.oauthTokenStatus != OAuthTokenStatus.VALID_OLD &&
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.user.oauthTokenStatus != OAuthTokenStatus.VALID_NEW &&
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !this.user.signedIn && !this.user.locallyManagedUser;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Gets main input element.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {(HTMLButtonElement|HTMLInputElement)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get mainInput() {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!this.signinButtonElement.hidden)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return this.signinButtonElement;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return this.passwordElement;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Whether action box button is in active state.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {boolean}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    get isActionBoxMenuActive() {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.actionBoxAreaElement.classList.contains('active');
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set isActionBoxMenuActive(active) {
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (active == this.isActionBoxMenuActive)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (active) {
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this.actionBoxMenuRemoveElement.hidden = !this.user_.canRemove;
419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        if (this.actionBoxRemoveUserWarningElement)
420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          this.actionBoxRemoveUserWarningElement.hidden = true;
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Clear focus first if another pod is focused.
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!this.parentNode.isFocused(this)) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.parentNode.focusPod(undefined, true);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.actionBoxAreaElement.focus();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.actionBoxAreaElement.classList.add('active');
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.actionBoxAreaElement.classList.remove('active');
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Whether action box button is in hovered state.
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {boolean}
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get isActionBoxMenuHovered() {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.actionBoxAreaElement.classList.contains('hovered');
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set isActionBoxMenuHovered(hovered) {
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (hovered == this.isActionBoxMenuHovered)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (hovered) {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.actionBoxAreaElement.classList.add('hovered');
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.actionBoxAreaElement.classList.remove('hovered');
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Updates the image element of the user.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateUserImage: function() {
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UserPod.userImageSalt_[this.user.username] = new Date().getTime();
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.update();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Focuses on input element.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focusInput: function() {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var needSignin = this.needGaiaSignin;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.signinButtonElement.hidden = !needSignin;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.passwordElement.hidden = needSignin;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Move tabIndex from the whole pod to the main input.
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.tabIndex = -1;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.mainInput.focus();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Activates the pod.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return {boolean} True if activated successfully.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    activate: function() {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!this.signinButtonElement.hidden) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Switch to Gaia signin.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.showSigninUI();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (!this.passwordElement.value) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Oobe.disableSigninUI();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome.send('authenticateUser',
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    [this.user.username, this.passwordElement.value]);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Shows signin UI for this user.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    showSigninUI: function() {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.parentNode.showSigninUI(this.user.emailAddress);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Resets the input field and updates the tab order of pod controls.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {boolean} takeFocus If true, input field takes focus.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reset: function(takeFocus) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.passwordElement.value = '';
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (takeFocus)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.focusInput();  // This will set a custom tab order.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.resetTabOrder();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Handles a click event on action area button.
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} e Click event.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleActionAreaButtonClick_: function(e) {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.parentNode.disabled)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.isActionBoxMenuActive = !this.isActionBoxMenuActive;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Handles a keydown event on action area button.
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} e KeyDown event.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleActionAreaButtonKeyDown_: function(e) {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.disabled)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switch (e.keyIdentifier) {
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'Enter':
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'U+0020':  // Space
53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          if (this.parentNode.focusedPod_ && !this.isActionBoxMenuActive)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this.isActionBoxMenuActive = true;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.stopPropagation();
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'Up':
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'Down':
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (this.isActionBoxMenuActive) {
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this.actionBoxMenuRemoveElement.tabIndex =
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                UserPodTabOrder.PAD_MENU_ITEM;
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this.actionBoxMenuRemoveElement.focus();
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.stopPropagation();
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'U+001B':  // Esc
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.isActionBoxMenuActive = false;
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.stopPropagation();
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'U+0009':  // Tab
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.parentNode.focusPod();
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.isActionBoxMenuActive = false;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Handles a click event on remove user command.
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} e Click event.
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleRemoveCommandClick_: function(e) {
561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      if (this.user.locallyManagedUser || this.user.isDesktopUser) {
5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        this.showRemoveWarning_();
5637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return;
5647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (this.isActionBoxMenuActive)
5667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        chrome.send('removeUser', [this.user.username]);
5677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    },
5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    /**
5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * Shows remove warning for managed users.
5717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     */
5727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    showRemoveWarning_: function() {
5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      this.actionBoxMenuRemoveElement.hidden = true;
574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      this.actionBoxRemoveUserWarningElement.hidden = false;
5757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    },
5767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    /**
5787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * Handles a click event on remove user confirmation button.
5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * @param {Event} e Click event.
5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     */
5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    handleRemoveUserConfirmationClick_: function(e) {
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.isActionBoxMenuActive)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome.send('removeUser', [this.user.username]);
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Handles a keydown event on remove command.
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} e KeyDown event.
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleRemoveCommandKeyDown_: function(e) {
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.disabled)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switch (e.keyIdentifier) {
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'Enter':
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          chrome.send('removeUser', [this.user.username]);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.stopPropagation();
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'Up':
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'Down':
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.stopPropagation();
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'U+001B':  // Esc
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.actionBoxAreaElement.focus();
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.isActionBoxMenuActive = false;
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.stopPropagation();
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.actionBoxAreaElement.focus();
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.isActionBoxMenuActive = false;
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Handles a blur event on remove command.
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} e Blur event.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleRemoveCommandBlur_: function(e) {
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.disabled)
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.actionBoxMenuRemoveElement.tabIndex = -1;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handles mousedown event on a user pod.
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} e Mousedown event.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleMouseDown_: function(e) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.parentNode.disabled)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!this.signinButtonElement.hidden && !this.isActionBoxMenuActive) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.showSigninUI();
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Prevent default so that we don't trigger 'focus' event.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        e.preventDefault();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Creates a public account user pod.
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @constructor
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @extends {UserPod}
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var PublicAccountUserPod = cr.ui.define(function() {
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var node = UserPod();
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var extras = $('public-account-user-pod-extras-template').children;
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (var i = 0; i < extras.length; ++i) {
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var el = extras[i].cloneNode(true);
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      node.appendChild(el);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return node;
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  });
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PublicAccountUserPod.prototype = {
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    __proto__: UserPod.prototype,
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * "Enter" button in expanded side pane.
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {!HTMLButtonElement}
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get enterButtonElement() {
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.querySelector('.enter-button');
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Boolean flag of whether the pod is showing the side pane. The flag
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * controls whether 'expanded' class is added to the pod's class list and
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * resets tab order because main input element changes when the 'expanded'
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * state changes.
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {boolean}
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get expanded() {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.classList.contains('expanded');
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set expanded(expanded) {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.expanded == expanded)
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.resetTabOrder();
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.classList.toggle('expanded', expanded);
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var self = this;
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.classList.add('animating');
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.addEventListener('webkitTransitionEnd', function f(e) {
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.removeEventListener('webkitTransitionEnd', f);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.classList.remove('animating');
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Accessibility focus indicator does not move with the focused
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // element. Sends a 'focus' event on the currently focused element
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // so that accessibility focus indicator updates its location.
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (document.activeElement)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          document.activeElement.dispatchEvent(new Event('focus'));
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      });
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get needGaiaSignin() {
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get mainInput() {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.expanded)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return this.enterButtonElement;
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return this.nameElement;
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    decorate: function() {
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UserPod.prototype.decorate.call(this);
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.classList.remove('need-password');
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.classList.add('public-account');
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.nameElement.addEventListener('keydown', (function(e) {
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (e.keyIdentifier == 'Enter') {
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.parentNode.activatedPod = this;
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // Stop this keydown event from bubbling up to PodRow handler.
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.stopPropagation();
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // Prevent default so that we don't trigger a 'click' event on the
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // newly focused "Enter" button.
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          e.preventDefault();
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }).bind(this));
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var learnMore = this.querySelector('.learn-more');
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      learnMore.addEventListener('mousedown', stopEventPropagation);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      learnMore.addEventListener('click', this.handleLearnMoreEvent);
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      learnMore.addEventListener('keydown', this.handleLearnMoreEvent);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      learnMore = this.querySelector('.side-pane-learn-more');
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      learnMore.addEventListener('click', this.handleLearnMoreEvent);
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      learnMore.addEventListener('keydown', this.handleLearnMoreEvent);
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.enterButtonElement.addEventListener('click', (function(e) {
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.enterButtonElement.disabled = true;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome.send('launchPublicAccount', [this.user.username]);
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }).bind(this));
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Updates the user pod element.
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    update: function() {
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UserPod.prototype.update.call(this);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.side-pane-name').textContent =
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.user_.displayName;
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.info').textContent =
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          loadTimeData.getStringF('publicAccountInfoFormat',
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  this.user_.enterpriseDomain);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    focusInput: function() {
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Move tabIndex from the whole pod to the main input.
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.tabIndex = -1;
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT;
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.mainInput.focus();
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reset: function(takeFocus) {
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!takeFocus)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.expanded = false;
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.enterButtonElement.disabled = false;
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UserPod.prototype.reset.call(this, takeFocus);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    activate: function() {
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.expanded = true;
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.focusInput();
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleMouseDown_: function(e) {
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.parentNode.disabled)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.parentNode.focusPod(this);
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.parentNode.activatedPod = this;
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Prevent default so that we don't trigger 'focus' event.
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      e.preventDefault();
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Handle mouse and keyboard events for the learn more button.
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Triggering the button causes information about public sessions to be
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * shown.
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} event Mouse or keyboard event.
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleLearnMoreEvent: function(event) {
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switch (event.type) {
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Show informaton on left click. Let any other clicks propagate.
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'click':
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (event.button != 0)
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Show informaton when <Return> or <Space> is pressed. Let any other
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // key presses propagate.
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 'keydown':
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          switch (event.keyCode) {
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            case 13:  // Return.
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            case 32:  // Space.
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              break;
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            default:
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              return;
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome.send('launchHelpApp', [HELP_TOPIC_PUBLIC_SESSION]);
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      stopEventPropagation(event);
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch   * Creates a user pod to be used only in desktop chrome.
823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch   * @constructor
824ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch   * @extends {UserPod}
825ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch   */
826ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  var DesktopUserPod = cr.ui.define(function() {
827ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // Don't just instantiate a UserPod(), as this will call decorate() on the
828ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // parent object, and add duplicate event listeners.
829ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    var node = $('user-pod-template').cloneNode(true);
830ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    node.removeAttribute('id');
831ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return node;
832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  });
833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
834ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DesktopUserPod.prototype = {
835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    __proto__: UserPod.prototype,
836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
837ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    /** @override */
838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    decorate: function() {
839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      UserPod.prototype.decorate.call(this);
840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    },
841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    /** @override */
843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    focusInput: function() {
844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      var isLockedUser = this.user.needsSignin;
845ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.signinButtonElement.hidden = isLockedUser;
846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.passwordElement.hidden = !isLockedUser;
847ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
848ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      // Move tabIndex from the whole pod to the main input.
849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.tabIndex = -1;
850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT;
851ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.mainInput.focus();
852ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    },
853ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
854ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    /** @override */
855ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    update: function() {
856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      // TODO(noms): Use the actual profile avatar for local profiles once the
857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      // new, non-pixellated avatars are available.
858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.imageElement.src = this.user.emailAddress == '' ?
859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          'chrome://theme/IDR_USER_MANAGER_DEFAULT_AVATAR' :
860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          this.user.userImage;
861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.nameElement.textContent = this.user_.displayName;
862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      var isLockedUser = this.user.needsSignin;
863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.passwordElement.hidden = !isLockedUser;
864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.signinButtonElement.hidden = isLockedUser;
865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      UserPod.prototype.updateActionBoxArea.call(this);
867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    },
868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    /** @override */
870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    activate: function() {
871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      Oobe.launchUser(this.user.emailAddress, this.user.displayName);
872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return true;
873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    },
874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    /** @override */
876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    handleMouseDown_: function(e) {
877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      if (this.parentNode.disabled)
878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        return;
879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      // Don't sign in until the user presses the button. Just activate the pod.
881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      Oobe.clearErrors();
882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      this.parentNode.lastFocusedPod_ =
883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          this.parentNode.getPodWithUsername_(this.user.emailAddress);
884ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    },
885ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
886ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    /** @override */
887a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    handleRemoveUserConfirmationClick_: function(e) {
888a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      chrome.send('removeUser', [this.user.profilePath]);
889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    },
890ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  };
891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
892ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  /**
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Creates a new pod row element.
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @extends {HTMLDivElement}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var PodRow = cr.ui.define('podrow');
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PodRow.prototype = {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: HTMLDivElement.prototype,
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether this user pod row is shown for the first time.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    firstShown_: true,
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Whether the initial wallpaper load after boot has been requested. Used
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // only if |Oobe.getInstance().shouldLoadWallpaperOnBoot()| is true.
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bootWallpaperLoaded_: false,
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True if inside focusPod().
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    insideFocusPod_: false,
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True if user pod has been activated with keyboard.
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In case of activation with keyboard we delay wallpaper change.
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    keyboardActivated_: false,
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Focused pod.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focusedPod_: undefined,
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Activated pod, i.e. the pod of current login attempt.
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    activatedPod_: undefined,
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pod that was most recently focused, if any.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lastFocusedPod_: undefined,
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When moving through users quickly at login screen, set a timeout to
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // prevent loading intermediate wallpapers.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadWallpaperTimeout_: null,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pods whose initial images haven't been loaded yet.
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    podsWithPendingImages_: [],
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** @override */
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decorate: function() {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.style.left = 0;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Event listeners that are installed for the time period during which
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the element is visible.
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.listeners_ = {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        focus: [this.handleFocus_.bind(this), true],
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        click: [this.handleClick_.bind(this), false],
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mousemove: [this.handleMouseMove_.bind(this), false],
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keydown: [this.handleKeyDown.bind(this), false]
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      };
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns all the pods in this pod row.
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {NodeList}
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get pods() {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.children;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Return true if user pod row has only single user pod in it.
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {boolean}
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get isSinglePod() {
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.children.length == 1;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns pod with the given username (null if there is no such pod).
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} username Username to be matched.
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return {Object} Pod with the given username. null if pod hasn't been
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                  found.
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getPodWithUsername_: function(username) {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0, pod; pod = this.pods[i]; ++i) {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (pod.user.username == username)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return pod;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * True if the the pod row is disabled (handles no user interaction).
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {boolean}
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disabled_: false,
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get disabled() {
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.disabled_;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set disabled(value) {
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.disabled_ = value;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var controls = this.querySelectorAll('button,input');
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0, control; control = controls[i]; ++i) {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        control.disabled = value;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Creates a user pod from given email.
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} email User's email.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    createUserPod: function(user) {
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var userPod;
998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      if (user.isDesktopUser)
999ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        userPod = new DesktopUserPod({user: user});
1000ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      else if (user.publicAccount)
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        userPod = new PublicAccountUserPod({user: user});
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        userPod = new UserPod({user: user});
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      userPod.hidden = false;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return userPod;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Add an existing user pod to this pod row.
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {!Object} user User info dictionary.
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {boolean} animated Whether to use init animation.
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addUserPod: function(user, animated) {
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var userPod = this.createUserPod(user);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (animated) {
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        userPod.classList.add('init');
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        userPod.nameElement.classList.add('init');
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.appendChild(userPod);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      userPod.initialize();
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns index of given pod or -1 if not found.
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {UserPod} pod Pod to look up.
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    indexOf_: function(pod) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.pods.length; ++i) {
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (pod == this.pods[i])
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return i;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Start first time show animation.
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startInitAnimation: function() {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Schedule init animation.
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0, pod; pod = this.pods[i]; ++i) {
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window.setTimeout(removeClass, 500 + i * 70, pod, 'init');
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window.setTimeout(removeClass, 700 + i * 70, pod.nameElement, 'init');
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Start login success animation.
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startAuthenticatedAnimation: function() {
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var activated = this.indexOf_(this.activatedPod_);
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (activated == -1)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0, pod; pod = this.pods[i]; ++i) {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (i < activated)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pod.classList.add('left');
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (i > activated)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pod.classList.add('right');
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pod.classList.add('zoom');
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Populates pod row with given existing users and start init animation.
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {array} users Array of existing user emails.
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {boolean} animated Whether to use init animation.
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadPods: function(users, animated) {
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Clear existing pods.
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.innerHTML = '';
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.focusedPod_ = undefined;
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.activatedPod_ = undefined;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.lastFocusedPod_ = undefined;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Populate the pod row.
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < users.length; ++i) {
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.addUserPod(users[i], animated);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0, pod; pod = this.pods[i]; ++i) {
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.podsWithPendingImages_.push(pod);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Make sure we eventually show the pod row, even if some image is stuck.
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setTimeout(function() {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        $('pod-row').classList.remove('images-loading');
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }, POD_ROW_IMAGES_LOAD_TIMEOUT_MS);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var columns = users.length < COLUMNS.length ?
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          COLUMNS[users.length] : COLUMNS[COLUMNS.length - 1];
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var rows = Math.floor((users.length - 1) / columns) + 1;
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Cancel any pending resize operation.
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.removeEventListener('mouseout', this.deferredResizeListener_);
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!this.columns || !this.rows) {
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Set initial dimensions.
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.resize_(columns, rows);
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else if (columns != this.columns || rows != this.rows) {
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Defer the resize until mouse cursor leaves the pod row.
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.deferredResizeListener_ = function(e) {
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (!findAncestorByClass(e.toElement, 'podrow')) {
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this.resize_(columns, rows);
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }.bind(this);
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.addEventListener('mouseout', this.deferredResizeListener_);
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.focusPod(this.preselectedPod);
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Resizes the pod row and cancel any pending resize operations.
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {number} columns Number of columns.
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {number} rows Number of rows.
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @private
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resize_: function(columns, rows) {
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.removeEventListener('mouseout', this.deferredResizeListener_);
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.columns = columns;
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.rows = rows;
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (this.parentNode == Oobe.getInstance().currentScreen) {
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Oobe.getInstance().updateScreenSize(this.parentNode);
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Number of columns.
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {?number}
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set columns(columns) {
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Cannot use 'columns' here.
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.setAttribute('ncolumns', columns);
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get columns() {
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.getAttribute('ncolumns');
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Number of rows.
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @type {?number}
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set rows(rows) {
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Cannot use 'rows' here.
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.setAttribute('nrows', rows);
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    get rows() {
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return this.getAttribute('nrows');
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Whether the pod is currently focused.
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {UserPod} pod Pod to check for focus.
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return {boolean} Pod focus status.
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isFocused: function(pod) {
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.focusedPod_ == pod;
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Focuses a given user pod or clear focus when given null.
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {UserPod=} podToFocus User pod to focus (undefined clears focus).
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {boolean=} opt_force If true, forces focus update even when
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                             podToFocus is already focused.
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focusPod: function(podToFocus, opt_force) {
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.isFocused(podToFocus) && !opt_force) {
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.keyboardActivated_ = false;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Make sure there's only one focusPod operation happening at a time.
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.insideFocusPod_) {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.keyboardActivated_ = false;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.insideFocusPod_ = true;
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clearTimeout(this.loadWallpaperTimeout_);
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0, pod; pod = this.pods[i]; ++i) {
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (!this.isSinglePod) {
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pod.isActionBoxMenuActive = false;
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (pod != podToFocus) {
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          pod.isActionBoxMenuHovered = false;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pod.classList.remove('focused');
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pod.classList.remove('faded');
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pod.reset(false);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Clear any error messages for previous pod.
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!this.isFocused(podToFocus))
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Oobe.clearErrors();
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var hadFocus = !!this.focusedPod_;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.focusedPod_ = podToFocus;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (podToFocus) {
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        podToFocus.classList.remove('faded');
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        podToFocus.classList.add('focused');
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        podToFocus.reset(true);  // Reset and give focus.
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (hadFocus && this.keyboardActivated_) {
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Delay wallpaper loading to let user tab through pods without lag.
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.loadWallpaperTimeout_ = window.setTimeout(
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this.loadWallpaper_.bind(this), WALLPAPER_LOAD_DELAY_MS);
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!this.firstShown_) {
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Load wallpaper immediately if there no pod was focused
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // previously, and it is not a boot into user pod list case.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.loadWallpaper_();
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.firstShown_ = false;
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.lastFocusedPod_ = podToFocus;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.insideFocusPod_ = false;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.keyboardActivated_ = false;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Loads wallpaper for the active user pod, if any.
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadWallpaper_: function() {
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.focusedPod_)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome.send('loadWallpaper', [this.focusedPod_.user.username]);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Resets wallpaper to the last active user's wallpaper, if any.
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadLastWallpaper: function() {
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.lastFocusedPod_)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome.send('loadWallpaper', [this.lastFocusedPod_.user.username]);
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns the currently activated pod.
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {UserPod}
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get activatedPod() {
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.activatedPod_;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set activatedPod(pod) {
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pod && pod.activate())
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.activatedPod_ = pod;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The pod of the signed-in user, if any; null otherwise.
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {?UserPod}
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get lockedPod() {
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0, pod; pod = this.pods[i]; ++i) {
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (pod.user.signedIn)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return pod;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The pod that is preselected on user pod row show.
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {?UserPod}
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get preselectedPod() {
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var lockedPod = this.lockedPod;
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var preselectedPod = PRESELECT_FIRST_POD ?
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          lockedPod || this.pods[0] : lockedPod;
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return preselectedPod;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Resets input UI.
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {boolean} takeFocus True to take focus.
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reset: function(takeFocus) {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.disabled = false;
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.activatedPod_)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.activatedPod_.reset(takeFocus);
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
128390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     * Restores input focus to current selected pod, if there is any.
128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)     */
128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    refocusCurrentPod: function() {
128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (this.focusedPod_) {
128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        this.focusedPod_.focusInput();
128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    },
129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
129190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    /**
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Clears focused pod password field.
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    clearFocusedPod: function() {
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!this.disabled && this.focusedPod_)
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.focusedPod_.reset(true);
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Shows signin UI.
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} email Email for signin UI.
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    showSigninUI: function(email) {
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Clear any error messages that might still be around.
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Oobe.clearErrors();
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.disabled = true;
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.lastFocusedPod_ = this.getPodWithUsername_(email);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Oobe.showSigninUI(email);
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Updates current image of a user.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} username User for which to update the image.
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateUserImage: function(username) {
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var pod = this.getPodWithUsername_(username);
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pod)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pod.updateUserImage();
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Resets OAuth token status (invalidates it).
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} username User for which to reset the status.
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resetUserOAuthTokenStatus: function(username) {
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var pod = this.getPodWithUsername_(username);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pod) {
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pod.user.oauthTokenStatus = OAuthTokenStatus.INVALID_OLD;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pod.update();
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        console.log('Failed to update Gaia state for: ' + username);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handler of click event.
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Event} e Click Event object.
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleClick_: function(e) {
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.disabled)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Clear all menus if the click is outside pod menu and its
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // button area.
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!findAncestorByClass(e.target, 'action-box-menu') &&
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !findAncestorByClass(e.target, 'action-box-area')) {
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (var i = 0, pod; pod = this.pods[i]; ++i)
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pod.isActionBoxMenuActive = false;
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Clears focus if not clicked on a pod and if there's more than one pod.
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var pod = findAncestorByClass(e.target, 'pod');
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if ((!pod || pod.parentNode != this) && !this.isSinglePod) {
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.focusPod();
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (pod)
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pod.isActionBoxMenuHovered = true;
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Return focus back to single pod.
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.isSinglePod) {
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.focusPod(this.focusedPod_, true /* force */);
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (!pod)
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this.focusedPod_.isActionBoxMenuHovered = false;
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Handler of mouse move event.
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Event} e Click Event object.
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @private
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handleMouseMove_: function(e) {
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.disabled)
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (e.webkitMovementX == 0 && e.webkitMovementY == 0)
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Defocus (thus hide) action box, if it is focused on a user pod
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // and the pointer is not hovering over it.
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var pod = findAncestorByClass(e.target, 'pod');
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (document.activeElement &&
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          document.activeElement.parentNode != pod &&
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          document.activeElement.classList.contains('action-box-area')) {
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        document.activeElement.parentNode.focus();
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (pod)
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pod.isActionBoxMenuHovered = true;
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Hide action boxes on other user pods.
1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (var i = 0, p; p = this.pods[i]; ++i)
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (p != pod && !p.isActionBoxMenuActive)
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          p.isActionBoxMenuHovered = false;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handles focus event.
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Event} e Focus Event object.
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleFocus_: function(e) {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.disabled)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (e.target.parentNode == this) {
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Focus on a pod
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (e.target.classList.contains('focused'))
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          e.target.focusInput();
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.focusPod(e.target);
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var pod = findAncestorByClass(e.target, 'pod');
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (pod && pod.parentNode == this) {
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Focus on a control of a pod but not on the action area button.
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!pod.classList.contains('focused') &&
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            !e.target.classList.contains('action-box-button')) {
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.focusPod(pod);
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          e.target.focus();
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Clears pod focus when we reach here. It means new focus is neither
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // on a pod nor on a button/input for a pod.
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Do not "defocus" user pod when it is a single pod.
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // That means that 'focused' class will not be removed and
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // input field/button will always be visible.
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!this.isSinglePod)
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.focusPod();
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handler of keydown event.
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Event} e KeyDown Event object.
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleKeyDown: function(e) {
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.disabled)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var editing = e.target.tagName == 'INPUT' && e.target.value;
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (e.keyIdentifier) {
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'Left':
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!editing) {
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this.keyboardActivated_ = true;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (this.focusedPod_ && this.focusedPod_.previousElementSibling)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this.focusPod(this.focusedPod_.previousElementSibling);
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this.focusPod(this.lastElementChild);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            e.stopPropagation();
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'Right':
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!editing) {
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this.keyboardActivated_ = true;
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (this.focusedPod_ && this.focusedPod_.nextElementSibling)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this.focusPod(this.focusedPod_.nextElementSibling);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this.focusPod(this.firstElementChild);
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            e.stopPropagation();
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'Enter':
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (this.focusedPod_) {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this.activatedPod = this.focusedPod_;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            e.stopPropagation();
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case 'U+001B':  // Esc
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (!this.isSinglePod)
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this.focusPod();
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Called right after the pod row is shown.
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleAfterShow: function() {
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Force input focus for user pod on show and once transition ends.
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.focusedPod_) {
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var focusedPod = this.focusedPod_;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var screen = this.parentNode;
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var self = this;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        focusedPod.addEventListener('webkitTransitionEnd', function f(e) {
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (e.target == focusedPod) {
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            focusedPod.removeEventListener('webkitTransitionEnd', f);
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            focusedPod.reset(true);
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Notify screen that it is ready.
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            screen.onShow();
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Boot transition: load wallpaper.
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!self.bootWallpaperLoaded_ &&
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Oobe.getInstance().shouldLoadWallpaperOnBoot()) {
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              self.loadWallpaperTimeout_ = window.setTimeout(
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  self.loadWallpaper_.bind(self), WALLPAPER_BOOT_LOAD_DELAY_MS);
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              self.bootWallpaperLoaded_ = true;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Called right before the pod row is shown.
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleBeforeShow: function() {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var event in this.listeners_) {
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.ownerDocument.addEventListener(
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            event, this.listeners_[event][0], this.listeners_[event][1]);
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('login-header-bar').buttonsTabIndex = UserPodTabOrder.HEADER_BAR;
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Called when the element is hidden.
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleHide: function() {
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var event in this.listeners_) {
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.ownerDocument.removeEventListener(
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            event, this.listeners_[event][0], this.listeners_[event][1]);
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('login-header-bar').buttonsTabIndex = 0;
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Called when a pod's user image finishes loading.
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handlePodImageLoad: function(pod) {
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var index = this.podsWithPendingImages_.indexOf(pod);
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (index == -1) {
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.podsWithPendingImages_.splice(index, 1);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.podsWithPendingImages_.length == 0) {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.classList.remove('images-loading');
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PodRow: PodRow
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
1548