<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[13263] trunk: Move autocomplete to standard jquery directory.</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/13263">13263</a></dd>
<dt>Author</dt> <dd>ryan</dd>
<dt>Date</dt> <dd>2010-02-20 23:35:05 +0000 (Sat, 20 Feb 2010)</dd>
</dl>
<h3>Log Message</h3>
<pre>Move autocomplete to standard jquery directory. Use core jQuery. Use jQuery instead of $. see <a href="http://trac.wordpress.org/ticket/11817">#11817</a></pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpadmincustomnavigationphp">trunk/wp-admin/custom-navigation.php</a></li>
<li><a href="#trunkwpincludesscriptloaderphp">trunk/wp-includes/script-loader.php</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkwpincludesjsjqueryautocompletedevjs">trunk/wp-includes/js/jquery/autocomplete.dev.js</a></li>
<li><a href="#trunkwpincludesjsjqueryautocompletejs">trunk/wp-includes/js/jquery/autocomplete.js</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkwpadminjscustomnavigationcustomjqueryautocompletedevjs">trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.dev.js</a></li>
<li><a href="#trunkwpadminjscustomnavigationcustomjqueryautocompletejs">trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.js</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpadmincustomnavigationphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-admin/custom-navigation.php (13262 => 13263)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/custom-navigation.php        2010-02-20 23:18:57 UTC (rev 13262)
+++ trunk/wp-admin/custom-navigation.php        2010-02-20 23:35:05 UTC (rev 13263)
</span><span class="lines">@@ -13,11 +13,11 @@
</span><span class="cx"> require_once('admin.php');
</span><span class="cx">
</span><span class="cx"> wp_admin_css( 'custom-navigation' );
</span><del>-wp_enqueue_script( 'custom-navigation-jquery' );
</del><ins>+wp_enqueue_script( 'jquery' );
</ins><span class="cx"> wp_enqueue_script( 'custom-navigation-ui-custom' );
</span><span class="cx"> wp_enqueue_script( 'custom-navigation-dynamic-functions' );
</span><span class="cx"> wp_enqueue_script( 'custom-navigation-default-items' );
</span><del>-wp_enqueue_script( 'custom-navigation-autocomplete' );
</del><ins>+wp_enqueue_script( 'jquery-autocomplete' );
</ins><span class="cx"> wp_enqueue_script( 'custom-navigation-php-functions' );
</span><span class="cx"> wp_enqueue_script( 'jquery-ui-dialog' );
</span><span class="cx">
</span><span class="lines">@@ -27,17 +27,6 @@
</span><span class="cx"> wp_custom_navigation();
</span><span class="cx">
</span><span class="cx"> function wp_custom_nav_reset() {
</span><del>-        
-        global $wpdb;
-        
-        $table_name = $wpdb->prefix . "custom_nav_records";                 
-        //DROP existing menu records
-        $wpdb->query("DELETE FROM ".$table_name);
-        
-        $table_name_menus = $wpdb->prefix . "custom_nav_menus";                 
-        //DELETE existing menus
-        $wpdb->query("DELETE FROM ".$table_name_menus);
-        
</del><span class="cx">         wp_custom_navigation_setup(true);
</span><span class="cx">                 
</span><span class="cx">         return true;
</span><span class="lines">@@ -410,24 +399,24 @@
</span><span class="cx">                                         ?>
</span><span class="cx">                                         
</span><span class="cx">                                         <script>
</span><del>-                                                 $(document).ready(function(){
</del><ins>+                                                 jQuery(document).ready(function(){
</ins><span class="cx">
</span><span class="cx">                                                         //GET PHP pages
</span><span class="cx">                                                 var dataposts = "<?php echo $page_name; ?>".split("|");
</span><span class="cx">                                                 
</span><span class="cx">                                                         //Set autocomplete
</span><del>-                                                        $("#page-search").autocomplete(dataposts);
</del><ins>+                                                        jQuery("#page-search").autocomplete(dataposts);
</ins><span class="cx">                                                 
</span><span class="cx">                                                         //Handle autocomplete result
</span><del>-                                                        $("#page-search").result(function(event, data, formatted) {
-                                                         $('#existing-pages').css('display','block');
-                                                         $("#existing-pages dt:contains('" + data + "')").css("display", "block");
</del><ins>+                                                        jQuery("#page-search").result(function(event, data, formatted) {
+                                                         jQuery('#existing-pages').css('display','block');
+                                                         jQuery("#existing-pages dt:contains('" + data + "')").css("display", "block");
</ins><span class="cx">                                                 
</span><del>-                                                         $('#show-pages').hide();
-                                                         $('#hide-pages').show();
</del><ins>+                                                         jQuery('#show-pages').hide();
+                                                         jQuery('#hide-pages').show();
</ins><span class="cx">                                                 
</span><span class="cx">                                                         });
</span><del>-                                                        $('#existing-pages').css('display','none');
</del><ins>+                                                        jQuery('#existing-pages').css('display','none');
</ins><span class="cx">                                                 });
</span><span class="cx">                                         </script>
</span><span class="cx">
</span><span class="lines">@@ -499,24 +488,24 @@
</span><span class="cx">                                         ?>
</span><span class="cx">
</span><span class="cx">                                         <script>
</span><del>-                                                 $(document).ready(function(){
</del><ins>+                                                 jQuery(document).ready(function(){
</ins><span class="cx">
</span><span class="cx">                                                         //GET PHP categories
</span><span class="cx">                                                 var datacats = "<?php echo $cat_name; ?>".split("|");
</span><span class="cx">                                                         
</span><span class="cx">                                                         //Set autocomplete
</span><del>-                                                        $("#cat-search").autocomplete(datacats);
</del><ins>+                                                        jQuery("#cat-search").autocomplete(datacats);
</ins><span class="cx">                                                 
</span><span class="cx">                                                         //Handle autocomplete result
</span><del>-                                                        $("#cat-search").result(function(event, data, formatted) {
-                                                         $('#existing-categories').css('display','block');
-                                                         $("#existing-categories dt:contains('" + data + "')").css("display", "block");
</del><ins>+                                                        jQuery("#cat-search").result(function(event, data, formatted) {
+                                                         jQuery('#existing-categories').css('display','block');
+                                                         jQuery("#existing-categories dt:contains('" + data + "')").css("display", "block");
</ins><span class="cx">                                                                                                  
</span><del>-                                                         $('#show-cats').hide();
-                                                         $('#hide-cats').show();
</del><ins>+                                                         jQuery('#show-cats').hide();
+                                                         jQuery('#hide-cats').show();
</ins><span class="cx">                                                 
</span><span class="cx">                                                         });
</span><del>-                                                        $('#existing-categories').css('display','none');
</del><ins>+                                                        jQuery('#existing-categories').css('display','none');
</ins><span class="cx">                                         
</span><span class="cx">                                                 });
</span><span class="cx">                                         </script>
</span></span></pre></div>
<a id="trunkwpadminjscustomnavigationcustomjqueryautocompletedevjs"></a>
<div class="delfile"><h4>Deleted: trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.dev.js (13262 => 13263)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.dev.js        2010-02-20 23:18:57 UTC (rev 13262)
+++ trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.dev.js        2010-02-20 23:35:05 UTC (rev 13263)
</span><span class="lines">@@ -1,808 +0,0 @@
</span><del>-/*
- * jQuery Autocomplete plugin 1.1
- *
- * Copyright (c) 2009 Jörn Zaefferer
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
- */
-
-;(function($) {
-        
-$.fn.extend({
-        autocomplete: function(urlOrData, options) {
-                var isUrl = typeof urlOrData == "string";
-                options = $.extend({}, $.Autocompleter.defaults, {
-                        url: isUrl ? urlOrData : null,
-                        data: isUrl ? null : urlOrData,
-                        delay: isUrl ? $.Autocompleter.defaults.delay : 10,
-                        max: options && !options.scroll ? 10 : 150
-                }, options);
-                
-                // if highlight is set to false, replace it with a do-nothing function
-                options.highlight = options.highlight || function(value) { return value; };
-                
-                // if the formatMatch option is not specified, then use formatItem for backwards compatibility
-                options.formatMatch = options.formatMatch || options.formatItem;
-                
-                return this.each(function() {
-                        new $.Autocompleter(this, options);
-                });
-        },
-        result: function(handler) {
-                return this.bind("result", handler);
-        },
-        search: function(handler) {
-                return this.trigger("search", [handler]);
-        },
-        flushCache: function() {
-                return this.trigger("flushCache");
-        },
-        setOptions: function(options){
-                return this.trigger("setOptions", [options]);
-        },
-        unautocomplete: function() {
-                return this.trigger("unautocomplete");
-        }
-});
-
-$.Autocompleter = function(input, options) {
-
-        var KEY = {
-                UP: 38,
-                DOWN: 40,
-                DEL: 46,
-                TAB: 9,
-                RETURN: 13,
-                ESC: 27,
-                COMMA: 188,
-                PAGEUP: 33,
-                PAGEDOWN: 34,
-                BACKSPACE: 8
-        };
-
-        // Create $ object for input element
-        var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
-
-        var timeout;
-        var previousValue = "";
-        var cache = $.Autocompleter.Cache(options);
-        var hasFocus = 0;
-        var lastKeyPressCode;
-        var config = {
-                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) {
-                        blockSubmit = false;
-                        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) {
-                // a keypress means the input has focus
-                // avoids issue where input had focus before the autocomplete was applied
-                hasFocus = 1;
-                // track last key pressed
-                lastKeyPressCode = event.keyCode;
-                switch(event.keyCode) {
-                
-                        case KEY.UP:
-                                event.preventDefault();
-                                if ( select.visible() ) {
-                                        select.prev();
-                                } else {
-                                        onChange(0, true);
-                                }
-                                break;
-                                
-                        case KEY.DOWN:
-                                event.preventDefault();
-                                if ( select.visible() ) {
-                                        select.next();
-                                } else {
-                                        onChange(0, true);
-                                }
-                                break;
-                                
-                        case KEY.PAGEUP:
-                                event.preventDefault();
-                                if ( select.visible() ) {
-                                        select.pageUp();
-                                } else {
-                                        onChange(0, true);
-                                }
-                                break;
-                                
-                        case KEY.PAGEDOWN:
-                                event.preventDefault();
-                                if ( select.visible() ) {
-                                        select.pageDown();
-                                } else {
-                                        onChange(0, true);
-                                }
-                                break;
-                        
-                        // matches also semicolon
-                        case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
-                        case KEY.TAB:
-                        case KEY.RETURN:
-                                if( selectCurrent() ) {
-                                        // stop default to prevent a form submit, Opera needs special handling
-                                        event.preventDefault();
-                                        blockSubmit = true;
-                                        return false;
-                                }
-                                break;
-                                
-                        case KEY.ESC:
-                                select.hide();
-                                break;
-                                
-                        default:
-                                clearTimeout(timeout);
-                                timeout = setTimeout(onChange, options.delay);
-                                break;
-                }
-        }).focus(function(){
-                // track whether the field has focus, we shouldn't process any
-                // results if the field no longer has focus
-                hasFocus++;
-        }).blur(function() {
-                hasFocus = 0;
-                if (!config.mouseDownOnSelect) {
-                        hideResults();
-                }
-        }).click(function() {
-                // show select when clicking in a focused field
-                if ( hasFocus++ > 1 && !select.visible() ) {
-                        onChange(0, true);
-                }
-        }).bind("search", function() {
-                // TODO why not just specifying both arguments?
-                var fn = (arguments.length > 1) ? arguments[1] : null;
-                function findValueCallback(q, data) {
-                        var result;
-                        if( data && data.length ) {
-                                for (var i=0; i < data.length; i++) {
-                                        if( data[i].result.toLowerCase() == q.toLowerCase() ) {
-                                                result = data[i];
-                                                break;
-                                        }
-                                }
-                        }
-                        if( typeof fn == "function" ) fn(result);
-                        else $input.trigger("result", result && [result.data, result.value]);
-                }
-                $.each(trimWords($input.val()), function(i, value) {
-                        request(value, findValueCallback, findValueCallback);
-                });
-        }).bind("flushCache", function() {
-                cache.flush();
-        }).bind("setOptions", function() {
-                $.extend(options, arguments[1]);
-                // if we've updated the data, repopulate
-                if ( "data" in arguments[1] )
-                        cache.populate();
-        }).bind("unautocomplete", function() {
-                select.unbind();
-                $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 ) {
-                                var seperator = options.multipleSeparator.length;
-                                var cursorAt = $(input).selection().start;
-                                var wordAt, progress = 0;
-                                $.each(words, function(i, word) {
-                                        progress += word.length;
-                                        if (cursorAt <= progress) {
-                                                wordAt = i;
-                                                return false;
-                                        }
-                                        progress += seperator;
-                                });
-                                words[wordAt] = v;
-                                // TODO this should set the cursor to the right position, but it gets overriden somewhere
-                                //$.Autocompleter.Selection(input, progress + seperator, progress + seperator);
-                                v = words.join( options.multipleSeparator );
-                        }
-                        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);
-                        if (!options.matchCase)
-                                currentValue = currentValue.toLowerCase();
-                        request(currentValue, receiveData, hideResultsNow);
-                } else {
-                        stopLoading();
-                        select.hide();
-                }
-        };
-        
-        function trimWords(value) {
-                if (!value)
-                        return [""];
-                if (!options.multiple)
-                        return [$.trim(value)];
-                return $.map(value.split(options.multipleSeparator), function(word) {
-                        return $.trim(value).length ? $.trim(word) : null;
-                });
-        }
-        
-        function lastWord(value) {
-                if ( !options.multiple )
-                        return value;
-                var words = trimWords(value);
-                if (words.length == 1)
-                        return words[0];
-                var cursorAt = $(input).selection().start;
-                if (cursorAt == value.length) {
-                        words = trimWords(value)
-                } else {
-                        words = trimWords(value.replace(value.substring(cursorAt), ""));
-                }
-                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
-        function autoFill(q, sValue){
-                // autofill in the complete box w/the first match as long as the user hasn't entered in more data
-                // if the last user key pressed was backspace, don't autofill
-                if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
-                        // fill in the value (keep the case the user has typed)
-                        $input.val($input.val() + sValue.substring(lastWord(previousValue).length));
-                        // select the portion of the value not typed by the user (so the next character will erase)
-                        $(input).selection(previousValue.length, previousValue.length + sValue.length);
-                }
-        };
-
-        function hideResults() {
-                clearTimeout(timeout);
-                timeout = setTimeout(hideResultsNow, 200);
-        };
-
-        function hideResultsNow() {
-                var wasVisible = select.visible();
-                select.hide();
-                clearTimeout(timeout);
-                stopLoading();
-                if (options.mustMatch) {
-                        // call search and run callback
-                        $input.search(
-                                function (result){
-                                        // if no value found, clear the input box
-                                        if( !result ) {
-                                                if (options.multiple) {
-                                                        var words = trimWords($input.val()).slice(0, -1);
-                                                        $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
-                                                }
-                                                else {
-                                                        $input.val( "" );
-                                                        $input.trigger("result", null);
-                                                }
-                                        }
-                                }
-                        );
-                }
-        };
-
-        function receiveData(q, data) {
-                if ( data && data.length && hasFocus ) {
-                        stopLoading();
-                        select.display(data, q);
-                        autoFill(q, data[0].value);
-                        select.show();
-                } else {
-                        hideResultsNow();
-                }
-        };
-
-        function request(term, success, failure) {
-                if (!options.matchCase)
-                        term = term.toLowerCase();
-                var data = cache.load(term);
-                // recieve the cached data
-                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",
-                                // limit abortion to this input
-                                port: "autocomplete" + input.name,
-                                dataType: options.dataType,
-                                url: options.url,
-                                data: $.extend({
-                                        q: lastWord(term),
-                                        limit: options.max
-                                }, extraParams),
-                                success: function(data) {
-                                        var parsed = options.parse && options.parse(data) || parse(data);
-                                        cache.add(term, parsed);
-                                        success(term, parsed);
-                                }
-                        });
-                } else {
-                        // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
-                        select.emptyList();
-                        failure(term);
-                }
-        };
-        
-        function parse(data) {
-                var parsed = [];
-                var rows = data.split("\n");
-                for (var i=0; i < rows.length; i++) {
-                        var row = $.trim(rows[i]);
-                        if (row) {
-                                row = row.split("|");
-                                parsed[parsed.length] = {
-                                        data: row,
-                                        value: row[0],
-                                        result: options.formatResult && options.formatResult(row, row[0]) || row[0]
-                                };
-                        }
-                }
-                return parsed;
-        };
-
-        function stopLoading() {
-                $input.removeClass(options.loadingClass);
-        };
-
-};
-
-$.Autocompleter.defaults = {
-        inputClass: "ac_input",
-        resultsClass: "ac_results",
-        loadingClass: "ac_loading",
-        minChars: 1,
-        delay: 400,
-        matchCase: false,
-        matchSubset: true,
-        matchContains: false,
-        cacheLength: 10,
-        max: 100,
-        mustMatch: false,
-        extraParams: {},
-        selectFirst: true,
-        formatItem: function(row) { return row[0]; },
-        formatMatch: null,
-        autoFill: false,
-        width: 0,
-        multiple: false,
-        multipleSeparator: ", ",
-        highlight: function(value, term) {
-                return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
-        },
- scroll: true,
- scrollHeight: 180
-};
-
-$.Autocompleter.Cache = function(options) {
-
-        var data = {};
-        var length = 0;
-        
-        function matchSubset(s, sub) {
-                if (!options.matchCase)
-                        s = s.toLowerCase();
-                var i = s.indexOf(sub);
-                if (options.matchContains == "word"){
-                        i = s.toLowerCase().search("\\b" + sub.toLowerCase());
-                }
-                if (i == -1) return false;
-                return i == 0 || options.matchContains;
-        };
-        
-        function add(q, value) {
-                if (length > options.cacheLength){
-                        flush();
-                }
-                if (!data[q]){
-                        length++;
-                }
-                data[q] = value;
-        }
-        
-        function populate(){
-                if( !options.data ) return false;
-                // track the matches
-                var stMatchSets = {},
-                        nullData = 0;
-
-                // 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] )
-                                stMatchSets[firstChar] = [];
-
-                        // if the match is a string
-                        var row = {
-                                value: value,
-                                data: rawValue,
-                                result: options.formatResult && options.formatResult(rawValue) || value
-                        };
-                        
-                        // push the current match into the set list
-                        stMatchSets[firstChar].push(row);
-
-                        // keep track of minChars zero items
-                        if ( nullData++ < options.max ) {
-                                stMatchSets[""].push(row);
-                        }
-                };
-
-                // add the data items to the cache
-                $.each(stMatchSets, function(i, value) {
-                        // increase the cache size
-                        options.cacheLength++;
-                        // add to the cache
-                        add(i, value);
-                });
-        }
-        
-        // populate any existing data
-        setTimeout(populate, 25);
-        
-        function flush(){
-                data = {};
-                length = 0;
-        }
-        
-        return {
-                flush: flush,
-                add: add,
-                populate: populate,
-                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
-                         */
-                        if( !options.url && options.matchContains ){
-                                // track all matches
-                                var csub = [];
-                                // loop through all the data grids for matches
-                                for( var k in data ){
-                                        // don't search through the stMatchSets[""] (minChars: 0) cache
-                                        // this prevents duplicates
-                                        if( k.length > 0 ){
-                                                var c = data[k];
-                                                $.each(c, function(i, x) {
-                                                        // if we've got a match, add it to the array
-                                                        if (matchSubset(x.value, q)) {
-                                                                csub.push(x);
-                                                        }
-                                                });
-                                        }
-                                }                                
-                                return csub;
-                        } else
-                        // if the exact item exists, use it
-                        if (data[q]){
-                                return data[q];
-                        } else
-                        if (options.matchSubset) {
-                                for (var i = q.length - 1; i >= options.minChars; i--) {
-                                        var c = data[q.substr(0, i)];
-                                        if (c) {
-                                                var csub = [];
-                                                $.each(c, function(i, x) {
-                                                        if (matchSubset(x.value, q)) {
-                                                                csub[csub.length] = x;
-                                                        }
-                                                });
-                                                return csub;
-                                        }
-                                }
-                        }
-                        return null;
-                }
-        };
-};
-
-$.Autocompleter.Select = function (options, input, select, config) {
-        var CLASSES = {
-                ACTIVE: "ac_over"
-        };
-        
-        var listItems,
-                active = -1,
-                data,
-                term = "",
-                needsInit = true,
-                element,
-                list;
-        
-        // Create results
-        function init() {
-                if (!needsInit)
-                        return;
-                element = $("<div/>")
-                .hide()
-                .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);
-         }
-                }).click(function(event) {
-                        $(target(event)).addClass(CLASSES.ACTIVE);
-                        select();
-                        // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
-                        input.focus();
-                        return false;
-                }).mousedown(function() {
-                        config.mouseDownOnSelect = true;
-                }).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")
-                        element = element.parentNode;
-                // more fun with IE, sometimes event.target is empty, just ignore it then
-                if(!element)
-                        return [];
-                return element;
-        }
-
-        function moveSelect(step) {
-                listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
-                movePosition(step);
- var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
- if(options.scroll) {
- var offset = 0;
- listItems.slice(0, active).each(function() {
-                                offset += this.offsetHeight;
-                        });
- if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
- list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
- } else if(offset < list.scrollTop()) {
- list.scrollTop(offset);
- }
- }
-        };
-        
-        function movePosition(step) {
-                active += step;
-                if (active < 0) {
-                        active = listItems.size() - 1;
-                } else if (active >= listItems.size()) {
-                        active = 0;
-                }
-        }
-        
-        function limitNumberOfItems(available) {
-                return options.max && options.max < available
-                        ? options.max
-                        : available;
-        }
-        
-        function fillList() {
-                list.empty();
-                var max = limitNumberOfItems(data.length);
-                for (var i=0; i < max; i++) {
-                        if (!data[i])
-                                continue;
-                        var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
-                        if ( formatted === false )
-                                continue;
-                        var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
-                        $.data(li, "ac_data", data[i]);
-                }
-                listItems = list.find("li");
-                if ( options.selectFirst ) {
-                        listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
-                        active = 0;
-                }
-                // apply bgiframe if available
-                if ( $.fn.bgiframe )
-                        list.bgiframe();
-        }
-        
-        return {
-                display: function(d, q) {
-                        init();
-                        data = d;
-                        term = q;
-                        fillList();
-                },
-                next: function() {
-                        moveSelect(1);
-                },
-                prev: function() {
-                        moveSelect(-1);
-                },
-                pageUp: function() {
-                        if (active != 0 && active - 8 < 0) {
-                                moveSelect( -active );
-                        } else {
-                                moveSelect(-8);
-                        }
-                },
-                pageDown: function() {
-                        if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
-                                moveSelect( listItems.size() - 1 - active );
-                        } else {
-                                moveSelect(8);
-                        }
-                },
-                hide: function() {
-                        element && element.hide();
-                        listItems && listItems.removeClass(CLASSES.ACTIVE);
-                        active = -1;
-                },
-                visible : function() {
-                        return element && element.is(":visible");
-                },
-                current: function() {
-                        return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
-                },
-                show: function() {
-                        var offset = $(input).offset();
-                        element.css({
-                                width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
-                                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() {
-                                                listHeight += this.offsetHeight;
-                                        });
-                                        var scrollbarsVisible = listHeight > options.scrollHeight;
- list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
-                                        if (!scrollbarsVisible) {
-                                                // IE doesn't recalculate width when scrollbar disappears
-                                                listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
-                                        }
- }
-
- }
-                },
-                selected: function() {
-                        var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
-                        return selected && selected.length && $.data(selected[0], "ac_data");
-                },
-                emptyList: function (){
-                        list && list.empty();
-                },
-                unbind: function() {
-                        element && element.remove();
-                }
-        };
-};
-
-$.fn.selection = function(start, end) {
-        if (start !== undefined) {
-                return this.each(function() {
-                        if( this.createTextRange ){
-                                var selRange = this.createTextRange();
-                                if (end === undefined || start == end) {
-                                        selRange.move("character", start);
-                                        selRange.select();
-                                } else {
-                                        selRange.collapse(true);
-                                        selRange.moveStart("character", start);
-                                        selRange.moveEnd("character", end);
-                                        selRange.select();
-                                }
-                        } else if( this.setSelectionRange ){
-                                this.setSelectionRange(start, end);
-                        } else if( this.selectionStart ){
-                                this.selectionStart = start;
-                                this.selectionEnd = end;
-                        }
-                });
-        }
-        var field = this[0];
-        if ( field.createTextRange ) {
-                var range = document.selection.createRange(),
-                        orig = field.value,
-                        teststring = "<->",
-                        textLength = range.text.length;
-                range.text = teststring;
-                var caretAt = field.value.indexOf(teststring);
-                field.value = orig;
-                this.selection(caretAt, caretAt + textLength);
-                return {
-                        start: caretAt,
-                        end: caretAt + textLength
-                }
-        } else if( field.selectionStart !== undefined ){
-                return {
-                        start: field.selectionStart,
-                        end: field.selectionEnd
-                }
-        }
-};
-
-})(jQuery);
</del><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpadminjscustomnavigationcustomjqueryautocompletejs"></a>
<div class="delfile"><h4>Deleted: trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.js (13262 => 13263)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.js        2010-02-20 23:18:57 UTC (rev 13262)
+++ trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.js        2010-02-20 23:35:05 UTC (rev 13263)
</span><span class="lines">@@ -1 +0,0 @@
</span><del>-(function(a){a.fn.extend({autocomplete:function(b,c){var d=typeof b=="string";c=a.extend({},a.Autocompleter.defaults,{url:d?b:null,data:d?null:b,delay:d?a.Autocompleter.defaults.delay:10,max:c&&!c.scroll?10:150},c);c.highlight=c.highlight||function(e){return e};c.formatMatch=c.formatMatch||c.formatItem;return this.each(function(){new a.Autocompleter(this,c)})},result:function(b){return this.bind("result",b)},search:function(b){return this.trigger("search",[b])},flushCache:function(){return this.trigger("flushCache")},setOptions:function(b){return this.trigger("setOptions",[b])},unautocomplete:function(){return this.trigger("unautocomplete")}});a.Autocompleter=function(l,g){var c={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var b=a(l).attr("autocomplete","off").addClass(g.inputClass);var j;var p="";var m=a.Autocompleter.Cache(g);var e=0;var u;var x={mouseDownOnSelect:false};var r=a.Autocompleter.Select(g,l,d,x);var w;a.browser.opera&&a(l.form).bind("submit.autocomplete",function(){if(w){w=false;return false}});b.bind((a.browser.opera?"keypress":"keydown")+".autocomplete",function(y){e=1;u=y.keyCode;switch(y.keyCode){case c.UP:y.preventDefault();if(r.visible()){r.prev()}else{t(0,true)}break;case c.DOWN:y.preventDefault();if(r.visible()){r.next()}else{t(0,true)}break;case c.PAGEUP:y.preventDefault();if(r.visible()){r.pageUp()}else{t(0,true)}break;case c.PAGEDOWN:y.preventDefault();if(r.visible()){r.pageDown()}else{t(0,true)}break;case g.multiple&&a.trim(g.multipleSeparator)==","&&c.COMMA:case c.TAB:case c.RETURN:if(d()){y.preventDefault();w=true;return false}break;case c.ESC:r.hide();break;default:clearTimeout(j);j=setTimeout(t,g.delay);break}}).focus(function(){e++}).blur(function(){e=0;if(!x.mouseDownOnSelect){s()}}).click(function(){if(e++>1&&!r.visible()){t(0,true)}}).bind("search",function(){var y=(arguments.length>1)?arguments[1]:null;function z(D,C){var A;if(C&&C.length){for(var B=0;B<C.length;B++){if(C[B].result.toLowerCase()==D.toLowerCase()){A=C[B];break}}}if(typeof y=="function"){y(A)}else{b.trigger("result",A&&[A.data,A.value])}}a.each(h(b.val()),function(A,B){f(B,z,z)})}).bind("flushCache",function(){m.flush()}).bind("setOptions",function(){a.extend(g,arguments[1]);if("data" in arguments[1]){m.populate()}}).bind("unautocomplete",function(){r.unbind();b.unbind();a(l.form).unbind(".autocomplete")});function d(){var B=r.selected();if(!B){return false}var y=B.result;p=y;if(g.multiple){var E=h(b.val());if(E.length>1){var A=g.multipleSeparator.length;var D=a(l).selection().start;var C,z=0;a.each(E,function(F,G){z+=G.length;if(D<=z){C=F;return false}z+=A});E[C]=y;y=E.join(g.multipleSeparator)}y+=g.multipleSeparator}b.val(y);v();b.trigger("result",[B.data,B.value]);return true}function t(A,z){if(u==c.DEL){r.hide();return}var y=b.val();if(!z&&y==p){return}p=y;y=i(y);if(y.length>=g.minChars){b.addClass(g.loadingClass);if(!g.matchCase){y=y.toLowerCase()}f(y,k,v)}else{n();r.hide()}}function h(y){if(!y){return[""]}if(!g.multiple){return[a.trim(y)]}return a.map(y.split(g.multipleSeparator),function(z){return a.trim(y).length?a.trim(z):null})}function i(y){if(!g.multiple){return y}var A=h(y);if(A.length==1){return A[0]}var z=a(l).selection().start;if(z==y.length){A=h(y)}else{A=h(y.replace(y.substring(z),""))}return A[A.length-1]}function q(y,z){if(g.autoFill&&(i(b.val()).toLowerCase()==y.toLowerCase())&&u!=c.BACKSPACE){b.val(b.val()+z.substring(i(p).length));a(l).selection(p.length,p.length+z.length)}}function s(){clearTimeout(j);j=setTimeout(v,200)}function v(){var y=r.visible();r.hide();clearTimeout(j);n();if(g.mustMatch){b.search(function(z){if(!z){if(g.multiple){var A=h(b.val()).slice(0,-1);b.val(A.join(g.multipleSeparator)+(A.length?g.multipleSeparator:""))}else{b.val("");b.trigger("result",null)}}})}}function k(z,y){if(y&&y.length&&e){n();r.display(y,z);q(z,y[0].value);r.show()}else{v()}}function f(z,B,y){if(!g.matchCase){z=z.toLowerCase()}var A=m.load(z);if(A&&A.length){B(z,A)}else{if((typeof g.url=="string")&&(g.url.length>0)){var C={timestamp:+new Date()};a.each(g.extraParams,function(D,E){C[D]=typeof E=="function"?E():E});a.ajax({mode:"abort",port:"autocomplete"+l.name,dataType:g.dataType,url:g.url,data:a.extend({q:i(z),limit:g.max},C),success:function(E){var D=g.parse&&g.parse(E)||o(E);m.add(z,D);B(z,D)}})}else{r.emptyList();y(z)}}}function o(B){var y=[];var A=B.split("\n");for(var z=0;z<A.length;z++){var C=a.trim(A[z]);if(C){C=C.split("|");y[y.length]={data:C,value:C[0],result:g.formatResult&&g.formatResult(C,C[0])||C[0]}}}return y}function n(){b.removeClass(g.loadingClass)}};a.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(b){return b[0]},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(c,b){return c.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+b.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>")},scroll:true,scrollHeight:180};a.Autocompleter.Cache=function(c){var f={};var d=0;function h(l,k){if(!c.matchCase){l=l.toLowerCase()}var j=l.indexOf(k);if(c.matchContains=="word"){j=l.toLowerCase().search("\\b"+k.toLowerCase())}if(j==-1){return false}return j==0||c.matchContains}function g(j,i){if(d>c.cacheLength){b()}if(!f[j]){d++}f[j]=i}function e(){if(!c.data){return false}var k={},j=0;if(!c.url){c.cacheLength=1}k[""]=[];for(var m=0,l=c.data.length;m<l;m++){var p=c.data[m];p=(typeof p=="string")?[p]:p;var o=c.formatMatch(p,m+1,c.data.length);if(o===false){continue}var n=o.charAt(0).toLowerCase();if(!k[n]){k[n]=[]}var q={value:o,data:p,result:c.formatResult&&c.formatResult(p)||o};k[n].push(q);if(j++<c.max){k[""].push(q)}}a.each(k,function(r,s){c.cacheLength++;g(r,s)})}setTimeout(e,25);function b(){f={};d=0}return{flush:b,add:g,populate:e,load:function(n){if(!c.cacheLength||!d){return null}if(!c.url&&c.matchContains){var m=[];for(var j in f){if(j.length>0){var o=f[j];a.each(o,function(p,k){if(h(k.value,n)){m.push(k)}})}}return m}else{if(f[n]){return f[n]}else{if(c.matchSubset){for(var l=n.length-1;l>=c.minChars;l--){var o=f[n.substr(0,l)];if(o){var m=[];a.each(o,function(p,k){if(h(k.value,n)){m[m.length]=k}});return m}}}}}return null}}};a.Autocompleter.Select=function(e,j,l,p){var i={ACTIVE:"ac_over"};var k,f=-1,r,m="",s=true,c,o;function n(){if(!s){return}c=a("<div/>").hide().addClass(e.resultsClass).css("position","absolute").appendTo(document.body);o=a("<ul/>").appendTo(c).mouseover(function(t){if(q(t).nodeName&&q(t).nodeName.toUpperCase()=="LI"){f=a("li",o).removeClass(i.ACTIVE).index(q(t));a(q(t)).addClass(i.ACTIVE)}}).click(function(t){a(q(t)).addClass(i.ACTIVE);l();j.focus();return false}).mousedown(function(){p.mouseDownOnSelect=true}).mouseup(function(){p.mouseDownOnSelect=false});if(e.width>0){c.css("width",e.width)}s=false}function q(u){var t=u.target;while(t&&t.tagName!="LI"){t=t.parentNode}if(!t){return[]}return t}function h(t){k.slice(f,f+1).removeClass(i.ACTIVE);g(t);var v=k.slice(f,f+1).addClass(i.ACTIVE);if(e.scroll){var u=0;k.slice(0,f).each(function(){u+=this.offsetHeight});if((u+v[0].offsetHeight-o.scrollTop())>o[0].clientHeight){o.scrollTop(u+v[0].offsetHeight-o.innerHeight())}else{if(u<o.scrollTop()){o.scrollTop(u)}}}}function g(t){f+=t;if(f<0){f=k.size()-1}else{if(f>=k.size()){f=0}}}function b(t){return e.max&&e.max<t?e.max:t}function d(){o.empty();var u=b(r.length);for(var v=0;v<u;v++){if(!r[v]){continue}var w=e.formatItem(r[v].data,v+1,u,r[v].value,m);if(w===false){continue}var t=a("<li/>").html(e.highlight(w,m)).addClass(v%2==0?"ac_even":"ac_odd").appendTo(o)[0];a.data(t,"ac_data",r[v])}k=o.find("li");if(e.selectFirst){k.slice(0,1).addClass(i.ACTIVE);f=0}if(a.fn.bgiframe){o.bgiframe()}}return{display:function(u,t){n();r=u;m=t;d()},next:function(){h(1)},prev:function(){h(-1)},pageUp:function(){if(f!=0&&f-8<0){h(-f)}else{h(-8)}},pageDown:function(){if(f!=k.size()-1&&f+8>k.size()){h(k.size()-1-f)}else{h(8)}},hide:function(){c&&c.hide();k&&k.removeClass(i.ACTIVE);f=-1},visible:function(){return c&&c.is(":visible")},current:function(){return this.visible()&&(k.filter("."+i.ACTIVE)[0]||e.selectFirst&&k[0])},show:function(){var v=a(j).offset();c.css({width:typeof e.width=="string"||e.width>0?e.width:a(j).width(),top:v.top+j.offsetHeight,left:v.left}).show();if(e.scroll){o.scrollTop(0);o.css({maxHeight:e.scrollHeight,overflow:"auto"});if(a.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var t=0;k.each(function(){t+=this.offsetHeight});var u=t>e.scrollHeight;o.css("height",u?e.scrollHeight:t);if(!u){k.width(o.width()-parseInt(k.css("padding-left"))-parseInt(k.css("padding-right")))}}}},selected:function(){var t=k&&k.filter("."+i.ACTIVE).removeClass(i.ACTIVE);return t&&t.length&&a.data(t[0],"ac_data")},emptyList:function(){o&&o.empty()},unbind:function(){c&&c.remove()}}};a.fn.selection=function(i,b){if(i!==undefined){return this.each(function(){if(this.createTextRange){var j=this.createTextRange();if(b===undefined||i==b){j.move("character",i);j.select()}else{j.collapse(true);j.moveStart("character",i);j.moveEnd("character",b);j.select()}}else{if(this.setSelectionRange){this.setSelectionRange(i,b)}else{if(this.selectionStart){this.selectionStart=i;this.selectionEnd=b}}}})}var g=this[0];if(g.createTextRange){var c=document.selection.createRange(),h=g.value,f="<->",d=c.text.length;c.text=f;var e=g.value.indexOf(f);g.value=h;this.selection(e,e+d);return{start:e,end:e+d}}else{if(g.selectionStart!==undefined){return{start:g.selectionStart,end:g.selectionEnd}}}}})(jQuery);
</del><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpincludesjsjqueryautocompletedevjsfromrev13257trunkwpadminjscustomnavigationcustomjqueryautocompletedevjs"></a>
<div class="copfile"><h4>Copied: trunk/wp-includes/js/jquery/autocomplete.dev.js (from rev 13257, trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.dev.js) (0 => 13263)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jquery/autocomplete.dev.js         (rev 0)
+++ trunk/wp-includes/js/jquery/autocomplete.dev.js        2010-02-20 23:35:05 UTC (rev 13263)
</span><span class="lines">@@ -0,0 +1,808 @@
</span><ins>+/*
+ * jQuery Autocomplete plugin 1.1
+ *
+ * Copyright (c) 2009 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
+ */
+
+;(function($) {
+        
+$.fn.extend({
+        autocomplete: function(urlOrData, options) {
+                var isUrl = typeof urlOrData == "string";
+                options = $.extend({}, $.Autocompleter.defaults, {
+                        url: isUrl ? urlOrData : null,
+                        data: isUrl ? null : urlOrData,
+                        delay: isUrl ? $.Autocompleter.defaults.delay : 10,
+                        max: options && !options.scroll ? 10 : 150
+                }, options);
+                
+                // if highlight is set to false, replace it with a do-nothing function
+                options.highlight = options.highlight || function(value) { return value; };
+                
+                // if the formatMatch option is not specified, then use formatItem for backwards compatibility
+                options.formatMatch = options.formatMatch || options.formatItem;
+                
+                return this.each(function() {
+                        new $.Autocompleter(this, options);
+                });
+        },
+        result: function(handler) {
+                return this.bind("result", handler);
+        },
+        search: function(handler) {
+                return this.trigger("search", [handler]);
+        },
+        flushCache: function() {
+                return this.trigger("flushCache");
+        },
+        setOptions: function(options){
+                return this.trigger("setOptions", [options]);
+        },
+        unautocomplete: function() {
+                return this.trigger("unautocomplete");
+        }
+});
+
+$.Autocompleter = function(input, options) {
+
+        var KEY = {
+                UP: 38,
+                DOWN: 40,
+                DEL: 46,
+                TAB: 9,
+                RETURN: 13,
+                ESC: 27,
+                COMMA: 188,
+                PAGEUP: 33,
+                PAGEDOWN: 34,
+                BACKSPACE: 8
+        };
+
+        // Create $ object for input element
+        var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
+
+        var timeout;
+        var previousValue = "";
+        var cache = $.Autocompleter.Cache(options);
+        var hasFocus = 0;
+        var lastKeyPressCode;
+        var config = {
+                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) {
+                        blockSubmit = false;
+                        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) {
+                // a keypress means the input has focus
+                // avoids issue where input had focus before the autocomplete was applied
+                hasFocus = 1;
+                // track last key pressed
+                lastKeyPressCode = event.keyCode;
+                switch(event.keyCode) {
+                
+                        case KEY.UP:
+                                event.preventDefault();
+                                if ( select.visible() ) {
+                                        select.prev();
+                                } else {
+                                        onChange(0, true);
+                                }
+                                break;
+                                
+                        case KEY.DOWN:
+                                event.preventDefault();
+                                if ( select.visible() ) {
+                                        select.next();
+                                } else {
+                                        onChange(0, true);
+                                }
+                                break;
+                                
+                        case KEY.PAGEUP:
+                                event.preventDefault();
+                                if ( select.visible() ) {
+                                        select.pageUp();
+                                } else {
+                                        onChange(0, true);
+                                }
+                                break;
+                                
+                        case KEY.PAGEDOWN:
+                                event.preventDefault();
+                                if ( select.visible() ) {
+                                        select.pageDown();
+                                } else {
+                                        onChange(0, true);
+                                }
+                                break;
+                        
+                        // matches also semicolon
+                        case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
+                        case KEY.TAB:
+                        case KEY.RETURN:
+                                if( selectCurrent() ) {
+                                        // stop default to prevent a form submit, Opera needs special handling
+                                        event.preventDefault();
+                                        blockSubmit = true;
+                                        return false;
+                                }
+                                break;
+                                
+                        case KEY.ESC:
+                                select.hide();
+                                break;
+                                
+                        default:
+                                clearTimeout(timeout);
+                                timeout = setTimeout(onChange, options.delay);
+                                break;
+                }
+        }).focus(function(){
+                // track whether the field has focus, we shouldn't process any
+                // results if the field no longer has focus
+                hasFocus++;
+        }).blur(function() {
+                hasFocus = 0;
+                if (!config.mouseDownOnSelect) {
+                        hideResults();
+                }
+        }).click(function() {
+                // show select when clicking in a focused field
+                if ( hasFocus++ > 1 && !select.visible() ) {
+                        onChange(0, true);
+                }
+        }).bind("search", function() {
+                // TODO why not just specifying both arguments?
+                var fn = (arguments.length > 1) ? arguments[1] : null;
+                function findValueCallback(q, data) {
+                        var result;
+                        if( data && data.length ) {
+                                for (var i=0; i < data.length; i++) {
+                                        if( data[i].result.toLowerCase() == q.toLowerCase() ) {
+                                                result = data[i];
+                                                break;
+                                        }
+                                }
+                        }
+                        if( typeof fn == "function" ) fn(result);
+                        else $input.trigger("result", result && [result.data, result.value]);
+                }
+                $.each(trimWords($input.val()), function(i, value) {
+                        request(value, findValueCallback, findValueCallback);
+                });
+        }).bind("flushCache", function() {
+                cache.flush();
+        }).bind("setOptions", function() {
+                $.extend(options, arguments[1]);
+                // if we've updated the data, repopulate
+                if ( "data" in arguments[1] )
+                        cache.populate();
+        }).bind("unautocomplete", function() {
+                select.unbind();
+                $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 ) {
+                                var seperator = options.multipleSeparator.length;
+                                var cursorAt = $(input).selection().start;
+                                var wordAt, progress = 0;
+                                $.each(words, function(i, word) {
+                                        progress += word.length;
+                                        if (cursorAt <= progress) {
+                                                wordAt = i;
+                                                return false;
+                                        }
+                                        progress += seperator;
+                                });
+                                words[wordAt] = v;
+                                // TODO this should set the cursor to the right position, but it gets overriden somewhere
+                                //$.Autocompleter.Selection(input, progress + seperator, progress + seperator);
+                                v = words.join( options.multipleSeparator );
+                        }
+                        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);
+                        if (!options.matchCase)
+                                currentValue = currentValue.toLowerCase();
+                        request(currentValue, receiveData, hideResultsNow);
+                } else {
+                        stopLoading();
+                        select.hide();
+                }
+        };
+        
+        function trimWords(value) {
+                if (!value)
+                        return [""];
+                if (!options.multiple)
+                        return [$.trim(value)];
+                return $.map(value.split(options.multipleSeparator), function(word) {
+                        return $.trim(value).length ? $.trim(word) : null;
+                });
+        }
+        
+        function lastWord(value) {
+                if ( !options.multiple )
+                        return value;
+                var words = trimWords(value);
+                if (words.length == 1)
+                        return words[0];
+                var cursorAt = $(input).selection().start;
+                if (cursorAt == value.length) {
+                        words = trimWords(value)
+                } else {
+                        words = trimWords(value.replace(value.substring(cursorAt), ""));
+                }
+                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
+        function autoFill(q, sValue){
+                // autofill in the complete box w/the first match as long as the user hasn't entered in more data
+                // if the last user key pressed was backspace, don't autofill
+                if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
+                        // fill in the value (keep the case the user has typed)
+                        $input.val($input.val() + sValue.substring(lastWord(previousValue).length));
+                        // select the portion of the value not typed by the user (so the next character will erase)
+                        $(input).selection(previousValue.length, previousValue.length + sValue.length);
+                }
+        };
+
+        function hideResults() {
+                clearTimeout(timeout);
+                timeout = setTimeout(hideResultsNow, 200);
+        };
+
+        function hideResultsNow() {
+                var wasVisible = select.visible();
+                select.hide();
+                clearTimeout(timeout);
+                stopLoading();
+                if (options.mustMatch) {
+                        // call search and run callback
+                        $input.search(
+                                function (result){
+                                        // if no value found, clear the input box
+                                        if( !result ) {
+                                                if (options.multiple) {
+                                                        var words = trimWords($input.val()).slice(0, -1);
+                                                        $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
+                                                }
+                                                else {
+                                                        $input.val( "" );
+                                                        $input.trigger("result", null);
+                                                }
+                                        }
+                                }
+                        );
+                }
+        };
+
+        function receiveData(q, data) {
+                if ( data && data.length && hasFocus ) {
+                        stopLoading();
+                        select.display(data, q);
+                        autoFill(q, data[0].value);
+                        select.show();
+                } else {
+                        hideResultsNow();
+                }
+        };
+
+        function request(term, success, failure) {
+                if (!options.matchCase)
+                        term = term.toLowerCase();
+                var data = cache.load(term);
+                // recieve the cached data
+                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",
+                                // limit abortion to this input
+                                port: "autocomplete" + input.name,
+                                dataType: options.dataType,
+                                url: options.url,
+                                data: $.extend({
+                                        q: lastWord(term),
+                                        limit: options.max
+                                }, extraParams),
+                                success: function(data) {
+                                        var parsed = options.parse && options.parse(data) || parse(data);
+                                        cache.add(term, parsed);
+                                        success(term, parsed);
+                                }
+                        });
+                } else {
+                        // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
+                        select.emptyList();
+                        failure(term);
+                }
+        };
+        
+        function parse(data) {
+                var parsed = [];
+                var rows = data.split("\n");
+                for (var i=0; i < rows.length; i++) {
+                        var row = $.trim(rows[i]);
+                        if (row) {
+                                row = row.split("|");
+                                parsed[parsed.length] = {
+                                        data: row,
+                                        value: row[0],
+                                        result: options.formatResult && options.formatResult(row, row[0]) || row[0]
+                                };
+                        }
+                }
+                return parsed;
+        };
+
+        function stopLoading() {
+                $input.removeClass(options.loadingClass);
+        };
+
+};
+
+$.Autocompleter.defaults = {
+        inputClass: "ac_input",
+        resultsClass: "ac_results",
+        loadingClass: "ac_loading",
+        minChars: 1,
+        delay: 400,
+        matchCase: false,
+        matchSubset: true,
+        matchContains: false,
+        cacheLength: 10,
+        max: 100,
+        mustMatch: false,
+        extraParams: {},
+        selectFirst: true,
+        formatItem: function(row) { return row[0]; },
+        formatMatch: null,
+        autoFill: false,
+        width: 0,
+        multiple: false,
+        multipleSeparator: ", ",
+        highlight: function(value, term) {
+                return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
+        },
+ scroll: true,
+ scrollHeight: 180
+};
+
+$.Autocompleter.Cache = function(options) {
+
+        var data = {};
+        var length = 0;
+        
+        function matchSubset(s, sub) {
+                if (!options.matchCase)
+                        s = s.toLowerCase();
+                var i = s.indexOf(sub);
+                if (options.matchContains == "word"){
+                        i = s.toLowerCase().search("\\b" + sub.toLowerCase());
+                }
+                if (i == -1) return false;
+                return i == 0 || options.matchContains;
+        };
+        
+        function add(q, value) {
+                if (length > options.cacheLength){
+                        flush();
+                }
+                if (!data[q]){
+                        length++;
+                }
+                data[q] = value;
+        }
+        
+        function populate(){
+                if( !options.data ) return false;
+                // track the matches
+                var stMatchSets = {},
+                        nullData = 0;
+
+                // 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] )
+                                stMatchSets[firstChar] = [];
+
+                        // if the match is a string
+                        var row = {
+                                value: value,
+                                data: rawValue,
+                                result: options.formatResult && options.formatResult(rawValue) || value
+                        };
+                        
+                        // push the current match into the set list
+                        stMatchSets[firstChar].push(row);
+
+                        // keep track of minChars zero items
+                        if ( nullData++ < options.max ) {
+                                stMatchSets[""].push(row);
+                        }
+                };
+
+                // add the data items to the cache
+                $.each(stMatchSets, function(i, value) {
+                        // increase the cache size
+                        options.cacheLength++;
+                        // add to the cache
+                        add(i, value);
+                });
+        }
+        
+        // populate any existing data
+        setTimeout(populate, 25);
+        
+        function flush(){
+                data = {};
+                length = 0;
+        }
+        
+        return {
+                flush: flush,
+                add: add,
+                populate: populate,
+                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
+                         */
+                        if( !options.url && options.matchContains ){
+                                // track all matches
+                                var csub = [];
+                                // loop through all the data grids for matches
+                                for( var k in data ){
+                                        // don't search through the stMatchSets[""] (minChars: 0) cache
+                                        // this prevents duplicates
+                                        if( k.length > 0 ){
+                                                var c = data[k];
+                                                $.each(c, function(i, x) {
+                                                        // if we've got a match, add it to the array
+                                                        if (matchSubset(x.value, q)) {
+                                                                csub.push(x);
+                                                        }
+                                                });
+                                        }
+                                }                                
+                                return csub;
+                        } else
+                        // if the exact item exists, use it
+                        if (data[q]){
+                                return data[q];
+                        } else
+                        if (options.matchSubset) {
+                                for (var i = q.length - 1; i >= options.minChars; i--) {
+                                        var c = data[q.substr(0, i)];
+                                        if (c) {
+                                                var csub = [];
+                                                $.each(c, function(i, x) {
+                                                        if (matchSubset(x.value, q)) {
+                                                                csub[csub.length] = x;
+                                                        }
+                                                });
+                                                return csub;
+                                        }
+                                }
+                        }
+                        return null;
+                }
+        };
+};
+
+$.Autocompleter.Select = function (options, input, select, config) {
+        var CLASSES = {
+                ACTIVE: "ac_over"
+        };
+        
+        var listItems,
+                active = -1,
+                data,
+                term = "",
+                needsInit = true,
+                element,
+                list;
+        
+        // Create results
+        function init() {
+                if (!needsInit)
+                        return;
+                element = $("<div/>")
+                .hide()
+                .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);
+         }
+                }).click(function(event) {
+                        $(target(event)).addClass(CLASSES.ACTIVE);
+                        select();
+                        // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
+                        input.focus();
+                        return false;
+                }).mousedown(function() {
+                        config.mouseDownOnSelect = true;
+                }).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")
+                        element = element.parentNode;
+                // more fun with IE, sometimes event.target is empty, just ignore it then
+                if(!element)
+                        return [];
+                return element;
+        }
+
+        function moveSelect(step) {
+                listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
+                movePosition(step);
+ var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
+ if(options.scroll) {
+ var offset = 0;
+ listItems.slice(0, active).each(function() {
+                                offset += this.offsetHeight;
+                        });
+ if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
+ list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
+ } else if(offset < list.scrollTop()) {
+ list.scrollTop(offset);
+ }
+ }
+        };
+        
+        function movePosition(step) {
+                active += step;
+                if (active < 0) {
+                        active = listItems.size() - 1;
+                } else if (active >= listItems.size()) {
+                        active = 0;
+                }
+        }
+        
+        function limitNumberOfItems(available) {
+                return options.max && options.max < available
+                        ? options.max
+                        : available;
+        }
+        
+        function fillList() {
+                list.empty();
+                var max = limitNumberOfItems(data.length);
+                for (var i=0; i < max; i++) {
+                        if (!data[i])
+                                continue;
+                        var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
+                        if ( formatted === false )
+                                continue;
+                        var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
+                        $.data(li, "ac_data", data[i]);
+                }
+                listItems = list.find("li");
+                if ( options.selectFirst ) {
+                        listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
+                        active = 0;
+                }
+                // apply bgiframe if available
+                if ( $.fn.bgiframe )
+                        list.bgiframe();
+        }
+        
+        return {
+                display: function(d, q) {
+                        init();
+                        data = d;
+                        term = q;
+                        fillList();
+                },
+                next: function() {
+                        moveSelect(1);
+                },
+                prev: function() {
+                        moveSelect(-1);
+                },
+                pageUp: function() {
+                        if (active != 0 && active - 8 < 0) {
+                                moveSelect( -active );
+                        } else {
+                                moveSelect(-8);
+                        }
+                },
+                pageDown: function() {
+                        if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
+                                moveSelect( listItems.size() - 1 - active );
+                        } else {
+                                moveSelect(8);
+                        }
+                },
+                hide: function() {
+                        element && element.hide();
+                        listItems && listItems.removeClass(CLASSES.ACTIVE);
+                        active = -1;
+                },
+                visible : function() {
+                        return element && element.is(":visible");
+                },
+                current: function() {
+                        return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
+                },
+                show: function() {
+                        var offset = $(input).offset();
+                        element.css({
+                                width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
+                                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() {
+                                                listHeight += this.offsetHeight;
+                                        });
+                                        var scrollbarsVisible = listHeight > options.scrollHeight;
+ list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
+                                        if (!scrollbarsVisible) {
+                                                // IE doesn't recalculate width when scrollbar disappears
+                                                listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
+                                        }
+ }
+
+ }
+                },
+                selected: function() {
+                        var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
+                        return selected && selected.length && $.data(selected[0], "ac_data");
+                },
+                emptyList: function (){
+                        list && list.empty();
+                },
+                unbind: function() {
+                        element && element.remove();
+                }
+        };
+};
+
+$.fn.selection = function(start, end) {
+        if (start !== undefined) {
+                return this.each(function() {
+                        if( this.createTextRange ){
+                                var selRange = this.createTextRange();
+                                if (end === undefined || start == end) {
+                                        selRange.move("character", start);
+                                        selRange.select();
+                                } else {
+                                        selRange.collapse(true);
+                                        selRange.moveStart("character", start);
+                                        selRange.moveEnd("character", end);
+                                        selRange.select();
+                                }
+                        } else if( this.setSelectionRange ){
+                                this.setSelectionRange(start, end);
+                        } else if( this.selectionStart ){
+                                this.selectionStart = start;
+                                this.selectionEnd = end;
+                        }
+                });
+        }
+        var field = this[0];
+        if ( field.createTextRange ) {
+                var range = document.selection.createRange(),
+                        orig = field.value,
+                        teststring = "<->",
+                        textLength = range.text.length;
+                range.text = teststring;
+                var caretAt = field.value.indexOf(teststring);
+                field.value = orig;
+                this.selection(caretAt, caretAt + textLength);
+                return {
+                        start: caretAt,
+                        end: caretAt + textLength
+                }
+        } else if( field.selectionStart !== undefined ){
+                return {
+                        start: field.selectionStart,
+                        end: field.selectionEnd
+                }
+        }
+};
+
+})(jQuery);
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpincludesjsjqueryautocompletejsfromrev13257trunkwpadminjscustomnavigationcustomjqueryautocompletejs"></a>
<div class="copfile"><h4>Copied: trunk/wp-includes/js/jquery/autocomplete.js (from rev 13257, trunk/wp-admin/js/custom-navigation-custom-jquery-autocomplete.js) (0 => 13263)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jquery/autocomplete.js         (rev 0)
+++ trunk/wp-includes/js/jquery/autocomplete.js        2010-02-20 23:35:05 UTC (rev 13263)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+(function(a){a.fn.extend({autocomplete:function(b,c){var d=typeof b=="string";c=a.extend({},a.Autocompleter.defaults,{url:d?b:null,data:d?null:b,delay:d?a.Autocompleter.defaults.delay:10,max:c&&!c.scroll?10:150},c);c.highlight=c.highlight||function(e){return e};c.formatMatch=c.formatMatch||c.formatItem;return this.each(function(){new a.Autocompleter(this,c)})},result:function(b){return this.bind("result",b)},search:function(b){return this.trigger("search",[b])},flushCache:function(){return this.trigger("flushCache")},setOptions:function(b){return this.trigger("setOptions",[b])},unautocomplete:function(){return this.trigger("unautocomplete")}});a.Autocompleter=function(l,g){var c={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var b=a(l).attr("autocomplete","off").addClass(g.inputClass);var j;var p="";var m=a.Autocompleter.Cache(g);var e=0;var u;var x={mouseDownOnSelect:false};var r=a.Autocompleter.Select(g,l,d,x);var w;a.browser.opera&&a(l.form).bind("submit.autocomplete",function(){if(w){w=false;return false}});b.bind((a.browser.opera?"keypress":"keydown")+".autocomplete",function(y){e=1;u=y.keyCode;switch(y.keyCode){case c.UP:y.preventDefault();if(r.visible()){r.prev()}else{t(0,true)}break;case c.DOWN:y.preventDefault();if(r.visible()){r.next()}else{t(0,true)}break;case c.PAGEUP:y.preventDefault();if(r.visible()){r.pageUp()}else{t(0,true)}break;case c.PAGEDOWN:y.preventDefault();if(r.visible()){r.pageDown()}else{t(0,true)}break;case g.multiple&&a.trim(g.multipleSeparator)==","&&c.COMMA:case c.TAB:case c.RETURN:if(d()){y.preventDefault();w=true;return false}break;case c.ESC:r.hide();break;default:clearTimeout(j);j=setTimeout(t,g.delay);break}}).focus(function(){e++}).blur(function(){e=0;if(!x.mouseDownOnSelect){s()}}).click(function(){if(e++>1&&!r.visible()){t(0,true)}}).bind("search",function(){var y=(arguments.length>1)?arguments[1]:null;function z(D,C){var A;if(C&&C.length){for(var B=0;B<C.length;B++){if(C[B].result.toLowerCase()==D.toLowerCase()){A=C[B];break}}}if(typeof y=="function"){y(A)}else{b.trigger("result",A&&[A.data,A.value])}}a.each(h(b.val()),function(A,B){f(B,z,z)})}).bind("flushCache",function(){m.flush()}).bind("setOptions",function(){a.extend(g,arguments[1]);if("data" in arguments[1]){m.populate()}}).bind("unautocomplete",function(){r.unbind();b.unbind();a(l.form).unbind(".autocomplete")});function d(){var B=r.selected();if(!B){return false}var y=B.result;p=y;if(g.multiple){var E=h(b.val());if(E.length>1){var A=g.multipleSeparator.length;var D=a(l).selection().start;var C,z=0;a.each(E,function(F,G){z+=G.length;if(D<=z){C=F;return false}z+=A});E[C]=y;y=E.join(g.multipleSeparator)}y+=g.multipleSeparator}b.val(y);v();b.trigger("result",[B.data,B.value]);return true}function t(A,z){if(u==c.DEL){r.hide();return}var y=b.val();if(!z&&y==p){return}p=y;y=i(y);if(y.length>=g.minChars){b.addClass(g.loadingClass);if(!g.matchCase){y=y.toLowerCase()}f(y,k,v)}else{n();r.hide()}}function h(y){if(!y){return[""]}if(!g.multiple){return[a.trim(y)]}return a.map(y.split(g.multipleSeparator),function(z){return a.trim(y).length?a.trim(z):null})}function i(y){if(!g.multiple){return y}var A=h(y);if(A.length==1){return A[0]}var z=a(l).selection().start;if(z==y.length){A=h(y)}else{A=h(y.replace(y.substring(z),""))}return A[A.length-1]}function q(y,z){if(g.autoFill&&(i(b.val()).toLowerCase()==y.toLowerCase())&&u!=c.BACKSPACE){b.val(b.val()+z.substring(i(p).length));a(l).selection(p.length,p.length+z.length)}}function s(){clearTimeout(j);j=setTimeout(v,200)}function v(){var y=r.visible();r.hide();clearTimeout(j);n();if(g.mustMatch){b.search(function(z){if(!z){if(g.multiple){var A=h(b.val()).slice(0,-1);b.val(A.join(g.multipleSeparator)+(A.length?g.multipleSeparator:""))}else{b.val("");b.trigger("result",null)}}})}}function k(z,y){if(y&&y.length&&e){n();r.display(y,z);q(z,y[0].value);r.show()}else{v()}}function f(z,B,y){if(!g.matchCase){z=z.toLowerCase()}var A=m.load(z);if(A&&A.length){B(z,A)}else{if((typeof g.url=="string")&&(g.url.length>0)){var C={timestamp:+new Date()};a.each(g.extraParams,function(D,E){C[D]=typeof E=="function"?E():E});a.ajax({mode:"abort",port:"autocomplete"+l.name,dataType:g.dataType,url:g.url,data:a.extend({q:i(z),limit:g.max},C),success:function(E){var D=g.parse&&g.parse(E)||o(E);m.add(z,D);B(z,D)}})}else{r.emptyList();y(z)}}}function o(B){var y=[];var A=B.split("\n");for(var z=0;z<A.length;z++){var C=a.trim(A[z]);if(C){C=C.split("|");y[y.length]={data:C,value:C[0],result:g.formatResult&&g.formatResult(C,C[0])||C[0]}}}return y}function n(){b.removeClass(g.loadingClass)}};a.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(b){return b[0]},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(c,b){return c.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+b.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>")},scroll:true,scrollHeight:180};a.Autocompleter.Cache=function(c){var f={};var d=0;function h(l,k){if(!c.matchCase){l=l.toLowerCase()}var j=l.indexOf(k);if(c.matchContains=="word"){j=l.toLowerCase().search("\\b"+k.toLowerCase())}if(j==-1){return false}return j==0||c.matchContains}function g(j,i){if(d>c.cacheLength){b()}if(!f[j]){d++}f[j]=i}function e(){if(!c.data){return false}var k={},j=0;if(!c.url){c.cacheLength=1}k[""]=[];for(var m=0,l=c.data.length;m<l;m++){var p=c.data[m];p=(typeof p=="string")?[p]:p;var o=c.formatMatch(p,m+1,c.data.length);if(o===false){continue}var n=o.charAt(0).toLowerCase();if(!k[n]){k[n]=[]}var q={value:o,data:p,result:c.formatResult&&c.formatResult(p)||o};k[n].push(q);if(j++<c.max){k[""].push(q)}}a.each(k,function(r,s){c.cacheLength++;g(r,s)})}setTimeout(e,25);function b(){f={};d=0}return{flush:b,add:g,populate:e,load:function(n){if(!c.cacheLength||!d){return null}if(!c.url&&c.matchContains){var m=[];for(var j in f){if(j.length>0){var o=f[j];a.each(o,function(p,k){if(h(k.value,n)){m.push(k)}})}}return m}else{if(f[n]){return f[n]}else{if(c.matchSubset){for(var l=n.length-1;l>=c.minChars;l--){var o=f[n.substr(0,l)];if(o){var m=[];a.each(o,function(p,k){if(h(k.value,n)){m[m.length]=k}});return m}}}}}return null}}};a.Autocompleter.Select=function(e,j,l,p){var i={ACTIVE:"ac_over"};var k,f=-1,r,m="",s=true,c,o;function n(){if(!s){return}c=a("<div/>").hide().addClass(e.resultsClass).css("position","absolute").appendTo(document.body);o=a("<ul/>").appendTo(c).mouseover(function(t){if(q(t).nodeName&&q(t).nodeName.toUpperCase()=="LI"){f=a("li",o).removeClass(i.ACTIVE).index(q(t));a(q(t)).addClass(i.ACTIVE)}}).click(function(t){a(q(t)).addClass(i.ACTIVE);l();j.focus();return false}).mousedown(function(){p.mouseDownOnSelect=true}).mouseup(function(){p.mouseDownOnSelect=false});if(e.width>0){c.css("width",e.width)}s=false}function q(u){var t=u.target;while(t&&t.tagName!="LI"){t=t.parentNode}if(!t){return[]}return t}function h(t){k.slice(f,f+1).removeClass(i.ACTIVE);g(t);var v=k.slice(f,f+1).addClass(i.ACTIVE);if(e.scroll){var u=0;k.slice(0,f).each(function(){u+=this.offsetHeight});if((u+v[0].offsetHeight-o.scrollTop())>o[0].clientHeight){o.scrollTop(u+v[0].offsetHeight-o.innerHeight())}else{if(u<o.scrollTop()){o.scrollTop(u)}}}}function g(t){f+=t;if(f<0){f=k.size()-1}else{if(f>=k.size()){f=0}}}function b(t){return e.max&&e.max<t?e.max:t}function d(){o.empty();var u=b(r.length);for(var v=0;v<u;v++){if(!r[v]){continue}var w=e.formatItem(r[v].data,v+1,u,r[v].value,m);if(w===false){continue}var t=a("<li/>").html(e.highlight(w,m)).addClass(v%2==0?"ac_even":"ac_odd").appendTo(o)[0];a.data(t,"ac_data",r[v])}k=o.find("li");if(e.selectFirst){k.slice(0,1).addClass(i.ACTIVE);f=0}if(a.fn.bgiframe){o.bgiframe()}}return{display:function(u,t){n();r=u;m=t;d()},next:function(){h(1)},prev:function(){h(-1)},pageUp:function(){if(f!=0&&f-8<0){h(-f)}else{h(-8)}},pageDown:function(){if(f!=k.size()-1&&f+8>k.size()){h(k.size()-1-f)}else{h(8)}},hide:function(){c&&c.hide();k&&k.removeClass(i.ACTIVE);f=-1},visible:function(){return c&&c.is(":visible")},current:function(){return this.visible()&&(k.filter("."+i.ACTIVE)[0]||e.selectFirst&&k[0])},show:function(){var v=a(j).offset();c.css({width:typeof e.width=="string"||e.width>0?e.width:a(j).width(),top:v.top+j.offsetHeight,left:v.left}).show();if(e.scroll){o.scrollTop(0);o.css({maxHeight:e.scrollHeight,overflow:"auto"});if(a.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var t=0;k.each(function(){t+=this.offsetHeight});var u=t>e.scrollHeight;o.css("height",u?e.scrollHeight:t);if(!u){k.width(o.width()-parseInt(k.css("padding-left"))-parseInt(k.css("padding-right")))}}}},selected:function(){var t=k&&k.filter("."+i.ACTIVE).removeClass(i.ACTIVE);return t&&t.length&&a.data(t[0],"ac_data")},emptyList:function(){o&&o.empty()},unbind:function(){c&&c.remove()}}};a.fn.selection=function(i,b){if(i!==undefined){return this.each(function(){if(this.createTextRange){var j=this.createTextRange();if(b===undefined||i==b){j.move("character",i);j.select()}else{j.collapse(true);j.moveStart("character",i);j.moveEnd("character",b);j.select()}}else{if(this.setSelectionRange){this.setSelectionRange(i,b)}else{if(this.selectionStart){this.selectionStart=i;this.selectionEnd=b}}}})}var g=this[0];if(g.createTextRange){var c=document.selection.createRange(),h=g.value,f="<->",d=c.text.length;c.text=f;var e=g.value.indexOf(f);g.value=h;this.selection(e,e+d);return{start:e,end:e+d}}else{if(g.selectionStart!==undefined){return{start:g.selectionStart,end:g.selectionEnd}}}}})(jQuery);
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpincludesscriptloaderphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/script-loader.php (13262 => 13263)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/script-loader.php        2010-02-20 23:18:57 UTC (rev 13262)
+++ trunk/wp-includes/script-loader.php        2010-02-20 23:35:05 UTC (rev 13263)
</span><span class="lines">@@ -164,6 +164,9 @@
</span><span class="cx">         $scripts->add( 'jquery-table-hotkeys', "/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js", array('jquery', 'jquery-hotkeys'), '20090102' );
</span><span class="cx">         $scripts->add_data( 'jquery-table-hotkeys', 'group', 1 );
</span><span class="cx">
</span><ins>+        $scripts->add( 'jquery-autocomplete', "/wp-includes/js/jquery/autocomplete$suffix.js", array('jquery'), '1.1' );
+        $scripts->add_data( 'jquery-autocomplete', 'group', 1 );
+
</ins><span class="cx">         $scripts->add( 'thickbox', "/wp-includes/js/thickbox/thickbox.js", array('jquery'), '3.1-20100108');
</span><span class="cx">         $scripts->add_data( 'thickbox', 'group', 1 );
</span><span class="cx">         $scripts->localize( 'thickbox', 'thickboxL10n', array(
</span><span class="lines">@@ -397,14 +400,9 @@
</span><span class="cx">         
</span><span class="cx">         //Custom Navigation
</span><span class="cx">
</span><del>-        $scripts->add( 'custom-navigation-jquery', '/wp-admin/js/custom-navigation-custom-jquery-1.3.2.js', false, '1.3.2' );
-                
-        $scripts->add( 'custom-navigation-ui-custom', '/wp-admin/js/custom-navigation-custom-jquery-ui-1.7.2.js', array('custom-navigation-jquery'), '1.7.2' );
</del><ins>+        $scripts->add( 'custom-navigation-ui-custom', '/wp-admin/js/custom-navigation-custom-jquery-ui-1.7.2.js', array('jquery'), '1.7.2' );
</ins><span class="cx">         $scripts->add_data( 'custom-navigation-ui-custom', 'group', 1 );
</span><span class="cx">         
</span><del>-        $scripts->add( 'custom-navigation-autocomplete', '/wp-admin/js/custom-navigation-custom-jquery-autocomplete.js', array('custom-navigation-jquery'), '1.0.0' );
-        $scripts->add_data( 'custom-navigation-autocomplete', 'group', 1 );
-        
</del><span class="cx">         $scripts->add( 'custom-navigation-default-items', '/wp-admin/js/custom-navigation-default-items.js', false, '1.0.0' );
</span><span class="cx">         $scripts->add( 'custom-navigation-dynamic-functions', '/wp-admin/js/custom-navigation-dynamic-functions.js', false, '1.0.0' );
</span><span class="cx">         $scripts->add( 'custom-navigation-php-functions', '/wp-admin/js/custom-navigation-php-functions.js', false, '1.0.0' );
</span></span></pre>
</div>
</div>
</body>
</html>