OLD | NEW |
| (Empty) |
1 // Copyright 2013 Google Inc. All Rights Reserved. | |
2 | |
3 /** | |
4 * @fileoverview Uses ChromeVox API to access the search tools menu. | |
5 * @author peterxiao@google.com (Peter Xiao) | |
6 */ | |
7 | |
8 goog.provide('cvox.SearchTool'); | |
9 | |
10 goog.require('cvox.ChromeVox'); | |
11 goog.require('cvox.DomUtil'); | |
12 goog.require('cvox.Search'); | |
13 goog.require('cvox.SearchConstants'); | |
14 goog.require('cvox.SearchUtil'); | |
15 | |
16 /** | |
17 * @constructor | |
18 */ | |
19 cvox.SearchTool = function() { | |
20 }; | |
21 | |
22 /** | |
23 * Index of the current menu in focus. | |
24 * @type {number} | |
25 */ | |
26 cvox.SearchTool.menuIndex; | |
27 | |
28 /** | |
29 * Array of menus. | |
30 * @type {Array.<Node>} | |
31 */ | |
32 cvox.SearchTool.menus = []; | |
33 | |
34 /** | |
35 * Index of the current menu item in focus. | |
36 * @type {number} | |
37 */ | |
38 cvox.SearchTool.menuItemIndex; | |
39 | |
40 /** | |
41 * Array of menu items for the current menu. | |
42 * @type {Array.<Node>} | |
43 */ | |
44 cvox.SearchTool.menuItems = []; | |
45 | |
46 /** | |
47 * Id of the clear button. | |
48 * @type {string} | |
49 */ | |
50 cvox.SearchTool.CLEAR_ID = 'hdtb_rst'; | |
51 | |
52 /** | |
53 * Toggles a menu open / close by simulating a click. | |
54 */ | |
55 cvox.SearchTool.toggleMenu = function() { | |
56 var menu = cvox.SearchTool.menus[cvox.SearchTool.menuIndex]; | |
57 var menuDiv = menu.previousSibling; | |
58 cvox.DomUtil.clickElem(menuDiv, false, false, false); | |
59 }; | |
60 | |
61 /** | |
62 * Syncs the first item in the current menu to ChromeVox. | |
63 */ | |
64 cvox.SearchTool.syncToMenu = function() { | |
65 cvox.SearchTool.menuItemIndex = 0; | |
66 cvox.SearchTool.toggleMenu(); | |
67 cvox.SearchTool.populateMenuItems(); | |
68 cvox.SearchTool.syncToMenuItem(); | |
69 }; | |
70 | |
71 /** | |
72 * Syncs the current menu item to ChromeVox. | |
73 */ | |
74 cvox.SearchTool.syncToMenuItem = function() { | |
75 var menuItem = cvox.SearchTool.menuItems[cvox.SearchTool.menuItemIndex]; | |
76 cvox.ChromeVox.syncToNode(menuItem, true); | |
77 }; | |
78 | |
79 /** | |
80 * Fills in menuItems with the current menu's items. | |
81 */ | |
82 cvox.SearchTool.populateMenuItems = function() { | |
83 var menu = cvox.SearchTool.menus[cvox.SearchTool.menuIndex]; | |
84 cvox.SearchTool.menuItems = []; | |
85 /* For now, we just special case on the clear button. */ | |
86 if (menu.id !== cvox.SearchTool.CLEAR_ID) { | |
87 var MENU_ITEM_SELECTOR = '.hdtbItm'; | |
88 var menuItemNodeList = menu.querySelectorAll(MENU_ITEM_SELECTOR); | |
89 for (var i = 0; i < menuItemNodeList.length; i++) { | |
90 cvox.SearchTool.menuItems.push(menuItemNodeList.item(i)); | |
91 } | |
92 } else { | |
93 cvox.SearchTool.menuItems = []; | |
94 cvox.SearchTool.menuItems.push(menu); | |
95 } | |
96 }; | |
97 | |
98 /** | |
99 * Fills in menus with the menus of the page. | |
100 */ | |
101 cvox.SearchTool.populateMenus = function() { | |
102 var MENU_SELECTOR = '.hdtbU'; | |
103 var menuDivs = document.querySelectorAll(MENU_SELECTOR); | |
104 for (var i = 0; i < menuDivs.length; i++) { | |
105 cvox.SearchTool.menus.push(menuDivs.item(i)); | |
106 } | |
107 | |
108 var clearDiv = document.getElementById(cvox.SearchTool.CLEAR_ID); | |
109 if (clearDiv) { | |
110 cvox.SearchTool.menus.push(clearDiv); | |
111 } | |
112 }; | |
113 | |
114 /** | |
115 * Switches focus to the tools interface, giving keyboard access. | |
116 */ | |
117 cvox.SearchTool.activateTools = function() { | |
118 var MENU_BAR_SELECTOR = '#hdtbMenus'; | |
119 var menuBar = document.querySelector(MENU_BAR_SELECTOR); | |
120 var MENUS_OPEN_CLASS = 'hdtb-td-o'; | |
121 menuBar.className = MENUS_OPEN_CLASS; | |
122 | |
123 cvox.SearchTool.populateMenus(); | |
124 cvox.SearchTool.menuIndex = 0; | |
125 cvox.SearchTool.syncToMenu(); | |
126 }; | |
127 | |
128 /** | |
129 * Goes to the link of the current menu item action. | |
130 */ | |
131 cvox.SearchTool.gotoMenuItem = function() { | |
132 var menuItem = cvox.SearchTool.menuItems[cvox.SearchTool.menuItemIndex]; | |
133 var LOCATION_INPUT_ID = '#lc-input'; | |
134 var input = menuItem.querySelector(LOCATION_INPUT_ID); | |
135 /* Special case for setting location. */ | |
136 if (input) { | |
137 input.focus(); | |
138 return; | |
139 } | |
140 | |
141 /* Custom Date Range. */ | |
142 var CDR_ID = 'cdr_opt'; | |
143 switch (menuItem.id) { | |
144 case cvox.SearchTool.CLEAR_ID: | |
145 window.location = menuItem.dataset.url; | |
146 break; | |
147 case CDR_ID: | |
148 var CDR_LINK_SELECTOR = '#cdrlnk'; | |
149 var cdrLink = menuItem.querySelector(CDR_LINK_SELECTOR); | |
150 cvox.DomUtil.clickElem(cdrLink, false, false, false); | |
151 cvox.SearchTool.toggleMenu(); | |
152 break; | |
153 default: | |
154 window.location = cvox.SearchUtil.extractURL(menuItem); | |
155 break; | |
156 } | |
157 }; | |
158 | |
159 /** | |
160 * Handles key events for the tools interface. | |
161 * @param {Event} evt Keydown event. | |
162 * @return {boolean} True if key was handled, false otherwise. | |
163 */ | |
164 cvox.SearchTool.keyhandler = function(evt) { | |
165 if (cvox.SearchUtil.isSearchWidgetActive()) { | |
166 return false; | |
167 } | |
168 | |
169 switch (evt.keyCode) { | |
170 case cvox.SearchConstants.KeyCode.UP: | |
171 cvox.SearchTool.menuItemIndex = cvox.SearchUtil.subOneWrap( | |
172 cvox.SearchTool.menuItemIndex, cvox.SearchTool.menuItems.length); | |
173 cvox.SearchTool.syncToMenuItem(); | |
174 break; | |
175 | |
176 case cvox.SearchConstants.KeyCode.DOWN: | |
177 cvox.SearchTool.menuItemIndex = cvox.SearchUtil.addOneWrap( | |
178 cvox.SearchTool.menuItemIndex, cvox.SearchTool.menuItems.length); | |
179 cvox.SearchTool.syncToMenuItem(); | |
180 break; | |
181 | |
182 case cvox.SearchConstants.KeyCode.LEFT: | |
183 cvox.SearchTool.toggleMenu(); | |
184 cvox.SearchTool.menuIndex = cvox.SearchUtil.subOneWrap( | |
185 cvox.SearchTool.menuIndex, cvox.SearchTool.menus.length); | |
186 cvox.SearchTool.syncToMenu(); | |
187 break; | |
188 | |
189 case cvox.SearchConstants.KeyCode.RIGHT: | |
190 cvox.SearchTool.toggleMenu(); | |
191 cvox.SearchTool.menuIndex = cvox.SearchUtil.addOneWrap( | |
192 cvox.SearchTool.menuIndex, cvox.SearchTool.menus.length); | |
193 cvox.SearchTool.syncToMenu(); | |
194 break; | |
195 | |
196 case cvox.SearchConstants.KeyCode.ENTER: | |
197 cvox.SearchTool.gotoMenuItem(); | |
198 break; | |
199 | |
200 default: | |
201 return false; | |
202 } | |
203 evt.preventDefault(); | |
204 evt.stopPropagation(); | |
205 return true; | |
206 }; | |
OLD | NEW |