// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

function pointInElement(p, elem) {
  return ((p.x >= elem.offsetLeft) &&
          (p.x <= (elem.offsetLeft + elem.offsetWidth)) &&
          (p.y >= elem.offsetTop) &&
          (p.y <= (elem.offsetTop + elem.offsetHeight)));
};

function setLastOpened() {
  localStorage.popupLastOpened = (new Date()).getTime();
  chrome.runtime.sendMessage('poll');
};

function loadI18nMessages() {
  function setProperty(selector, prop, msg) {
    document.querySelector(selector)[prop] = chrome.i18n.getMessage(msg);
  }

  setProperty('title', 'innerText', 'tabTitle');
  setProperty('#q', 'placeholder', 'searchPlaceholder');
  setProperty('#clear-all', 'title', 'clearAllTitle');
  setProperty('#open-folder', 'title', 'openDownloadsFolderTitle');
  setProperty('#empty', 'innerText', 'zeroItems');
  setProperty('#searching', 'innerText', 'searching');
  setProperty('#search-zero', 'innerText', 'zeroSearchResults');
  setProperty('#management-permission-info', 'innerText',
              'managementPermissionInfo');
  setProperty('#grant-management-permission', 'innerText',
              'grantManagementPermission');
  setProperty('#older', 'innerText', 'showOlderDownloads');
  setProperty('#loading-older', 'innerText', 'loadingOlderDownloads');
  setProperty('.pause', 'title', 'pauseTitle');
  setProperty('.resume', 'title', 'resumeTitle');
  setProperty('.cancel', 'title', 'cancelTitle');
  setProperty('.show-folder', 'title', 'showInFolderTitle');
  setProperty('.erase', 'title', 'eraseTitle');
  setProperty('.url', 'title', 'retryTitle');
  setProperty('.referrer', 'title', 'referrerTitle');
  setProperty('.open-filename', 'title', 'openTitle');
  setProperty('#bad-chrome-version', 'innerText', 'badChromeVersion');
  setProperty('.remove-file', 'title', 'removeFileTitle');

  document.querySelector('.progress').style.minWidth =
    getTextWidth(formatBytes(1024 * 1024 * 1023.9) + '/' +
                 formatBytes(1024 * 1024 * 1023.9)) + 'px';

  // This only covers {timeLeft,openWhenComplete}{Finishing,Days}. If
  // ...Hours/Minutes/Seconds could be longer for any locale, then this should
  // test them.
  var max_time_left_width = 0;
  for (var i = 0; i < 4; ++i) {
    max_time_left_width = Math.max(max_time_left_width, getTextWidth(
        formatTimeLeft(0 == (i % 2),
                       (i < 2) ? 0 : ((100 * 24) + 23) * 60 * 60 * 1000)));
  }
  document.querySelector('body div.item span.time-left').style.minWidth =
     max_time_left_width + 'px';
};

function getTextWidth(s) {
  var probe = document.getElementById('text-width-probe');
  probe.innerText = s;
  return probe.offsetWidth;
};

function formatDateTime(date) {
  var now = new Date();
  var zpad_mins = ':' + (date.getMinutes() < 10 ? '0' : '') + date.getMinutes();
  if (date.getYear() != now.getYear()) {
    return '' + (1900 + date.getYear());
  } else if ((date.getMonth() != now.getMonth()) ||
             (date.getDate() != now.getDate())) {
    return date.getDate() + ' ' + chrome.i18n.getMessage(
      'month' + date.getMonth() + 'abbr');
  } else if (date.getHours() == 12) {
    return '12' + zpad_mins + 'pm';
  } else if (date.getHours() > 12) {
    return (date.getHours() - 12) + zpad_mins + 'pm';
  }
  return date.getHours() + zpad_mins + 'am';
}

function formatBytes(n) {
  if (n < 1024) {
    return n + 'B';
  }
  var prefixes = 'KMGTPEZY';
  var mul = 1024;
  for (var i = 0; i < prefixes.length; ++i) {
    if (n < (1024 * mul)) {
      return (parseInt(n / mul) + '.' + parseInt(10 * ((n / mul) % 1)) +
              prefixes[i] + 'B');
    }
    mul *= 1024;
  }
  return '!!!';
}

