1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @fileoverview Uses ChromeVox API to enhance the search experience.
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.provide('cvox.Search');
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.ChromeVox');
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.SearchConstants');
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.SearchResults');
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.SearchUtil');
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require('cvox.UnknownResult');
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @constructor
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search = function() {
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Selectors to match results.
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object.<string, string>}
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.selectors = {};
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Selectors for web results.
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.webSelectors = {
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /* Topstuff typically contains important messages to be added first. */
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TOPSTUFF_SELECT: '#topstuff',
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SPELL_SUGG_SELECT: '.ssp',
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SPELL_CORRECTION_SELECT: '.sp_cnt',
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  KNOW_PANEL_SELECT: '.knop',
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RESULT_SELECT: 'li.g',
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RELATED_SELECT: '#brs'
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Selectors for image results.
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.imageSelectors = {
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  IMAGE_CATEGORIES_SELECT: '#ifbc .rg_fbl',
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  IMAGE_RESULT_SELECT: '#rg_s .rg_di'
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Index of the currently synced result.
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {number}
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.index;
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Array of the search results.
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Array.<Element>}
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.results = [];
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Array of the navigation panes.
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Array.<Element>}
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.panes = [];
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Index of the currently synced pane.
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {number}
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.paneIndex;
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If currently synced item is a pane.
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.isPane = false;
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Class of a selected pane.
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.SELECTED_PANE_CLASS = 'hdtb_mitem hdtb_msel';
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Speak and sync.
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.speakSync_ = function() {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var result = cvox.Search.results[cvox.Search.index];
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var resultType = cvox.Search.getResultType(result);
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var isSpoken = resultType.speak(result);
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.ChromeVox.syncToNode(resultType.getSyncNode(result), !isSpoken);
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.isPane = false;
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Sync the search result index to ChromeVox.
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.syncToIndex = function() {
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.ChromeVox.tts.stop();
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var prop = { endCallback: cvox.Search.speakSync_ };
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (cvox.Search.index === 0) {
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.ChromeVox.tts.speak('First result', 1, prop);
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else if (cvox.Search.index === cvox.Search.results.length - 1) {
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.ChromeVox.tts.speak('Last result', 1, prop);
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.speakSync_();
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Sync the current pane index to ChromeVox.
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.syncPaneToIndex = function() {
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var pane = cvox.Search.panes[cvox.Search.paneIndex];
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var anchor = pane.querySelector('a');
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (anchor) {
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.ChromeVox.syncToNode(anchor, true);
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.ChromeVox.syncToNode(pane, true);
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.isPane = true;
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the type of the result such as Knowledge Panel, Weather, etc.
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Element} result Result to be classified.
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {cvox.AbstractResult} Type of the result.
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getResultType = function(result) {
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (var i = 0; i < cvox.SearchResults.RESULT_TYPES.length; i++) {
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var resultType = new cvox.SearchResults.RESULT_TYPES[i]();
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (resultType.isType(result)) {
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return resultType;
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return new cvox.UnknownResult();
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the page number associated with the url.
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} url Url of search page.
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {number} Page number.
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getPageNumber = function(url) {
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var PAGE_ANCHOR_SELECTOR = '#nav .fl';
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var pageAnchors = document.querySelectorAll(PAGE_ANCHOR_SELECTOR);
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (var i = 0; i < pageAnchors.length; i++) {
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var pageAnchor = pageAnchors.item(i);
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (pageAnchor.href === url) {
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return parseInt(pageAnchor.innerText, 10);
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return NaN;
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Navigate to the next / previous page.
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {boolean} next True for the next page, false for the previous.
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.navigatePage = function(next) {
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /* NavEnd contains previous / next page links. */
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var NAV_END_CLASS = 'navend';
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var navEnds = document.getElementsByClassName(NAV_END_CLASS);
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var navEnd = next ? navEnds[1] : navEnds[0];
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var url = cvox.SearchUtil.extractURL(navEnd);
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var navToUrl = function() {
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    window.location = url;
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  };
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var prop = { endCallback: navToUrl };
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (url) {
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var pageNumber = cvox.Search.getPageNumber(url);
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!isNaN(pageNumber)) {
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.ChromeVox.tts.speak('Page ' + pageNumber, 0, prop);
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    } else {
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.ChromeVox.tts.speak('Unknown page.', 0, prop);
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Navigates to the currently synced pane.
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.goToPane = function() {
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var pane = cvox.Search.panes[cvox.Search.paneIndex];
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (pane.className === cvox.Search.SELECTED_PANE_CLASS) {
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.ChromeVox.tts.speak('You are already on that page.');
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var anchor = pane.querySelector('a');
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.ChromeVox.tts.speak(anchor.textContent);
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var url = cvox.SearchUtil.extractURL(pane);
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (url) {
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    window.location = url;
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Follow the link to the current result.
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.goToResult = function() {
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var result = cvox.Search.results[cvox.Search.index];
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var resultType = cvox.Search.getResultType(result);
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var url = resultType.getURL(result);
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (url) {
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    window.location = url;
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Handle the keyboard.
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Event} evt Keydown event.
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} True if key was handled, false otherwise.
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.keyhandler = function(evt) {
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var SEARCH_INPUT_ID = 'gbqfq';
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var searchInput = document.getElementById(SEARCH_INPUT_ID);
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var result = cvox.Search.results[cvox.Search.index];
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var ret = false;
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /* TODO(peterxiao): Add cvox api call to determine cvox key. */
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (evt.shiftKey || evt.altKey || evt.ctrlKey) {
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /* Do not handle if search input has focus, or if the search widget
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   * has focus.
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   */
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (document.activeElement !== searchInput &&
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      !cvox.SearchUtil.isSearchWidgetActive()) {
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    switch (evt.keyCode) {
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case cvox.SearchConstants.KeyCode.UP:
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      /* Add results.length because JS Modulo is silly. */
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.index = cvox.SearchUtil.subOneWrap(cvox.Search.index,
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.Search.results.length);
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (cvox.Search.index === cvox.Search.results.length - 1) {
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.ChromeVox.earcons.playEarconByName('WRAP');
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.syncToIndex();
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case cvox.SearchConstants.KeyCode.DOWN:
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.index = cvox.SearchUtil.addOneWrap(cvox.Search.index,
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.Search.results.length);
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (cvox.Search.index === 0) {
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.ChromeVox.earcons.playEarconByName('WRAP');
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.syncToIndex();
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case cvox.SearchConstants.KeyCode.PAGE_UP:
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.navigatePage(false);
255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case cvox.SearchConstants.KeyCode.PAGE_DOWN:
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.navigatePage(true);
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case cvox.SearchConstants.KeyCode.LEFT:
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.paneIndex = cvox.SearchUtil.subOneWrap(cvox.Search.paneIndex,
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.Search.panes.length);
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.syncPaneToIndex();
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case cvox.SearchConstants.KeyCode.RIGHT:
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.paneIndex = cvox.SearchUtil.addOneWrap(cvox.Search.paneIndex,
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.Search.panes.length);
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.syncPaneToIndex();
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case cvox.SearchConstants.KeyCode.ENTER:
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (cvox.Search.isPane) {
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.Search.goToPane();
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      } else {
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        cvox.Search.goToResult();
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    default:
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return false;
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    evt.preventDefault();
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    evt.stopPropagation();
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return true;
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return false;
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Adds the elements that match the selector to results.
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} selector Selector of element to add.
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.addToResultsBySelector = function(selector) {
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var nodes = document.querySelectorAll(selector);
297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (var i = 0; i < nodes.length; i++) {
298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var node = nodes.item(i);
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    /* Do not add if empty. */
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (node.innerHTML !== '') {
301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cvox.Search.results.push(nodes.item(i));
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Populates the panes array.
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.populatePanes = function() {
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.panes = [];
311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var PANE_SELECT = '.hdtb_mitem';
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var paneElems = document.querySelectorAll(PANE_SELECT);
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (var i = 0; i < paneElems.length; i++) {
314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.panes.push(paneElems.item(i));
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Populates the results with results.
320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.populateResults = function() {
322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (var prop in cvox.Search.selectors) {
323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.addToResultsBySelector(cvox.Search.selectors[prop]);
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Populates the results with ad results.
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.populateAdResults = function() {
331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.results = [];
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var ADS_SELECT = '.ads-ad';
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.addToResultsBySelector(ADS_SELECT);
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Observes mutations and updates results accordingly.
338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.observeMutation = function() {
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var SEARCH_AREA_SELECT = '#rg_s';
341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var target = document.querySelector(SEARCH_AREA_SELECT);
342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var observer = new MutationObserver(function(mutations) {
344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.results = [];
345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.populateResults();
346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  });
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var config =
349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      /** @type MutationObserverInit */
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ({ attributes: true, childList: true, characterData: true });
351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  observer.observe(target, config);
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the current selected pane's index.
356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {number} Index of selected pane.
357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getSelectedPaneIndex = function() {
359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var panes = cvox.Search.panes;
360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (var i = 0; i < panes.length; i++) {
361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (panes[i].className === cvox.Search.SELECTED_PANE_CLASS) {
362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return i;
363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return 0;
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Get the ancestor of node that is a result.
370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Node} node Node.
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {Node} Result ancestor.
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.getAncestorResult = function(node) {
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var curr = node;
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  while (curr) {
376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for (var prop in cvox.Search.selectors) {
377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      var selector = cvox.Search.selectors[prop];
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (curr.webkitMatchesSelector && curr.webkitMatchesSelector(selector)) {
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return curr;
380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      }
381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    curr = curr.parentNode;
383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return null;
385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Sync to the correct initial node.
389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.initialSync = function() {
391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var currNode = cvox.ChromeVox.navigationManager.getCurrentNode();
392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var result = cvox.Search.getAncestorResult(currNode);
393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.index = cvox.Search.results.indexOf(result);
394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (cvox.Search.index === -1) {
395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.index = 0;
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (cvox.Search.results.length > 0) {
399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.syncToIndex();
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Initialize Search.
405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)cvox.Search.init = function() {
407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.index = 0;
408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /* Flush out anything that may have been speaking. */
410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.ChromeVox.tts.stop();
411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /* Determine the type of search. */
413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var SELECTED_CLASS = 'hdtb_msel';
414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var selected = document.getElementsByClassName(SELECTED_CLASS)[0];
415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!selected) {
416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var selectedHTML = selected.innerHTML;
420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  switch (selectedHTML) {
421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  case 'Web':
422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  case 'News':
423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.selectors = cvox.Search.webSelectors;
424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    break;
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  case 'Images':
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.selectors = cvox.Search.imageSelectors;
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    cvox.Search.observeMutation();
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    break;
429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  default:
430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.populateResults();
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.populatePanes();
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.paneIndex = cvox.Search.getSelectedPaneIndex();
436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cvox.Search.initialSync();
438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
440