1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file.
4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction pointInElement(p, elem) {
6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return ((p.x >= elem.offsetLeft) &&
7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          (p.x <= (elem.offsetLeft + elem.offsetWidth)) &&
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          (p.y >= elem.offsetTop) &&
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          (p.y <= (elem.offsetTop + elem.offsetHeight)));
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction setLastOpened() {
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  localStorage.popupLastOpened = (new Date()).getTime();
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.runtime.sendMessage('poll');
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction loadI18nMessages() {
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  function setProperty(selector, prop, msg) {
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.querySelector(selector)[prop] = chrome.i18n.getMessage(msg);
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('title', 'innerText', 'tabTitle');
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#q', 'placeholder', 'searchPlaceholder');
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#clear-all', 'title', 'clearAllTitle');
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#open-folder', 'title', 'openDownloadsFolderTitle');
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#empty', 'innerText', 'zeroItems');
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#searching', 'innerText', 'searching');
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#search-zero', 'innerText', 'zeroSearchResults');
29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  setProperty('#management-permission-info', 'innerText',
30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch              'managementPermissionInfo');
31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  setProperty('#grant-management-permission', 'innerText',
32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch              'grantManagementPermission');
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#older', 'innerText', 'showOlderDownloads');
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#loading-older', 'innerText', 'loadingOlderDownloads');
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.pause', 'title', 'pauseTitle');
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.resume', 'title', 'resumeTitle');
37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.cancel', 'title', 'cancelTitle');
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.show-folder', 'title', 'showInFolderTitle');
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.erase', 'title', 'eraseTitle');
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.url', 'title', 'retryTitle');
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.referrer', 'title', 'referrerTitle');
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.open-filename', 'title', 'openTitle');
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('#bad-chrome-version', 'innerText', 'badChromeVersion');
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  setProperty('.remove-file', 'title', 'removeFileTitle');
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.querySelector('.progress').style.minWidth =
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    getTextWidth(formatBytes(1024 * 1024 * 1023.9) + '/' +
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                 formatBytes(1024 * 1024 * 1023.9)) + 'px';
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // This only covers {timeLeft,openWhenComplete}{Finishing,Days}. If
51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // ...Hours/Minutes/Seconds could be longer for any locale, then this should
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // test them.
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var max_time_left_width = 0;
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (var i = 0; i < 4; ++i) {
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    max_time_left_width = Math.max(max_time_left_width, getTextWidth(
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        formatTimeLeft(0 == (i % 2),
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                       (i < 2) ? 0 : ((100 * 24) + 23) * 60 * 60 * 1000)));
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.querySelector('body div.item span.time-left').style.minWidth =
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch     max_time_left_width + 'px';
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction getTextWidth(s) {
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var probe = document.getElementById('text-width-probe');
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  probe.innerText = s;
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return probe.offsetWidth;
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction formatDateTime(date) {
70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var now = new Date();
71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var zpad_mins = ':' + (date.getMinutes() < 10 ? '0' : '') + date.getMinutes();
72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (date.getYear() != now.getYear()) {
73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return '' + (1900 + date.getYear());
74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } else if ((date.getMonth() != now.getMonth()) ||
75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch             (date.getDate() != now.getDate())) {
76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return date.getDate() + ' ' + chrome.i18n.getMessage(
77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      'month' + date.getMonth() + 'abbr');
78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } else if (date.getHours() == 12) {
79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return '12' + zpad_mins + 'pm';
80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } else if (date.getHours() > 12) {
81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return (date.getHours() - 12) + zpad_mins + 'pm';
82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return date.getHours() + zpad_mins + 'am';
84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction formatBytes(n) {
87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (n < 1024) {
88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return n + 'B';
89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var prefixes = 'KMGTPEZY';
91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var mul = 1024;
92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (var i = 0; i < prefixes.length; ++i) {
93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (n < (1024 * mul)) {
94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return (parseInt(n / mul) + '.' + parseInt(10 * ((n / mul) % 1)) +
95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch              prefixes[i] + 'B');
96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    mul *= 1024;
98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return '!!!';
100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction formatTimeLeft(openWhenComplete, ms) {
103d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var prefix = openWhenComplete ? 'openWhenComplete' : 'timeLeft';
104d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (ms < 1000) {
105d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return chrome.i18n.getMessage(prefix + 'Finishing');
106d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
107d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var days = parseInt(ms / (24 * 60 * 60 * 1000));
108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var hours = parseInt(ms / (60 * 60 * 1000)) % 24;
109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (days) {
110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return chrome.i18n.getMessage(prefix + 'Days', [days, hours]);
111d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
112d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var minutes = parseInt(ms / (60 * 1000)) % 60;
113d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (hours) {
114d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return chrome.i18n.getMessage(prefix + 'Hours', [hours, minutes]);
115d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
116d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var seconds = parseInt(ms / 1000) % 60;
117d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (minutes) {
118d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return chrome.i18n.getMessage(prefix + 'Minutes', [minutes, seconds]);
119d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
120d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return chrome.i18n.getMessage(prefix + 'Seconds', [seconds]);
121d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
122d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function ratchetWidth(w) {
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var current = parseInt(document.body.style.minWidth) || 0;
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  document.body.style.minWidth = Math.max(w, current) + 'px';
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function ratchetHeight(h) {
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var current = parseInt(document.body.style.minHeight) || 0;
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  document.body.style.minHeight = Math.max(h, current) + 'px';
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
133d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction binarySearch(array, target, cmp) {
134d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var low = 0, high = array.length - 1, i, comparison;
135d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  while (low <= high) {
136d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    i = (low + high) >> 1;
137d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    comparison = cmp(target, array[i]);
138d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (comparison < 0) {
139d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      low = i + 1;
140d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    } else if (comparison > 0) {
141d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      high = i - 1;
142d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    } else {
143d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return i;
144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return i;
147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
149d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction arrayFrom(seq) {
150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return Array.prototype.slice.apply(seq);
151d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
152d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
153d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction DownloadItem(data) {
154d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var item = this;
155d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (var prop in data) {
156d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item[prop] = data[prop];
157d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
158d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.startTime = new Date(item.startTime);
159d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.canResume == undefined) {
160d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadItem.canResumeHack = true;
161d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
162d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
163d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.div = document.querySelector('body>div.item').cloneNode(true);
164d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.div.id = 'item' + item.id;
165d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.div.item = item;
166d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
167d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var items_div = document.getElementById('items');
168d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if ((items_div.childNodes.length == 0) ||
169d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      (item.startTime.getTime() < items_div.childNodes[
170d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch       items_div.childNodes.length - 1].item.startTime.getTime())) {
171d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    items_div.appendChild(item.div);
172d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } else if (item.startTime.getTime() >
173d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch             items_div.childNodes[0].item.startTime.getTime()) {
174d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    items_div.insertBefore(item.div, items_div.childNodes[0]);
175d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } else {
176d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    var adjacent_div = items_div.childNodes[
177d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      binarySearch(arrayFrom(items_div.childNodes),
178d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                   item.startTime.getTime(),
179d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                   function(target, other) {
180d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          return target - other.item.startTime.getTime();
181d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    })];
182d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    var adjacent_item = adjacent_div.item;
183d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (adjacent_item.startTime.getTime() < item.startTime.getTime()) {
184d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      items_div.insertBefore(item.div, adjacent_div);
185d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    } else {
186d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      items_div.insertBefore(item.div, adjacent_div.nextSibling);
187d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
188d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
189d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
190d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('referrer').onclick = function() {
191d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    chrome.tabs.create({url: item.referrer});
192d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
193d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  item.getElement('by-ext').onclick = function() {
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    chrome.tabs.create({url: 'chrome://extensions#' + item.byExtensionId});
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
198d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('open-filename').onclick = function() {
199d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.open();
200d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
201d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
202d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('open-filename').ondragstart = function() {
203d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.drag();
204d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
205d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
206d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('pause').onclick = function() {
207d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.pause();
208d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
209d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
210d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('cancel').onclick = function() {
211d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.cancel();
212d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
213d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
214d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('resume').onclick = function() {
215d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.resume();
216d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
217d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
218d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('show-folder').onclick = function() {
219d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.show();
220d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
221d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
222d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('remove-file').onclick = function() {
223d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.removeFile();
224d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
225d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
226d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('erase').onclick = function() {
227d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.erase();
228d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
229d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
230d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
231d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.more_mousemove = function(evt) {
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var mouse = {x:evt.x, y:evt.y+document.body.scrollTop};
233d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (item.getElement('more') &&
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        (pointInElement(mouse, item.div) ||
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         pointInElement(mouse, item.getElement('more')))) {
236d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return;
237d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
238d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (item.getElement('more')) {
239d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('more').hidden = true;
240d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
241d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    window.removeEventListener('mousemove', item.more_mousemove);
242d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  [item.div, item.getElement('more')].concat(
244d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('more').children).forEach(function(elem) {
245d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    elem.onmouseover = function() {
246d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      arrayFrom(items_div.children).forEach(function(other) {
247d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        if (other.item != item) {
248d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          other.item.getElement('more').hidden = true;
249d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        }
250d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      });
251d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('more').hidden = false;
252d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('more').style.top =
253d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        (item.div.offsetTop + item.div.offsetHeight) + 'px';
254d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('more').style.left = item.div.offsetLeft + 'px';
255d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      if (window.innerHeight < (parseInt(item.getElement('more').style.top) +
256d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                                item.getElement('more').offsetHeight)) {
257d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        item.getElement('more').style.top = (
258d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          item.div.offsetTop - item.getElement('more').offsetHeight) + 'px';
259d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
260d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      window.addEventListener('mousemove', item.more_mousemove);
261d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    };
262d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
263d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
264d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.referrer) {
265d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.getElement('referrer').href = item.referrer;
266d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } else {
267d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.getElement('referrer').hidden = true;
268d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
269d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('url').href = item.url;
270d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('url').innerText = item.url;
271d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.render();
272d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
273d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.canResumeHack = false;
274d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
275d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.getElement = function(name) {
276d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return document.querySelector('#item' + this.id + ' .' + name);
277d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
278d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
279d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.render = function() {
280d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var item = this;
281d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var now = new Date();
282d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var in_progress = (item.state == 'in_progress')
283d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var openable = (item.state != 'interrupted') && item.exists && !item.deleted;
284d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
285d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.startTime = new Date(item.startTime);
286d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (DownloadItem.canResumeHack) {
287d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.canResume = in_progress && item.paused;
288d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
289d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.filename) {
290d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.basename = item.filename.substring(Math.max(
291d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.filename.lastIndexOf('\\'),
292d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.filename.lastIndexOf('/')) + 1);
293d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
294d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.estimatedEndTime) {
295d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.estimatedEndTime = new Date(item.estimatedEndTime);
296d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
297d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.endTime) {
298d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.endTime = new Date(item.endTime);
299d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
300d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
301d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.filename && !item.icon_url) {
302d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    chrome.downloads.getFileIcon(
303d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.id,
304d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      {'size': 32},
305d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      function(icon_url) {
306d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        item.getElement('icon').hidden = !icon_url;
307d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        if (icon_url) {
308d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          item.icon_url = icon_url;
309d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          item.getElement('icon').src = icon_url;
310d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        }
311d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
312d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
313d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
314bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  item.getElement('removed').style.display = openable ? 'none' : 'inline';
315d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('open-filename').style.display = (
316bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    openable ? 'inline' : 'none');
317d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('in-progress').hidden = !in_progress;
318d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('pause').style.display = (
319d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    !in_progress || item.paused) ? 'none' : 'inline-block';
320d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('resume').style.display = (
321d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    !in_progress || !item.canResume) ? 'none' : 'inline-block';
322d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('cancel').style.display = (
323d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    !in_progress ? 'none' : 'inline-block');
324d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('remove-file').hidden = (
325d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    (item.state != 'complete') ||
326d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    !item.exists ||
327d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.deleted ||
328d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    !chrome.downloads.removeFile);
329d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('erase').hidden = in_progress;
330d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
331d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var could_progress = in_progress || item.canResume;
332d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('progress').style.display = (
333d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    could_progress ? 'inline-block' : 'none');
334d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('meter').hidden = !could_progress || !item.totalBytes;
335d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
336d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('removed').innerText = item.basename;
337d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('open-filename').innerText = item.basename;
338d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
339bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  function setByExtension(show) {
340bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (show) {
341bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      item.getElement('by-ext').title = item.byExtensionName;
342bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      item.getElement('by-ext').href =
343bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        'chrome://extensions#' + item.byExtensionId;
344bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      item.getElement('by-ext img').src =
345bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        'chrome://extension-icon/' + item.byExtensionId + '/48/1';
346bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    } else {
347bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      item.getElement('by-ext').hidden = true;
348bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    }
349bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (item.byExtensionId && item.byExtensionName) {
351bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    chrome.permissions.contains({permissions: ['management']},
352bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                function(result) {
353bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      if (result) {
354bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        setByExtension(true);
355bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      } else {
356bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        setByExtension(false);
357bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        if (!localStorage.managementPermissionDenied) {
358bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          document.getElementById('request-management-permission').hidden =
359bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            false;
360bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          document.getElementById('grant-management-permission').onclick =
361bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch              function() {
362bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            chrome.permissions.request({permissions: ['management']},
363bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                      function(granted) {
364bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch              setByExtension(granted);
365bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch              if (!granted) {
366bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                localStorage.managementPermissionDenied = true;
367bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch              }
368bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            });
369bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            return false;
370bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          };
371bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        }
372bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      }
373bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    });
374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
375bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    setByExtension(false);
376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
378d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!item.getElement('error').hidden) {
379d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (item.error) {
380d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      // TODO(benjhayden) When https://codereview.chromium.org/16924017/ is
381d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      // released, set minimum_chrome_version and remove the error_N messages.
382d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('error').innerText = chrome.i18n.getMessage(
383d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          'error_' + item.error);
384d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      if (!item.getElement('error').innerText) {
385d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        item.getElement('error').innerText = item.error;
386d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
387d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    } else if (!openable) {
388d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('error').innerText = chrome.i18n.getMessage(
389d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          'errorRemoved');
390d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
391d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
392d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
393d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  item.getElement('complete-size').innerText = formatBytes(
394d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.bytesReceived);
395d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.totalBytes && (item.state != 'complete')) {
396d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.getElement('progress').innerText = (
397d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('complete-size').innerText + '/' +
398d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      formatBytes(item.totalBytes));
399d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.getElement('meter').children[0].style.width = parseInt(
400d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        100 * item.bytesReceived / item.totalBytes) + '%';
401d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
402d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
403d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (in_progress) {
404d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (item.estimatedEndTime && !item.paused) {
405d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      var openWhenComplete = false;
406d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      try {
407d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        openWhenComplete = JSON.parse(localStorage.openWhenComplete).indexOf(
408d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch            item.id) >= 0;
409d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      } catch (e) {
410d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
411d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('time-left').innerText = formatTimeLeft(
412d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          openWhenComplete, item.estimatedEndTime.getTime() - now.getTime());
413d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    } else {
414d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.getElement('time-left').innerText = String.fromCharCode(160);
415d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
416d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
417d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
418d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (item.startTime) {
419d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.getElement('start-time').innerText = formatDateTime(
420d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        item.startTime);
421d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
422d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ratchetWidth(item.getElement('icon').offsetWidth +
4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               item.getElement('file-url').offsetWidth +
4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               item.getElement('cancel').offsetWidth +
4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               item.getElement('pause').offsetWidth +
4273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               item.getElement('resume').offsetWidth);
4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ratchetWidth(item.getElement('more').offsetWidth);
4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
430d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  this.maybeAccept();
431d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
432d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
433d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.onChanged = function(delta) {
434d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (var key in delta) {
435d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (key != 'id') {
436d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      this[key] = delta[key].current;
437d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
438d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
439d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  this.render();
440d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (delta.state) {
441d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    setLastOpened();
442d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
443d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if ((this.state == 'in_progress') && !this.paused) {
444d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.startPollingProgress();
445d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
446d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
447d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
448d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.onErased = function() {
449d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  window.removeEventListener('mousemove', this.more_mousemove);
450d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.getElementById('items').removeChild(this.div);
451d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
452d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
453d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.drag = function() {
454d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.drag(this.id);
455d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
456d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
457d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.show = function() {
458d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.show(this.id);
459d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
460d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
461d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.open = function() {
462d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (this.state == 'complete') {
463d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    chrome.downloads.open(this.id);
464d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return;
465d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
466d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.runtime.sendMessage({openWhenComplete:this.id});
467d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
468d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
469d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.removeFile = function() {
470d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.removeFile(this.id);
471d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  this.deleted = true;
472d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  this.render();
473d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
474d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
475d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.erase = function() {
476d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.erase({id: this.id});
477d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
478d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
479d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.pause = function() {
480d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.pause(this.id);
481d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
482d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
483d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.resume = function() {
484d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.resume(this.id);
485d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
486d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
487d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.cancel = function() {
488d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.cancel(this.id);
489d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
490d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
491d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.maybeAccept = function() {
492d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // This function is safe to call at any time for any item, and it will always
493d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // do the right thing, which is to display the danger prompt only if the item
494d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // is in_progress and dangerous, and if the prompt is not already displayed.
495d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if ((this.state != 'in_progress') ||
496d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      (this.danger == 'safe') ||
497d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      (this.danger == 'accepted') ||
498d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      DownloadItem.prototype.maybeAccept.accepting_danger) {
499d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return;
500d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ratchetWidth(400);
5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ratchetHeight(200);
503d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadItem.prototype.maybeAccept.accepting_danger = true;
504424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // On Mac, window.onload is run while the popup is animating in, before it is
505424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // considered "visible". Prompts will not be displayed over an invisible
506424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // window, so the popup will become stuck. Just wait a little bit for the
507424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // window to finish animating in. http://crbug.com/280107
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This has been fixed, so this setTimeout can be removed when the fix has
5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // been released to stable, and minimum_chrome_version can be set.
510424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  var id = this.id;
511424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  setTimeout(function() {
512424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    chrome.downloads.acceptDanger(id, function() {
513424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      DownloadItem.prototype.maybeAccept.accepting_danger = false;
514424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      arrayFrom(document.getElementById('items').childNodes).forEach(
515424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        function(item_div) { item_div.item.maybeAccept(); });
516424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    });
517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }, 500);
518d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
519d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.maybeAccept.accepting_danger = false;
520d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
521d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvar DownloadManager = {};
522d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
523d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.showingOlder = false;
524d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
525d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.getItem = function(id) {
526d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var item_div = document.getElementById('item' + id);
527d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return item_div ? item_div.item : null;
528d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
529d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
530d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.getOrCreate = function(data) {
531d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var item = DownloadManager.getItem(data.id);
532d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return item ? item : new DownloadItem(data);
533d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
534d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
535d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.forEachItem = function(cb) {
536d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Calls cb(item, index) in the order that they are displayed, i.e. in order
537d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // of decreasing startTime.
538d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  arrayFrom(document.getElementById('items').childNodes).forEach(
539d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    function(item_div, index) { cb(item_div.item, index); });
540d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
541d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
542d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress = function() {
543d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (DownloadManager.startPollingProgress.tid < 0) {
544d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.startPollingProgress.tid = setTimeout(
545d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      DownloadManager.startPollingProgress.pollProgress,
546d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      DownloadManager.startPollingProgress.MS);
547d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
548d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
549d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress.MS = 200;
550d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress.tid = -1;
551d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress.pollProgress = function() {
552d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.startPollingProgress.tid = -1;
553d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.search({state: 'in_progress', paused: false},
554d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      function(results) {
555d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!results.length)
556d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return;
557d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    results.forEach(function(result) {
558d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      var item = DownloadManager.getOrCreate(result);
559d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      for (var prop in result) {
560d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        item[prop] = result[prop];
561d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
562d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.render();
563d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      if ((item.state == 'in_progress') && !item.paused) {
564d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        DownloadManager.startPollingProgress();
565d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
566d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
567d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
568d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
569d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
570d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.showNew = function() {
571d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var any_items = (document.getElementById('items').childNodes.length > 0);
572d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.getElementById('empty').style.display =
573d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    any_items ? 'none' : 'inline-block';
574bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  document.getElementById('head').style.borderBottomWidth =
575bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    (any_items ? 1 : 0) + 'px';
576d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.getElementById('clear-all').hidden = !any_items;
577d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
578d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var query_search = document.getElementById('q');
579d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  query_search.hidden = !any_items;
580d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
581d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!any_items) {
582d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return;
583d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
584d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var old_ms = (new Date()).getTime() - kOldMs;
585d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var any_hidden = false;
586d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var any_showing = false;
587d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // First show up to kShowNewMax items newer than kOldMs. If there aren't any
588d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // items newer than kOldMs, then show up to kShowNewMax items of any age. If
589d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // there are any hidden items, show the Show Older button.
590d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.forEachItem(function(item, index) {
591d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.div.hidden = !DownloadManager.showingOlder && (
592d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      (item.startTime.getTime() < old_ms) || (index >= kShowNewMax));
593d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    any_hidden = any_hidden || item.div.hidden;
594d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    any_showing = any_showing || !item.div.hidden;
595d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
596d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!any_showing) {
597d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    any_hidden = false;
598d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.forEachItem(function(item, index) {
599d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.div.hidden = !DownloadManager.showingOlder && (index >= kShowNewMax);
600d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      any_hidden = any_hidden || item.div.hidden;
601d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      any_showing = any_showing || !item.div.hidden;
602d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
603d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
604d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.getElementById('older').hidden = !any_hidden;
605d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
606d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  query_search.focus();
607d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
608d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
609d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.showOlder = function() {
610d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.showingOlder = true;
611d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var loading_older_span = document.getElementById('loading-older');
612d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.getElementById('older').hidden = true;
613d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  loading_older_span.hidden = false;
614d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.search({}, function(results) {
615d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    results.forEach(function(result) {
616d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      var item = DownloadManager.getOrCreate(result);
617d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.div.hidden = false;
618d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
619d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    loading_older_span.hidden = true;
620d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
621d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
622d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
623d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.onSearch = function() {
624d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // split string by space, but ignore space in quotes
625d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // http://stackoverflow.com/questions/16261635
626d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var query = document.getElementById('q').value.match(/(?:[^\s"]+|"[^"]*")+/g);
627d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!query) {
628d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.showNew();
629d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('search-zero').hidden = true;
630d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } else {
631d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    query = query.map(function(term) {
632d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      // strip quotes
633d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return (term.match(/\s/) &&
634d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch              term[0].match(/["']/) &&
635d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch              term[term.length - 1] == term[0]) ?
636d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        term.substr(1, term.length - 2) : term;
637d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
638d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    var searching = document.getElementById('searching');
639d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    searching.hidden = false;
640d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    chrome.downloads.search({query: query}, function(results) {
641d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      document.getElementById('older').hidden = true;
642d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      DownloadManager.forEachItem(function(item) {
643d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        item.div.hidden = true;
644d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      });
645d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      results.forEach(function(result) {
646d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        DownloadManager.getOrCreate(result).div.hidden = false;
647d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      });
648d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      searching.hidden = true;
649d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      document.getElementById('search-zero').hidden = (results.length != 0);
650d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
651d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
652d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
653d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
654d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.clearAll = function() {
655d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.forEachItem(function(item) {
656d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!item.div.hidden) {
657d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.erase();
658d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      // The onErased handler should circle back around to loadItems.
659d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
660d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
661d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
662d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
663d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvar kShowNewMax = 50;
664d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvar kOldMs = 1000 * 60 * 60 * 24 * 7;
665d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
666d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// These settings can be tuned by modifying localStorage in dev-tools.
667d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochif ('kShowNewMax' in localStorage) {
668d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  kShowNewMax = parseInt(localStorage.kShowNewMax);
669d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
670d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochif ('kOldMs' in localStorage) {
671d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  kOldMs = parseInt(localStorage.kOldMs);
672d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
673d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
674d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems = function() {
675d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Request up to kShowNewMax + 1, but only display kShowNewMax; the +1 is a
676d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // probe to see if there are any older downloads.
677d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // TODO(benjhayden) When https://codereview.chromium.org/16924017/ is
678d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // released, set minimum_chrome_version and remove this try/catch.
679d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  try {
680d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    chrome.downloads.search({
681d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        orderBy: ['-startTime'],
682d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        limit: kShowNewMax + 1},
683d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      function(results) {
684d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        DownloadManager.loadItems.items = results;
685d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        DownloadManager.loadItems.onLoaded();
686d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
687d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } catch (exc) {
688d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    chrome.downloads.search({
689d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        orderBy: '-startTime',
690d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        limit: kShowNewMax + 1},
691d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      function(results) {
692d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        DownloadManager.loadItems.items = results;
693d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        DownloadManager.loadItems.onLoaded();
694d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
695d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
696d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
697d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.items = [];
698d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.window_loaded = false;
699d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
700d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.onLoaded = function() {
701d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!DownloadManager.loadItems.window_loaded) {
702d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return;
703d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
704d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.loadItems.items.forEach(function(item) {
705d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.getOrCreate(item);
706d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
707d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.loadItems.items = [];
708d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.showNew();
709d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
710d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
711d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.onWindowLoaded = function() {
712d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.loadItems.window_loaded = true;
713d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.loadItems.onLoaded();
714d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
715d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
716d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// If this extension is installed on a stable-channel chrome, where the
717d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// downloads API is not available, do not use the downloads API, and link to the
718d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// beta channel.
719d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochif (chrome.downloads) {
720d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Start searching ASAP, don't wait for onload.
721d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  DownloadManager.loadItems();
722d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
723d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.onCreated.addListener(function(item) {
724d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.getOrCreate(item);
725d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.showNew();
726d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.startPollingProgress();
727d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
728d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
729d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.onChanged.addListener(function(delta) {
730d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    var item = DownloadManager.getItem(delta.id);
731d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (item) {
732d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      item.onChanged(delta);
733d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
734d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
735d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
736d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.onErased.addListener(function(id) {
737d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    var item = DownloadManager.getItem(id);
738d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!item) {
739d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return;
740d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
741d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    item.onErased();
742d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.loadItems();
743d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
744d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
745d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  window.onload = function() {
7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ratchetWidth(
747bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      document.getElementById('q-outer').offsetWidth +
748d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      document.getElementById('clear-all').offsetWidth +
7493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      document.getElementById('open-folder').offsetWidth);
750d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    setLastOpened();
751d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    loadI18nMessages();
752d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DownloadManager.loadItems.onWindowLoaded();
753d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('older').onclick = function() {
754d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      DownloadManager.showOlder();
755d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
756d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    };
757d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('q').onsearch = function() {
758d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      DownloadManager.onSearch();
759d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    };
760d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('clear-all').onclick = function() {
761d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      DownloadManager.clearAll();
762d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
763d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    };
764d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (chrome.downloads.showDefaultFolder) {
765d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      document.getElementById('open-folder').onclick = function() {
766d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        chrome.downloads.showDefaultFolder();
767d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        return false;
768d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      };
769d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    } else {
770d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      document.getElementById('open-folder').hidden = true;
771d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
772d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
773d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} else {
774d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // The downloads API is not available.
775d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // TODO(benjhayden) Remove this when minimum_chrome_version is set.
776d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  window.onload = function() {
777d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    loadI18nMessages();
778d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    var bad_version = document.getElementById('bad-chrome-version');
779d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    bad_version.hidden = false;
780d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    bad_version.onclick = function() {
781d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      chrome.tabs.create({url: bad_version.href});
782d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
783d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    };
784d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('empty').style.display = 'none';
785d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('q').style.display = 'none';
786d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('open-folder').style.display = 'none';
787d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    document.getElementById('clear-all').style.display = 'none';
788d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  };
789d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
790