text: /*
   * Copyright (C) 2011 Google Inc. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are
   * met:
   *
   *     * Redistributions of source code must retain the above copyright
   * notice, this list of conditions and the following disclaimer.
   *     * Redistributions in binary form must reproduce the above
   * copyright notice, this list of conditions and the following disclaimer
   * in the documentation and/or other materials provided with the
   * distribution.
   *     * Neither the name of Google Inc. nor the names of its
   * contributors may be used to endorse or promote products derived from
   * this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  WebInspector.AuditLauncherView = function(runnerCallback)
  {
      WebInspector.View.call(this);
      this._runnerCallback = runnerCallback;
      this._categoryIdPrefix = "audit-category-item-";
      this._auditRunning = false;
  
      this.element.addStyleClass("audit-launcher-view");
  
      this._contentElement = document.createElement("div");
      this._contentElement.className = "audit-launcher-view-content";
      this.element.appendChild(this._contentElement);
      this._boundCategoryClickListener = this._categoryClicked.bind(this);
  
      this._resetResourceCount();
  
      this._sortedCategories = [];
  
      this._headerElement = document.createElement("h1");
      this._headerElement.className = "no-audits";
      this._headerElement.textContent = WebInspector.UIString("No audits to run");
      this._contentElement.appendChild(this._headerElement);
  
      WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceStarted, this._onResourceStarted, this);
      WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceFinished, this._onResourceFinished, this);
  }
  
  WebInspector.AuditLauncherView.prototype = {
      _resetResourceCount: function()
      {
          this._loadedResources = 0;
          this._totalResources = 0;
      },
  
      _onResourceStarted: function(event)
      {
          var resource = event.data;
          // Ignore long-living WebSockets for the sake of progress indicator, as we won't be waiting them anyway.
          if (resource.type === WebInspector.Resource.Type.WebSocket)
              return;
          ++this._totalResources;
          this._updateResourceProgress();
      },
  
      _onResourceFinished: function(event)
      {
          var resource = event.data;
          // See resorceStarted for details.
          if (resource.type === WebInspector.Resource.Type.WebSocket)
              return;
          ++this._loadedResources;
          this._updateResourceProgress();
      },
  
      addCategory: function(category)
      {
          if (!this._sortedCategories.length)
              this._createLauncherUI();
  
          var categoryElement = this._createCategoryElement(category.displayName, category.id);
          category._checkboxElement = categoryElement.firstChild;
          if (this._selectAllCheckboxElement.checked) {
              category._checkboxElement.checked = true;
              ++this._currentCategoriesCount;
          }
  
          function compareCategories(a, b)
          {
              var aTitle = a.displayName || "";
              var bTitle = b.displayName || "";
              return aTitle.localeCompare(bTitle);
          }
          var insertBefore = insertionIndexForObjectInListSortedByFunction(category, this._sortedCategories, compareCategories);
          this._categoriesElement.insertBefore(categoryElement, this._categoriesElement.children[insertBefore] || null);
          this._sortedCategories.splice(insertBefore, 0, category);
          this._updateButton();
      },
  
      _setAuditRunning: function(auditRunning)
      {
          if (this._auditRunning === auditRunning)
              return;
          this._auditRunning = auditRunning;
          this._updateButton();
          this._updateResourceProgress();
      },
  
      _launchButtonClicked: function(event)
      {
          var catIds = [];
          var childNodes = this._categoriesElement.childNodes;
          for (var category = 0; category < this._sortedCategories.length; ++category) {
              if (this._sortedCategories[category]._checkboxElement.checked)
                  catIds.push(this._sortedCategories[category].id);
          }
  
          this._setAuditRunning(true);
          this._runnerCallback(catIds, this._auditPresentStateElement.checked, this._setAuditRunning.bind(this, false));
      },
  
      _selectAllClicked: function(checkCategories)
      {
          var childNodes = this._categoriesElement.childNodes;
          for (var i = 0, length = childNodes.length; i < length; ++i)
              childNodes[i].firstChild.checked = checkCategories;
          this._currentCategoriesCount = checkCategories ? this._sortedCategories.length : 0;
          this._updateButton();
      },
  
      _categoryClicked: function(event)
      {
          this._currentCategoriesCount += event.target.checked ? 1 : -1;
          this._selectAllCheckboxElement.checked = this._currentCategoriesCount === this._sortedCategories.length;
          this._updateButton();
      },
  
      _createCategoryElement: function(title, id)
      {
          var labelElement = document.createElement("label");
          labelElement.id = this._categoryIdPrefix + id;
  
          var element = document.createElement("input");
          element.type = "checkbox";
          if (id !== "")
              element.addEventListener("click", this._boundCategoryClickListener, false);
          labelElement.appendChild(element);
          labelElement.appendChild(document.createTextNode(title));
  
          return labelElement;
      },
  
      _createLauncherUI: function()
      {
          this._headerElement = document.createElement("h1");
          this._headerElement.textContent = WebInspector.UIString("Select audits to run");
  
          for (var child = 0; child < this._contentElement.children.length; ++child)
              this._contentElement.removeChild(this._contentElement.children[child]);
  
          this._contentElement.appendChild(this._headerElement);
  
          function handleSelectAllClick(event)
          {
              this._selectAllClicked(event.target.checked);
          }
          var categoryElement = this._createCategoryElement(WebInspector.UIString("Select All"), "");
          categoryElement.id = "audit-launcher-selectall";
          this._selectAllCheckboxElement = categoryElement.firstChild;
          this._selectAllCheckboxElement.checked = true;
          this._selectAllCheckboxElement.addEventListener("click", handleSelectAllClick.bind(this), false);
          this._contentElement.appendChild(categoryElement);
  
          this._categoriesElement = document.createElement("div");
          this._categoriesElement.className = "audit-categories-container";
          this._contentElement.appendChild(this._categoriesElement);
  
          this._currentCategoriesCount = 0;
  
          var flexibleSpaceElement = document.createElement("div");
          flexibleSpaceElement.className = "flexible-space";
          this._contentElement.appendChild(flexibleSpaceElement);
  
          this._buttonContainerElement = document.createElement("div");
          this._buttonContainerElement.className = "button-container";
  
          var labelElement = document.createElement("label");
          this._auditPresentStateElement = document.createElement("input");
          this._auditPresentStateElement.name = "audit-mode";
          this._auditPresentStateElement.type = "radio";
          this._auditPresentStateElement.checked = true;
          this._auditPresentStateLabelElement = document.createTextNode(WebInspector.UIString("Audit Present State"));
          labelElement.appendChild(this._auditPresentStateElement);
          labelElement.appendChild(this._auditPresentStateLabelElement);
          this._buttonContainerElement.appendChild(labelElement);
  
          labelElement = document.createElement("label");
          this.auditReloadedStateElement = document.createElement("input");
          this.auditReloadedStateElement.name = "audit-mode";
          this.auditReloadedStateElement.type = "radio";
          labelElement.appendChild(this.auditReloadedStateElement);
          labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load"));
          this._buttonContainerElement.appendChild(labelElement);
  
          this._launchButton = document.createElement("button");
          this._launchButton.type = "button";
          this._launchButton.textContent = WebInspector.UIString("Run");
          this._launchButton.addEventListener("click", this._launchButtonClicked.bind(this), false);
          this._buttonContainerElement.appendChild(this._launchButton);
  
          this._resourceProgressContainer = document.createElement("span");
          this._resourceProgressContainer.className = "resource-progress";
          var resourceProgressImage = document.createElement("img");
          this._resourceProgressContainer.appendChild(resourceProgressImage);
          this._resourceProgressTextElement = document.createElement("span");
          this._resourceProgressContainer.appendChild(this._resourceProgressTextElement);
          this._buttonContainerElement.appendChild(this._resourceProgressContainer);
  
          this._contentElement.appendChild(this._buttonContainerElement);
  
          this._selectAllClicked(this._selectAllCheckboxElement.checked);
          this._updateButton();
          this._updateResourceProgress();
      },
  
      _updateResourceProgress: function()
      {
          if (!this._resourceProgressContainer)
              return;
  
          if (!this._auditRunning) {
              this._resetResourceCount();
              this._resourceProgressContainer.addStyleClass("hidden");
          } else
              this._resourceProgressContainer.removeStyleClass("hidden");
          this._resourceProgressTextElement.textContent = WebInspector.UIString("Loading (%d of %d)", this._loadedResources, this._totalResources);
      },
  
      _updateButton: function()
      {
          this._launchButton.disabled = !this._currentCategoriesCount || this._auditRunning;
      }
  }
  
  WebInspector.AuditLauncherView.prototype.__proto__ = WebInspector.View.prototype;
  