// Copyright 2013 Google Inc. All Rights Reserved.

/**
 * @fileoverview Context Menu for Search.
 * @author peterxiao@google.com (Peter Xiao)
 */

goog.provide('cvox.SearchContextMenu');

goog.require('cvox.ChromeVoxKbHandler');
goog.require('cvox.KeySequence');
goog.require('cvox.Search');
goog.require('cvox.SearchTool');

/**
 * @constructor
 */
cvox.SearchContextMenu = function() {
};

/* Globals */
var Command = {
  TOOLS: 'tools',
  ADS: 'ads',
  MAIN: 'main'
};

/**
 * Current focus Search is in.
 */
cvox.SearchContextMenu.currState = Command.MAIN;

/**
 * Handles context menu events.
 * @param {Event} evt Event received.
 */
cvox.SearchContextMenu.contextMenuHandler = function(evt) {
  var cmd = evt.detail['customCommand'];
  switch (cmd) {
  case Command.TOOLS:
    cvox.SearchContextMenu.focusTools();
    break;

  case Command.ADS:
    cvox.SearchContextMenu.focusAds();
    break;

  case Command.MAIN:
    cvox.SearchContextMenu.focusMain();
    break;
  }
};

/**
 * Handles key events.
 * @param {Event} evt Event received.
 * @return {boolean} True if key was handled, false otherwise.
 */
cvox.SearchContextMenu.keyhandler = function(evt) {
  var ret = false;
  var keySeq = new cvox.KeySequence(evt);
  var command = cvox.ChromeVoxKbHandler.handlerKeyMap.commandForKey(keySeq);
  /* Handle if just default action. */
  if (!command || command === 'performDefaultAction') {
    switch (cvox.SearchContextMenu.currState) {
      case Command.TOOLS:
        ret = cvox.SearchTool.keyhandler(evt);
        break;
      case Command.ADS:
      case Command.MAIN:
        ret = cvox.Search.keyhandler(evt);
        break;
    }
  }
  return ret;
};

/**
 * Switch to main search results focus.
 */
cvox.SearchContextMenu.focusMain = function() {
  if (cvox.SearchContextMenu.currState === Command.TOOLS) {
    cvox.SearchTool.toggleMenu();
  }
  cvox.Search.populateResults();
  cvox.Search.index = 0;
  cvox.Search.syncToIndex();
  cvox.SearchContextMenu.currState = Command.MAIN;
};

/**
 * Switch to ads focus.
 */
cvox.SearchContextMenu.focusAds = function() {
  cvox.Search.populateAdResults();
  if (cvox.Search.results.length === 0) {
    cvox.SearchContextMenu.focusMain();
    return;
  }
  cvox.Search.index = 0;
  cvox.Search.syncToIndex();

  if (cvox.SearchContextMenu.currState === Command.TOOLS) {
    cvox.SearchTool.toggleMenu();
  }

  cvox.SearchContextMenu.currState = Command.ADS;
};

/**
 * Switch to tools focus.
 */
cvox.SearchContextMenu.focusTools = function() {
  if (cvox.SearchContextMenu.currState !== Command.TOOLS) {
    cvox.SearchTool.activateTools();
    cvox.SearchContextMenu.currState = Command.TOOLS;
  }
};

/**
 * Initializes the context menu.
 */
cvox.SearchContextMenu.init = function() {
  var ACTIONS = [
    { desc: 'Main Results', cmd: Command.MAIN },
    { desc: 'Search Tools', cmd: Command.TOOLS },
    { desc: 'Ads', cmd: Command.ADS }
  ];
  /* Attach ContextMenuActions. */
  var body = document.querySelector('body');
  body.setAttribute('contextMenuActions', JSON.stringify(ACTIONS));

  /* Listen for ContextMenu events. */
  body.addEventListener('ATCustomEvent',
    cvox.SearchContextMenu.contextMenuHandler, true);

  window.addEventListener('keydown', cvox.SearchContextMenu.keyhandler, true);
  cvox.Search.init();
};
