15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('print_preview', function() {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'use strict';
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Component that renders a search box for searching through destinations.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @extends {print_preview.Component}
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function SearchBox() {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print_preview.Component.call(this);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Timeout used to control incremental search.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {?number}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     this.timeout_ = null;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Input box where the query is entered.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @type {HTMLInputElement}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.input_ = null;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Enumeration of event types dispatched from the search box.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @enum {string}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchBox.EventType = {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SEARCH: 'print_preview.SearchBox.SEARCH'
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * CSS classes used by the search box.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @enum {string}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchBox.Classes_ = {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INPUT: 'search-box-input'
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Delay in milliseconds before dispatching a SEARCH event.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @type {number}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @const
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchBox.SEARCH_DELAY_ = 150;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchBox.prototype = {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: print_preview.Component.prototype,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** @param {string} New query to set the search box's query to. */
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setQuery: function(query) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      query = query || '';
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.input_.value = query.trim();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Sets the input element of the search box in focus. */
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focus: function() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.input_.focus();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** @override */
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enterDocument: function() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_preview.Component.prototype.enterDocument.call(this);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.tracker.add(this.input_, 'keydown', this.onInputKeyDown_.bind(this));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** @override */
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exitDocument: function() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_preview.Component.prototype.exitDocument.call(this);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.input_ = null;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** @override */
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decorateInternal: function() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.input_ = this.getElement().getElementsByClassName(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SearchBox.Classes_.INPUT)[0];
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return {string} The current query of the search box.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getQuery_: function() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.input_.value.trim();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Dispatches a SEARCH event.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dispatchSearchEvent_: function() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.timeout_ = null;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var searchEvent = new cr.Event(SearchBox.EventType.SEARCH);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      searchEvent.query = this.getQuery_();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.dispatchEvent(searchEvent);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Called when the input element's value changes. Dispatches a search event.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @private
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    onInputKeyDown_: function() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.timeout_) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clearTimeout(this.timeout_);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.timeout_ = setTimeout(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.dispatchSearchEvent_.bind(this), SearchBox.SEARCH_DELAY_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Export
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SearchBox: SearchBox
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
125