function formatTimeLeft(openWhenComplete, ms) {
  var prefix = openWhenComplete ? 'openWhenComplete' : 'timeLeft';
  if (ms < 1000) {
    return chrome.i18n.getMessage(prefix + 'Finishing');
  }
  var days = parseInt(ms / (24 * 60 * 60 * 1000));
  var hours = parseInt(ms / (60 * 60 * 1000)) % 24;
  if (days) {
    return chrome.i18n.getMessage(prefix + 'Days', [days, hours]);
  }
  var minutes = parseInt(ms / (60 * 1000)) % 60;
  if (hours) {
    return chrome.i18n.getMessage(prefix + 'Hours', [hours, minutes]);
  }
  var seconds = parseInt(ms / 1000) % 60;
  if (minutes) {
    return chrome.i18n.getMessage(prefix + 'Minutes', [minutes, seconds]);
  }
  return chrome.i18n.getMessage(prefix + 'Seconds', [seconds]);
}

function ratchetWidth(w) {
  var current = parseInt(document.body.style.minWidth) || 0;
  document.body.style.minWidth = Math.max(w, current) + 'px';
}

function ratchetHeight(h) {
  var current = parseInt(document.body.style.minHeight) || 0;
  document.body.style.minHeight = Math.max(h, current) + 'px';
}

function binarySearch(array, target, cmp) {
  var low = 0, high = array.length - 1, i, comparison;
  while (low <= high) {
    i = (low + high) >> 1;
    comparison = cmp(target, array[i]);
    if (comparison < 0) {
      low = i + 1;
    } else if (comparison > 0) {
      high = i - 1;
    } else {
      return i;
    }
  }
  return i;
};

function arrayFrom(seq) {
  return Array.prototype.slice.apply(seq);
};

function DownloadItem(data) {
  var item = this;
  for (var prop in data) {
    item[prop] = data[prop];
  }
  item.startTime = new Date(item.startTime);
  if (item.canResume == undefined) {
    DownloadItem.canResumeHack = true;
  }

  item.div = document.querySelector('body>div.item').cloneNode(true);
  item.div.id = 'item' + item.id;
  item.div.item = item;

  var items_div = document.getElementById('items');
  if ((items_div.childNodes.length == 0) ||
      (item.startTime.getTime() < items_div.childNodes[
       items_div.childNodes.length - 1].item.startTime.getTime())) {
    items_div.appendChild(item.div);
  } else if (item.startTime.getTime() >
             items_div.childNodes[0].item.startTime.getTime()) {
    items_div.insertBefore(item.div, items_div.childNodes[0]);
  } else {
    var adjacent_div = items_div.childNodes[
      binarySearch(arrayFrom(items_div.childNodes),
                   item.startTime.getTime(),
                   function(target, other) {
          return target - other.item.startTime.getTime();
    })];
    var adjacent_item = adjacent_div.item;
    if (adjacent_item.startTime.getTime() < item.startTime.getTime()) {
      items_div.insertBefore(item.div, adjacent_div);
    } else {
      items_div.insertBefore(item.div, adjacent_div.nextSibling);
    }
  }

  item.getElement('referrer').onclick = function() {
    chrome.tabs.create({url: item.referrer});
    return false;
  };
  item.getElement('by-ext').onclick = function() {
    chrome.tabs.create({url: 'chrome://extensions#' + item.byExtensionId});
    return false;
  }
  item.getElement('open-filename').onclick = function() {
    item.open();
    return false;
  };
  item.getElement('open-filename').ondragstart = function() {
    item.drag();
    return false;
  };
  item.getElement('pause').onclick = function() {
    item.pause();
    return false;
  };
  item.getElement('cancel').onclick = function() {
    item.cancel();
    return false;
  };
  item.getElement('resume').onclick = function() {
    item.resume();
    return false;
  };
  item.getElement('show-folder').onclick = function() {
    item.show();
    return false;
  };
  item.getElement('remove-file').onclick = function() {
    item.removeFile();
    return false;
  };
  item.getElement('erase').onclick = function() {
    item.erase();
    return false;
  };

  item.more_mousemove = function(evt) {
    var mouse = {x:evt.x, y:evt.y+document.body.scrollTop};
    if (item.getElement('more') &&
        (pointInElement(mouse, item.div) ||
         pointInElement(mouse, item.getElement('more')))) {
      return;
    }
    if (item.getElement('more')) {
      item.getElement('more').hidden = true;
    }
    window.removeEventListener('mousemove', item.more_mousemove);
  };
  [item.div, item.getElement('more')].concat(
      item.getElement('more').children).forEach(function(elem) {
    elem.onmouseover = function() {
      arrayFrom(items_div.children).forEach(function(other) {
        if (other.item != item) {
          other.item.getElement('more').hidden = true;
        }
      });
      item.getElement('more').hidden = false;
      item.getElement('more').style.top =
        (item.div.offsetTop + item.div.offsetHeight) + 'px';
      item.getElement('more').style.left = item.div.offsetLeft + 'px';
      if (window.innerHeight < (parseInt(item.getElement('more').style.top) +
                                item.getElement('more').offsetHeight)) {
        item.getElement('more').style.top = (
          item.div.offsetTop - item.getElement('more').offsetHeight) + 'px';
      }
      window.addEventListener('mousemove', item.more_mousemove);
    };
  });

  if (item.referrer) {
    item.getElement('referrer').href = item.referrer;
  } else {
    item.getElement('referrer').hidden = true;
  }
  item.getElement('url').href = item.url;
  item.getElement('url').innerText = item.url;
  item.render();
}
DownloadItem.canResumeHack = false;

