WordPress.org

Make WordPress Core

Ticket #33301: 33301.13.patch

File 33301.13.patch, 21.5 KB (added by azaozz, 4 years ago)
  • src/wp-includes/class-wp-editor.php

     
    14141414                        <div id="link-options">
    14151415                                <p class="howto"><?php _e( 'Enter the destination URL' ); ?></p>
    14161416                                <div>
    1417                                         <label><span><?php _e( 'URL' ); ?></span><input id="wp-link-url" type="text" /></label>
     1417                                        <label><span><?php _e( 'URL' ); ?></span>
     1418                                        <input id="wp-link-url" type="text" role="combobox" aria-autocomplete="list" aria-expanded="false" placeholder="<?php _e( 'Paste URL or type to search' ); ?>" /></label>
    14181419                                </div>
    14191420                                <div class="wp-link-text-field">
    1420                                         <label><span><?php _e( 'Link Text' ); ?></span><input id="wp-link-text" type="text" /></label>
     1421                                        <label><span><?php _e( 'Link Text' ); ?></span>
     1422                                        <input id="wp-link-text" type="text" /></label>
    14211423                                </div>
    14221424                                <div class="link-target">
    14231425                                        <label><span>&nbsp;</span><input type="checkbox" id="wp-link-target" /> <?php _e( 'Open link in a new tab' ); ?></label>
    14241426                                </div>
    14251427                        </div>
    1426                         <p class="howto"><a href="#" id="wp-link-search-toggle"><?php _e( 'Or link to existing content' ); ?></a></p>
    1427                         <div id="search-panel">
    1428                                 <div class="link-search-wrapper">
    1429                                         <label>
    1430                                                 <span class="search-label"><?php _e( 'Search' ); ?></span>
    1431                                                 <input type="search" id="wp-link-search" class="link-search-field" autocomplete="off" />
    1432                                                 <span class="spinner"></span>
    1433                                         </label>
    1434                                 </div>
    1435                                 <div id="search-results" class="query-results" tabindex="0">
    1436                                         <ul></ul>
    1437                                         <div class="river-waiting">
    1438                                                 <span class="spinner"></span>
    1439                                         </div>
    1440                                 </div>
    1441                                 <div id="most-recent-results" class="query-results" tabindex="0">
    1442                                         <div class="query-notice" id="query-notice-message">
    1443                                                 <em class="query-notice-default"><?php _e( 'No search term specified. Showing recent items.' ); ?></em>
    1444                                                 <em class="query-notice-hint screen-reader-text"><?php _e( 'Search or use up and down arrow keys to select an item.' ); ?></em>
    1445                                         </div>
    1446                                         <ul></ul>
    1447                                         <div class="river-waiting">
    1448                                                 <span class="spinner"></span>
    1449                                         </div>
    1450                                 </div>
    1451                         </div>
    14521428                </div>
    14531429                <div class="submitbox">
    14541430                        <div id="wp-link-cancel">
  • src/wp-includes/css/editor.css

     
    8484}
    8585
    8686.mce-textbox,
    87 .mce-checkbox i.mce-i-checkbox,
    88 #wp-link .query-results {
     87.mce-checkbox i.mce-i-checkbox {
    8988        border: 1px solid #ddd;
    9089        -webkit-border-radius: 0;
    9190        border-radius: 0;
     
    13341333        height: 100%;
    13351334}
    13361335
    1337 #wp-link-wrap.search-panel-visible {
    1338         height: 500px;
    1339         margin-top: -250px;
    1340 }
    1341 
    13421336#wp-link-wrap .wp-link-text-field {
    13431337        display: none;
    13441338}
     
    14061400
    14071401#wp-link-wrap.search-panel-visible #link-selector {
    14081402        -webkit-overflow-scrolling: touch;
    1409         padding: 0 16px;
    1410         position: absolute;
    1411         top: 36px;
    1412         left: 0;
    1413         right: 0;
    1414         bottom: 44px;
    14151403}
    14161404
    14171405#wp-link ol,
     
    14211409        padding: 0;
    14221410}
    14231411
    1424 #wp-link-search-toggle:after {
    1425         display: inline-block;
    1426         font: normal 20px/1 dashicons;
    1427         vertical-align: top;
    1428         speak: none;
    1429         -webkit-font-smoothing: antialiased;
    1430         -moz-osx-font-smoothing: grayscale;
    1431         content: "\f140";
    1432 }
    1433 
    1434 .search-panel-visible #wp-link-search-toggle:after {
    1435         content: "\f142";
    1436 }
    1437 
    14381412#wp-link input[type="text"] {
    14391413        -webkit-box-sizing: border-box;
    14401414        -moz-box-sizing: border-box;
     
    14541428        color: inherit;
    14551429}
    14561430
    1457 #wp-link-search-toggle {
    1458         cursor: pointer;
    1459 }
    1460 
    14611431#wp-link label input[type="text"] {
    1462         margin-top: 5px;
     1432        margin: 5px 0 0;
    14631433        width: 70%;
    14641434}
    14651435
    1466 #wp-link #link-options label span,
    1467 #wp-link #search-panel label span.search-label {
     1436#wp-link #link-options label span {
    14681437        display: inline-block;
    14691438        width: 80px;
    14701439        text-align: right;
     
    14741443        word-wrap: break-word;
    14751444}
    14761445
    1477 #wp-link .link-search-field {
    1478         float: left;
    1479         width: 250px;
    1480         max-width: 70%;
    1481 }
    1482 
    1483 #wp-link .link-search-wrapper {
    1484         margin: 5px 0 9px;
    1485         display: block;
    1486         overflow: hidden;
    1487 }
    1488 
    1489 #wp-link .link-search-wrapper span {
    1490         float: left;
    1491         margin-top: 4px;
    1492 }
    1493 
    1494 #wp-link .link-search-wrapper .spinner {
    1495         margin-top: 5px;
    1496 }
    1497 
    14981446#wp-link .link-target {
    14991447        padding: 3px 0 0;
    15001448        white-space: nowrap;
     
    15061454        max-width: 70%;
    15071455}
    15081456
    1509 #wp-link .query-results {
    1510         border: 1px #dfdfdf solid;
    1511         margin: 0;
    1512         background: #fff;
    1513         overflow: auto;
    1514         position: absolute;
    1515         left: 16px;
    1516         right: 16px;
    1517         bottom: 16px;
    1518         top: 172px;
    1519 }
    1520 
    1521 .has-text-field #wp-link .query-results {
    1522         top: 205px;
    1523 }
    1524 
    15251457#wp-link li {
    15261458        clear: both;
    15271459        margin-bottom: 0;
     
    15321464        position: relative;
    15331465}
    15341466
    1535 #wp-link .query-notice {
    1536         padding: 0;
    1537         border-bottom: 1px solid #dfdfdf;
    1538         background-color: #f7fcfe;
    1539         color: #000;
    1540 }
    1541 
    1542 #wp-link .query-notice .query-notice-default,
    1543 #wp-link .query-notice .query-notice-hint {
    1544         display: block;
    1545         padding: 6px;
    1546         border-left: 4px solid #00a0d2;
    1547 }
    1548 
    1549 #wp-link .unselectable.no-matches-found {
    1550         padding: 0;
    1551         border-bottom: 1px solid #dfdfdf;
    1552         background-color: #fef7f1;
    1553 }
    1554 
    1555 #wp-link .no-matches-found .item-title {
    1556         display: block;
    1557         padding: 6px;
    1558         border-left: 4px solid #d54e21;
    1559 }
    1560 
    1561 #wp-link .query-results em {
    1562         font-style: normal;
    1563 }
    1564 
    15651467#wp-link li:hover {
    15661468        background: #eaf2fa;
    15671469        color: #151515;
     
    16071509        top: 5px;
    16081510}
    16091511
    1610 #wp-link #search-results,
    1611 #wp-link #search-panel {
    1612         display: none;
    1613 }
    1614 
    1615 #wp-link-wrap.search-panel-visible #search-panel {
    1616         display: block;
    1617 }
    1618 
    1619 #wp-link .river-waiting {
    1620         display: none;
    1621         padding: 10px 0;
    1622 }
    1623 
    16241512#wp-link .submitbox {
    16251513        padding: 8px 16px;
    16261514        background: #fcfcfc;
     
    16511539                margin-top: -140px;
    16521540        }
    16531541
    1654         #wp-link-wrap.search-panel-visible .query-results {
    1655                 top: 195px;
    1656         }
    1657 
    1658         #wp-link-wrap.search-panel-visible.has-text-field .query-results {
    1659                 top: 235px;
    1660         }
    1661 
    16621542        #link-selector {
    16631543                padding: 0 16px 60px;
    16641544        }
     
    16871567                -webkit-transition: none;
    16881568                transition: none;
    16891569        }
    1690 
    1691         #wp-link-wrap.search-panel-visible {
    1692                 height: auto;
    1693                 margin-top: 0;
    1694                 top: 10px;
    1695                 bottom: 10px;
    1696         }
    1697 
    1698         .search-panel-visible #link-selector {
    1699                 overflow: auto;
    1700         }
    1701 
    1702         .search-panel-visible #search-panel .query-results {
    1703                 position: static;
    1704         }
    17051570}
    17061571
    17071572@media screen and ( max-height: 290px ) {
     
    17181583                height: calc(100% - 92px);
    17191584                padding-bottom: 2px;
    17201585        }
    1721 
    1722         #search-panel .query-results {
    1723                 position: static;
    1724         }
    17251586}
    17261587
    17271588div.wp-link-preview {
     
    17821643        }
    17831644}
    17841645
    1785 .ui-autocomplete.mce-wp-autocomplete {
    1786         z-index: 100100;
    1787         margin-top: 10px;
     1646.ui-autocomplete.wplink-autocomplete {
     1647        z-index: 100110;
    17881648        max-height: 200px;
    17891649        overflow-y: auto;
    17901650}
    17911651
     1652.wplink-autocomplete li {
     1653        clear: both;
     1654        white-space: normal;
     1655}
     1656
    17921657/* =Overlay Body
    17931658-------------------------------------------------------------- */
    17941659
  • src/wp-includes/js/tinymce/plugins/wplink/plugin.js

     
    310310                                                },
    311311                                                minLength: 2,
    312312                                                position: {
    313                                                         my: 'left top+5'
     313                                                        my: 'left top+2'
    314314                                                }
    315315                                        } ).autocomplete( 'instance' )._renderItem = function( ul, item ) {
    316316                                                return $( '<li role="option" id="mce-wp-autocomplete-' + item.ID + '">' )
     
    329329                                                $( input ).autocomplete( 'search' );
    330330                                        } )
    331331                                        .autocomplete( 'widget' )
    332                                                 .addClass( 'mce-wp-autocomplete' )
     332                                                .addClass( 'wplink-autocomplete' )
    333333                                                .attr( 'role', 'listbox' );
    334334                                }
    335335
  • src/wp-includes/js/wplink.js

     
    1 /* global ajaxurl, tinymce, wpLinkL10n, setUserSetting, wpActiveEditor */
     1/* global tinymce, wpLinkL10n, wpActiveEditor */
    22var wpLink;
    33
    44( function( $ ) {
    5         var editor, searchTimer, River, Query, correctedURL,
     5        var editor, correctedURL,
    66                inputs = {},
    7                 rivers = {},
    87                isTouch = ( 'ontouchend' in document );
    98
    109        function getLink() {
     
    1211        }
    1312
    1413        wpLink = {
    15                 timeToTriggerRiver: 150,
    16                 minRiverAJAXDuration: 200,
    17                 riverBottomThreshold: 5,
    18                 keySensitivity: 100,
    19                 lastSearch: '',
    2014                textarea: '',
    2115
    2216                init: function() {
     
    2923                        // Input
    3024                        inputs.text = $( '#wp-link-text' );
    3125                        inputs.url = $( '#wp-link-url' );
    32                         inputs.nonce = $( '#_ajax_linking_nonce' );
    3326                        inputs.openInNewTab = $( '#wp-link-target' );
    34                         inputs.search = $( '#wp-link-search' );
    3527
    36                         // Build Rivers
    37                         rivers.search = new River( $( '#search-results' ) );
    38                         rivers.recent = new River( $( '#most-recent-results' ) );
    39                         rivers.elements = inputs.dialog.find( '.query-results' );
     28                        if ( $.ui && $.ui.autocomplete ) {
     29                                wpLink.setAutocomplete();
     30                        }
    4031
    41                         // Get search notice text
    42                         inputs.queryNotice = $( '#query-notice-message' );
    43                         inputs.queryNoticeTextDefault = inputs.queryNotice.find( '.query-notice-default' );
    44                         inputs.queryNoticeTextHint = inputs.queryNotice.find( '.query-notice-hint' );
    45 
    46                         // Bind event handlers
    47                         inputs.dialog.keydown( wpLink.keydown );
    48                         inputs.dialog.keyup( wpLink.keyup );
    4932                        inputs.submit.click( function( event ) {
    5033                                event.preventDefault();
    5134                                wpLink.update();
    5235                        });
     36
    5337                        inputs.close.add( inputs.backdrop ).add( '#wp-link-cancel a' ).click( function( event ) {
    5438                                event.preventDefault();
    5539                                wpLink.close();
    5640                        });
    5741
    58                         $( '#wp-link-search-toggle' ).on( 'click', wpLink.toggleInternalLinking );
     42                        inputs.url.on( 'paste', function() {
     43                                setTimeout( wpLink.correctURL, 0 );
     44                        } );
     45                },
    5946
    60                         rivers.elements.on( 'river-select', wpLink.updateFields );
     47                setAutocomplete: function() {
     48                        var $input = inputs.url,
     49                                cache, last;
    6150
    62                         // Display 'hint' message when search field or 'query-results' box are focused
    63                         inputs.search.on( 'focus.wplink', function() {
    64                                 inputs.queryNoticeTextDefault.hide();
    65                                 inputs.queryNoticeTextHint.removeClass( 'screen-reader-text' ).show();
    66                         } ).on( 'blur.wplink', function() {
    67                                 inputs.queryNoticeTextDefault.show();
    68                                 inputs.queryNoticeTextHint.addClass( 'screen-reader-text' ).hide();
    69                         } );
     51                        $input.on( 'keydown', function() {
     52                                $input.removeAttr( 'aria-activedescendant' );
     53                        } ).autocomplete( {
     54                                source: function( request, response ) {
     55                                        if ( last === request.term ) {
     56                                                response( cache );
     57                                                return;
     58                                        }
    7059
    71                         inputs.search.on( 'keyup input', function() {
    72                                 var self = this;
     60                                        if ( /^https?:/.test( request.term ) || request.term.indexOf( '.' ) !== -1 ) {
     61                                                return response();
     62                                        }
    7363
    74                                 window.clearTimeout( searchTimer );
    75                                 searchTimer = window.setTimeout( function() {
    76                                         wpLink.searchInternalLinks.call( self );
    77                                 }, 500 );
    78                         });
     64                                        $.post( window.ajaxurl, {
     65                                                action: 'wp-link-ajax',
     66                                                page: 1,
     67                                                search: request.term,
     68                                                _ajax_linking_nonce: $( '#_ajax_linking_nonce' ).val()
     69                                        }, function( data ) {
     70                                                cache = data;
     71                                                response( data );
     72                                        }, 'json' );
    7973
    80                         inputs.url.on( 'paste', function() {
    81                                 setTimeout( wpLink.correctURL, 0 );
    82                         } );
     74                                        last = request.term;
     75                                },
     76                                focus: function( event, ui ) {
     77                                        $input.attr( 'aria-activedescendant', 'mce-wp-autocomplete-' + ui.item.ID );
     78                                },
     79                                select: function( event, ui ) {
     80                                        $input.val( ui.item.permalink );
    8381
    84                         inputs.url.on( 'blur', wpLink.correctURL );
     82                                        if ( inputs.wrap.hasClass( 'has-text-field' ) && tinymce.trim( inputs.text.val() ) === '' ) {
     83                                                inputs.text.val( ui.item.title );
     84                                        }
     85
     86                                        return false;
     87                                },
     88                                open: function() {
     89                                        $input.attr( 'aria-expanded', 'true' );
     90                                },
     91                                close: function() {
     92                                        $input.attr( 'aria-expanded', 'false' );
     93                                },
     94                                minLength: 2,
     95                                position: {
     96                                        my: 'left top+2'
     97                                }
     98                        } ).autocomplete( 'instance' )._renderItem = function( ul, item ) {
     99                                return $( '<li role="option" id="mce-wp-autocomplete-' + item.ID + '">' )
     100                                .append( '<span class="item-title">' + item.title + '</span>&nbsp;<span class="item-date alignright">' + item.info + '</span>' )
     101                                .appendTo( ul );
     102                        };
     103
     104                        $input.attr( {
     105                                'aria-owns': $input.autocomplete( 'widget' ).attr( 'id' )
     106                        }  )
     107                        .on( 'focus', function() {
     108                                $input.autocomplete( 'search' );
     109                        } )
     110                        .autocomplete( 'widget' )
     111                                .addClass( 'wplink-autocomplete' )
     112                                .attr( 'role', 'listbox' );
     113
     114
    85115                },
    86116
    87117                // If URL wasn't corrected last time and doesn't start with http:, https:, ? # or /, prepend http://
     
    150180                refresh: function() {
    151181                        var text = '';
    152182
    153                         // Refresh rivers (clear links, check visibility)
    154                         rivers.search.refresh();
    155                         rivers.recent.refresh();
    156 
    157183                        if ( wpLink.isMCE() ) {
    158184                                wpLink.mceRefresh();
    159185                        } else {
     
    185211                                inputs.url.focus()[0].select();
    186212                        }
    187213
    188                         // Load the most recent results if this is the first time opening the panel.
    189                         if ( ! rivers.recent.ul.children().length ) {
    190                                 rivers.recent.ajax();
    191                         }
    192 
    193214                        correctedURL = inputs.url.val().replace( /^http:\/\//, '' );
    194215                },
    195216
     
    251272
    252273                close: function() {
    253274                        var linkNode;
    254                        
     275
    255276                        $( document.body ).removeClass( 'modal-open' );
    256277
    257278                        if ( ! wpLink.isMCE() ) {
     
    405426                        editor.nodeChanged();
    406427                },
    407428
    408                 updateFields: function( e, li ) {
    409                         inputs.url.val( li.children( '.item-permalink' ).val() );
    410                 },
    411 
    412429                setDefaultValues: function() {
    413430                        var selection,
    414431                                emailRegexp = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i,
     
    435452
    436453                        // Update save prompt.
    437454                        inputs.submit.val( wpLinkL10n.save );
    438                 },
    439 
    440                 searchInternalLinks: function() {
    441                         var t = $( this ), waiting,
    442                                 search = t.val();
    443 
    444                         if ( search.length > 2 ) {
    445                                 rivers.recent.hide();
    446                                 rivers.search.show();
    447 
    448                                 // Don't search if the keypress didn't change the title.
    449                                 if ( wpLink.lastSearch == search )
    450                                         return;
    451 
    452                                 wpLink.lastSearch = search;
    453                                 waiting = t.parent().find( '.spinner' ).addClass( 'is-active' );
    454 
    455                                 rivers.search.change( search );
    456                                 rivers.search.ajax( function() {
    457                                         waiting.removeClass( 'is-active' );
    458                                 });
    459                         } else {
    460                                 rivers.search.hide();
    461                                 rivers.recent.show();
    462                         }
    463                 },
    464 
    465                 next: function() {
    466                         rivers.search.next();
    467                         rivers.recent.next();
    468                 },
    469 
    470                 prev: function() {
    471                         rivers.search.prev();
    472                         rivers.recent.prev();
    473                 },
    474 
    475                 keydown: function( event ) {
    476                         var fn, id;
    477 
    478                         // Escape key.
    479                         if ( 27 === event.keyCode ) {
    480                                 wpLink.close();
    481                                 event.stopImmediatePropagation();
    482                         // Tab key.
    483                         } else if ( 9 === event.keyCode ) {
    484                                 id = event.target.id;
    485 
    486                                 // wp-link-submit must always be the last focusable element in the dialog.
    487                                 // following focusable elements will be skipped on keyboard navigation.
    488                                 if ( id === 'wp-link-submit' && ! event.shiftKey ) {
    489                                         inputs.close.focus();
    490                                         event.preventDefault();
    491                                 } else if ( id === 'wp-link-close' && event.shiftKey ) {
    492                                         inputs.submit.focus();
    493                                         event.preventDefault();
    494                                 }
    495                         }
    496 
    497                         // Up Arrow and Down Arrow keys.
    498                         if ( 38 !== event.keyCode && 40 !== event.keyCode ) {
    499                                 return;
    500                         }
    501 
    502                         if ( document.activeElement &&
    503                                 ( document.activeElement.id === 'link-title-field' || document.activeElement.id === 'url-field' ) ) {
    504                                 return;
    505                         }
    506 
    507                         // Up Arrow key.
    508                         fn = 38 === event.keyCode ? 'prev' : 'next';
    509                         clearInterval( wpLink.keyInterval );
    510                         wpLink[ fn ]();
    511                         wpLink.keyInterval = setInterval( wpLink[ fn ], wpLink.keySensitivity );
    512                         event.preventDefault();
    513                 },
    514 
    515                 keyup: function( event ) {
    516                         // Up Arrow and Down Arrow keys.
    517                         if ( 38 === event.keyCode || 40 === event.keyCode ) {
    518                                 clearInterval( wpLink.keyInterval );
    519                                 event.preventDefault();
    520                         }
    521                 },
    522 
    523                 delayedCallback: function( func, delay ) {
    524                         var timeoutTriggered, funcTriggered, funcArgs, funcContext;
    525 
    526                         if ( ! delay )
    527                                 return func;
    528 
    529                         setTimeout( function() {
    530                                 if ( funcTriggered )
    531                                         return func.apply( funcContext, funcArgs );
    532                                 // Otherwise, wait.
    533                                 timeoutTriggered = true;
    534                         }, delay );
    535 
    536                         return function() {
    537                                 if ( timeoutTriggered )
    538                                         return func.apply( this, arguments );
    539                                 // Otherwise, wait.
    540                                 funcArgs = arguments;
    541                                 funcContext = this;
    542                                 funcTriggered = true;
    543                         };
    544                 },
    545 
    546                 toggleInternalLinking: function( event ) {
    547                         var visible = inputs.wrap.hasClass( 'search-panel-visible' );
    548 
    549                         inputs.wrap.toggleClass( 'search-panel-visible', ! visible );
    550                         setUserSetting( 'wplink', visible ? '0' : '1' );
    551                         inputs[ ! visible ? 'search' : 'url' ].focus();
    552                         event.preventDefault();
    553455                }
    554456        };
    555457
    556         River = function( element, search ) {
    557                 var self = this;
    558                 this.element = element;
    559                 this.ul = element.children( 'ul' );
    560                 this.contentHeight = element.children( '#link-selector-height' );
    561                 this.waiting = element.find('.river-waiting');
    562 
    563                 this.change( search );
    564                 this.refresh();
    565 
    566                 $( '#wp-link .query-results, #wp-link #link-selector' ).scroll( function() {
    567                         self.maybeLoad();
    568                 });
    569                 element.on( 'click', 'li', function( event ) {
    570                         self.select( $( this ), event );
    571                 });
    572         };
    573 
    574         $.extend( River.prototype, {
    575                 refresh: function() {
    576                         this.deselect();
    577                         this.visible = this.element.is( ':visible' );
    578                 },
    579                 show: function() {
    580                         if ( ! this.visible ) {
    581                                 this.deselect();
    582                                 this.element.show();
    583                                 this.visible = true;
    584                         }
    585                 },
    586                 hide: function() {
    587                         this.element.hide();
    588                         this.visible = false;
    589                 },
    590                 // Selects a list item and triggers the river-select event.
    591                 select: function( li, event ) {
    592                         var liHeight, elHeight, liTop, elTop;
    593 
    594                         if ( li.hasClass( 'unselectable' ) || li == this.selected )
    595                                 return;
    596 
    597                         this.deselect();
    598                         this.selected = li.addClass( 'selected' );
    599                         // Make sure the element is visible
    600                         liHeight = li.outerHeight();
    601                         elHeight = this.element.height();
    602                         liTop = li.position().top;
    603                         elTop = this.element.scrollTop();
    604 
    605                         if ( liTop < 0 ) // Make first visible element
    606                                 this.element.scrollTop( elTop + liTop );
    607                         else if ( liTop + liHeight > elHeight ) // Make last visible element
    608                                 this.element.scrollTop( elTop + liTop - elHeight + liHeight );
    609 
    610                         // Trigger the river-select event
    611                         this.element.trigger( 'river-select', [ li, event, this ] );
    612                 },
    613                 deselect: function() {
    614                         if ( this.selected )
    615                                 this.selected.removeClass( 'selected' );
    616                         this.selected = false;
    617                 },
    618                 prev: function() {
    619                         if ( ! this.visible )
    620                                 return;
    621 
    622                         var to;
    623                         if ( this.selected ) {
    624                                 to = this.selected.prev( 'li' );
    625                                 if ( to.length )
    626                                         this.select( to );
    627                         }
    628                 },
    629                 next: function() {
    630                         if ( ! this.visible )
    631                                 return;
    632 
    633                         var to = this.selected ? this.selected.next( 'li' ) : $( 'li:not(.unselectable):first', this.element );
    634                         if ( to.length )
    635                                 this.select( to );
    636                 },
    637                 ajax: function( callback ) {
    638                         var self = this,
    639                                 delay = this.query.page == 1 ? 0 : wpLink.minRiverAJAXDuration,
    640                                 response = wpLink.delayedCallback( function( results, params ) {
    641                                         self.process( results, params );
    642                                         if ( callback )
    643                                                 callback( results, params );
    644                                 }, delay );
    645 
    646                         this.query.ajax( response );
    647                 },
    648                 change: function( search ) {
    649                         if ( this.query && this._search == search )
    650                                 return;
    651 
    652                         this._search = search;
    653                         this.query = new Query( search );
    654                         this.element.scrollTop( 0 );
    655                 },
    656                 process: function( results, params ) {
    657                         var list = '', alt = true, classes = '',
    658                                 firstPage = params.page == 1;
    659 
    660                         if ( ! results ) {
    661                                 if ( firstPage ) {
    662                                         list += '<li class="unselectable no-matches-found"><span class="item-title"><em>' +
    663                                                 wpLinkL10n.noMatchesFound + '</em></span></li>';
    664                                 }
    665                         } else {
    666                                 $.each( results, function() {
    667                                         classes = alt ? 'alternate' : '';
    668                                         classes += this.title ? '' : ' no-title';
    669                                         list += classes ? '<li class="' + classes + '">' : '<li>';
    670                                         list += '<input type="hidden" class="item-permalink" value="' + this.permalink + '" />';
    671                                         list += '<span class="item-title">';
    672                                         list += this.title ? this.title : wpLinkL10n.noTitle;
    673                                         list += '</span><span class="item-info">' + this.info + '</span></li>';
    674                                         alt = ! alt;
    675                                 });
    676                         }
    677 
    678                         this.ul[ firstPage ? 'html' : 'append' ]( list );
    679                 },
    680                 maybeLoad: function() {
    681                         var self = this,
    682                                 el = this.element,
    683                                 bottom = el.scrollTop() + el.height();
    684 
    685                         if ( ! this.query.ready() || bottom < this.contentHeight.height() - wpLink.riverBottomThreshold )
    686                                 return;
    687 
    688                         setTimeout(function() {
    689                                 var newTop = el.scrollTop(),
    690                                         newBottom = newTop + el.height();
    691 
    692                                 if ( ! self.query.ready() || newBottom < self.contentHeight.height() - wpLink.riverBottomThreshold )
    693                                         return;
    694 
    695                                 self.waiting.addClass( 'is-active' );
    696                                 el.scrollTop( newTop + self.waiting.outerHeight() );
    697 
    698                                 self.ajax( function() {
    699                                         self.waiting.removeClass( 'is-active' );
    700                                 });
    701                         }, wpLink.timeToTriggerRiver );
    702                 }
    703         });
    704 
    705         Query = function( search ) {
    706                 this.page = 1;
    707                 this.allLoaded = false;
    708                 this.querying = false;
    709                 this.search = search;
    710         };
    711 
    712         $.extend( Query.prototype, {
    713                 ready: function() {
    714                         return ! ( this.querying || this.allLoaded );
    715                 },
    716                 ajax: function( callback ) {
    717                         var self = this,
    718                                 query = {
    719                                         action : 'wp-link-ajax',
    720                                         page : this.page,
    721                                         '_ajax_linking_nonce' : inputs.nonce.val()
    722                                 };
    723 
    724                         if ( this.search )
    725                                 query.search = this.search;
    726 
    727                         this.querying = true;
    728 
    729                         $.post( ajaxurl, query, function( r ) {
    730                                 self.page++;
    731                                 self.querying = false;
    732                                 self.allLoaded = ! r;
    733                                 callback( r, query );
    734                         }, 'json' );
    735                 }
    736         });
    737 
    738458        $( document ).ready( wpLink.init );
    739459})( jQuery );