// Copyright (c) 2011 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.

// require cr.js
// require cr/event_target.js
// require cr/util.js

/**
 * Bridge between the browser and the page.
 * In this file:
 *   * define EventTargets to recieve message from the browser,
 *   * dispatch browser messages to EventTarget,
 *   * define interface to request data to the browser.
 */

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

  /**
   * Post requestInfo message to Browser.
   */
  function requestInfo() {
    chrome.send('requestInfo');
  }

  /**
   * Callback entry point from Browser.
   * Messages are Dispatched as Event to:
   *   * onAvailableSpaceUpdated,
   *   * onGlobalInfoUpdated,
   *   * onPerHostInfoUpdated,
   *   * onPerOriginInfoUpdated,
   *   * onStatisticsUpdated.
   * @param {string} message Message label. Possible Values are:
   *   * 'AvailableSpaceUpdated',
   *   * 'GlobalInfoUpdated',
   *   * 'PerHostInfoUpdated',
   *   * 'PerOriginInfoUpdated',
   *   * 'StatisticsUpdated'.
   * @param {Object} detail Message specific additional data.
   */
  function messageHandler(message, detail) {
    var target = null;
    switch (message) {
      case 'AvailableSpaceUpdated':
        target = cr.quota.onAvailableSpaceUpdated;
        break;
      case 'GlobalInfoUpdated':
        target = cr.quota.onGlobalInfoUpdated;
        break;
      case 'PerHostInfoUpdated':
        target = cr.quota.onPerHostInfoUpdated;
        break;
      case 'PerOriginInfoUpdated':
        target = cr.quota.onPerOriginInfoUpdated;
        break;
      case 'StatisticsUpdated':
        target = cr.quota.onStatisticsUpdated;
        break;
      default:
        console.error('Unknown Message');
        break;
    }
    if (target) {
      var event = cr.doc.createEvent('CustomEvent');
      event.initCustomEvent('update', false, false, detail);
      target.dispatchEvent(event);
    }
  }

  return {
    onAvailableSpaceUpdated: new cr.EventTarget(),
    onGlobalInfoUpdated: new cr.EventTarget(),
    onPerHostInfoUpdated: new cr.EventTarget(),
    onPerOriginInfoUpdated: new cr.EventTarget(),
    onStatisticsUpdated: new cr.EventTarget(),

    requestInfo: requestInfo,
    messageHandler: messageHandler
  };
});