DownloadItem.prototype.getElement = function(name) {
  return document.querySelector('#item' + this.id + ' .' + name);
};

DownloadItem.prototype.render = function() {
  var item = this;
  var now = new Date();
  var in_progress = (item.state == 'in_progress')
  var openable = (item.state != 'interrupted') && item.exists && !item.deleted;

  item.startTime = new Date(item.startTime);
  if (DownloadItem.canResumeHack) {
    item.canResume = in_progress && item.paused;
  }
  if (item.filename) {
    item.basename = item.filename.substring(Math.max(
      item.filename.lastIndexOf('\\'),
      item.filename.lastIndexOf('/')) + 1);
  }
  if (item.estimatedEndTime) {
    item.estimatedEndTime = new Date(item.estimatedEndTime);
  }
  if (item.endTime) {
    item.endTime = new Date(item.endTime);
  }

  if (item.filename && !item.icon_url) {
    chrome.downloads.getFileIcon(
      item.id,
      {'size': 32},
      function(icon_url) {
        item.getElement('icon').hidden = !icon_url;
        if (icon_url) {
          item.icon_url = icon_url;
          item.getElement('icon').src = icon_url;
        }
    });
  }

  item.getElement('removed').style.display = openable ? 'none' : 'inline';
  item.getElement('open-filename').style.display = (
    openable ? 'inline' : 'none');
  item.getElement('in-progress').hidden = !in_progress;
  item.getElement('pause').style.display = (
    !in_progress || item.paused) ? 'none' : 'inline-block';
  item.getElement('resume').style.display = (
    !in_progress || !item.canResume) ? 'none' : 'inline-block';
  item.getElement('cancel').style.display = (
    !in_progress ? 'none' : 'inline-block');
  item.getElement('remove-file').hidden = (
    (item.state != 'complete') ||
    !item.exists ||
    item.deleted ||
    !chrome.downloads.removeFile);
  item.getElement('erase').hidden = in_progress;

  var could_progress = in_progress || item.canResume;
  item.getElement('progress').style.display = (
    could_progress ? 'inline-block' : 'none');
  item.getElement('meter').hidden = !could_progress || !item.totalBytes;

  item.getElement('removed').innerText = item.basename;
  item.getElement('open-filename').innerText = item.basename;

  function setByExtension(show) {
    if (show) {
      item.getElement('by-ext').title = item.byExtensionName;
      item.getElement('by-ext').href =
        'chrome://extensions#' + item.byExtensionId;
      item.getElement('by-ext img').src =
        'chrome://extension-icon/' + item.byExtensionId + '/48/1';
    } else {
      item.getElement('by-ext').hidden = true;
    }
  }
  if (item.byExtensionId && item.byExtensionName) {
    chrome.permissions.contains({permissions: ['management']},
                                function(result) {
      if (result) {
        setByExtension(true);
      } else {
        setByExtension(false);
        if (!localStorage.managementPermissionDenied) {
          document.getElementById('request-management-permission').hidden =
            false;
          document.getElementById('grant-management-permission').onclick =
              function() {
            chrome.permissions.request({permissions: ['management']},
                                      function(granted) {
              setByExtension(granted);
              if (!granted) {
                localStorage.managementPermissionDenied = true;
              }
            });
            return false;
          };
        }
      }
    });
  } else {
    setByExtension(false);
  }

  if (!item.getElement('error').hidden) {
    if (item.error) {
      // TODO(benjhayden) When https://codereview.chromium.org/16924017/ is
      // released, set minimum_chrome_version and remove the error_N messages.
      item.getElement('error').innerText = chrome.i18n.getMessage(
          'error_' + item.error);
      if (!item.getElement('error').innerText) {
        item.getElement('error').innerText = item.error;
      }
    } else if (!openable) {
      item.getElement('error').innerText = chrome.i18n.getMessage(
          'errorRemoved');
    }
  }

  item.getElement('complete-size').innerText = formatBytes(
    item.bytesReceived);
  if (item.totalBytes && (item.state != 'complete')) {
    item.getElement('progress').innerText = (
      item.getElement('complete-size').innerText + '/' +
      formatBytes(item.totalBytes));
    item.getElement('meter').children[0].style.width = parseInt(
        100 * item.bytesReceived / item.totalBytes) + '%';
  }

  if (in_progress) {
    if (item.estimatedEndTime && !item.paused) {
      var openWhenComplete = false;
      try {
        openWhenComplete = JSON.parse(localStorage.openWhenComplete).indexOf(
            item.id) >= 0;
      } catch (e) {
      }
      item.getElement('time-left').innerText = formatTimeLeft(
          openWhenComplete, item.estimatedEndTime.getTime() - now.getTime());
    } else {
      item.getElement('time-left').innerText = String.fromCharCode(160);
    }
  }

  if (item.startTime) {
    item.getElement('start-time').innerText = formatDateTime(
        item.startTime);
  }

  ratchetWidth(item.getElement('icon').offsetWidth +
               item.getElement('file-url').offsetWidth +
               item.getElement('cancel').offsetWidth +
               item.getElement('pause').offsetWidth +
               item.getElement('resume').offsetWidth);
  ratchetWidth(item.getElement('more').offsetWidth);

  this.maybeAccept();
};

