// 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.

cr.define('indexeddb', function() {
  'use strict';

  function initialize() {
    chrome.send('getAllOrigins');
  }

  function progressNodeFor(link) {
    return link.parentNode.querySelector('.download-status');
  }

  function downloadOriginData(event) {
    var link = event.target;
    progressNodeFor(link).style.display = 'inline';
    chrome.send('downloadOriginData', [link.idb_partition_path,
                                       link.idb_origin_url]);
    return false;
  }

  function forceClose(event) {
    var link = event.target;
    progressNodeFor(link).style.display = 'inline';
    chrome.send('forceClose', [link.idb_partition_path,
                               link.idb_origin_url]);
    return false;
  }

  function forceSchemaDowngrade(event) {
    var link = event.target;
    progressNodeFor(link).style.display = 'inline';
    chrome.send('forceSchemaDowngrade', [link.idb_partition_path,
                                         link.idb_origin_url]);
    return false;
  }

  function withNode(selector, partition_path, origin_url, callback) {
    var links = document.querySelectorAll(selector);
    for (var i = 0; i < links.length; ++i) {
      var link = links[i];
      if (partition_path == link.idb_partition_path &&
          origin_url == link.idb_origin_url) {
        callback(link);
      }
    }
  }
  // Fired from the backend after the data has been zipped up, and the
  // download manager has begun downloading the file.
  function onOriginDownloadReady(partition_path, origin_url, connection_count) {
    withNode('a.download', partition_path, origin_url, function(link) {
      progressNodeFor(link).style.display = 'none';
    });
    withNode('.connection-count', partition_path, origin_url, function(span) {
      span.innerText = connection_count;
    });
  }

  function onForcedClose(partition_path, origin_url, connection_count) {
    withNode('a.force-close', partition_path, origin_url, function(link) {
      progressNodeFor(link).style.display = 'none';
    });
    withNode('.connection-count', partition_path, origin_url, function(span) {
      span.innerText = connection_count;
    });
  }

  function onForcedSchemaDowngrade(partition_path,
                                   origin_url,
                                   connection_count) {
    withNode('a.force-schema-downgrade', partition_path, origin_url,
             function(link) {
      progressNodeFor(link).style.display = 'none';
    });
    withNode('.connection-count', partition_path, origin_url, function(span) {
      span.innerText = connection_count;
    });
  }

  // Fired from the backend with a single partition's worth of
  // IndexedDB metadata.
  function onOriginsReady(origins, partition_path) {
    var template = jstGetTemplate('indexeddb-list-template');
    var container = $('indexeddb-list');
    container.appendChild(template);
    jstProcess(new JsEvalContext({ idbs: origins,
                                   partition_path: partition_path}), template);

    var downloadLinks = container.querySelectorAll('a.download');
    for (var i = 0; i < downloadLinks.length; ++i) {
      downloadLinks[i].addEventListener('click', downloadOriginData, false);
    }
    var forceCloseLinks = container.querySelectorAll('a.force-close');
    for (i = 0; i < forceCloseLinks.length; ++i) {
      forceCloseLinks[i].addEventListener('click', forceClose, false);
    }
    var forceSchemaDowngradeLinks =
        container.querySelectorAll('a.force-schema-downgrade');
    for (i = 0; i < forceSchemaDowngradeLinks.length; ++i) {
      forceSchemaDowngradeLinks[i].addEventListener(
          'click', forceSchemaDowngrade, false);
    }
  }

  return {
    initialize: initialize,
    onForcedClose: onForcedClose,
    onForcedSchemaDowngrade: onForcedSchemaDowngrade,
    onOriginDownloadReady: onOriginDownloadReady,
    onOriginsReady: onOriginsReady,
  };
});

document.addEventListener('DOMContentLoaded', indexeddb.initialize);
