1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 * @fileoverview Uses ChromeVox API to access the search tools menu.
10 goog
.provide('cvox.SearchTool');
12 goog
.require('cvox.ChromeVox');
13 goog
.require('cvox.DomUtil');
14 goog
.require('cvox.Search');
15 goog
.require('cvox.SearchConstants');
16 goog
.require('cvox.SearchUtil');
21 cvox
.SearchTool = function() {
25 * Index of the current menu in focus.
28 cvox
.SearchTool
.menuIndex
;
34 cvox
.SearchTool
.menus
= [];
37 * Index of the current menu item in focus.
40 cvox
.SearchTool
.menuItemIndex
;
43 * Array of menu items for the current menu.
46 cvox
.SearchTool
.menuItems
= [];
49 * Id of the clear button.
52 cvox
.SearchTool
.CLEAR_ID
= 'hdtb_rst';
55 * Toggles a menu open / close by simulating a click.
57 cvox
.SearchTool
.toggleMenu = function() {
58 var menu
= cvox
.SearchTool
.menus
[cvox
.SearchTool
.menuIndex
];
59 var menuDiv
= menu
.previousSibling
;
60 cvox
.DomUtil
.clickElem(menuDiv
, false, false, false);
64 * Syncs the first item in the current menu to ChromeVox.
66 cvox
.SearchTool
.syncToMenu = function() {
67 cvox
.SearchTool
.menuItemIndex
= 0;
68 cvox
.SearchTool
.toggleMenu();
69 cvox
.SearchTool
.populateMenuItems();
70 cvox
.SearchTool
.syncToMenuItem();
74 * Syncs the current menu item to ChromeVox.
76 cvox
.SearchTool
.syncToMenuItem = function() {
77 var menuItem
= cvox
.SearchTool
.menuItems
[cvox
.SearchTool
.menuItemIndex
];
78 cvox
.ChromeVox
.syncToNode(menuItem
, true);
82 * Fills in menuItems with the current menu's items.
84 cvox
.SearchTool
.populateMenuItems = function() {
85 var menu
= cvox
.SearchTool
.menus
[cvox
.SearchTool
.menuIndex
];
86 cvox
.SearchTool
.menuItems
= [];
87 /* For now, we just special case on the clear button. */
88 if (menu
.id
!== cvox
.SearchTool
.CLEAR_ID
) {
89 var MENU_ITEM_SELECTOR
= '.hdtbItm';
90 var menuItemNodeList
= menu
.querySelectorAll(MENU_ITEM_SELECTOR
);
91 for (var i
= 0; i
< menuItemNodeList
.length
; i
++) {
92 cvox
.SearchTool
.menuItems
.push(menuItemNodeList
.item(i
));
95 cvox
.SearchTool
.menuItems
= [];
96 cvox
.SearchTool
.menuItems
.push(menu
);
101 * Fills in menus with the menus of the page.
103 cvox
.SearchTool
.populateMenus = function() {
104 var MENU_SELECTOR
= '.hdtbU';
105 var menuDivs
= document
.querySelectorAll(MENU_SELECTOR
);
106 for (var i
= 0; i
< menuDivs
.length
; i
++) {
107 cvox
.SearchTool
.menus
.push(menuDivs
.item(i
));
110 var clearDiv
= document
.getElementById(cvox
.SearchTool
.CLEAR_ID
);
112 cvox
.SearchTool
.menus
.push(clearDiv
);
117 * Switches focus to the tools interface, giving keyboard access.
119 cvox
.SearchTool
.activateTools = function() {
120 var MENU_BAR_SELECTOR
= '#hdtbMenus';
121 var menuBar
= document
.querySelector(MENU_BAR_SELECTOR
);
122 var MENUS_OPEN_CLASS
= 'hdtb-td-o';
123 menuBar
.className
= MENUS_OPEN_CLASS
;
125 cvox
.SearchTool
.populateMenus();
126 cvox
.SearchTool
.menuIndex
= 0;
127 cvox
.SearchTool
.syncToMenu();
131 * Goes to the link of the current menu item action.
133 cvox
.SearchTool
.gotoMenuItem = function() {
134 var menuItem
= cvox
.SearchTool
.menuItems
[cvox
.SearchTool
.menuItemIndex
];
135 var LOCATION_INPUT_ID
= '#lc-input';
136 var input
= menuItem
.querySelector(LOCATION_INPUT_ID
);
137 /* Special case for setting location. */
143 /* Custom Date Range. */
144 var CDR_ID
= 'cdr_opt';
145 switch (menuItem
.id
) {
146 case cvox
.SearchTool
.CLEAR_ID
:
147 window
.location
= menuItem
.dataset
.url
;
150 var CDR_LINK_SELECTOR
= '#cdrlnk';
151 var cdrLink
= menuItem
.querySelector(CDR_LINK_SELECTOR
);
152 cvox
.DomUtil
.clickElem(cdrLink
, false, false, false);
153 cvox
.SearchTool
.toggleMenu();
156 window
.location
= cvox
.SearchUtil
.extractURL(menuItem
);
162 * Handles key events for the tools interface.
163 * @param {Event} evt Keydown event.
164 * @return {boolean} True if key was handled, false otherwise.
166 cvox
.SearchTool
.keyhandler = function(evt
) {
167 if (cvox
.SearchUtil
.isSearchWidgetActive()) {
171 switch (evt
.keyCode
) {
172 case cvox
.SearchConstants
.KeyCode
.UP
:
173 cvox
.SearchTool
.menuItemIndex
= cvox
.SearchUtil
.subOneWrap(
174 cvox
.SearchTool
.menuItemIndex
, cvox
.SearchTool
.menuItems
.length
);
175 cvox
.SearchTool
.syncToMenuItem();
178 case cvox
.SearchConstants
.KeyCode
.DOWN
:
179 cvox
.SearchTool
.menuItemIndex
= cvox
.SearchUtil
.addOneWrap(
180 cvox
.SearchTool
.menuItemIndex
, cvox
.SearchTool
.menuItems
.length
);
181 cvox
.SearchTool
.syncToMenuItem();
184 case cvox
.SearchConstants
.KeyCode
.LEFT
:
185 cvox
.SearchTool
.toggleMenu();
186 cvox
.SearchTool
.menuIndex
= cvox
.SearchUtil
.subOneWrap(
187 cvox
.SearchTool
.menuIndex
, cvox
.SearchTool
.menus
.length
);
188 cvox
.SearchTool
.syncToMenu();
191 case cvox
.SearchConstants
.KeyCode
.RIGHT
:
192 cvox
.SearchTool
.toggleMenu();
193 cvox
.SearchTool
.menuIndex
= cvox
.SearchUtil
.addOneWrap(
194 cvox
.SearchTool
.menuIndex
, cvox
.SearchTool
.menus
.length
);
195 cvox
.SearchTool
.syncToMenu();
198 case cvox
.SearchConstants
.KeyCode
.ENTER
:
199 cvox
.SearchTool
.gotoMenuItem();
205 evt
.preventDefault();
206 evt
.stopPropagation();