12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 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.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)cr.define('policy', function() {
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /**
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * A hack to check if we are displaying the mobile version of this page by
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * checking if the first column is hidden.
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @return {boolean} True if this is the mobile version.
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   */
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  var isMobilePage = function() {
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return document.defaultView.getComputedStyle(document.querySelector(
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        '.scope-column')).display == 'none';
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * A box that shows the status of cloud policy for a device or user.
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @constructor
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @extends {HTMLFieldSetElement}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var StatusBox = cr.ui.define(function() {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var node = $('status-box-template').cloneNode(true);
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    node.removeAttribute('id');
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return node;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  });
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StatusBox.prototype = {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set up the prototype chain.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    __proto__: HTMLFieldSetElement.prototype,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Initialization function for the cr.ui framework.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    decorate: function() {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Populate the box with the given cloud policy status.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {string} scope The policy scope, either "device" or "user".
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Object} status Dictionary with information about the status.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    initialize: function(scope, status) {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (scope == 'device') {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // For device policy, set the appropriate title and populate the topmost
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // status item with the domain the device is enrolled into.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.querySelector('.legend').textContent =
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadTimeData.getString('statusDevice');
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var domain = this.querySelector('.domain');
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        domain.textContent = status.domain;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        domain.parentElement.hidden = false;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // For user policy, set the appropriate title and populate the topmost
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // status item with the username that policies apply to.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.querySelector('.legend').textContent =
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadTimeData.getString('statusUser');
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Populate the topmost item with the username.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var username = this.querySelector('.username');
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        username.textContent = status.username;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        username.parentElement.hidden = false;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Populate all remaining items.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.client-id').textContent = status.clientId || '';
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.time-since-last-refresh').textContent =
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          status.timeSinceLastRefresh || '';
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.refresh-interval').textContent =
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          status.refreshInterval || '';
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.status').textContent = status.status || '';
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * A single policy's entry in the policy table.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @constructor
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @extends {HTMLTableSectionElement}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var Policy = cr.ui.define(function() {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var node = $('policy-template').cloneNode(true);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    node.removeAttribute('id');
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return node;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  });
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Policy.prototype = {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set up the prototype chain.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    __proto__: HTMLTableSectionElement.prototype,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Initialization function for the cr.ui framework.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    decorate: function() {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.updateToggleExpandedValueText_();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.toggle-expanded-value').addEventListener(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'click', this.toggleExpandedValue_.bind(this));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Populate the table columns with information about the policy name, value
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * and status.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {string} name The policy name.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Object} value Dictionary with information about the policy value.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {boolean} unknown Whether the policy name is not recognized.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    initialize: function(name, value, unknown) {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.name = name;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.unset = !value;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Populate the name column.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.name').textContent = name;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Populate the remaining columns with policy scope, level and value if a
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // value has been set. Otherwise, leave them blank.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (value) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.querySelector('.scope').textContent =
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadTimeData.getString(value.scope == 'user' ?
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                'scopeUser' : 'scopeDevice');
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.querySelector('.level').textContent =
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadTimeData.getString(value.level == 'recommended' ?
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                'levelRecommended' : 'levelMandatory');
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.querySelector('.value').textContent = value.value;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.querySelector('.expanded-value').textContent = value.value;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Populate the status column.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var status;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!value) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // If the policy value has not been set, show an error message.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        status = loadTimeData.getString('unset');
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else if (unknown) {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // If the policy name is not recognized, show an error message.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        status = loadTimeData.getString('unknown');
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else if (value.error) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // If an error occurred while parsing the policy value, show the error
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // message.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        status = value.error;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Otherwise, indicate that the policy value was parsed correctly.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        status = loadTimeData.getString('ok');
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.status').textContent = status;
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (isMobilePage()) {
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The number of columns which are hidden by the css file for the mobile
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // (Android) version of this page.
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        /** @const */ var HIDDEN_COLUMNS_IN_MOBILE_VERSION = 2;
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        var expandedValue = this.querySelector('.expanded-value');
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        expandedValue.setAttribute('colspan',
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            expandedValue.colSpan - HIDDEN_COLUMNS_IN_MOBILE_VERSION);
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Check the table columns for overflow. Most columns are automatically
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * elided when overflow occurs. The only action required is to add a tooltip
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * that shows the complete content. The value column is an exception. If
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * overflow occurs here, the contents is replaced with a link that toggles
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * the visibility of an additional row containing the complete value.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    checkOverflow: function() {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Set a tooltip on all overflowed columns except the value column.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var divs = this.querySelectorAll('div.elide');
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (var i = 0; i < divs.length; i++) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var div = divs[i];
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        div.title = div.offsetWidth < div.scrollWidth ? div.textContent : '';
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Cache the width of the value column's contents when it is first shown.
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // This is required to be able to check whether the contents would still
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // overflow the column once it has been hidden and replaced by a link.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var valueContainer = this.querySelector('.value-container');
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (valueContainer.valueWidth == undefined) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        valueContainer.valueWidth =
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            valueContainer.querySelector('.value').offsetWidth;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Determine whether the contents of the value column overflows. The
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // visibility of the contents, replacement link and additional row
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // containing the complete value that depend on this are handled by CSS.
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (valueContainer.offsetWidth < valueContainer.valueWidth)
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this.classList.add('has-overflowed-value');
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      else
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this.classList.remove('has-overflowed-value');
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Update the text of the link that toggles the visibility of an additional
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * row containing the complete policy value, depending on the toggle state.
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @private
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    updateToggleExpandedValueText_: function(event) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.querySelector('.toggle-expanded-value').textContent =
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          loadTimeData.getString(
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              this.classList.contains('show-overflowed-value') ?
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  'hideExpandedValue' : 'showExpandedValue');
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Toggle the visibility of an additional row containing the complete policy
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * value.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    toggleExpandedValue_: function() {
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.classList.toggle('show-overflowed-value');
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.updateToggleExpandedValueText_();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * A table of policies and their values.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @constructor
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @extends {HTMLTableSectionElement}
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var PolicyTable = cr.ui.define('tbody');
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PolicyTable.prototype = {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set up the prototype chain.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    __proto__: HTMLTableSectionElement.prototype,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Initialization function for the cr.ui framework.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    decorate: function() {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.policies_ = {};
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.filterPattern_ = '';
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window.addEventListener('resize', this.checkOverflow_.bind(this));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Initialize the list of all known policies.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Object} names Dictionary containing all known policy names.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    setPolicyNames: function(names) {
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.policies_ = names;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.setPolicyValues({});
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Populate the table with the currently set policy values and any errors
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * detected while parsing these.
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Object} values Dictionary containing the current policy values.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    setPolicyValues: function(values) {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Remove all policies from the table.
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var policies = this.getElementsByTagName('tbody');
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      while (policies.length > 0)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.removeChild(policies.item(0));
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // First, add known policies whose value is currently set.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var unset = [];
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (var name in this.policies_) {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (name in values)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.setPolicyValue_(name, values[name], false);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          unset.push(name);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Second, add policies whose value is currently set but whose name is not
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // recognized.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (var name in values) {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!(name in this.policies_))
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.setPolicyValue_(name, values[name], true);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Finally, add known policies whose value is not currently set.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (var i = 0; i < unset.length; i++)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.setPolicyValue_(unset[i], undefined, false);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Filter the policies.
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.filter();
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Set the filter pattern. Only policies whose name contains |pattern| are
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * shown in the policy table. The filter is case insensitive. It can be
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * disabled by setting |pattern| to an empty string.
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {string} pattern The filter pattern.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    setFilterPattern: function(pattern) {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.filterPattern_ = pattern.toLowerCase();
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.filter();
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Filter policies. Only policies whose name contains the filter pattern are
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * shown in the table. Furthermore, policies whose value is not currently
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * set are only shown if the corresponding checkbox is checked.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    filter: function() {
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var showUnset = $('show-unset').checked;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var policies = this.getElementsByTagName('tbody');
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (var i = 0; i < policies.length; i++) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var policy = policies[i];
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        policy.hidden =
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            policy.unset && !showUnset ||
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            policy.name.toLowerCase().indexOf(this.filterPattern_) == -1;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (this.querySelector('tbody:not([hidden])'))
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this.parentElement.classList.remove('empty');
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      else
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this.parentElement.classList.add('empty');
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      setTimeout(this.checkOverflow_.bind(this), 0);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Check the table columns for overflow.
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @private
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    checkOverflow_: function() {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var policies = this.getElementsByTagName('tbody');
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (var i = 0; i < policies.length; i++) {
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!policies[i].hidden)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          policies[i].checkOverflow();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Add a policy with the given |name| and |value| to the table.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {string} name The policy name.
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Object} value Dictionary with information about the policy value.
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {boolean} unknown Whether the policy name is not recoginzed.
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @private
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    setPolicyValue_: function(name, value, unknown) {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var policy = new Policy;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy.initialize(name, value, unknown);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.appendChild(policy);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * A singelton object that handles communication between browser and WebUI.
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @constructor
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  function Page() {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make Page a singleton.
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cr.addSingletonGetter(Page);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Provide a list of all known policies to the UI. Called by the browser on
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * page load.
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Object} names Dictionary containing all known policy names.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Page.setPolicyNames = function(names) {
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var page = this.getInstance();
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Clear all policy tables.
348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    page.mainSection.innerHTML = '';
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    page.policyTables = {};
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Create tables and set known policy names for Chrome and extensions.
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (names.hasOwnProperty('chromePolicyNames')) {
353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var table = page.appendNewTable('chrome', 'Chrome policies', '');
354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      table.setPolicyNames(names.chromePolicyNames);
355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (names.hasOwnProperty('extensionPolicyNames')) {
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      for (var ext in names.extensionPolicyNames) {
359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        var table = page.appendNewTable('extension-' + ext,
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            names.extensionPolicyNames[ext].name, 'ID: ' + ext);
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        table.setPolicyNames(names.extensionPolicyNames[ext].policyNames);
362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Provide a list of the currently set policy values and any errors detected
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * while parsing these to the UI. Called by the browser on page load and
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * whenever policy values change.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Object} values Dictionary containing the current policy values.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Page.setPolicyValues = function(values) {
373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var page = this.getInstance();
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (values.hasOwnProperty('chromePolicies')) {
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var table = page.policyTables['chrome'];
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      table.setPolicyValues(values.chromePolicies);
377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (values.hasOwnProperty('extensionPolicies')) {
380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      for (var extensionId in values.extensionPolicies) {
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        var table = page.policyTables['extension-' + extensionId];
382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (table)
383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          table.setPolicyValues(values.extensionPolicies[extensionId]);
384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Provide the current cloud policy status to the UI. Called by the browser on
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * page load if cloud policy is present and whenever the status changes.
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Object} status Dictionary containing the current policy status.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Page.setStatus = function(status) {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.getInstance().setStatus(status);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Notify the UI that a request to reload policy values has completed. Called
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * by the browser after a request to reload policy has been sent by the UI.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Page.reloadPoliciesDone = function() {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.getInstance().reloadPoliciesDone();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Page.prototype = {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Main initialization function. Called by the browser on page load.
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    initialize: function() {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uber.onContentFrameLoaded();
411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cr.ui.FocusOutlineManager.forDocument(document);
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this.mainSection = $('main-section');
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this.policyTables = {};
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Place the initial focus on the filter input field.
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      $('filter').focus();
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var self = this;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      $('filter').onsearch = function(event) {
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        for (policyTable in self.policyTables) {
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          self.policyTables[policyTable].setFilterPattern(this.value);
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      };
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      $('reload-policies').onclick = function(event) {
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.disabled = true;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome.send('reloadPolicies');
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      };
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      $('show-unset').onchange = function() {
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        for (policyTable in self.policyTables) {
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          self.policyTables[policyTable].filter();
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      };
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Notify the browser that the page has loaded, causing it to send the
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // list of all known policies, the current policy values and the cloud
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // policy status.
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome.send('initialized');
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   /**
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * Creates a new policy table section, adds the section to the page,
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * and returns the new table from that section.
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param {string} id The key for storing the new table in policyTables.
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param {string} label_title Title for this policy table.
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param {string} label_content Description for the policy table.
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @return {Element} The newly created table.
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    appendNewTable: function(id, label_title, label_content) {
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var newSection = this.createPolicyTableSection(id, label_title,
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          label_content);
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this.mainSection.appendChild(newSection);
454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return this.policyTables[id];
455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    },
456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    /**
458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * Creates a new section containing a title, description and table of
459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * policies.
460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param {id} id The key for storing the new table in policyTables.
461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param {string} label_title Title for this policy table.
462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param {string} label_content Description for the policy table.
463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @return {Element} The newly created section.
464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    createPolicyTableSection: function(id, label_title, label_content) {
466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var section = document.createElement('section');
467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      section.setAttribute('class', 'policy-table-section');
468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Add title and description.
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var title = window.document.createElement('h3');
471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      title.textContent = label_title;
472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      section.appendChild(title);
473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (label_content) {
475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        var description = window.document.createElement('div');
476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        description.classList.add('table-description');
477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        description.textContent = label_content;
478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        section.appendChild(description);
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Add 'No Policies Set' element.
482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var noPolicies = window.document.createElement('div');
483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      noPolicies.classList.add('no-policies-set');
484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      noPolicies.textContent = loadTimeData.getString('noPoliciesSet');
485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      section.appendChild(noPolicies);
486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Add table of policies.
488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var newTable = this.createPolicyTable();
489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      this.policyTables[id] = newTable;
490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      section.appendChild(newTable);
491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return section;
493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    },
494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    /**
496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * Creates a new table for displaying policies.
497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @return {Element} The newly created table.
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    createPolicyTable: function() {
500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var newTable = window.document.createElement('table');
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var tableHead = window.document.createElement('thead');
502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var tableRow = window.document.createElement('tr');
5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      var tableHeadings = ['Scope', 'Level', 'Name', 'Value', 'Status'];
504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      for (var i = 0; i < tableHeadings.length; i++) {
505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        var tableHeader = window.document.createElement('th');
5067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        tableHeader.classList.add(tableHeadings[i].toLowerCase() + '-column');
5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        tableHeader.textContent = loadTimeData.getString('header' +
5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                         tableHeadings[i]);
509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        tableRow.appendChild(tableHeader);
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      tableHead.appendChild(tableRow);
512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      newTable.appendChild(tableHead);
513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      cr.ui.decorate(newTable, PolicyTable);
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return newTable;
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    },
516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Update the status section of the page to show the current cloud policy
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * status.
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @param {Object} status Dictionary containing the current policy status.
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    setStatus: function(status) {
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Remove any existing status boxes.
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var container = $('status-box-container');
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      while (container.firstChild)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        container.removeChild(container.firstChild);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Hide the status section.
528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      var section = $('status-section');
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      section.hidden = true;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Add a status box for each scope that has a cloud policy status.
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (var scope in status) {
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var box = new StatusBox;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        box.initialize(scope, status[scope]);
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        container.appendChild(box);
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Show the status section.
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        section.hidden = false;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Re-enable the reload policies button when the previous request to reload
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * policies values has completed.
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reloadPoliciesDone: function() {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      $('reload-policies').disabled = false;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Page: Page
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Have the main initialization function be called when the page finishes
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// loading.
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)document.addEventListener(
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'DOMContentLoaded',
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy.Page.getInstance().initialize.bind(policy.Page.getInstance()));
560