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.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WallpaperManager constructor.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WallpaperManager objects encapsulate the functionality of the wallpaper
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * manager extension.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {HTMLElement} dialogDom The DOM node containing the prototypical
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     extension UI.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function WallpaperManager(dialogDom) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.dialogDom_ = dialogDom;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.document_ = dialogDom.ownerDocument;
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.enableOnlineWallpaper_ = loadTimeData.valueExists('manifestBaseURL');
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.selectedCategory = null;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.selectedItem_ = null;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.progressManager_ = new ProgressManager();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.customWallpaperData_ = null;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.currentWallpaper_ = null;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.wallpaperRequest_ = null;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.wallpaperDirs_ = WallpaperDirectories.getInstance();
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  this.preManifestDomInit_();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  this.fetchManifest_();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Anonymous 'namespace'.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(bshe): Get rid of anonymous namespace.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * URL of the learn more page for wallpaper picker.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /** @const */ var LearnMoreURL =
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'https://support.google.com/chromeos/?p=wallpaper_fileerror&hl=' +
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          navigator.language;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Index of the All category. It is the first category in wallpaper picker.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /** @const */ var AllCategoryIndex = 0;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Index offset of categories parsed from manifest. The All category is added
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * before them. So the offset is 1.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /** @const */ var OnlineCategoriesOffset = 1;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Returns a translated string.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Wrapper function to make dealing with translated strings more concise.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Equivilant to localStrings.getString(id).
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the string to return.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {string} The translated string.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function str(id) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return loadTimeData.getString(id);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Retruns the current selected layout.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @return {string} The selected layout.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  function getSelectedLayout() {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var setWallpaperLayout = $('set-wallpaper-layout');
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return setWallpaperLayout.options[setWallpaperLayout.selectedIndex].value;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Loads translated strings.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.initStrings = function(callback) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.wallpaperPrivate.getStrings(function(strings) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loadTimeData.data = strings;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (callback)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        callback();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Requests wallpaper manifest file from server.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.fetchManifest_ = function() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var locale = navigator.language;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!this.enableOnlineWallpaper_) {
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this.postManifestDomInit_();
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var urls = [
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        str('manifestBaseURL') + locale + '.json',
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Fallback url. Use 'en' locale by default.
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        str('manifestBaseURL') + 'en.json'];
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var asyncFetchManifestFromUrls = function(urls, func, successCallback,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              failureCallback) {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var index = 0;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var loop = {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        next: function() {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (index < urls.length) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            func(loop, urls[index]);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            index++;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          } else {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            failureCallback();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        },
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        success: function(response) {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          successCallback(response);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        },
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        failure: function() {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          failureCallback();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      };
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loop.next();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var fetchManifestAsync = function(loop, url) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var xhr = new XMLHttpRequest();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        xhr.addEventListener('loadend', function(e) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (this.status == 200 && this.responseText != null) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            try {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              var manifest = JSON.parse(this.responseText);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              loop.success(manifest);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } catch (e) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              loop.failure();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          } else {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loop.next();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        xhr.open('GET', url, true);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xhr.send(null);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } catch (e) {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loop.failure();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (navigator.onLine) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      asyncFetchManifestFromUrls(urls, fetchManifestAsync,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 this.onLoadManifestSuccess_.bind(this),
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 this.onLoadManifestFailed_.bind(this));
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // If device is offline, fetches manifest from local storage.
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // TODO(bshe): Always loading the offline manifest first and replacing
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // with the online one when available.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.onLoadManifestFailed_();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Shows error message in a centered dialog.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @private
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {string} errroMessage The string to show in the error dialog.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.showError_ = function(errorMessage) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    document.querySelector('.error-message').textContent = errorMessage;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    $('error-container').hidden = false;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Sets manifest loaded from server. Called after manifest is successfully
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * loaded.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {object} manifest The parsed manifest file.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.onLoadManifestSuccess_ = function(manifest) {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.manifest_ = manifest;
176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    WallpaperUtil.saveToStorage(Constants.AccessManifestKey, manifest, false);
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this.postManifestDomInit_();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets manifest to previously saved object if any and shows connection error.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called after manifest failed to load.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.onLoadManifestFailed_ = function() {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var accessManifestKey = Constants.AccessManifestKey;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var self = this;
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Constants.WallpaperLocalStorage.get(accessManifestKey, function(items) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.manifest_ = items[accessManifestKey] ? items[accessManifestKey] : {};
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.showError_(str('connectionFailed'));
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      self.postManifestDomInit_();
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      $('wallpaper-grid').classList.add('image-picker-offline');
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    });
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * Toggle surprise me feature of wallpaper picker. It fires an storage
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * onChanged event. Event handler for that event is in event_page.js.
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @private
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.toggleSurpriseMe_ = function() {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var checkbox = $('surprise-me').querySelector('#checkbox');
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var shouldEnable = !checkbox.classList.contains('checked');
201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    WallpaperUtil.saveToStorage(Constants.AccessSurpriseMeEnabledKey,
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                shouldEnable, true, function() {
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (chrome.runtime.lastError == null) {
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (shouldEnable) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            checkbox.classList.add('checked');
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          } else {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            checkbox.classList.remove('checked');
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          $('categories-list').disabled = shouldEnable;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          $('wallpaper-grid').disabled = shouldEnable;
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        } else {
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // TODO(bshe): show error message to user.
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          console.error('Failed to save surprise me option to chrome storage.');
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    });
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   * One-time initialization of various DOM nodes. Fetching manifest may take a
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   * long time due to slow connection. Dom nodes that do not depend on manifest
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   * should be initialized here to unblock from manifest fetching.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WallpaperManager.prototype.preManifestDomInit_ = function() {
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    $('window-close-button').addEventListener('click', function() {
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window.close();
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    });
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this.document_.defaultView.addEventListener(
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'resize', this.onResize_.bind(this));
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this.document_.defaultView.addEventListener(
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'keydown', this.onKeyDown_.bind(this));
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    $('learn-more').href = LearnMoreURL;
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    $('close-error').addEventListener('click', function() {
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      $('error-container').hidden = true;
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    });
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    $('close-wallpaper-selection').addEventListener('click', function() {
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      $('wallpaper-selection-container').hidden = true;
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      $('set-wallpaper-layout').disabled = true;
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    });
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /**
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   * One-time initialization of various DOM nodes. Dom nodes that do depend on
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   * manifest should be initialized here.
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   */
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WallpaperManager.prototype.postManifestDomInit_ = function() {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i18nTemplate.process(this.document_, loadTimeData);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initCategoriesList_();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initThumbnailsGrid_();
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.presetCategory_();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('file-selector').addEventListener(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'change', this.onFileSelectorChanged_.bind(this));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('set-wallpaper-layout').addEventListener(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'change', this.onWallpaperLayoutChanged_.bind(this));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (loadTimeData.valueExists('wallpaperAppName')) {
2576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      $('wallpaper-set-by-message').textContent = loadTimeData.getStringF(
2586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          'currentWallpaperSetByMessage', str('wallpaperAppName'));
2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    }
2606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (this.enableOnlineWallpaper_) {
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      var self = this;
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      $('surprise-me').hidden = false;
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      $('surprise-me').addEventListener('click',
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        this.toggleSurpriseMe_.bind(this));
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Constants.WallpaperSyncStorage.get(Constants.AccessSurpriseMeEnabledKey,
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          function(items) {
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Surprise me has been moved from local to sync storage, prefer
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // values from sync, but if unset check local and update synced pref
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // if applicable.
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (!items.hasOwnProperty(Constants.AccessSurpriseMeEnabledKey)) {
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          Constants.WallpaperLocalStorage.get(
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              Constants.AccessSurpriseMeEnabledKey, function(values) {
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if (values.hasOwnProperty(Constants.AccessSurpriseMeEnabledKey)) {
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              WallpaperUtil.saveToStorage(Constants.AccessSurpriseMeEnabledKey,
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  values[Constants.AccessSurpriseMeEnabledKey], true);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if (values[Constants.AccessSurpriseMeEnabledKey]) {
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                $('surprise-me').querySelector('#checkbox').classList.add(
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    'checked');
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                $('categories-list').disabled = true;
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                $('wallpaper-grid').disabled = true;
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          });
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        } else if (items[Constants.AccessSurpriseMeEnabledKey]) {
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          $('surprise-me').querySelector('#checkbox').classList.add('checked');
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          $('categories-list').disabled = true;
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          $('wallpaper-grid').disabled = true;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      });
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      window.addEventListener('offline', function() {
2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        chrome.wallpaperPrivate.getOfflineWallpaperList(function(lists) {
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (!self.downloadedListMap_)
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            self.downloadedListMap_ = {};
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          for (var i = 0; i < lists.length; i++) {
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            self.downloadedListMap_[lists[i]] = true;
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          var thumbnails = self.document_.querySelectorAll('.thumbnail');
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          for (var i = 0; i < thumbnails.length; i++) {
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            var thumbnail = thumbnails[i];
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            var url = self.wallpaperGrid_.dataModel.item(i).baseURL;
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            var fileName = url.substring(url.lastIndexOf('/') + 1) +
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                Constants.HighResolutionSuffix;
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            if (self.downloadedListMap_ &&
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                self.downloadedListMap_.hasOwnProperty(encodeURI(fileName))) {
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              thumbnail.offline = true;
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            }
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        });
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        $('wallpaper-grid').classList.add('image-picker-offline');
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      });
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      window.addEventListener('online', function() {
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.downloadedListMap_ = null;
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        $('wallpaper-grid').classList.remove('image-picker-offline');
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      });
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.onResize_();
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.initContextMenuAndCommand_();
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * One-time initialization of context menu and command.
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.initContextMenuAndCommand_ = function() {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.wallpaperContextMenu_ = $('wallpaper-context-menu');
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cr.ui.Menu.decorate(this.wallpaperContextMenu_);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cr.ui.contextMenuHandler.setContextMenu(this.wallpaperGrid_,
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            this.wallpaperContextMenu_);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var commands = this.dialogDom_.querySelectorAll('command');
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (var i = 0; i < commands.length; i++)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cr.ui.Command.decorate(commands[i]);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var doc = this.document_;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    doc.addEventListener('command', this.onCommand_.bind(this));
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    doc.addEventListener('canExecute', this.onCommandCanExecute_.bind(this));
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Handles a command being executed.
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Event} event A command event.
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.onCommand_ = function(event) {
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (event.command.id == 'delete') {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var wallpaperGrid = this.wallpaperGrid_;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var selectedIndex = wallpaperGrid.selectionModel.selectedIndex;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var item = wallpaperGrid.dataModel.item(selectedIndex);
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!item || item.source != Constants.WallpaperSourceEnum.Custom)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.removeCustomWallpaper(item.baseURL);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      wallpaperGrid.dataModel.splice(selectedIndex, 1);
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Calculate the number of remaining custom wallpapers. The add new button
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // in data model needs to be excluded.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var customWallpaperCount = wallpaperGrid.dataModel.length - 1;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (customWallpaperCount == 0) {
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Active custom wallpaper is also copied in chronos data dir. It needs
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // to be deleted.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome.wallpaperPrivate.resetWallpaper();
3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        this.onWallpaperChanged_(null, null);
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        selectedIndex = Math.min(selectedIndex, customWallpaperCount - 1);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        wallpaperGrid.selectionModel.selectedIndex = selectedIndex;
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event.cancelBubble = true;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Decides if a command can be executed on current target.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Event} event A command event.
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.onCommandCanExecute_ = function(event) {
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (event.command.id) {
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 'delete':
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var wallpaperGrid = this.wallpaperGrid_;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var selectedIndex = wallpaperGrid.selectionModel.selectedIndex;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var item = wallpaperGrid.dataModel.item(selectedIndex);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (selectedIndex != this.wallpaperGrid_.dataModel.length - 1 &&
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          item && item.source == Constants.WallpaperSourceEnum.Custom) {
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          event.canExecute = true;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        event.canExecute = false;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Preset to the category which contains current wallpaper.
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.presetCategory_ = function() {
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.currentWallpaper_ = str('currentWallpaper');
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The currentWallpaper_ is either a url contains HightResolutionSuffix or a
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // custom wallpaper file name converted from an integer value represent
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // time (e.g., 13006377367586070).
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!this.enableOnlineWallpaper_ || (this.currentWallpaper_ &&
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.currentWallpaper_.indexOf(Constants.HighResolutionSuffix) == -1)) {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Custom is the last one in the categories list.
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.categoriesList_.selectionModel.selectedIndex =
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this.categoriesList_.dataModel.length - 1;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var self = this;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var presetCategoryInner_ = function() {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Selects the first category in the categories list of current
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // wallpaper as the default selected category when showing wallpaper
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // picker UI.
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var presetCategory = AllCategoryIndex;
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (self.currentWallpaper_) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (var key in self.manifest_.wallpaper_list) {
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          var url = self.manifest_.wallpaper_list[key].base_url +
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              Constants.HighResolutionSuffix;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (url.indexOf(self.currentWallpaper_) != -1 &&
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              self.manifest_.wallpaper_list[key].categories.length > 0) {
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            presetCategory = self.manifest_.wallpaper_list[key].categories[0] +
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                OnlineCategoriesOffset;
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.categoriesList_.selectionModel.selectedIndex = presetCategory;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (navigator.onLine) {
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      presetCategoryInner_();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // If device is offline, gets the available offline wallpaper list first.
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Wallpapers which are not in the list will display a grayscaled
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // thumbnail.
4308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      chrome.wallpaperPrivate.getOfflineWallpaperList(function(lists) {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!self.downloadedListMap_)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self.downloadedListMap_ = {};
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (var i = 0; i < lists.length; i++)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self.downloadedListMap_[lists[i]] = true;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        presetCategoryInner_();
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      });
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Constructs the thumbnails grid.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.initThumbnailsGrid_ = function() {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.wallpaperGrid_ = $('wallpaper-grid');
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wallpapers.WallpaperThumbnailsGrid.decorate(this.wallpaperGrid_);
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    this.wallpaperGrid_.autoExpands = true;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.wallpaperGrid_.addEventListener('change', this.onChange_.bind(this));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.wallpaperGrid_.addEventListener('dblclick', this.onClose_.bind(this));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * Handles change event dispatched by wallpaper grid.
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   */
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WallpaperManager.prototype.onChange_ = function() {
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // splice may dispatch a change event because the position of selected
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // element changing. But the actual selected element may not change after
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // splice. Check if the new selected element equals to the previous selected
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // element before continuing. Otherwise, wallpaper may reset to previous one
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // as described in http://crbug.com/229036.
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (this.selectedItem_ == this.wallpaperGrid_.selectedItem)
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.selectedItem_ = this.wallpaperGrid_.selectedItem;
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.onSelectedItemChanged_();
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /**
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Closes window if no pending wallpaper request.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.onClose_ = function() {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (this.wallpaperRequest_) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.wallpaperRequest_.addEventListener('loadend', function() {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Close window on wallpaper loading finished.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window.close();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window.close();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
4826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   * Moves the check mark to |activeItem| and hides the wallpaper set by third
4836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   * party message if any. Called when wallpaper changed successfully.
4846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   * @param {?Object} activeItem The active item in WallpaperThumbnailsGrid's
4856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   *     data model.
4866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   * @param {?string} currentWallpaperURL The URL or filename of current
4876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   *     wallpaper.
4886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   */
4896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  WallpaperManager.prototype.onWallpaperChanged_ = function(
4906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      activeItem, currentWallpaperURL) {
4916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    this.wallpaperGrid_.activeItem = activeItem;
4926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    this.currentWallpaper_ = currentWallpaperURL;
4936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Hides the wallpaper set by message.
4946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    $('wallpaper-set-by-message').textContent = '';
4956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  };
4966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  /**
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * Sets wallpaper to the corresponding wallpaper of selected thumbnail.
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * @param {{baseURL: string, layout: string, source: string,
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *          availableOffline: boolean, opt_dynamicURL: string,
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *          opt_author: string, opt_authorWebsite: string}}
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *     selectedItem the selected item in WallpaperThumbnailsGrid's data
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *     model.
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    */
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.setSelectedWallpaper_ = function(selectedItem) {
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var self = this;
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (selectedItem.source) {
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case Constants.WallpaperSourceEnum.Custom:
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var errorHandler = this.onFileSystemError_.bind(this);
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var success = function(dirEntry) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          dirEntry.getFile(selectedItem.baseURL, {create: false},
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           function(fileEntry) {
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fileEntry.file(function(file) {
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              var reader = new FileReader();
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              reader.readAsArrayBuffer(file);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              reader.addEventListener('error', errorHandler);
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              reader.addEventListener('load', function(e) {
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                self.setCustomWallpaper(e.target.result,
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        selectedItem.layout,
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        false, selectedItem.baseURL,
5216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                        self.onWallpaperChanged_.bind(self,
5226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                            selectedItem, selectedItem.baseURL),
5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                        errorHandler);
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              });
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }, errorHandler);
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }, errorHandler);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL,
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         success, errorHandler);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case Constants.WallpaperSourceEnum.OEM:
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // Resets back to default wallpaper.
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        chrome.wallpaperPrivate.resetWallpaper();
5346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        this.onWallpaperChanged_(selectedItem, selectedItem.baseURL);
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        WallpaperUtil.saveWallpaperInfo(wallpaperURL, selectedItem.layout,
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        selectedItem.source);
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        break;
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case Constants.WallpaperSourceEnum.Online:
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var wallpaperURL = selectedItem.baseURL +
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            Constants.HighResolutionSuffix;
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var selectedGridItem = this.wallpaperGrid_.getListItem(selectedItem);
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome.wallpaperPrivate.setWallpaperIfExists(wallpaperURL,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     selectedItem.layout,
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     function(exists) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (exists) {
5476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            self.onWallpaperChanged_(selectedItem, wallpaperURL);
548a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            WallpaperUtil.saveWallpaperInfo(wallpaperURL, selectedItem.layout,
549a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                            selectedItem.source);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // Falls back to request wallpaper from server.
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (self.wallpaperRequest_)
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            self.wallpaperRequest_.abort();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self.wallpaperRequest_ = new XMLHttpRequest();
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          self.progressManager_.reset(self.wallpaperRequest_, selectedGridItem);
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          var onSuccess = function(xhr) {
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            var image = xhr.response;
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            chrome.wallpaperPrivate.setWallpaper(image, selectedItem.layout,
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                wallpaperURL,
5646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                function() {
5656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                  self.progressManager_.hideProgressBar(selectedGridItem);
5666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                  if (chrome.runtime.lastError != undefined &&
5686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                      chrome.runtime.lastError.message !=
5696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          str('canceledWallpaper')) {
5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    self.showError_(chrome.runtime.lastError.message);
5716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                  } else {
5726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    self.onWallpaperChanged_(selectedItem, wallpaperURL);
5736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                  }
5746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                });
575a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            WallpaperUtil.saveWallpaperInfo(wallpaperURL, selectedItem.layout,
576a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                            selectedItem.source);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            self.wallpaperRequest_ = null;
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          };
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          var onFailure = function() {
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            self.progressManager_.hideProgressBar(selectedGridItem);
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            self.showError_(str('downloadFailed'));
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            self.wallpaperRequest_ = null;
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          };
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          WallpaperUtil.fetchURL(wallpaperURL, 'arraybuffer', onSuccess,
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 onFailure, self.wallpaperRequest_);
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        console.error('Unsupported wallpaper source.');
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /*
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Removes the oldest custom wallpaper. If the oldest one is set as current
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * wallpaper, removes the second oldest one to free some space. This should
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * only be called when exceeding wallpaper quota.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.removeOldestWallpaper_ = function() {
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Custom wallpapers should already sorted when put to the data model. The
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // last element is the add new button, need to exclude it as well.
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var oldestIndex = this.wallpaperGrid_.dataModel.length - 2;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var item = this.wallpaperGrid_.dataModel.item(oldestIndex);
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!item || item.source != Constants.WallpaperSourceEnum.Custom)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (item.baseURL == this.currentWallpaper_)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      item = this.wallpaperGrid_.dataModel.item(--oldestIndex);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (item) {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.removeCustomWallpaper(item.baseURL);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.wallpaperGrid_.dataModel.splice(oldestIndex, 1);
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /*
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Shows an error message to user and log the failed reason in console.
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.onFileSystemError_ = function(e) {
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var msg = '';
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (e.code) {
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case FileError.QUOTA_EXCEEDED_ERR:
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        msg = 'QUOTA_EXCEEDED_ERR';
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Instead of simply remove oldest wallpaper, we should consider a
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // better way to handle this situation. See crbug.com/180890.
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.removeOldestWallpaper_();
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case FileError.NOT_FOUND_ERR:
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        msg = 'NOT_FOUND_ERR';
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case FileError.SECURITY_ERR:
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        msg = 'SECURITY_ERR';
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case FileError.INVALID_MODIFICATION_ERR:
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        msg = 'INVALID_MODIFICATION_ERR';
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case FileError.INVALID_STATE_ERR:
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        msg = 'INVALID_STATE_ERR';
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        msg = 'Unknown Error';
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    console.error('Error: ' + msg);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.showError_(str('accessFileFailure'));
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * Handles changing of selectedItem in wallpaper manager.
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WallpaperManager.prototype.onSelectedItemChanged_ = function() {
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.setWallpaperAttribution_(this.selectedItem_);
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!this.selectedItem_ || this.selectedItem_.source == 'ADDNEW')
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (this.selectedItem_.baseURL && !this.wallpaperGrid_.inProgramSelection) {
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (this.selectedItem_.source == Constants.WallpaperSourceEnum.Custom) {
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var items = {};
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        var key = this.selectedItem_.baseURL;
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var self = this;
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Constants.WallpaperLocalStorage.get(key, function(items) {
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          self.selectedItem_.layout =
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              items[key] ? items[key] : 'CENTER_CROPPED';
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          self.setSelectedWallpaper_(self.selectedItem_);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.setSelectedWallpaper_(this.selectedItem_);
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Set attributions of wallpaper with given URL. If URL is not valid, clear
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * the attributions.
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {{baseURL: string, dynamicURL: string, layout: string,
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *          author: string, authorWebsite: string, availableOffline: boolean}}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     selectedItem selected wallpaper item in grid.
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.setWallpaperAttribution_ = function(selectedItem) {
6791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Only online wallpapers have author and website attributes. All other type
6801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // of wallpapers should not show attributions.
6811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (selectedItem &&
6821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        selectedItem.source == Constants.WallpaperSourceEnum.Online) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('author-name').textContent = selectedItem.author;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('author-website').textContent = $('author-website').href =
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          selectedItem.authorWebsite;
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome.wallpaperPrivate.getThumbnail(selectedItem.baseURL,
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           selectedItem.source,
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           function(data) {
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var img = $('attribute-image');
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (data) {
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          var blob = new Blob([new Int8Array(data)], {'type' : 'image\/png'});
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          img.src = window.URL.createObjectURL(blob);
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          img.addEventListener('load', function(e) {
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            window.URL.revokeObjectURL(this.src);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          });
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else {
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          img.src = '';
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      });
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('wallpaper-attribute').hidden = false;
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      $('attribute-image').hidden = false;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('wallpaper-attribute').hidden = true;
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    $('attribute-image').hidden = true;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('author-name').textContent = '';
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('author-website').textContent = $('author-website').href = '';
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    $('attribute-image').src = '';
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Resize thumbnails grid and categories list to fit the new window size.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.onResize_ = function() {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.wallpaperGrid_.redraw();
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.categoriesList_.redraw();
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
72058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   * Close the last opened overlay on pressing the Escape key.
72158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   * @param {Event} event A keydown event.
72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   */
72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WallpaperManager.prototype.onKeyDown_ = function(event) {
72458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (event.keyCode == 27) {
72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // The last opened overlay coincides with the first match of querySelector
72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // because the Error Container is declared in the DOM before the Wallpaper
72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Selection Container.
72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // TODO(bshe): Make the overlay selection not dependent on the DOM.
72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      var closeButtonSelector = '.overlay-container:not([hidden]) .close';
73058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      var closeButton = this.document_.querySelector(closeButtonSelector);
73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (closeButton) {
73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        closeButton.click();
73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        event.preventDefault();
73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      }
73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
73658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /**
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Constructs the categories list.
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.initCategoriesList_ = function() {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.categoriesList_ = $('categories-list');
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.ui.List.decorate(this.categoriesList_);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // cr.ui.list calculates items in view port based on client height and item
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // height. However, categories list is displayed horizontally. So we should
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // not calculate visible items here. Sets autoExpands to true to show every
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // item in the list.
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(bshe): Use ul to replace cr.ui.list for category list.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.categoriesList_.autoExpands = true;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var self = this;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.categoriesList_.itemConstructor = function(entry) {
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return self.renderCategory_(entry);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.categoriesList_.selectionModel = new cr.ui.ListSingleSelectionModel();
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.categoriesList_.selectionModel.addEventListener(
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'change', this.onCategoriesChange_.bind(this));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var categoriesDataModel = new cr.ui.ArrayDataModel([]);
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (this.enableOnlineWallpaper_) {
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Adds all category as first category.
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      categoriesDataModel.push(str('allCategoryLabel'));
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (var key in this.manifest_.categories) {
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        categoriesDataModel.push(this.manifest_.categories[key]);
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Adds custom category as last category.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    categoriesDataModel.push(str('customCategoryLabel'));
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.categoriesList_.dataModel = categoriesDataModel;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Constructs the element in categories list.
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} entry Text content of a category.
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.renderCategory_ = function(entry) {
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var li = this.document_.createElement('li');
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.defineProperty(li, 'custom', cr.PropertyKind.BOOL_ATTR);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    li.custom = (entry == str('customCategoryLabel'));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.defineProperty(li, 'lead', cr.PropertyKind.BOOL_ATTR);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.defineProperty(li, 'selected', cr.PropertyKind.BOOL_ATTR);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var div = this.document_.createElement('div');
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div.textContent = entry;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    li.appendChild(div);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return li;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Handles the custom wallpaper which user selected from file manager. Called
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * when users select a file.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.onFileSelectorChanged_ = function() {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var files = $('file-selector').files;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (files.length != 1)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.error('More than one files are selected or no file selected');
7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!files[0].type.match('image/jpeg') &&
7987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        !files[0].type.match('image/png')) {
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.showError_(str('invalidWallpaper'));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var layout = getSelectedLayout();
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var self = this;
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var errorHandler = this.onFileSystemError_.bind(this);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var setSelectedFile = function(file, layout, fileName) {
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var saveThumbnail = function(thumbnail) {
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var success = function(dirEntry) {
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          dirEntry.getFile(fileName, {create: true}, function(fileEntry) {
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fileEntry.createWriter(function(fileWriter) {
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              fileWriter.onwriteend = function(e) {
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                $('set-wallpaper-layout').disabled = false;
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                var wallpaperInfo = {
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  baseURL: fileName,
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  layout: layout,
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  source: Constants.WallpaperSourceEnum.Custom,
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  availableOffline: true
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                };
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                self.wallpaperGrid_.dataModel.splice(0, 0, wallpaperInfo);
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                self.wallpaperGrid_.selectedItem = wallpaperInfo;
8206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                self.onWallpaperChanged_(wallpaperInfo, fileName);
821a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                WallpaperUtil.saveToStorage(self.currentWallpaper_, layout,
822a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                            false);
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              };
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              fileWriter.onerror = errorHandler;
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              var blob = new Blob([new Int8Array(thumbnail)],
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  {'type' : 'image\/jpeg'});
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              fileWriter.write(blob);
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }, errorHandler);
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }, errorHandler);
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        };
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.THUMBNAIL,
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            success, errorHandler);
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      };
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var success = function(dirEntry) {
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        dirEntry.getFile(fileName, {create: true}, function(fileEntry) {
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          fileEntry.createWriter(function(fileWriter) {
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fileWriter.addEventListener('writeend', function(e) {
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              var reader = new FileReader();
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              reader.readAsArrayBuffer(file);
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              reader.addEventListener('error', errorHandler);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              reader.addEventListener('load', function(e) {
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                self.setCustomWallpaper(e.target.result, layout, true, fileName,
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        saveThumbnail, function() {
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  self.removeCustomWallpaper(fileName);
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  errorHandler();
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                });
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              });
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            });
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fileWriter.addEventListener('error', errorHandler);
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fileWriter.write(file);
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }, errorHandler);
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }, errorHandler);
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      };
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL, success,
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       errorHandler);
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    setSelectedFile(files[0], layout, new Date().getTime().toString());
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Removes wallpaper and thumbnail with fileName from FileSystem.
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {string} fileName The file name of wallpaper and thumbnail to be
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *     removed.
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.removeCustomWallpaper = function(fileName) {
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var errorHandler = this.onFileSystemError_.bind(this);
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var self = this;
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var removeFile = function(fileName) {
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var success = function(dirEntry) {
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        dirEntry.getFile(fileName, {create: false}, function(fileEntry) {
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          fileEntry.remove(function() {
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }, errorHandler);
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }, errorHandler);
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Removes copy of original.
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL, success,
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       errorHandler);
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Removes generated thumbnail.
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.THUMBNAIL, success,
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       errorHandler);
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    removeFile(fileName);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Sets current wallpaper and generate thumbnail if generateThumbnail is true.
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {ArrayBuffer} wallpaper The binary representation of wallpaper.
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {string} layout The user selected wallpaper layout.
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {boolean} generateThumbnail True if need to generate thumbnail.
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {string} fileName The unique file name of wallpaper.
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {function(thumbnail):void} success Success callback. If
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *     generateThumbnail is true, the callback parameter should have the
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *     generated thumbnail.
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {function(e):void} failure Failure callback. Called when there is an
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *     error from FileSystem.
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.setCustomWallpaper = function(wallpaper,
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           layout,
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           generateThumbnail,
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           fileName,
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           success,
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           failure) {
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var self = this;
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var onFinished = function(opt_thumbnail) {
911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (chrome.runtime.lastError != undefined &&
912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          chrome.runtime.lastError.message != str('canceledWallpaper')) {
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.showError_(chrome.runtime.lastError.message);
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        $('set-wallpaper-layout').disabled = true;
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        failure();
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        success(opt_thumbnail);
918a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        // Custom wallpapers are not synced yet. If login on a different
919a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        // computer after set a custom wallpaper, wallpaper wont change by sync.
920a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        WallpaperUtil.saveWallpaperInfo(fileName, layout,
921a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                        Constants.WallpaperSourceEnum.Custom);
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome.wallpaperPrivate.setCustomWallpaper(wallpaper, layout,
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               generateThumbnail,
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               fileName, onFinished);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Handles the layout setting change of custom wallpaper.
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WallpaperManager.prototype.onWallpaperLayoutChanged_ = function() {
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var layout = getSelectedLayout();
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var self = this;
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome.wallpaperPrivate.setCustomWallpaperLayout(layout, function() {
937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (chrome.runtime.lastError != undefined &&
938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          chrome.runtime.lastError.message != str('canceledWallpaper')) {
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.showError_(chrome.runtime.lastError.message);
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.removeCustomWallpaper(fileName);
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        $('set-wallpaper-layout').disabled = true;
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
943a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        WallpaperUtil.saveToStorage(self.currentWallpaper_, layout, false);
9446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        self.onWallpaperChanged_(self.wallpaperGrid_.activeItem,
9456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                 self.currentWallpaper_);
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    });
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Handles user clicking on a different category.
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WallpaperManager.prototype.onCategoriesChange_ = function() {
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var categoriesList = this.categoriesList_;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selectedIndex = categoriesList.selectionModel.selectedIndex;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (selectedIndex == -1)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selectedListItem = categoriesList.getListItemByIndex(selectedIndex);
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var bar = $('bar');
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bar.style.left = selectedListItem.offsetLeft + 'px';
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bar.style.width = selectedListItem.offsetWidth + 'px';
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var wallpapersDataModel = new cr.ui.ArrayDataModel([]);
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var selectedItem;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (selectedListItem.custom) {
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.document_.body.setAttribute('custom', '');
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var errorHandler = this.onFileSystemError_.bind(this);
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var toArray = function(list) {
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return Array.prototype.slice.call(list || [], 0);
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var self = this;
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var processResults = function(entries) {
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (var i = 0; i < entries.length; i++) {
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          var entry = entries[i];
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          var wallpaperInfo = {
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                baseURL: entry.name,
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                // The layout will be replaced by the actual value saved in
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                // local storage when requested later. Layout is not important
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                // for constructing thumbnails grid, we use CENTER_CROPPED here
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                // to speed up the process of constructing. So we do not need to
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                // wait for fetching correct layout.
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                layout: 'CENTER_CROPPED',
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                source: Constants.WallpaperSourceEnum.Custom,
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                availableOffline: true
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          };
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          wallpapersDataModel.push(wallpaperInfo);
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        if (loadTimeData.getBoolean('isOEMDefaultWallpaper')) {
9901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          var oemDefaultWallpaperElement = {
9911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              baseURL: 'OemDefaultWallpaper',
9921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              layout: 'CENTER_CROPPED',
9931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              source: Constants.WallpaperSourceEnum.OEM,
9941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              availableOffline: true
9951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          };
9961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          wallpapersDataModel.push(oemDefaultWallpaperElement);
9971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
9981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        for (var i = 0; i < wallpapersDataModel.length; i++) {
9991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          if (self.currentWallpaper_ == wallpapersDataModel.item(i).baseURL)
10001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            selectedItem = wallpapersDataModel.item(i);
10011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var lastElement = {
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            baseURL: '',
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layout: '',
10051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            source: Constants.WallpaperSourceEnum.AddNew,
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            availableOffline: true
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        };
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        wallpapersDataModel.push(lastElement);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.wallpaperGrid_.dataModel = wallpapersDataModel;
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.wallpaperGrid_.selectedItem = selectedItem;
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.wallpaperGrid_.activeItem = selectedItem;
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var success = function(dirEntry) {
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var dirReader = dirEntry.createReader();
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var entries = [];
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of a directory's entries are not guaranteed to return in a single
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // call.
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        var readEntries = function() {
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          dirReader.readEntries(function(results) {
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (!results.length) {
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              processResults(entries.sort());
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } else {
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              entries = entries.concat(toArray(results));
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              readEntries();
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }, errorHandler);
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        };
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        readEntries(); // Start reading dirs.
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.wallpaperDirs_.getDirectory(WallpaperDirNameEnum.ORIGINAL,
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       success, errorHandler);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.document_.body.removeAttribute('custom');
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var key in this.manifest_.wallpaper_list) {
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (selectedIndex == AllCategoryIndex ||
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this.manifest_.wallpaper_list[key].categories.indexOf(
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                selectedIndex - OnlineCategoriesOffset) != -1) {
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var wallpaperInfo = {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            baseURL: this.manifest_.wallpaper_list[key].base_url,
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            layout: this.manifest_.wallpaper_list[key].default_layout,
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            source: Constants.WallpaperSourceEnum.Online,
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            availableOffline: false,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            author: this.manifest_.wallpaper_list[key].author,
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            authorWebsite: this.manifest_.wallpaper_list[key].author_website,
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            dynamicURL: this.manifest_.wallpaper_list[key].dynamic_url
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          };
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          var startIndex = wallpaperInfo.baseURL.lastIndexOf('/') + 1;
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          var fileName = wallpaperInfo.baseURL.substring(startIndex) +
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              Constants.HighResolutionSuffix;
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (this.downloadedListMap_ &&
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              this.downloadedListMap_.hasOwnProperty(encodeURI(fileName))) {
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            wallpaperInfo.availableOffline = true;
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          wallpapersDataModel.push(wallpaperInfo);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var url = this.manifest_.wallpaper_list[key].base_url +
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              Constants.HighResolutionSuffix;
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (url == this.currentWallpaper_) {
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            selectedItem = wallpaperInfo;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.wallpaperGrid_.dataModel = wallpapersDataModel;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.wallpaperGrid_.selectedItem = selectedItem;
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.wallpaperGrid_.activeItem = selectedItem;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1070