DownloadItem.prototype.onChanged = function(delta) {
  for (var key in delta) {
    if (key != 'id') {
      this[key] = delta[key].current;
    }
  }
  this.render();
  if (delta.state) {
    setLastOpened();
  }
  if ((this.state == 'in_progress') && !this.paused) {
    DownloadManager.startPollingProgress();
  }
};

DownloadItem.prototype.onErased = function() {
  window.removeEventListener('mousemove', this.more_mousemove);
  document.getElementById('items').removeChild(this.div);
};

DownloadItem.prototype.drag = function() {
  chrome.downloads.drag(this.id);
};

DownloadItem.prototype.show = function() {
  chrome.downloads.show(this.id);
};

DownloadItem.prototype.open = function() {
  if (this.state == 'complete') {
    chrome.downloads.open(this.id);
    return;
  }
  chrome.runtime.sendMessage({openWhenComplete:this.id});
};

DownloadItem.prototype.removeFile = function() {
  chrome.downloads.removeFile(this.id);
  this.deleted = true;
  this.render();
};

DownloadItem.prototype.erase = function() {
  chrome.downloads.erase({id: this.id});
};

DownloadItem.prototype.pause = function() {
  chrome.downloads.pause(this.id);
};

DownloadItem.prototype.resume = function() {
  chrome.downloads.resume(this.id);
};

DownloadItem.prototype.cancel = function() {
  chrome.downloads.cancel(this.id);
};

DownloadItem.prototype.maybeAccept = function() {
  // This function is safe to call at any time for any item, and it will always
  // do the right thing, which is to display the danger prompt only if the item
  // is in_progress and dangerous, and if the prompt is not already displayed.
  if ((this.state != 'in_progress') ||
      (this.danger == 'safe') ||
      (this.danger == 'accepted') ||
      DownloadItem.prototype.maybeAccept.accepting_danger) {
    return;
  }
  ratchetWidth(400);
  ratchetHeight(200);
  DownloadItem.prototype.maybeAccept.accepting_danger = true;
  chrome.downloads.acceptDanger(this.id, function() {
    DownloadItem.prototype.maybeAccept.accepting_danger = false;
    arrayFrom(document.getElementById('items').childNodes).forEach(
      function(item_div) { item_div.item.maybeAccept(); });
  });
};
DownloadItem.prototype.maybeAccept.accepting_danger = false;

var DownloadManager = {};

DownloadManager.showingOlder = false;

