diff options
Diffstat (limited to 'ui/ui.autocomplete.js')
-rw-r--r-- | ui/ui.autocomplete.js | 134 |
1 files changed, 67 insertions, 67 deletions
diff --git a/ui/ui.autocomplete.js b/ui/ui.autocomplete.js index c4a5e6f7a..8c2487a38 100644 --- a/ui/ui.autocomplete.js +++ b/ui/ui.autocomplete.js @@ -4,7 +4,7 @@ * Copyright (c) 2007, 2008 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. - * + * * http://docs.jquery.com/UI/Autocomplete * * Depends: @@ -13,7 +13,7 @@ (function($) { $.widget("ui.autocomplete", { - + _init: function() { $.extend(this.options, { @@ -22,11 +22,11 @@ $.widget("ui.autocomplete", { highlight: this.options.highlight || function(value) { return value; }, // if highlight is set to false, replace it with a do-nothing function formatMatch: this.options.formatMatch || this.options.formatItem // if the formatMatch option is not specified, then use formatItem for backwards compatibility }); - + new $.Autocompleter(this.element[0], this.options); - + }, - + result: function(handler) { return this.element.bind("result", handler); }, @@ -42,7 +42,7 @@ $.widget("ui.autocomplete", { destroy: function() { return this.element.trigger("unautocomplete"); } - + }); $.Autocompleter = function(input, options) { @@ -73,9 +73,9 @@ $.Autocompleter = function(input, options) { mouseDownOnSelect: false }; var select = $.Autocompleter.Select(options, input, selectCurrent, config); - + var blockSubmit; - + // prevent form submit in opera when selecting with return key $.browser.opera && $(input.form).bind("submit.autocomplete", function() { if (blockSubmit) { @@ -83,13 +83,13 @@ $.Autocompleter = function(input, options) { return false; } }); - + // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { // track last key pressed lastKeyPressCode = event.keyCode; switch(event.keyCode) { - + case KEY.UP: event.preventDefault(); if ( select.visible() ) { @@ -98,7 +98,7 @@ $.Autocompleter = function(input, options) { onChange(0, true); } break; - + case KEY.DOWN: event.preventDefault(); if ( select.visible() ) { @@ -107,7 +107,7 @@ $.Autocompleter = function(input, options) { onChange(0, true); } break; - + case KEY.PAGEUP: event.preventDefault(); if ( select.visible() ) { @@ -116,7 +116,7 @@ $.Autocompleter = function(input, options) { onChange(0, true); } break; - + case KEY.PAGEDOWN: event.preventDefault(); if ( select.visible() ) { @@ -125,7 +125,7 @@ $.Autocompleter = function(input, options) { onChange(0, true); } break; - + // matches also semicolon case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: case KEY.TAB: @@ -137,11 +137,11 @@ $.Autocompleter = function(input, options) { return false; } break; - + case KEY.ESC: select.hide(); break; - + default: clearTimeout(timeout); timeout = setTimeout(onChange, options.delay); @@ -192,16 +192,16 @@ $.Autocompleter = function(input, options) { $input.unbind(); $(input.form).unbind(".autocomplete"); }); - - + + function selectCurrent() { var selected = select.selected(); if( !selected ) return false; - + var v = selected.result; previousValue = v; - + if ( options.multiple ) { var words = trimWords($input.val()); if ( words.length > 1 ) { @@ -209,26 +209,26 @@ $.Autocompleter = function(input, options) { } v += options.multipleSeparator; } - + $input.val(v); hideResultsNow(); $input.trigger("result", [selected.data, selected.value]); return true; } - + function onChange(crap, skipPrevCheck) { if( lastKeyPressCode == KEY.DEL ) { select.hide(); return; } - + var currentValue = $input.val(); - + if ( !skipPrevCheck && currentValue == previousValue ) return; - + previousValue = currentValue; - + currentValue = lastWord(currentValue); if ( currentValue.length >= options.minChars) { $input.addClass(options.loadingClass); @@ -240,7 +240,7 @@ $.Autocompleter = function(input, options) { select.hide(); } }; - + function trimWords(value) { if ( !value ) { return [""]; @@ -253,14 +253,14 @@ $.Autocompleter = function(input, options) { }); return result; } - + function lastWord(value) { if ( !options.multiple ) return value; var words = trimWords(value); return words[words.length - 1]; } - + // fills in the input box w/the first match (assumed to be the best match) // q: the term entered // sValue: the first matching result @@ -324,16 +324,16 @@ $.Autocompleter = function(input, options) { if (data && data.length) { success(term, data); // if an AJAX url has been supplied, try loading the data now - + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ - + var extraParams = { timestamp: +new Date() }; $.each(options.extraParams, function(key, param) { extraParams[key] = typeof param == "function" ? param() : param; }); - + $.ajax({ // try to leverage ajaxQueue plugin to abort previous requests mode: "abort", @@ -365,7 +365,7 @@ $.Autocompleter = function(input, options) { failure(term); } }; - + function parse(data) { var parsed = []; var rows = data.split("\n"); @@ -424,25 +424,25 @@ $.Autocompleter.Cache = function(options) { var data = {}; var length = 0; - + function matchSubset(s, sub) { - if (!options.matchCase) + if (!options.matchCase) s = s.toLowerCase(); var i = s.indexOf(sub); if (i == -1) return false; return i == 0 || options.matchContains; }; - + function add(q, value) { if (length > options.cacheLength){ flush(); } - if (!data[q]){ + if (!data[q]){ length++; } data[q] = value; } - + function populate(){ if( !options.data ) return false; // track the matches @@ -451,23 +451,23 @@ $.Autocompleter.Cache = function(options) { // no url was specified, we need to adjust the cache length to make sure it fits the local data store if( !options.url ) options.cacheLength = 1; - + // track all options for minChars = 0 stMatchSets[""] = []; - + // loop through the array and create a lookup structure for ( var i = 0, ol = options.data.length; i < ol; i++ ) { var rawValue = options.data[i]; // if rawValue is a string, make an array otherwise just reference the array rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; - + var value = options.formatMatch(rawValue, i+1, options.data.length); if ( value === false ) continue; - + var firstChar = value.charAt(0).toLowerCase(); // if no lookup array for this character exists, look it up now - if( !stMatchSets[firstChar] ) + if( !stMatchSets[firstChar] ) stMatchSets[firstChar] = []; // if the match is a string @@ -476,7 +476,7 @@ $.Autocompleter.Cache = function(options) { data: rawValue, result: options.formatResult && options.formatResult(rawValue) || value }; - + // push the current match into the set list stMatchSets[firstChar].push(row); @@ -494,15 +494,15 @@ $.Autocompleter.Cache = function(options) { add(i, value); }); } - + // populate any existing data setTimeout(populate, 25); - + function flush(){ data = {}; length = 0; } - + return { flush: flush, add: add, @@ -510,7 +510,7 @@ $.Autocompleter.Cache = function(options) { load: function(q) { if (!options.cacheLength || !length) return null; - /* + /* * if dealing w/local data and matchContains than we must make sure * to loop through all the data collections looking for matches */ @@ -530,9 +530,9 @@ $.Autocompleter.Cache = function(options) { } }); } - } + } return csub; - } else + } else // if the exact item exists, use it if (data[q]){ return data[q]; @@ -560,7 +560,7 @@ $.Autocompleter.Select = function (options, input, select, config) { var CLASSES = { ACTIVE: "ui-autocomplete-over" }; - + var listItems, active = -1, data, @@ -568,7 +568,7 @@ $.Autocompleter.Select = function (options, input, select, config) { needsInit = true, element, list; - + // Create results function init() { if (!needsInit) @@ -578,11 +578,11 @@ $.Autocompleter.Select = function (options, input, select, config) { .addClass(options.resultsClass) .css("position", "absolute") .appendTo(document.body); - + list = $("<ul/>").appendTo(element).mouseover( function(event) { if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); - $(target(event)).addClass(CLASSES.ACTIVE); + $(target(event)).addClass(CLASSES.ACTIVE); } }).click(function(event) { $(target(event)).addClass(CLASSES.ACTIVE); @@ -595,13 +595,13 @@ $.Autocompleter.Select = function (options, input, select, config) { }).mouseup(function() { config.mouseDownOnSelect = false; }); - + if( options.width > 0 ) element.css("width", options.width); - + needsInit = false; - } - + } + function target(event) { var element = event.target; while(element && element.tagName != "LI") @@ -628,7 +628,7 @@ $.Autocompleter.Select = function (options, input, select, config) { } } }; - + function movePosition(step) { active += step; if (active < 0) { @@ -637,13 +637,13 @@ $.Autocompleter.Select = function (options, input, select, config) { active = 0; } } - + function limitNumberOfItems(available) { return options.max && options.max < available ? options.max : available; } - + function fillList() { list.empty(); var max = limitNumberOfItems(data.length); @@ -665,7 +665,7 @@ $.Autocompleter.Select = function (options, input, select, config) { if ( $.fn.bgiframe ) list.bgiframe(); } - + return { display: function(d, q) { init(); @@ -712,14 +712,14 @@ $.Autocompleter.Select = function (options, input, select, config) { top: offset.top + input.offsetHeight, left: offset.left }).show(); - + if(options.scroll) { list.scrollTop(0); list.css({ maxHeight: options.scrollHeight, overflow: 'auto' }); - + if($.browser.msie && typeof document.body.style.maxHeight === "undefined") { var listHeight = 0; listItems.each(function() { @@ -732,11 +732,11 @@ $.Autocompleter.Select = function (options, input, select, config) { listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) ); } } - + } - + $(input).triggerHandler("autocompleteshow", [{}, { options: options }], options["show"]); - + }, selected: function() { var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); |