src/cm/media/js/lib/yui/yui3-3.15.0/build/autocomplete-base/autocomplete-base.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('autocomplete-base', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
Provides automatic input completion or suggestions for text input fields and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
textareas.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
@module autocomplete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@main autocomplete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
@since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
`Y.Base` extension that provides core autocomplete logic (but no UI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
implementation) for a text input field or textarea. Must be mixed into a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
`Y.Base`-derived class to be useful.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
@module autocomplete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
@submodule autocomplete-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
Extension that provides core autocomplete logic (but no UI implementation) for a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
text input field or textarea.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
The `AutoCompleteBase` class provides events and attributes that abstract away
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
core autocomplete logic and configuration, but does not provide a widget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
implementation or suggestion UI. For a prepackaged autocomplete widget, see
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
`AutoCompleteList`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
This extension cannot be instantiated directly, since it doesn't provide an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
actual implementation. It's intended to be mixed into a `Y.Base`-based class or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
`Y.Widget`-based example:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
    YUI().use('autocomplete-base', 'widget', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
        var MyAC = Y.Base.create('myAC', Y.Widget, [Y.AutoCompleteBase], {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
            // Custom prototype methods and properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
        }, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
            // Custom static methods and properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
        // Custom implementation code.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
`Y.Base`-based example:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    YUI().use('autocomplete-base', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
        var MyAC = Y.Base.create('myAC', Y.Base, [Y.AutoCompleteBase], {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
            initializer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
                this._bindUIACBase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
                this._syncUIACBase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
            // Custom prototype methods and properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
        }, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
            // Custom static methods and properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        // Custom implementation code.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
@class AutoCompleteBase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
var Escape  = Y.Escape,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    Lang    = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
    YArray  = Y.Array,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    YObject = Y.Object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    isFunction = Lang.isFunction,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    isString   = Lang.isString,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    trim       = Lang.trim,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    INVALID_VALUE = Y.Attribute.INVALID_VALUE,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
    _FUNCTION_VALIDATOR = '_functionValidator',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
    _SOURCE_SUCCESS     = '_sourceSuccess',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
    ALLOW_BROWSER_AC    = 'allowBrowserAutocomplete',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
    INPUT_NODE          = 'inputNode',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
    QUERY               = 'query',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
    QUERY_DELIMITER     = 'queryDelimiter',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
    REQUEST_TEMPLATE    = 'requestTemplate',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    RESULTS             = 'results',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
    RESULT_LIST_LOCATOR = 'resultListLocator',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
    VALUE               = 'value',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
    VALUE_CHANGE        = 'valueChange',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
    EVT_CLEAR   = 'clear',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
    EVT_QUERY   = QUERY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    EVT_RESULTS = RESULTS;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
function AutoCompleteBase() {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
AutoCompleteBase.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
    // -- Lifecycle Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    initializer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
        // AOP bindings.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
        Y.before(this._bindUIACBase, this, 'bindUI');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
        Y.before(this._syncUIACBase, this, 'syncUI');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
        // -- Public Events ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
        Fires after the query has been completely cleared or no longer meets the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
        minimum query length requirement.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
        @event clear
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
        @param {String} prevVal Value of the query before it was cleared.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
        @param {String} src Source of the event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
        @preventable _defClearFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
        this.publish(EVT_CLEAR, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
            defaultFn: this._defClearFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
        Fires when the contents of the input field have changed and the input
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
        value meets the criteria necessary to generate an autocomplete query.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
        @event query
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
        @param {String} inputValue Full contents of the text input field or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
            textarea that generated the query.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
        @param {String} query AutoComplete query. This is the string that will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
            be used to request completion results. It may or may not be the same
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
            as `inputValue`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
        @param {String} src Source of the event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
        @preventable _defQueryFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
        this.publish(EVT_QUERY, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
            defaultFn: this._defQueryFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
        Fires after query results are received from the source. If no source has
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
        been set, this event will not fire.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
        @event results
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
        @param {Array|Object} data Raw, unfiltered result data (if available).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
        @param {String} query Query that generated these results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
        @param {Object[]} results Array of filtered, formatted, and highlighted
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
            results. Each item in the array is an object with the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
            properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
            @param {Node|HTMLElement|String} results.display Formatted result
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
                HTML suitable for display to the user. If no custom formatter is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
                set, this will be an HTML-escaped version of the string in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
                `text` property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
            @param {String} [results.highlighted] Highlighted (but not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
                formatted) result text. This property will only be set if a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
                highlighter is in use.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
            @param {Any} results.raw Raw, unformatted result in whatever form it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
                was provided by the source.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
            @param {String} results.text Plain text version of the result,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
                suitable for being inserted into the value of a text input field
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
                or textarea when the result is selected by a user. This value is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
                not HTML-escaped and should not be inserted into the page using
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
                `innerHTML` or `Node#setContent()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
        @preventable _defResultsFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        this.publish(EVT_RESULTS, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
            defaultFn: this._defResultsFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
    destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        this._acBaseEvents && this._acBaseEvents.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        delete this._acBaseEvents;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        delete this._cache;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
        delete this._inputNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        delete this._rawSource;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    // -- Public Prototype Methods ---------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
    Clears the result cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
    @method clearCache
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
    clearCache: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
        this._cache && (this._cache = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
    Sends a request to the configured source. If no source is configured, this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
    method won't do anything.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    Usually there's no reason to call this method manually; it will be called
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    automatically when user input causes a `query` event to be fired. The only
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    time you'll need to call this method manually is if you want to force a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    request to be sent when no user input has occurred.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    @method sendRequest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
    @param {String} [query] Query to send. If specified, the `query` attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
        will be set to this query. If not specified, the current value of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
        `query` attribute will be used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
    @param {Function} [requestTemplate] Request template function. If not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
        specified, the current value of the `requestTemplate` attribute will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
        used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
    sendRequest: function (query, requestTemplate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
        var request,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
            source = this.get('source');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
        if (query || query === '') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
            this._set(QUERY, query);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
            query = this.get(QUERY) || '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
        if (source) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
            if (!requestTemplate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
                requestTemplate = this.get(REQUEST_TEMPLATE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
            request = requestTemplate ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
                requestTemplate.call(this, query) : query;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
            source.sendRequest({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
                query  : query,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
                request: request,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
                callback: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
                    success: Y.bind(this._onResponse, this, query)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
    // -- Protected Lifecycle Methods ------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
    Attaches event listeners and behaviors.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
    @method _bindUIACBase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    _bindUIACBase: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
        var inputNode  = this.get(INPUT_NODE),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
            tokenInput = inputNode && inputNode.tokenInput;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
        // If the inputNode has a node-tokeninput plugin attached, bind to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        // plugin's inputNode instead.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
        if (tokenInput) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
            inputNode = tokenInput.get(INPUT_NODE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
            this._set('tokenInput', tokenInput);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        if (!inputNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
            Y.error('No inputNode specified.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
        this._inputNode = inputNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
        this._acBaseEvents = new Y.EventHandle([
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
            // This is the valueChange event on the inputNode, provided by the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
            // event-valuechange module, not our own valueChange.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
            inputNode.on(VALUE_CHANGE, this._onInputValueChange, this),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
            inputNode.on('blur', this._onInputBlur, this),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
            this.after(ALLOW_BROWSER_AC + 'Change', this._syncBrowserAutocomplete),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
            this.after('sourceTypeChange', this._afterSourceTypeChange),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
            this.after(VALUE_CHANGE, this._afterValueChange)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
        ]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
    Synchronizes the UI state of the `inputNode`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
    @method _syncUIACBase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
    _syncUIACBase: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        this._syncBrowserAutocomplete();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
        this.set(VALUE, this.get(INPUT_NODE).get(VALUE));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
    // -- Protected Prototype Methods ------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
    Creates a DataSource-like object that simply returns the specified array as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    a response. See the `source` attribute for more details.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
    @method _createArraySource
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
    @param {Array} source
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
    @return {Object} DataSource-like object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
    _createArraySource: function (source) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
        var that = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
        return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
            type: 'array',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
            sendRequest: function (request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
                that[_SOURCE_SUCCESS](source.concat(), request);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
    Creates a DataSource-like object that passes the query to a custom-defined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    function, which is expected to call the provided callback with an array of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
    results. See the `source` attribute for more details.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    @method _createFunctionSource
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    @param {Function} source Function that accepts a query and a callback as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
      parameters, and calls the callback with an array of results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
    @return {Object} DataSource-like object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
    _createFunctionSource: function (source) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
        var that = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
        return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
            type: 'function',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
            sendRequest: function (request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
                var value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
                function afterResults(results) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
                    that[_SOURCE_SUCCESS](results || [], request);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
                // Allow both synchronous and asynchronous functions. If we get
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
                // a truthy return value, assume the function is synchronous.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
                if ((value = source(request.query, afterResults))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
                    afterResults(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
    Creates a DataSource-like object that looks up queries as properties on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
    specified object, and returns the found value (if any) as a response. See
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
    the `source` attribute for more details.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
    @method _createObjectSource
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
    @param {Object} source
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
    @return {Object} DataSource-like object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
    _createObjectSource: function (source) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
        var that = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
        return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
            type: 'object',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
            sendRequest: function (request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
                var query = request.query;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
                that[_SOURCE_SUCCESS](
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
                    YObject.owns(source, query) ? source[query] : [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
                    request
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
                );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
    Returns `true` if _value_ is either a function or `null`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
    @method _functionValidator
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
    @param {Function|null} value Value to validate.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
    _functionValidator: function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
        return value === null || isFunction(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
    Faster and safer alternative to `Y.Object.getValue()`. Doesn't bother
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
    casting the path to an array (since we already know it's an array) and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
    doesn't throw an error if a value in the middle of the object hierarchy is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    neither `undefined` nor an object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    @method _getObjectValue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
    @param {Object} obj
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
    @param {Array} path
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
    @return {Any} Located value, or `undefined` if the value was
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
        not found at the specified path.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
    _getObjectValue: function (obj, path) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
        if (!obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
        for (var i = 0, len = path.length; obj && i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
            obj = obj[path[i]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
        return obj;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
    Parses result responses, performs filtering and highlighting, and fires the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
    `results` event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
    @method _parseResponse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
    @param {String} query Query that generated these results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
    @param {Object} response Response containing results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
    @param {Object} data Raw response data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
    _parseResponse: function (query, response, data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
        var facade = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
                data   : data,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
                query  : query,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
                results: []
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
            listLocator = this.get(RESULT_LIST_LOCATOR),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
            results     = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
            unfiltered  = response && response.results,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
            filters,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
            formatted,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
            formatter,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
            highlighted,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
            highlighter,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
            i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
            len,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
            maxResults,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
            result,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
            text,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
            textLocator;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
        if (unfiltered && listLocator) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
            unfiltered = listLocator.call(this, unfiltered);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
        if (unfiltered && unfiltered.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
            filters     = this.get('resultFilters');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
            textLocator = this.get('resultTextLocator');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
            // Create a lightweight result object for each result to make them
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
            // easier to work with. The various properties on the object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
            // represent different formats of the result, and will be populated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
            // as we go.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
            for (i = 0, len = unfiltered.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
                result = unfiltered[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
                text = textLocator ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
                        textLocator.call(this, result) :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
                        result.toString();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
                results.push({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
                    display: Escape.html(text),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
                    raw    : result,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
                    text   : text
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
            // Run the results through all configured result filters. Each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
            // filter returns an array of (potentially fewer) result objects,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
            // which is then passed to the next filter, and so on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
            for (i = 0, len = filters.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
                results = filters[i].call(this, query, results.concat());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
                if (!results) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
                    return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
                if (!results.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
                    break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
            if (results.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
                formatter   = this.get('resultFormatter');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
                highlighter = this.get('resultHighlighter');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
                maxResults  = this.get('maxResults');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
                // If maxResults is set and greater than 0, limit the number of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
                // results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
                if (maxResults && maxResults > 0 &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
                        results.length > maxResults) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
                    results.length = maxResults;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
                // Run the results through the configured highlighter (if any).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
                // The highlighter returns an array of highlighted strings (not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
                // an array of result objects), and these strings are then added
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
                // to each result object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
                if (highlighter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
                    highlighted = highlighter.call(this, query,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
                            results.concat());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
                    if (!highlighted) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
                        return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
                    for (i = 0, len = highlighted.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
                        result = results[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
                        result.highlighted = highlighted[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
                        result.display     = result.highlighted;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
                // Run the results through the configured formatter (if any) to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
                // produce the final formatted results. The formatter returns an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
                // array of strings or Node instances (not an array of result
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
                // objects), and these strings/Nodes are then added to each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
                // result object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
                if (formatter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
                    formatted = formatter.call(this, query, results.concat());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
                    if (!formatted) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
                        return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
                    for (i = 0, len = formatted.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
                        results[i].display = formatted[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
        facade.results = results;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
        this.fire(EVT_RESULTS, facade);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
    Returns the query portion of the specified input value, or `null` if there
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
    is no suitable query within the input value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
    If a query delimiter is defined, the query will be the last delimited part
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
    of of the string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
    @method _parseValue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
    @param {String} value Input value from which to extract the query.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
    @return {String|null} query
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
    _parseValue: function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
        var delim = this.get(QUERY_DELIMITER);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
        if (delim) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
            value = value.split(delim);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
            value = value[value.length - 1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
        return Lang.trimLeft(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
    Setter for the `enableCache` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
    @method _setEnableCache
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
    @param {Boolean} value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
    _setEnableCache: function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
        // When `this._cache` is an object, result sources will store cached
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
        // results in it. When it's falsy, they won't. This way result sources
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
        // don't need to get the value of the `enableCache` attribute on every
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
        // request, which would be sloooow.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
        this._cache = value ? {} : null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
    Setter for locator attributes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
    @method _setLocator
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
    @param {Function|String|null} locator
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
    @return {Function|null}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
    _setLocator: function (locator) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
        if (this[_FUNCTION_VALIDATOR](locator)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
            return locator;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
        var that = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
        locator = locator.toString().split('.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
        return function (result) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
            return result && that._getObjectValue(result, locator);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
    Setter for the `requestTemplate` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
    @method _setRequestTemplate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
    @param {Function|String|null} template
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
    @return {Function|null}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
    _setRequestTemplate: function (template) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
        if (this[_FUNCTION_VALIDATOR](template)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
            return template;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
        template = template.toString();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
        return function (query) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
            return Lang.sub(template, {query: encodeURIComponent(query)});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
    Setter for the `resultFilters` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
    @method _setResultFilters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
    @param {Array|Function|String|null} filters `null`, a filter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
        function, an array of filter functions, or a string or array of strings
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
        representing the names of methods on `Y.AutoCompleteFilters`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
    @return {Function[]} Array of filter functions (empty if <i>filters</i> is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
        `null`).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
    _setResultFilters: function (filters) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
        var acFilters, getFilterFunction;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
        if (filters === null) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
            return [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
        acFilters = Y.AutoCompleteFilters;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
        getFilterFunction = function (filter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
            if (isFunction(filter)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
                return filter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
            if (isString(filter) && acFilters &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
                    isFunction(acFilters[filter])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
                return acFilters[filter];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
            return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
        if (Lang.isArray(filters)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
            filters = YArray.map(filters, getFilterFunction);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
            return YArray.every(filters, function (f) { return !!f; }) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
                    filters : INVALID_VALUE;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
            filters = getFilterFunction(filters);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
            return filters ? [filters] : INVALID_VALUE;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
    Setter for the `resultHighlighter` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
    @method _setResultHighlighter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
    @param {Function|String|null} highlighter `null`, a highlighter function, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
        a string representing the name of a method on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
        `Y.AutoCompleteHighlighters`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
    @return {Function|null}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
    _setResultHighlighter: function (highlighter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
        var acHighlighters;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
        if (this[_FUNCTION_VALIDATOR](highlighter)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
            return highlighter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
        acHighlighters = Y.AutoCompleteHighlighters;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
        if (isString(highlighter) && acHighlighters &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
                isFunction(acHighlighters[highlighter])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
            return acHighlighters[highlighter];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
        return INVALID_VALUE;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
    Setter for the `source` attribute. Returns a DataSource or a DataSource-like
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
    object depending on the type of _source_ and/or the value of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
    `sourceType` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
    @method _setSource
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
    @param {Any} source AutoComplete source. See the `source` attribute for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
        details.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
    @return {DataSource|Object}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
    _setSource: function (source) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
        var sourceType = this.get('sourceType') || Lang.type(source),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
            sourceSetter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
        if ((source && isFunction(source.sendRequest))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
                || source === null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
                || sourceType === 'datasource') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
            // Quacks like a DataSource instance (or null). Make it so!
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
            this._rawSource = source;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
            return source;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
        // See if there's a registered setter for this source type.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
        if ((sourceSetter = AutoCompleteBase.SOURCE_TYPES[sourceType])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
            this._rawSource = source;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
            return Lang.isString(sourceSetter) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
                    this[sourceSetter](source) : sourceSetter(source);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
        Y.error("Unsupported source type '" + sourceType + "'. Maybe autocomplete-sources isn't loaded?");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
        return INVALID_VALUE;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
    Shared success callback for non-DataSource sources.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
    @method _sourceSuccess
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
    @param {Any} data Response data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
    @param {Object} request Request object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
    _sourceSuccess: function (data, request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
        request.callback.success({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
            data: data,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
            response: {results: data}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
    Synchronizes the UI state of the `allowBrowserAutocomplete` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
    @method _syncBrowserAutocomplete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
    _syncBrowserAutocomplete: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
        var inputNode = this.get(INPUT_NODE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
        if (inputNode.get('nodeName').toLowerCase() === 'input') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
            inputNode.setAttribute('autocomplete',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
                    this.get(ALLOW_BROWSER_AC) ? 'on' : 'off');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
    Updates the query portion of the `value` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
    If a query delimiter is defined, the last delimited portion of the input
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
    value will be replaced with the specified _value_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
    @method _updateValue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
    @param {String} newVal New value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
    _updateValue: function (newVal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
        var delim = this.get(QUERY_DELIMITER),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
            insertDelim,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
            len,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
            prevVal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
        newVal = Lang.trimLeft(newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
        if (delim) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
            insertDelim = trim(delim); // so we don't double up on spaces
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
            prevVal     = YArray.map(trim(this.get(VALUE)).split(delim), trim);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
            len         = prevVal.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
            if (len > 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
                prevVal[len - 1] = newVal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
                newVal = prevVal.join(insertDelim + ' ');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
            newVal = newVal + insertDelim + ' ';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
        this.set(VALUE, newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
    // -- Protected Event Handlers ---------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
    Updates the current `source` based on the new `sourceType` to ensure that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
    the two attributes don't get out of sync when they're changed separately.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
    @method _afterSourceTypeChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
    _afterSourceTypeChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
        if (this._rawSource) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
            this.set('source', this._rawSource);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
    Handles change events for the `value` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
    @method _afterValueChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
    _afterValueChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
        var newVal   = e.newVal,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
            self     = this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
            uiChange = e.src === AutoCompleteBase.UI_SRC,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
            delay, fire, minQueryLength, query;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
        // Update the UI if the value was changed programmatically.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
        if (!uiChange) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
            self._inputNode.set(VALUE, newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
        minQueryLength = self.get('minQueryLength');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
        query          = self._parseValue(newVal) || '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
        if (minQueryLength >= 0 && query.length >= minQueryLength) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
            // Only query on changes that originate from the UI.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
            if (uiChange) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
                delay = self.get('queryDelay');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
                fire = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
                    self.fire(EVT_QUERY, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
                        inputValue: newVal,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
                        query     : query,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
                        src       : e.src
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
                    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
                };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
                if (delay) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
                    clearTimeout(self._delay);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
                    self._delay = setTimeout(fire, delay);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
                    fire();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
                // For programmatic value changes, just update the query
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
                // attribute without sending a query.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
                self._set(QUERY, query);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
            clearTimeout(self._delay);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
            self.fire(EVT_CLEAR, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
                prevVal: e.prevVal ? self._parseValue(e.prevVal) : null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
                src    : e.src
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
    Handles `blur` events on the input node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
    @method _onInputBlur
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
    _onInputBlur: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
        var delim = this.get(QUERY_DELIMITER),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
            delimPos,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
            newVal,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
            value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
        // If a query delimiter is set and the input's value contains one or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
        // more trailing delimiters, strip them.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
        if (delim && !this.get('allowTrailingDelimiter')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
            delim = Lang.trimRight(delim);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
            value = newVal = this._inputNode.get(VALUE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
            if (delim) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
                while ((newVal = Lang.trimRight(newVal)) &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
                        (delimPos = newVal.length - delim.length) &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
                        newVal.lastIndexOf(delim) === delimPos) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
                    newVal = newVal.substring(0, delimPos);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
                // Delimiter is one or more space characters, so just trim the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
                // value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
                newVal = Lang.trimRight(newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
            if (newVal !== value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
                this.set(VALUE, newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
    Handles `valueChange` events on the input node and fires a `query` event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
    when the input value meets the configured criteria.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
    @method _onInputValueChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
    _onInputValueChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
        var newVal = e.newVal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
        // Don't query if the internal value is the same as the new value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
        // reported by valueChange.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
        if (newVal !== this.get(VALUE)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
            this.set(VALUE, newVal, {src: AutoCompleteBase.UI_SRC});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
    Handles source responses and fires the `results` event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
    @method _onResponse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
    _onResponse: function (query, e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
        // Ignore stale responses that aren't for the current query.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
        if (query === (this.get(QUERY) || '')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
            this._parseResponse(query || '', e.response, e.data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
    // -- Protected Default Event Handlers -------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   929
    Default `clear` event handler. Sets the `results` attribute to an empty
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   930
    array and `query` to null.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   931
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   932
    @method _defClearFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   933
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   934
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   935
    _defClearFn: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   936
        this._set(QUERY, null);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   937
        this._set(RESULTS, []);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   938
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   939
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   940
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   941
    Default `query` event handler. Sets the `query` attribute and sends a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   942
    request to the source if one is configured.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   943
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   944
    @method _defQueryFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   945
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   946
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   947
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   948
    _defQueryFn: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   949
        this.sendRequest(e.query); // sendRequest will set the 'query' attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   950
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   951
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   952
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   953
    Default `results` event handler. Sets the `results` attribute to the latest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   954
    results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   955
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   956
    @method _defResultsFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   957
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   958
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   959
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   960
    _defResultsFn: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   961
        this._set(RESULTS, e[RESULTS]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   962
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   963
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   964
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   965
AutoCompleteBase.ATTRS = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   966
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   967
    Whether or not to enable the browser's built-in autocomplete functionality
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   968
    for input fields.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   969
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   970
    @attribute allowBrowserAutocomplete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   971
    @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   972
    @default false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   973
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   974
    allowBrowserAutocomplete: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   975
        value: false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   976
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   977
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   978
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   979
    When a `queryDelimiter` is set, trailing delimiters will automatically be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   980
    stripped from the input value by default when the input node loses focus.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   981
    Set this to `true` to allow trailing delimiters.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   982
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   983
    @attribute allowTrailingDelimiter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   984
    @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   985
    @default false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   986
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   987
    allowTrailingDelimiter: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   988
        value: false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   989
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   990
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   991
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   992
    Whether or not to enable in-memory caching in result sources that support
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   993
    it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   994
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   995
    @attribute enableCache
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   996
    @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   997
    @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   998
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   999
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1000
    enableCache: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1001
        lazyAdd: false, // we need the setter to run on init
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1002
        setter: '_setEnableCache',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1003
        value: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1004
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1005
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1006
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1007
    Node to monitor for changes, which will generate `query` events when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1008
    appropriate. May be either an `<input>` or a `<textarea>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1009
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1010
    @attribute inputNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1011
    @type Node|HTMLElement|String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1012
    @initOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1013
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1014
    inputNode: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1015
        setter: Y.one,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1016
        writeOnce: 'initOnly'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1017
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1018
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1019
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1020
    Maximum number of results to return. A value of `0` or less will allow an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1021
    unlimited number of results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1022
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1023
    @attribute maxResults
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1024
    @type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1025
    @default 0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1026
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1027
    maxResults: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1028
        value: 0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1029
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1030
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1031
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1032
    Minimum number of characters that must be entered before a `query` event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1033
    will be fired. A value of `0` allows empty queries; a negative value will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1034
    effectively disable all `query` events.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1035
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1036
    @attribute minQueryLength
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1037
    @type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1038
    @default 1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1039
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1040
    minQueryLength: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1041
        value: 1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1042
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1043
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1044
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1045
    Current query, or `null` if there is no current query.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1046
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1047
    The query might not be the same as the current value of the input node, both
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1048
    for timing reasons (due to `queryDelay`) and because when one or more
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1049
    `queryDelimiter` separators are in use, only the last portion of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1050
    delimited input string will be used as the query value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1051
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1052
    @attribute query
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1053
    @type String|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1054
    @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1055
    @readonly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1056
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1057
    query: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1058
        readOnly: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1059
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1060
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1061
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1062
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1063
    Number of milliseconds to delay after input before triggering a `query`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1064
    event. If new input occurs before this delay is over, the previous input
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1065
    event will be ignored and a new delay will begin.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1066
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1067
    This can be useful both to throttle queries to a remote data source and to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1068
    avoid distracting the user by showing them less relevant results before
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1069
    they've paused their typing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1070
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1071
    @attribute queryDelay
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1072
    @type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1073
    @default 100
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1074
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1075
    queryDelay: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1076
        value: 100
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1077
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1078
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1079
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1080
    Query delimiter string. When a delimiter is configured, the input value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1081
    will be split on the delimiter, and only the last portion will be used in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1082
    autocomplete queries and updated when the `query` attribute is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1083
    modified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1084
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1085
    @attribute queryDelimiter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1086
    @type String|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1087
    @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1088
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1089
    queryDelimiter: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1090
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1091
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1092
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1093
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1094
    Source request template. This can be a function that accepts a query as a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1095
    parameter and returns a request string, or it can be a string containing the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1096
    placeholder "{query}", which will be replaced with the actual URI-encoded
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1097
    query. In either case, the resulting string will be appended to the request
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1098
    URL when the `source` attribute is set to a remote DataSource, JSONP URL, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1099
    XHR URL (it will not be appended to YQL URLs).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1100
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1101
    While `requestTemplate` may be set to either a function or a string, it will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1102
    always be returned as a function that accepts a query argument and returns a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1103
    string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1104
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1105
    @attribute requestTemplate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1106
    @type Function|String|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1107
    @default null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1108
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1109
    requestTemplate: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1110
        setter: '_setRequestTemplate',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1111
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1112
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1113
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1114
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1115
    Array of local result filter functions. If provided, each filter will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1116
    called with two arguments when results are received: the query and an array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1117
    of result objects. See the documentation for the `results` event for a list
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1118
    of the properties available on each result object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1119
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1120
    Each filter is expected to return a filtered or modified version of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1121
    results array, which will then be passed on to subsequent filters, then the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1122
    `resultHighlighter` function (if set), then the `resultFormatter` function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1123
    (if set), and finally to subscribers to the `results` event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1124
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1125
    If no `source` is set, result filters will not be called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1126
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1127
    Prepackaged result filters provided by the autocomplete-filters and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1128
    autocomplete-filters-accentfold modules can be used by specifying the filter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1129
    name as a string, such as `'phraseMatch'` (assuming the necessary filters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1130
    module is loaded).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1131
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1132
    @attribute resultFilters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1133
    @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1134
    @default []
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1135
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1136
    resultFilters: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1137
        setter: '_setResultFilters',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1138
        value: []
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1139
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1140
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1141
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1142
    Function which will be used to format results. If provided, this function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1143
    will be called with two arguments after results have been received and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1144
    filtered: the query and an array of result objects. The formatter is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1145
    expected to return an array of HTML strings or Node instances containing the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1146
    desired HTML for each result.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1147
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1148
    See the documentation for the `results` event for a list of the properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1149
    available on each result object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1150
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1151
    If no `source` is set, the formatter will not be called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1153
    @attribute resultFormatter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1154
    @type Function|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1155
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1156
    resultFormatter: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1157
        validator: _FUNCTION_VALIDATOR,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1158
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1159
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1160
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1161
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1162
    Function which will be used to highlight results. If provided, this function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1163
    will be called with two arguments after results have been received and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1164
    filtered: the query and an array of filtered result objects. The highlighter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1165
    is expected to return an array of highlighted result text in the form of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1166
    HTML strings.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1168
    See the documentation for the `results` event for a list of the properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1169
    available on each result object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1170
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1171
    If no `source` is set, the highlighter will not be called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1172
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1173
    @attribute resultHighlighter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1174
    @type Function|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1175
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1176
    resultHighlighter: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1177
        setter: '_setResultHighlighter',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1178
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1179
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1180
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1181
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1182
    Locator that should be used to extract an array of results from a non-array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1183
    response.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1184
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1185
    By default, no locator is applied, and all responses are assumed to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1186
    arrays by default. If all responses are already arrays, you don't need to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1187
    define a locator.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1188
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1189
    The locator may be either a function (which will receive the raw response as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1190
    an argument and must return an array) or a string representing an object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1191
    path, such as "foo.bar.baz" (which would return the value of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1192
    `result.foo.bar.baz` if the response is an object).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1193
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1194
    While `resultListLocator` may be set to either a function or a string, it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1195
    will always be returned as a function that accepts a response argument and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1196
    returns an array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1198
    @attribute resultListLocator
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1199
    @type Function|String|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1200
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1201
    resultListLocator: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1202
        setter: '_setLocator',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1203
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1204
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1205
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1206
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1207
    Current results, or an empty array if there are no results.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1208
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1209
    @attribute results
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1210
    @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1211
    @default []
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1212
    @readonly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1213
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1214
    results: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1215
        readOnly: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1216
        value: []
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1217
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1218
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1219
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1220
    Locator that should be used to extract a plain text string from a non-string
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1221
    result item. The resulting text value will typically be the value that ends
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1222
    up being inserted into an input field or textarea when the user of an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1223
    autocomplete implementation selects a result.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1224
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1225
    By default, no locator is applied, and all results are assumed to be plain
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1226
    text strings. If all results are already plain text strings, you don't need
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1227
    to define a locator.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1228
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1229
    The locator may be either a function (which will receive the raw result as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1230
    an argument and must return a string) or a string representing an object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1231
    path, such as "foo.bar.baz" (which would return the value of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1232
    `result.foo.bar.baz` if the result is an object).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1233
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1234
    While `resultTextLocator` may be set to either a function or a string, it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1235
    will always be returned as a function that accepts a result argument and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1236
    returns a string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1237
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1238
    @attribute resultTextLocator
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1239
    @type Function|String|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1240
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1241
    resultTextLocator: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1242
        setter: '_setLocator',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1243
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1244
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1245
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1246
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1247
    Source for autocomplete results. The following source types are supported:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1248
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1249
    <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1250
      <dt>Array</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1251
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1252
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1253
        The full array will be provided to any configured filters for each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1254
        query. This is an easy way to create a fully client-side autocomplete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1255
        implementation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1256
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1257
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1258
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1259
        Example: `['first result', 'second result', 'etc']`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1260
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1261
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1262
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1263
      <dt>DataSource</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1264
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1265
        A `DataSource` instance or other object that provides a DataSource-like
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1266
        `sendRequest` method. See the `DataSource` documentation for details.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1267
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1268
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1269
      <dt>Function</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1270
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1271
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1272
        A function source will be called with the current query and a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1273
        callback function as parameters, and should either return an array of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1274
        results (for synchronous operation) or return nothing and pass an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1275
        array of results to the provided callback (for asynchronous
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1276
        operation).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1277
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1278
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1279
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1280
        Example (synchronous):
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1281
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1282
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1283
        <pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1284
        function (query) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1285
            return ['foo', 'bar'];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1286
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1287
        </pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1288
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1289
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1290
        Example (async):
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1291
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1293
        <pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1294
        function (query, callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1295
            callback(['foo', 'bar']);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1296
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1297
        </pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1298
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1299
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1300
      <dt>Object</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1301
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1302
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1303
        An object will be treated as a query hashmap. If a property on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1304
        object matches the current query, the value of that property will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1305
        used as the response.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1306
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1308
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1309
        The response is assumed to be an array of results by default. If the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1310
        response is not an array, provide a `resultListLocator` to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1311
        process the response and return an array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1312
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1313
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1314
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1315
        Example: `{foo: ['foo result 1', 'foo result 2'], bar: ['bar result']}`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1316
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1317
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1318
    </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1319
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1320
    If the optional `autocomplete-sources` module is loaded, then
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1321
    the following additional source types will be supported as well:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1322
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1323
    <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1324
      <dt>&lt;select&gt; Node</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1325
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1326
        You may provide a YUI Node instance wrapping a &lt;select&gt;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1327
        element, and the options in the list will be used as results. You
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1328
        will also need to specify a `resultTextLocator` of 'text'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1329
        or 'value', depending on what you want to use as the text of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1330
        result.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1331
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1332
        Each result will be an object with the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1333
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1334
        <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1335
          <dt>html (String)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1336
          <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1337
            <p>HTML content of the &lt;option&gt; element.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1338
          </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1339
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1340
          <dt>index (Number)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1341
          <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1342
            <p>Index of the &lt;option&gt; element in the list.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1343
          </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1344
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1345
          <dt>node (Y.Node)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1346
          <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1347
            <p>Node instance referring to the original &lt;option&gt; element.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1348
          </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1349
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1350
          <dt>selected (Boolean)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1351
          <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1352
            <p>Whether or not this item is currently selected in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1353
            &lt;select&gt; list.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1354
          </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1355
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1356
          <dt>text (String)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1357
          <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1358
            <p>Text content of the &lt;option&gt; element.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1359
          </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1360
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1361
          <dt>value (String)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1362
          <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1363
            <p>Value of the &lt;option&gt; element.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1364
          </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1365
        </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1366
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1367
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1368
      <dt>String (JSONP URL)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1369
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1370
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1371
        If a URL with a `{callback}` placeholder is provided, it will be used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1372
        make a JSONP request. The `{query}` placeholder will be replaced with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1373
        the current query, and the `{callback}` placeholder will be replaced
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1374
        with an internally-generated JSONP callback name. Both placeholders must
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1375
        appear in the URL, or the request will fail. An optional `{maxResults}`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1376
        placeholder may also be provided, and will be replaced with the value of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1377
        the maxResults attribute (or 1000 if the maxResults attribute is 0 or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1378
        less).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1379
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1380
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1381
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1382
        The response is assumed to be an array of results by default. If the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1383
        response is not an array, provide a `resultListLocator` to process the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1384
        response and return an array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1385
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1387
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1388
        <strong>The `jsonp` module must be loaded in order for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1389
        JSONP URL sources to work.</strong> If the `jsonp` module
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1390
        is not already loaded, it will be loaded on demand if possible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1391
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1392
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1393
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1394
        Example: `'http://example.com/search?q={query}&callback={callback}'`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1395
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1396
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1397
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1398
      <dt>String (XHR URL)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1399
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1400
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1401
        If a URL without a `{callback}` placeholder is provided, it will be used
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1402
        to make a same-origin XHR request. The `{query}` placeholder will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1403
        replaced with the current query. An optional `{maxResults}` placeholder
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1404
        may also be provided, and will be replaced with the value of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1405
        maxResults attribute (or 1000 if the maxResults attribute is 0 or less).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1406
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1407
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1408
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1409
        The response is assumed to be a JSON array of results by default. If the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1410
        response is a JSON object and not an array, provide a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1411
        `resultListLocator` to process the response and return an array. If the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1412
        response is in some form other than JSON, you will need to use a custom
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1413
        DataSource instance as the source.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1414
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1415
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1416
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1417
        <strong>The `io-base` and `json-parse` modules
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1418
        must be loaded in order for XHR URL sources to work.</strong> If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1419
        these modules are not already loaded, they will be loaded on demand
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1420
        if possible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1421
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1423
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1424
        Example: `'http://example.com/search?q={query}'`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1425
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1426
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1427
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1428
      <dt>String (YQL query)</dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1429
      <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1430
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1431
        If a YQL query is provided, it will be used to make a YQL request. The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1432
        `{query}` placeholder will be replaced with the current autocomplete
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1433
        query. This placeholder must appear in the YQL query, or the request
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1434
        will fail. An optional `{maxResults}` placeholder may also be provided,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1435
        and will be replaced with the value of the maxResults attribute (or 1000
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1436
        if the maxResults attribute is 0 or less).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1437
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1438
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1439
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1440
        <strong>The `yql` module must be loaded in order for YQL
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1441
        sources to work.</strong> If the `yql` module is not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1442
        already loaded, it will be loaded on demand if possible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1443
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1444
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1445
        <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1446
        Example: `'select * from search.suggest where query="{query}"'`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1447
        </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1448
      </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1449
    </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1450
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1451
    As an alternative to providing a source, you could simply listen for `query`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1452
    events and handle them any way you see fit. Providing a source is optional,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1453
    but will usually be simpler.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1454
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1455
    @attribute source
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1456
    @type Array|DataSource|Function|Node|Object|String|null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1457
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1458
    source: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1459
        setter: '_setSource',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1460
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1461
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1462
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1463
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1464
    May be used to force a specific source type, overriding the automatic source
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1465
    type detection. It should almost never be necessary to do this, but as they
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1466
    taught us in the Boy Scouts, one should always be prepared, so it's here if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1467
    you need it. Be warned that if you set this attribute and something breaks,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1468
    it's your own fault.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1469
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1470
    Supported `sourceType` values are: 'array', 'datasource', 'function', and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1471
    'object'.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1472
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1473
    If the `autocomplete-sources` module is loaded, the following additional
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1474
    source types are supported: 'io', 'jsonp', 'select', 'string', 'yql'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1475
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1476
    @attribute sourceType
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1477
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1478
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1479
    sourceType: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1480
        value: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1481
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1482
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1483
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1484
    If the `inputNode` specified at instantiation time has a `node-tokeninput`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1485
    plugin attached to it, this attribute will be a reference to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1486
    `Y.Plugin.TokenInput` instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1487
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1488
    @attribute tokenInput
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1489
    @type Plugin.TokenInput
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1490
    @readonly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1491
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1492
    tokenInput: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1493
        readOnly: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1494
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1495
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1496
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1497
    Current value of the input node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1498
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1499
    @attribute value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1500
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1501
    @default ''
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1502
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1503
    value: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1504
        // Why duplicate this._inputNode.get('value')? Because we need a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1505
        // reliable way to track the source of value changes. We want to perform
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1506
        // completion when the user changes the value, but not when we change
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1507
        // the value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1508
        value: ''
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1509
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1510
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1511
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1512
// This tells Y.Base.create() to copy these static properties to any class
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1513
// AutoCompleteBase is mixed into.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1514
AutoCompleteBase._buildCfg = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1515
    aggregates: ['SOURCE_TYPES'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1516
    statics   : ['UI_SRC']
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1517
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1518
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1519
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1520
Mapping of built-in source types to their setter functions. DataSource instances
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1521
and DataSource-like objects are handled natively, so are not mapped here.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1522
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1523
@property SOURCE_TYPES
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1524
@type {Object}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1525
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1526
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1527
AutoCompleteBase.SOURCE_TYPES = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1528
    array     : '_createArraySource',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1529
    'function': '_createFunctionSource',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1530
    object    : '_createObjectSource'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1531
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1532
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1533
AutoCompleteBase.UI_SRC = (Y.Widget && Y.Widget.UI_SRC) || 'ui';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1534
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1535
Y.AutoCompleteBase = AutoCompleteBase;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1536
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1537
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1538
}, '@VERSION@', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1539
    "optional": [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1540
        "autocomplete-sources"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1541
    ],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1542
    "requires": [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1543
        "array-extras",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1544
        "base-build",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1545
        "escape",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1546
        "event-valuechange",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1547
        "node-base"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1548
    ]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1549
});