15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)'use strict';
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Group of progress item in the progress center panels.
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * This is responsible for generating the summarized item and managing lifetime
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * of error items.
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {string} name Name of the group.
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {boolean} quiet Whether the group is for quiet items or not.
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @constructor
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)function ProgressCenterItemGroup(name, quiet) {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Name of the group.
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {string}
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.name = name;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Whether the group is for quiet items or not.
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {boolean}
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.quiet_ = quiet;
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * State of the group.
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {ProgressCenterItemGroup.State}
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.state_ = ProgressCenterItemGroup.State.EMPTY;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Items that are progressing, or completed but still animated.
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Key is item ID.
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {Object.<string, ProgressCenterItem>}
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.items_ = {};
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Set of animated state of items. Key is item ID and value is whether the
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * item is animated or not.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {Object.<string, boolean>}
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.animated_ = {};
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Last summarized item.
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {ProgressCenterItem}
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.summarizedItem_ = null;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Whether the summarized item is animated or not.
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {boolean}
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.summarizedItemAnimated_ = false;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Total maximum progress value of items already completed and removed from
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * this.items_.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {number}
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.totalProgressMax_ = 0;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Total progress value of items already completed and removed from
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * this.items_.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {number}
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.totalProgressValue_ = 0;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Object.seal(this);
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * State of ProgressCenterItemGroup.
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @enum {string}
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @const
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.State = Object.freeze({
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Group has no items.
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EMPTY: 'empty',
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Group has at least 1 progressing item.
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ACTIVE: 'active',
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Group has no progressing items but still shows error items.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  INACTIVE: 'inactive'
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)});
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Makes the summarized item for the groups.
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * When a group has only error items, getSummarizedItem of the item returns
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * null. Basically the first result of the groups that the progress center panel
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * contains is used as a summarized item. But If all the group returns null, the
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * progress center panel generates the summarized item by using the method.
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Array.<ProgressCenterItemGroup>} var_groups List of groups.
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {ProgressCenterItem} Summarized item.
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.getSummarizedErrorItem = function(var_groups) {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var groups = Array.prototype.slice.call(arguments);
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var errorItems = [];
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (var i = 0; i < groups.length; i++) {
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (var id in groups[i].items_) {
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var item = groups[i].items_[id];
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (item.state === ProgressItemState.ERROR)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        errorItems.push(item);
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (errorItems.length === 0)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return null;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (errorItems.length === 1)
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return errorItems[0].clone();
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var item = new ProgressCenterItem();
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  item.state = ProgressItemState.ERROR;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  item.message = strf('ERROR_PROGRESS_SUMMARY_PLURAL',
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      errorItems.length);
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  item.single = false;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return item;
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Obtains Whether the item should be animated or not.
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {boolean} previousAnimated Whether the item is previously animated or
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *     not.
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {ProgressCenterItem} previousItem Item before updating.
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {ProgressCenterItem} item New item.
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {boolean} Whether the item should be animated or not.
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @private
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.shouldAnimate_ = function(
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    previousAnimated, previousItem, item) {
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!previousItem || !item || previousItem.quiet || item.quiet)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (previousItem.progressRateInPercent < item.progressRateInPercent)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (previousAnimated &&
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      previousItem.progressRateInPercent === item.progressRateInPercent)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype = {
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @return {ProgressCenterItemGroup.State} State of the group.
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  get state() {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return this.state_;
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @return {number} Number of error items that the group contains.
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  get numErrors() {
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var result = 0;
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (var id in this.items_) {
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (this.items_[id].state === ProgressItemState.ERROR)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        result++;
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return result;
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Obtains the progressing (or completed but animated) item.
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {string} id Item ID.
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {ProgressCenterItem} Item having the ID.
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.getItem = function(id) {
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return this.items_[id] || null;
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Obtains whether the item should be animated or not.
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {string} id Item ID.
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {boolean} Whether the item should be animated or not.
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.isAnimated = function(id) {
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return !!this.animated_[id];
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Obtains whether the summarized item should be animated or not.
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {boolean} Whether the summarized item should be animated or not.
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.isSummarizedAnimated = function() {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return this.summarizedItemAnimated_;
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Starts item update.
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Marks the given item as updating.
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {ProgressCenterItem} item Item containing updated information.
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.update = function(item) {
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If the group is inactive, go back to the empty state.
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.endInactive();
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Compares the current state and the new state to check if the update is
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // valid or not.
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var previousItem = this.items_[item.id];
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (item.state) {
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ProgressItemState.ERROR:
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (previousItem && previousItem.state !== ProgressItemState.PROGRESSING)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (this.state_ === ProgressCenterItemGroup.State.EMPTY)
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.state_ = ProgressCenterItemGroup.State.INACTIVE;
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.items_[item.id] = item.clone();
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.animated_[item.id] = false;
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.summarizedItem_ = null;
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ProgressItemState.PROGRESSING:
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ProgressItemState.COMPLETED:
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if ((!previousItem && item.state === ProgressItemState.COMPLETED) ||
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          (previousItem &&
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           previousItem.state !== ProgressItemState.PROGRESSING))
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (this.state_ === ProgressCenterItemGroup.State.EMPTY)
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.state_ = ProgressCenterItemGroup.State.ACTIVE;
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.items_[item.id] = item.clone();
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.animated_[item.id] = ProgressCenterItemGroup.shouldAnimate_(
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          !!this.animated_[item.id],
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          previousItem,
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          item);
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!this.animated_[item.id])
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.completeItemAnimation(item.id);
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ProgressItemState.CANCELED:
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!previousItem ||
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          previousItem.state !== ProgressItemState.PROGRESSING)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delete this.items_[item.id];
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.animated_[item.id] = false;
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.summarizedItem_ = null;
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Update the internal summarized item cache.
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var previousSummarizedItem = this.summarizedItem_;
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.summarizedItem_ = this.getSummarizedItem(0);
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.summarizedItemAnimated_ = ProgressCenterItemGroup.shouldAnimate_(
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !!this.summarizedItemAnimated_,
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      previousSummarizedItem,
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.summarizedItem_);
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!this.summarizedItemAnimated_)
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.completeSummarizedItemAnimation();
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Notifies the end of the item's animation to the group.
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * If all the items except error items completes, the group enter the inactive
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * state.
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {string} id Item ID.
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.completeItemAnimation = function(id) {
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (this.state_ !== ProgressCenterItemGroup.State.ACTIVE)
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.animated_[id] = false;
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (this.items_[id].state === ProgressItemState.COMPLETED) {
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.totalProgressValue_ += (this.items_[id].progressValue || 0.0);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.totalProgressMax_ += (this.items_[id].progressMax || 0.0);
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete this.items_[id];
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.tryEndActive_();
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Notifies the end of the summarized item's animation.
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * This may update summarized view. (1 progressing + 1 error -> 1 error)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.completeSummarizedItemAnimation = function() {
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.summarizedItemAnimated_ = false;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.tryEndActive_();
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Obtains the summary of the set.
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {number} numOtherErrors Number of errors contained by other groups.
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {ProgressCenterItem} Item.
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.getSummarizedItem =
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    function(numOtherErrors) {
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (this.state_ === ProgressCenterItemGroup.State.EMPTY ||
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.state_ === ProgressCenterItemGroup.State.INACTIVE)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return null;
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var summarizedItem = new ProgressCenterItem();
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  summarizedItem.quiet = this.quiet_;
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  summarizedItem.progressMax += this.totalProgressMax_;
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  summarizedItem.progressValue += this.totalProgressValue_;
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var progressingItems = [];
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var errorItems = [];
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var numItems = 0;
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (var id in this.items_) {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var item = this.items_[id];
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    numItems++;
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Count states.
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (item.state) {
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemState.PROGRESSING:
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemState.COMPLETED:
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        progressingItems.push(item);
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemState.ERROR:
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        errorItems.push(item);
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        continue;
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If all of the progressing items have the same type, then use
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // it. Otherwise use TRANSFER, since it is the most generic.
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (summarizedItem.type === null)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      summarizedItem.type = item.type;
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (summarizedItem.type !== item.type)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      summarizedItem.type = ProgressItemType.TRANSFER;
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Sum up the progress values.
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.progressMax += item.progressMax;
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.progressValue += item.progressValue;
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns 1 item.
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (progressingItems.length === 1 &&
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      errorItems.length + numOtherErrors === 0) {
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.id = progressingItems[0].id;
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.cancelCallback = progressingItems[0].cancelCallback;
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.message = progressingItems[0].message;
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.state = progressingItems[0].state;
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return summarizedItem;
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns integrated items.
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (progressingItems.length > 0) {
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var numErrors = errorItems.length + numOtherErrors;
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var messages = [];
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (summarizedItem.type) {
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemType.COPY:
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        messages.push(str('COPY_PROGRESS_SUMMARY'));
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemType.MOVE:
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        messages.push(str('MOVE_PROGRESS_SUMMARY'));
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemType.DELETE:
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        messages.push(str('DELETE_PROGRESS_SUMMARY'));
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemType.ZIP:
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        messages.push(str('ZIP_PROGRESS_SUMMARY'));
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemType.SYNC:
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        messages.push(str('SYNC_PROGRESS_SUMMARY'));
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemType.TRANSFER:
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        messages.push(str('TRANSFER_PROGRESS_SUMMARY'));
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (numErrors === 1)
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      messages.push(str('ERROR_PROGRESS_SUMMARY'));
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (numErrors > 1)
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      messages.push(strf('ERROR_PROGRESS_SUMMARY_PLURAL', numErrors));
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.single = false;
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.message = messages.join(' ');
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    summarizedItem.state = ProgressItemState.PROGRESSING;
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return summarizedItem;
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns complete items.
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  summarizedItem.state = ProgressItemState.COMPLETED;
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return summarizedItem;
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Goes back to the EMPTY state from the INACTIVE state. Removes all the items.
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * If the current state is not the INACTIVE, nothing happens.
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.endInactive = function() {
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (this.state_ !== ProgressCenterItemGroup.State.INACTIVE)
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.items_ = {};
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.animated_ = {};
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.summarizedItem_ = null;
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.summarizedItemAnimated_ = false;
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.totalProgressValue_ = 0.0;
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.totalProgressMax_ = 0.0;
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.state_ = ProgressCenterItemGroup.State.EMPTY;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Ends active state if there is no progressing and animated items.
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @private
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItemGroup.prototype.tryEndActive_ = function() {
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (this.state_ !== ProgressCenterItemGroup.State.ACTIVE ||
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.summarizedItemAnimated_)
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var hasError = false;
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (var id in this.items_) {
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If there is non-error item (progressing, or completed but still
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // animated), we should stay the active state.
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (this.items_[id].state !== ProgressItemState.ERROR)
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    hasError = true;
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.state_ = ProgressCenterItemGroup.State.INACTIVE;
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!hasError)
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.endInactive();
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
423