DownloadManager.getItem = function(id) {
  var item_div = document.getElementById('item' + id);
  return item_div ? item_div.item : null;
};

DownloadManager.getOrCreate = function(data) {
  var item = DownloadManager.getItem(data.id);
  return item ? item : new DownloadItem(data);
};

DownloadManager.forEachItem = function(cb) {
  // Calls cb(item, index) in the order that they are displayed, i.e. in order
  // of decreasing startTime.
  arrayFrom(document.getElementById('items').childNodes).forEach(
    function(item_div, index) { cb(item_div.item, index); });
};

DownloadManager.startPollingProgress = function() {
  if (DownloadManager.startPollingProgress.tid < 0) {
    DownloadManager.startPollingProgress.tid = setTimeout(
      DownloadManager.startPollingProgress.pollProgress,
      DownloadManager.startPollingProgress.MS);
  }
}
DownloadManager.startPollingProgress.MS = 200;
DownloadManager.startPollingProgress.tid = -1;
DownloadManager.startPollingProgress.pollProgress = function() {
  DownloadManager.startPollingProgress.tid = -1;
  chrome.downloads.search({state: 'in_progress', paused: false},
      function(results) {
    if (!results.length)
      return;
    results.forEach(function(result) {
      var item = DownloadManager.getOrCreate(result);
      for (var prop in result) {
        item[prop] = result[prop];
      }
      item.render();
      if ((item.state == 'in_progress') && !item.paused) {
        DownloadManager.startPollingProgress();
      }
    });
  });
};

DownloadManager.showNew = function() {
  var any_items = (document.getElementById('items').childNodes.length > 0);
  document.getElementById('empty').style.display =
    any_items ? 'none' : 'inline-block';
  document.getElementById('head').style.borderBottomWidth =
    (any_items ? 1 : 0) + 'px';
  document.getElementById('clear-all').hidden = !any_items;

  var query_search = document.getElementById('q');
  query_search.hidden = !any_items;

  if (!any_items) {
    return;
  }
  var old_ms = (new Date()).getTime() - kOldMs;
  var any_hidden = false;
  var any_showing = false;
  // First show up to kShowNewMax items newer than kOldMs. If there aren't any
  // items newer than kOldMs, then show up to kShowNewMax items of any age. If
  // there are any hidden items, show the Show Older button.
  DownloadManager.forEachItem(function(item, index) {
    item.div.hidden = !DownloadManager.showingOlder && (
      (item.startTime.getTime() < old_ms) || (index >= kShowNewMax));
    any_hidden = any_hidden || item.div.hidden;
    any_showing = any_showing || !item.div.hidden;
  });
  if (!any_showing) {
    any_hidden = false;
    DownloadManager.forEachItem(function(item, index) {
      item.div.hidden = !DownloadManager.showingOlder && (index >= kShowNewMax);
      any_hidden = any_hidden || item.div.hidden;
      any_showing = any_showing || !item.div.hidden;
    });
  }
  document.getElementById('older').hidden = !any_hidden;

  query_search.focus();
};

DownloadManager.showOlder = function() {
  DownloadManager.showingOlder = true;
  var loading_older_span = document.getElementById('loading-older');
  document.getElementById('older').hidden = true;
  loading_older_span.hidden = false;
  chrome.downloads.search({}, function(results) {
    results.forEach(function(result) {
      var item = DownloadManager.getOrCreate(result);
      item.div.hidden = false;
    });
    loading_older_span.hidden = true;
  });
};

