// Copyright 2013 Google Inc. All Rights Reserved. /** * @fileoverview Uses ChromeVox API to access the search tools menu. * @author peterxiao@google.com (Peter Xiao) */ goog.provide('cvox.SearchTool'); goog.require('cvox.ChromeVox'); goog.require('cvox.DomUtil'); goog.require('cvox.Search'); goog.require('cvox.SearchConstants'); goog.require('cvox.SearchUtil'); /** * @constructor */ cvox.SearchTool = function() { }; /** * Index of the current menu in focus. * @type {number} */ cvox.SearchTool.menuIndex; /** * Array of menus. * @type {Array.} */ cvox.SearchTool.menus = []; /** * Index of the current menu item in focus. * @type {number} */ cvox.SearchTool.menuItemIndex; /** * Array of menu items for the current menu. * @type {Array.} */ cvox.SearchTool.menuItems = []; /** * Id of the clear button. * @type {string} */ cvox.SearchTool.CLEAR_ID = 'hdtb_rst'; /** * Toggles a menu open / close by simulating a click. */ cvox.SearchTool.toggleMenu = function() { var menu = cvox.SearchTool.menus[cvox.SearchTool.menuIndex]; var menuDiv = menu.previousSibling; cvox.DomUtil.clickElem(menuDiv, false, false, false); }; /** * Syncs the first item in the current menu to ChromeVox. */ cvox.SearchTool.syncToMenu = function() { cvox.SearchTool.menuItemIndex = 0; cvox.SearchTool.toggleMenu(); cvox.SearchTool.populateMenuItems(); cvox.SearchTool.syncToMenuItem(); }; /** * Syncs the current menu item to ChromeVox. */ cvox.SearchTool.syncToMenuItem = function() { var menuItem = cvox.SearchTool.menuItems[cvox.SearchTool.menuItemIndex]; cvox.ChromeVox.syncToNode(menuItem, true); }; /** * Fills in menuItems with the current menu's items. */ cvox.SearchTool.populateMenuItems = function() { var menu = cvox.SearchTool.menus[cvox.SearchTool.menuIndex]; cvox.SearchTool.menuItems = []; /* For now, we just special case on the clear button. */ if (menu.id !== cvox.SearchTool.CLEAR_ID) { var MENU_ITEM_SELECTOR = '.hdtbItm'; var menuItemNodeList = menu.querySelectorAll(MENU_ITEM_SELECTOR); for (var i = 0; i < menuItemNodeList.length; i++) { cvox.SearchTool.menuItems.push(menuItemNodeList.item(i)); } } else { cvox.SearchTool.menuItems = []; cvox.SearchTool.menuItems.push(menu); } }; /** * Fills in menus with the menus of the page. */ cvox.SearchTool.populateMenus = function() { var MENU_SELECTOR = '.hdtbU'; var menuDivs = document.querySelectorAll(MENU_SELECTOR); for (var i = 0; i < menuDivs.length; i++) { cvox.SearchTool.menus.push(menuDivs.item(i)); } var clearDiv = document.getElementById(cvox.SearchTool.CLEAR_ID); if (clearDiv) { cvox.SearchTool.menus.push(clearDiv); } }; /** * Switches focus to the tools interface, giving keyboard access. */ cvox.SearchTool.activateTools = function() { var MENU_BAR_SELECTOR = '#hdtbMenus'; var menuBar = document.querySelector(MENU_BAR_SELECTOR); var MENUS_OPEN_CLASS = 'hdtb-td-o'; menuBar.className = MENUS_OPEN_CLASS; cvox.SearchTool.populateMenus(); cvox.SearchTool.menuIndex = 0; cvox.SearchTool.syncToMenu(); }; /** * Goes to the link of the current menu item action. */ cvox.SearchTool.gotoMenuItem = function() { var menuItem = cvox.SearchTool.menuItems[cvox.SearchTool.menuItemIndex]; var LOCATION_INPUT_ID = '#lc-input'; var input = menuItem.querySelector(LOCATION_INPUT_ID); /* Special case for setting location. */ if (input) { input.focus(); return; } /* Custom Date Range. */ var CDR_ID = 'cdr_opt'; switch (menuItem.id) { case cvox.SearchTool.CLEAR_ID: window.location = menuItem.dataset.url; break; case CDR_ID: var CDR_LINK_SELECTOR = '#cdrlnk'; var cdrLink = menuItem.querySelector(CDR_LINK_SELECTOR); cvox.DomUtil.clickElem(cdrLink, false, false, false); cvox.SearchTool.toggleMenu(); break; default: window.location = cvox.SearchUtil.extractURL(menuItem); break; } }; /** * Handles key events for the tools interface. * @param {Event} evt Keydown event. * @return {boolean} True if key was handled, false otherwise. */ cvox.SearchTool.keyhandler = function(evt) { if (cvox.SearchUtil.isSearchWidgetActive()) { return false; } switch (evt.keyCode) { case cvox.SearchConstants.KeyCode.UP: cvox.SearchTool.menuItemIndex = cvox.SearchUtil.subOneWrap( cvox.SearchTool.menuItemIndex, cvox.SearchTool.menuItems.length); cvox.SearchTool.syncToMenuItem(); break; case cvox.SearchConstants.KeyCode.DOWN: cvox.SearchTool.menuItemIndex = cvox.SearchUtil.addOneWrap( cvox.SearchTool.menuItemIndex, cvox.SearchTool.menuItems.length); cvox.SearchTool.syncToMenuItem(); break; case cvox.SearchConstants.KeyCode.LEFT: cvox.SearchTool.toggleMenu(); cvox.SearchTool.menuIndex = cvox.SearchUtil.subOneWrap( cvox.SearchTool.menuIndex, cvox.SearchTool.menus.length); cvox.SearchTool.syncToMenu(); break; case cvox.SearchConstants.KeyCode.RIGHT: cvox.SearchTool.toggleMenu(); cvox.SearchTool.menuIndex = cvox.SearchUtil.addOneWrap( cvox.SearchTool.menuIndex, cvox.SearchTool.menus.length); cvox.SearchTool.syncToMenu(); break; case cvox.SearchConstants.KeyCode.ENTER: cvox.SearchTool.gotoMenuItem(); break; default: return false; } evt.preventDefault(); evt.stopPropagation(); return true; };