DownloadManager.onSearch = function() {
  // split string by space, but ignore space in quotes
  // http://stackoverflow.com/questions/16261635
  var query = document.getElementById('q').value.match(/(?:[^\s"]+|"[^"]*")+/g);
  if (!query) {
    DownloadManager.showNew();
    document.getElementById('search-zero').hidden = true;
  } else {
    query = query.map(function(term) {
      // strip quotes
      return (term.match(/\s/) &&
              term[0].match(/["']/) &&
              term[term.length - 1] == term[0]) ?
        term.substr(1, term.length - 2) : term;
    });
    var searching = document.getElementById('searching');
    searching.hidden = false;
    chrome.downloads.search({query: query}, function(results) {
      document.getElementById('older').hidden = true;
      DownloadManager.forEachItem(function(item) {
        item.div.hidden = true;
      });
      results.forEach(function(result) {
        DownloadManager.getOrCreate(result).div.hidden = false;
      });
      searching.hidden = true;
      document.getElementById('search-zero').hidden = (results.length != 0);
    });
  }
};

DownloadManager.clearAll = function() {
  DownloadManager.forEachItem(function(item) {
    if (!item.div.hidden) {
      item.erase();
      // The onErased handler should circle back around to loadItems.
    }
  });
};

var kShowNewMax = 50;
var kOldMs = 1000 * 60 * 60 * 24 * 7;

// These settings can be tuned by modifying localStorage in dev-tools.
if ('kShowNewMax' in localStorage) {
  kShowNewMax = parseInt(localStorage.kShowNewMax);
}
if ('kOldMs' in localStorage) {
  kOldMs = parseInt(localStorage.kOldMs);
}

DownloadManager.loadItems = function() {
  // Request up to kShowNewMax + 1, but only display kShowNewMax; the +1 is a
  // probe to see if there are any older downloads.
  // TODO(benjhayden) When https://codereview.chromium.org/16924017/ is
  // released, set minimum_chrome_version and remove this try/catch.
  try {
    chrome.downloads.search({
        orderBy: ['-startTime'],
        limit: kShowNewMax + 1},
      function(results) {
        DownloadManager.loadItems.items = results;
        DownloadManager.loadItems.onLoaded();
    });
  } catch (exc) {
    chrome.downloads.search({
        orderBy: '-startTime',
        limit: kShowNewMax + 1},
      function(results) {
        DownloadManager.loadItems.items = results;
        DownloadManager.loadItems.onLoaded();
    });
  }
};
DownloadManager.loadItems.items = [];
DownloadManager.loadItems.window_loaded = false;

DownloadManager.loadItems.onLoaded = function() {
  if (!DownloadManager.loadItems.window_loaded) {
    return;
  }
  DownloadManager.loadItems.items.forEach(function(item) {
    DownloadManager.getOrCreate(item);
  });
  DownloadManager.loadItems.items = [];
  DownloadManager.showNew();
};

DownloadManager.loadItems.onWindowLoaded = function() {
  DownloadManager.loadItems.window_loaded = true;
  DownloadManager.loadItems.onLoaded();
};

// If this extension is installed on a stable-channel chrome, where the
// downloads API is not available, do not use the downloads API, and link to the
// beta channel.
if (chrome.downloads) {
  // Start searching ASAP, don't wait for onload.
  DownloadManager.loadItems();

  chrome.downloads.onCreated.addListener(function(item) {
    DownloadManager.getOrCreate(item);
    DownloadManager.showNew();
    DownloadManager.startPollingProgress();
  });

  chrome.downloads.onChanged.addListener(function(delta) {
    var item = DownloadManager.getItem(delta.id);
    if (item) {
      item.onChanged(delta);
    }
  });

  chrome.downloads.onErased.addListener(function(id) {
    var item = DownloadManager.getItem(id);
    if (!item) {
      return;
    }
    item.onErased();
    DownloadManager.loadItems();
  });

  window.onload = function() {
    ratchetWidth(
      document.getElementById('q-outer').offsetWidth +
      document.getElementById('clear-all').offsetWidth +
      document.getElementById('open-folder').offsetWidth);
    setLastOpened();
    loadI18nMessages();
    DownloadManager.loadItems.onWindowLoaded();
    document.getElementById('older').onclick = function() {
      DownloadManager.showOlder();
      return false;
    };
    document.getElementById('q').onsearch = function() {
      DownloadManager.onSearch();
    };
    document.getElementById('clear-all').onclick = function() {
      DownloadManager.clearAll();
      return false;
    };
    if (chrome.downloads.showDefaultFolder) {
      document.getElementById('open-folder').onclick = function() {
        chrome.downloads.showDefaultFolder();
        return false;
      };
    } else {
      document.getElementById('open-folder').hidden = true;
    }
  };
} else {
  // The downloads API is not available.
  // TODO(benjhayden) Remove this when minimum_chrome_version is set.
  window.onload = function() {
    loadI18nMessages();
    var bad_version = document.getElementById('bad-chrome-version');
    bad_version.hidden = false;
    bad_version.onclick = function() {
      chrome.tabs.create({url: bad_version.href});
      return false;
    };
    document.getElementById('empty').style.display = 'none';
    document.getElementById('q').style.display = 'none';
    document.getElementById('open-folder').style.display = 'none';
    document.getElementById('clear-all').style.display = 'none';
  };
}
