var wpLink;
-(function($){
- var inputs = {}, rivers = {}, ed, River, Query;
+( function( $, wpLinkL10n, wp ) {
+ var editor, searchTimer, River, Query, correctedURL, linkNode,
+ emailRegexp = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$/i,
+ urlRegexp = /^(https?|ftp):\/\/[A-Z0-9.-]+\.[A-Z]{2,63}[^ "]*$/i,
+ inputs = {},
+ rivers = {},
+ isTouch = ( 'ontouchend' in document );
+
+ function getLink() {
+ return linkNode || editor.dom.getParent( editor.selection.getNode(), 'a[href]' );
+ }
wpLink = {
timeToTriggerRiver: 150,
keySensitivity: 100,
lastSearch: '',
textarea: '',
+ modalOpen: false,
+
+ init: function() {
+ inputs.wrap = $('#wp-link-wrap');
+ inputs.dialog = $( '#wp-link' );
+ inputs.backdrop = $( '#wp-link-backdrop' );
+ inputs.submit = $( '#wp-link-submit' );
+ inputs.close = $( '#wp-link-close' );
+
+ // Input
+ inputs.text = $( '#wp-link-text' );
+ inputs.url = $( '#wp-link-url' );
+ inputs.nonce = $( '#_ajax_linking_nonce' );
+ inputs.openInNewTab = $( '#wp-link-target' );
+ inputs.search = $( '#wp-link-search' );
- init : function() {
- inputs.dialog = $('#wp-link');
- inputs.submit = $('#wp-link-submit');
- // URL
- inputs.url = $('#url-field');
- inputs.nonce = $('#_ajax_linking_nonce');
- // Secondary options
- inputs.title = $('#link-title-field');
- // Advanced Options
- inputs.openInNewTab = $('#link-target-checkbox');
- inputs.search = $('#search-field');
// Build Rivers
- rivers.search = new River( $('#search-results') );
- rivers.recent = new River( $('#most-recent-results') );
- rivers.elements = $('.query-results', inputs.dialog);
+ rivers.search = new River( $( '#search-results' ) );
+ rivers.recent = new River( $( '#most-recent-results' ) );
+ rivers.elements = inputs.dialog.find( '.query-results' );
+
+ // Get search notice text
+ inputs.queryNotice = $( '#query-notice-message' );
+ inputs.queryNoticeTextDefault = inputs.queryNotice.find( '.query-notice-default' );
+ inputs.queryNoticeTextHint = inputs.queryNotice.find( '.query-notice-hint' );
// Bind event handlers
inputs.dialog.keydown( wpLink.keydown );
inputs.dialog.keyup( wpLink.keyup );
- inputs.submit.click( function(e){
- e.preventDefault();
+ inputs.submit.click( function( event ) {
+ event.preventDefault();
wpLink.update();
});
- $('#wp-link-cancel').click( function(e){
- e.preventDefault();
+
+ inputs.close.add( inputs.backdrop ).add( '#wp-link-cancel button' ).click( function( event ) {
+ event.preventDefault();
wpLink.close();
});
- $('#internal-toggle').click( wpLink.toggleInternalLinking );
- rivers.elements.bind('river-select', wpLink.updateFields );
+ rivers.elements.on( 'river-select', wpLink.updateFields );
+
+ // Display 'hint' message when search field or 'query-results' box are focused
+ inputs.search.on( 'focus.wplink', function() {
+ inputs.queryNoticeTextDefault.hide();
+ inputs.queryNoticeTextHint.removeClass( 'screen-reader-text' ).show();
+ } ).on( 'blur.wplink', function() {
+ inputs.queryNoticeTextDefault.show();
+ inputs.queryNoticeTextHint.addClass( 'screen-reader-text' ).hide();
+ } );
+
+ inputs.search.on( 'keyup input', function() {
+ window.clearTimeout( searchTimer );
+ searchTimer = window.setTimeout( function() {
+ wpLink.searchInternalLinks();
+ }, 500 );
+ });
- inputs.search.keyup( wpLink.searchInternalLinks );
+ inputs.url.on( 'paste', function() {
+ setTimeout( wpLink.correctURL, 0 );
+ } );
- inputs.dialog.bind('wpdialogrefresh', wpLink.refresh);
- inputs.dialog.bind('wpdialogbeforeopen', wpLink.beforeOpen);
- inputs.dialog.bind('wpdialogclose', wpLink.onClose);
+ inputs.url.on( 'blur', wpLink.correctURL );
},
- beforeOpen : function() {
- wpLink.range = null;
+ // If URL wasn't corrected last time and doesn't start with http:, https:, ? # or /, prepend http://
+ correctURL: function () {
+ var url = $.trim( inputs.url.val() );
- if ( ! wpLink.isMCE() && document.selection ) {
- wpLink.textarea.focus();
- wpLink.range = document.selection.createRange();
+ if ( url && correctedURL !== url && ! /^(?:[a-z]+:|#|\?|\.|\/)/.test( url ) ) {
+ inputs.url.val( 'http://' + url );
+ correctedURL = url;
}
},
- open : function() {
- if ( !wpActiveEditor )
+ open: function( editorId, url, text, node ) {
+ var ed,
+ $body = $( document.body );
+
+ $body.addClass( 'modal-open' );
+ wpLink.modalOpen = true;
+ linkNode = node;
+
+ wpLink.range = null;
+
+ if ( editorId ) {
+ window.wpActiveEditor = editorId;
+ }
+
+ if ( ! window.wpActiveEditor ) {
return;
+ }
- this.textarea = $('#'+wpActiveEditor).get(0);
-
- // Initialize the dialog if necessary (html mode).
- if ( ! inputs.dialog.data('wpdialog') ) {
- inputs.dialog.wpdialog({
- title: wpLinkL10n.title,
- width: 480,
- height: 'auto',
- modal: true,
- dialogClass: 'wp-dialog',
- zIndex: 300000
- });
+ this.textarea = $( '#' + window.wpActiveEditor ).get( 0 );
+
+ if ( typeof window.tinymce !== 'undefined' ) {
+ // Make sure the link wrapper is the last element in the body,
+ // or the inline editor toolbar may show above the backdrop.
+ $body.append( inputs.backdrop, inputs.wrap );
+
+ ed = window.tinymce.get( window.wpActiveEditor );
+
+ if ( ed && ! ed.isHidden() ) {
+ editor = ed;
+ } else {
+ editor = null;
+ }
+
+ if ( editor && window.tinymce.isIE ) {
+ editor.windowManager.wplinkBookmark = editor.selection.getBookmark();
+ }
+ }
+
+ if ( ! wpLink.isMCE() && document.selection ) {
+ this.textarea.focus();
+ this.range = document.selection.createRange();
}
- inputs.dialog.wpdialog('open');
+ inputs.wrap.show();
+ inputs.backdrop.show();
+
+ wpLink.refresh( url, text );
+
+ $( document ).trigger( 'wplink-open', inputs.wrap );
},
- isMCE : function() {
- return tinyMCEPopup && ( ed = tinyMCEPopup.editor ) && ! ed.isHidden();
+ isMCE: function() {
+ return editor && ! editor.isHidden();
},
- refresh : function() {
+ refresh: function( url, text ) {
+ var linkText = '';
+
// Refresh rivers (clear links, check visibility)
rivers.search.refresh();
rivers.recent.refresh();
- if ( wpLink.isMCE() )
- wpLink.mceRefresh();
- else
+ if ( wpLink.isMCE() ) {
+ wpLink.mceRefresh( url, text );
+ } else {
+ // For the Text editor the "Link text" field is always shown
+ if ( ! inputs.wrap.hasClass( 'has-text-field' ) ) {
+ inputs.wrap.addClass( 'has-text-field' );
+ }
+
+ if ( document.selection ) {
+ // Old IE
+ linkText = document.selection.createRange().text || text || '';
+ } else if ( typeof this.textarea.selectionStart !== 'undefined' &&
+ ( this.textarea.selectionStart !== this.textarea.selectionEnd ) ) {
+ // W3C
+ text = this.textarea.value.substring( this.textarea.selectionStart, this.textarea.selectionEnd ) || text || '';
+ }
+
+ inputs.text.val( text );
wpLink.setDefaultValues();
+ }
+
+ if ( isTouch ) {
+ // Close the onscreen keyboard
+ inputs.url.focus().blur();
+ } else {
+ // Focus the URL field and highlight its contents.
+ // If this is moved above the selection changes,
+ // IE will show a flashing cursor over the dialog.
+ window.setTimeout( function() {
+ inputs.url[0].select();
+ inputs.url.focus();
+ } );
+ }
- // Focus the URL field and highlight its contents.
- // If this is moved above the selection changes,
- // IE will show a flashing cursor over the dialog.
- inputs.url.focus()[0].select();
// Load the most recent results if this is the first time opening the panel.
- if ( ! rivers.recent.ul.children().length )
+ if ( ! rivers.recent.ul.children().length ) {
rivers.recent.ajax();
+ }
+
+ correctedURL = inputs.url.val().replace( /^http:\/\//, '' );
},
- mceRefresh : function() {
- var e;
- ed = tinyMCEPopup.editor;
+ hasSelectedText: function( linkNode ) {
+ var node, nodes, i, html = editor.selection.getContent();
- tinyMCEPopup.restoreSelection();
+ // Partial html and not a fully selected anchor element
+ if ( /</.test( html ) && ( ! /^<a [^>]+>[^<]+<\/a>$/.test( html ) || html.indexOf('href=') === -1 ) ) {
+ return false;
+ }
- // If link exists, select proper values.
- if ( e = ed.dom.getParent(ed.selection.getNode(), 'A') ) {
- // Set URL and description.
- inputs.url.val( ed.dom.getAttrib(e, 'href') );
- inputs.title.val( ed.dom.getAttrib(e, 'title') );
- // Set open in new tab.
- if ( "_blank" == ed.dom.getAttrib(e, 'target') )
- inputs.openInNewTab.prop('checked', true);
- // Update save prompt.
- inputs.submit.val( wpLinkL10n.update );
+ if ( linkNode ) {
+ nodes = linkNode.childNodes;
- // If there's no link, set the default values.
- } else {
- wpLink.setDefaultValues();
+ if ( nodes.length === 0 ) {
+ return false;
+ }
+
+ for ( i = nodes.length - 1; i >= 0; i-- ) {
+ node = nodes[i];
+
+ if ( node.nodeType != 3 && ! window.tinymce.dom.BookmarkManager.isBookmarkNode( node ) ) {
+ return false;
+ }
+ }
}
- tinyMCEPopup.storeSelection();
+ return true;
},
- close : function() {
- if ( wpLink.isMCE() )
- tinyMCEPopup.close();
- else
- inputs.dialog.wpdialog('close');
+ mceRefresh: function( searchStr, text ) {
+ var linkText, href,
+ linkNode = getLink(),
+ onlyText = this.hasSelectedText( linkNode );
+
+ if ( linkNode ) {
+ linkText = linkNode.textContent || linkNode.innerText;
+ href = editor.dom.getAttrib( linkNode, 'href' );
+
+ if ( ! $.trim( linkText ) ) {
+ linkText = text || '';
+ }
+
+ if ( searchStr && ( urlRegexp.test( searchStr ) || emailRegexp.test( searchStr ) ) ) {
+ href = searchStr;
+ }
+
+ if ( href !== '_wp_link_placeholder' ) {
+ inputs.url.val( href );
+ inputs.openInNewTab.prop( 'checked', '_blank' === editor.dom.getAttrib( linkNode, 'target' ) );
+ inputs.submit.val( wpLinkL10n.update );
+ } else {
+ this.setDefaultValues( linkText );
+ }
+
+ if ( searchStr && searchStr !== href ) {
+ // The user has typed something in the inline dialog. Trigger a search with it.
+ inputs.search.val( searchStr );
+ } else {
+ inputs.search.val( '' );
+ }
+
+ // Always reset the search
+ window.setTimeout( function() {
+ wpLink.searchInternalLinks();
+ } );
+ } else {
+ linkText = editor.selection.getContent({ format: 'text' }) || text || '';
+ this.setDefaultValues( linkText );
+ }
+
+ if ( onlyText ) {
+ inputs.text.val( linkText );
+ inputs.wrap.addClass( 'has-text-field' );
+ } else {
+ inputs.text.val( '' );
+ inputs.wrap.removeClass( 'has-text-field' );
+ }
},
- onClose: function() {
- if ( ! wpLink.isMCE() ) {
- wpLink.textarea.focus();
- if ( wpLink.range ) {
- wpLink.range.moveToBookmark( wpLink.range.getBookmark() );
- wpLink.range.select();
+ close: function( reset ) {
+ $( document.body ).removeClass( 'modal-open' );
+ wpLink.modalOpen = false;
+
+ if ( reset !== 'noReset' ) {
+ if ( ! wpLink.isMCE() ) {
+ wpLink.textarea.focus();
+
+ if ( wpLink.range ) {
+ wpLink.range.moveToBookmark( wpLink.range.getBookmark() );
+ wpLink.range.select();
+ }
+ } else {
+ if ( editor.plugins.wplink ) {
+ editor.plugins.wplink.close();
+ }
+
+ editor.focus();
}
}
+
+ inputs.backdrop.hide();
+ inputs.wrap.hide();
+
+ correctedURL = false;
+
+ $( document ).trigger( 'wplink-close', inputs.wrap );
},
- getAttrs : function() {
+ getAttrs: function() {
+ wpLink.correctURL();
+
return {
- href : inputs.url.val(),
- title : inputs.title.val(),
- target : inputs.openInNewTab.prop('checked') ? '_blank' : ''
+ href: $.trim( inputs.url.val() ),
+ target: inputs.openInNewTab.prop( 'checked' ) ? '_blank' : ''
};
},
- update : function() {
- if ( wpLink.isMCE() )
+ buildHtml: function(attrs) {
+ var html = '<a href="' + attrs.href + '"';
+
+ if ( attrs.target ) {
+ html += ' target="' + attrs.target + '"';
+ }
+
+ return html + '>';
+ },
+
+ update: function() {
+ if ( wpLink.isMCE() ) {
wpLink.mceUpdate();
- else
+ } else {
wpLink.htmlUpdate();
+ }
},
- htmlUpdate : function() {
- var attrs, html, begin, end, cursor,
+ htmlUpdate: function() {
+ var attrs, text, html, begin, end, cursor, selection,
textarea = wpLink.textarea;
- if ( ! textarea )
+ if ( ! textarea ) {
return;
+ }
attrs = wpLink.getAttrs();
+ text = inputs.text.val();
// If there's no href, return.
- if ( ! attrs.href || attrs.href == 'http://' )
+ if ( ! attrs.href ) {
return;
+ }
- // Build HTML
- html = '<a href="' + attrs.href + '"';
-
- if ( attrs.title )
- html += ' title="' + attrs.title + '"';
- if ( attrs.target )
- html += ' target="' + attrs.target + '"';
-
- html += '>';
+ html = wpLink.buildHtml(attrs);
// Insert HTML
if ( document.selection && wpLink.range ) {
// Note: If no text is selected, IE will not place the cursor
// inside the closing tag.
textarea.focus();
- wpLink.range.text = html + wpLink.range.text + '</a>';
+ wpLink.range.text = html + ( text || wpLink.range.text ) + '</a>';
wpLink.range.moveToBookmark( wpLink.range.getBookmark() );
wpLink.range.select();
wpLink.range = null;
} else if ( typeof textarea.selectionStart !== 'undefined' ) {
// W3C
- begin = textarea.selectionStart;
- end = textarea.selectionEnd;
- selection = textarea.value.substring( begin, end );
- html = html + selection + '</a>';
- cursor = begin + html.length;
-
- // If no next is selected, place the cursor inside the closing tag.
- if ( begin == end )
- cursor -= '</a>'.length;
+ begin = textarea.selectionStart;
+ end = textarea.selectionEnd;
+ selection = text || textarea.value.substring( begin, end );
+ html = html + selection + '</a>';
+ cursor = begin + html.length;
+
+ // If no text is selected, place the cursor inside the closing tag.
+ if ( begin === end && ! selection ) {
+ cursor -= 4;
+ }
- textarea.value = textarea.value.substring( 0, begin )
- + html
- + textarea.value.substring( end, textarea.value.length );
+ textarea.value = (
+ textarea.value.substring( 0, begin ) +
+ html +
+ textarea.value.substring( end, textarea.value.length )
+ );
// Update cursor position
textarea.selectionStart = textarea.selectionEnd = cursor;
wpLink.close();
textarea.focus();
+
+ // Audible confirmation message when a link has been inserted in the Editor.
+ wp.a11y.speak( wpLinkL10n.linkInserted );
},
- mceUpdate : function() {
- var ed = tinyMCEPopup.editor,
- attrs = wpLink.getAttrs(),
- e, b;
+ mceUpdate: function() {
+ var attrs = wpLink.getAttrs(),
+ link, text;
- tinyMCEPopup.restoreSelection();
- e = ed.dom.getParent(ed.selection.getNode(), 'A');
+ if ( window.tinymce.isIE && editor.windowManager.wplinkBookmark ) {
+ editor.selection.moveToBookmark( editor.windowManager.wplinkBookmark );
+ editor.windowManager.wplinkBookmark = null;
+ }
- // If the values are empty, unlink and return
- if ( ! attrs.href || attrs.href == 'http://' ) {
- if ( e ) {
- tinyMCEPopup.execCommand("mceBeginUndoLevel");
- b = ed.selection.getBookmark();
- ed.dom.remove(e, 1);
- ed.selection.moveToBookmark(b);
- tinyMCEPopup.execCommand("mceEndUndoLevel");
- wpLink.close();
- }
+ if ( ! attrs.href ) {
+ editor.execCommand( 'unlink' );
+ wpLink.close();
return;
}
- tinyMCEPopup.execCommand("mceBeginUndoLevel");
+ link = getLink();
- if (e == null) {
- ed.getDoc().execCommand("unlink", false, null);
- tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});
+ if ( inputs.wrap.hasClass( 'has-text-field' ) ) {
+ text = inputs.text.val() || attrs.href;
+ }
- tinymce.each(ed.dom.select("a"), function(n) {
- if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') {
- e = n;
- ed.dom.setAttribs(e, attrs);
+ if ( link ) {
+ if ( text ) {
+ if ( 'innerText' in link ) {
+ link.innerText = text;
+ } else {
+ link.textContent = text;
}
- });
-
- // Sometimes WebKit lets a user create a link where
- // they shouldn't be able to. In this case, CreateLink
- // injects "#mce_temp_url#" into their content. Fix it.
- if ( $(e).text() == '#mce_temp_url#' ) {
- ed.dom.remove(e);
- e = null;
}
+
+ // Not editing any more
+ attrs['data-wplink-edit'] = null;
+ editor.dom.setAttribs( link, attrs );
} else {
- ed.dom.setAttribs(e, attrs);
+ if ( text ) {
+ editor.selection.setNode( editor.dom.create( 'a', attrs, editor.dom.encode( text ) ) );
+ } else {
+ editor.execCommand( 'mceInsertLink', false, attrs );
+ }
}
- // Don't move caret if selection was image
- if ( e && (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') ) {
- ed.focus();
- ed.selection.select(e);
- ed.selection.collapse(0);
- tinyMCEPopup.storeSelection();
+ wpLink.close( 'noReset' );
+ editor.focus();
+ editor.nodeChanged();
+
+ if ( link && editor.plugins.wplink ) {
+ editor.plugins.wplink.checkLink( link );
}
- tinyMCEPopup.execCommand("mceEndUndoLevel");
- wpLink.close();
+ // Audible confirmation message when a link has been inserted in the Editor.
+ wp.a11y.speak( wpLinkL10n.linkInserted );
},
- updateFields : function( e, li, originalEvent ) {
- inputs.url.val( li.children('.item-permalink').val() );
- inputs.title.val( li.hasClass('no-title') ? '' : li.children('.item-title').text() );
- if ( originalEvent && originalEvent.type == "click" )
- inputs.url.focus();
+ updateFields: function( e, li ) {
+ inputs.url.val( li.children( '.item-permalink' ).val() );
+ },
+
+ getUrlFromSelection: function( selection ) {
+ if ( ! selection ) {
+ if ( this.isMCE() ) {
+ selection = editor.selection.getContent({ format: 'text' });
+ } else if ( document.selection && wpLink.range ) {
+ selection = wpLink.range.text;
+ } else if ( typeof this.textarea.selectionStart !== 'undefined' ) {
+ selection = this.textarea.value.substring( this.textarea.selectionStart, this.textarea.selectionEnd );
+ }
+ }
+
+ selection = $.trim( selection );
+
+ if ( selection && emailRegexp.test( selection ) ) {
+ // Selection is email address
+ return 'mailto:' + selection;
+ } else if ( selection && urlRegexp.test( selection ) ) {
+ // Selection is URL
+ return selection.replace( /&|�?38;/gi, '&' );
+ }
+
+ return '';
},
- setDefaultValues : function() {
- // Set URL and description to defaults.
- // Leave the new tab setting as-is.
- inputs.url.val('http://');
- inputs.title.val('');
+
+ setDefaultValues: function( selection ) {
+ inputs.url.val( this.getUrlFromSelection( selection ) );
+
+ // Empty the search field and swap the "rivers".
+ inputs.search.val('');
+ wpLink.searchInternalLinks();
// Update save prompt.
inputs.submit.val( wpLinkL10n.save );
},
- searchInternalLinks : function() {
- var t = $(this), waiting,
- search = t.val();
+ searchInternalLinks: function() {
+ var waiting,
+ search = inputs.search.val() || '';
if ( search.length > 2 ) {
rivers.recent.hide();
return;
wpLink.lastSearch = search;
- waiting = t.parent().find('.spinner').show();
+ waiting = inputs.search.parent().find( '.spinner' ).addClass( 'is-active' );
rivers.search.change( search );
- rivers.search.ajax( function(){ waiting.hide(); });
+ rivers.search.ajax( function() {
+ waiting.removeClass( 'is-active' );
+ });
} else {
rivers.search.hide();
rivers.recent.show();
}
},
- next : function() {
+ next: function() {
rivers.search.next();
rivers.recent.next();
},
- prev : function() {
+
+ prev: function() {
rivers.search.prev();
rivers.recent.prev();
},
- keydown : function( event ) {
- var fn, key = $.ui.keyCode;
+ keydown: function( event ) {
+ var fn, id;
- switch( event.which ) {
- case key.UP:
- fn = 'prev';
- case key.DOWN:
- fn = fn || 'next';
- clearInterval( wpLink.keyInterval );
- wpLink[ fn ]();
- wpLink.keyInterval = setInterval( wpLink[ fn ], wpLink.keySensitivity );
- break;
- default:
- return;
+ // Escape key.
+ if ( 27 === event.keyCode ) {
+ wpLink.close();
+ event.stopImmediatePropagation();
+ // Tab key.
+ } else if ( 9 === event.keyCode ) {
+ id = event.target.id;
+
+ // wp-link-submit must always be the last focusable element in the dialog.
+ // following focusable elements will be skipped on keyboard navigation.
+ if ( id === 'wp-link-submit' && ! event.shiftKey ) {
+ inputs.close.focus();
+ event.preventDefault();
+ } else if ( id === 'wp-link-close' && event.shiftKey ) {
+ inputs.submit.focus();
+ event.preventDefault();
+ }
}
- event.preventDefault();
- },
- keyup: function( event ) {
- var key = $.ui.keyCode;
- switch( event.which ) {
- case key.ESCAPE:
- event.stopImmediatePropagation();
- if ( ! $(document).triggerHandler( 'wp_CloseOnEscape', [{ event: event, what: 'wplink', cb: wpLink.close }] ) )
- wpLink.close();
+ // Up Arrow and Down Arrow keys.
+ if ( 38 !== event.keyCode && 40 !== event.keyCode ) {
+ return;
+ }
- return false;
- break;
- case key.UP:
- case key.DOWN:
- clearInterval( wpLink.keyInterval );
- break;
- default:
- return;
+ if ( document.activeElement &&
+ ( document.activeElement.id === 'link-title-field' || document.activeElement.id === 'url-field' ) ) {
+ return;
}
+
+ // Up Arrow key.
+ fn = 38 === event.keyCode ? 'prev' : 'next';
+ clearInterval( wpLink.keyInterval );
+ wpLink[ fn ]();
+ wpLink.keyInterval = setInterval( wpLink[ fn ], wpLink.keySensitivity );
event.preventDefault();
},
- delayedCallback : function( func, delay ) {
+ keyup: function( event ) {
+ // Up Arrow and Down Arrow keys.
+ if ( 38 === event.keyCode || 40 === event.keyCode ) {
+ clearInterval( wpLink.keyInterval );
+ event.preventDefault();
+ }
+ },
+
+ delayedCallback: function( func, delay ) {
var timeoutTriggered, funcTriggered, funcArgs, funcContext;
if ( ! delay )
return func.apply( funcContext, funcArgs );
// Otherwise, wait.
timeoutTriggered = true;
- }, delay);
+ }, delay );
return function() {
if ( timeoutTriggered )
funcContext = this;
funcTriggered = true;
};
- },
-
- toggleInternalLinking : function( event ) {
- var panel = $('#search-panel'),
- widget = inputs.dialog.wpdialog('widget'),
- // We're about to toggle visibility; it's currently the opposite
- visible = !panel.is(':visible'),
- win = $(window);
-
- $(this).toggleClass('toggle-arrow-active', visible);
-
- inputs.dialog.height('auto');
- panel.slideToggle( 300, function() {
- setUserSetting('wplink', visible ? '1' : '0');
- inputs[ visible ? 'search' : 'url' ].focus();
-
- // Move the box if the box is now expanded, was opened in a collapsed state,
- // and if it needs to be moved. (Judged by bottom not being positive or
- // bottom being smaller than top.)
- var scroll = win.scrollTop(),
- top = widget.offset().top,
- bottom = top + widget.outerHeight(),
- diff = bottom - win.height();
-
- if ( diff > scroll ) {
- widget.animate({'top': diff < top ? top - diff : scroll }, 200);
- }
- });
- event.preventDefault();
}
- }
+ };
River = function( element, search ) {
var self = this;
this.element = element;
- this.ul = element.children('ul');
+ this.ul = element.children( 'ul' );
+ this.contentHeight = element.children( '#link-selector-height' );
this.waiting = element.find('.river-waiting');
this.change( search );
this.refresh();
- element.scroll( function(){ self.maybeLoad(); });
- element.delegate('li', 'click', function(e){ self.select( $(this), e ); });
+ $( '#wp-link .query-results, #wp-link #link-selector' ).scroll( function() {
+ self.maybeLoad();
+ });
+ element.on( 'click', 'li', function( event ) {
+ self.select( $( this ), event );
+ });
};
$.extend( River.prototype, {
refresh: function() {
this.deselect();
- this.visible = this.element.is(':visible');
+ this.visible = this.element.is( ':visible' );
},
show: function() {
if ( ! this.visible ) {
select: function( li, event ) {
var liHeight, elHeight, liTop, elTop;
- if ( li.hasClass('unselectable') || li == this.selected )
+ if ( li.hasClass( 'unselectable' ) || li == this.selected )
return;
this.deselect();
- this.selected = li.addClass('selected');
+ this.selected = li.addClass( 'selected' );
// Make sure the element is visible
liHeight = li.outerHeight();
elHeight = this.element.height();
this.element.scrollTop( elTop + liTop - elHeight + liHeight );
// Trigger the river-select event
- this.element.trigger('river-select', [ li, event, this ]);
+ this.element.trigger( 'river-select', [ li, event, this ] );
},
deselect: function() {
if ( this.selected )
- this.selected.removeClass('selected');
+ this.selected.removeClass( 'selected' );
this.selected = false;
},
prev: function() {
var to;
if ( this.selected ) {
- to = this.selected.prev('li');
+ to = this.selected.prev( 'li' );
if ( to.length )
this.select( to );
}
if ( ! this.visible )
return;
- var to = this.selected ? this.selected.next('li') : $('li:not(.unselectable):first', this.element);
+ var to = this.selected ? this.selected.next( 'li' ) : $( 'li:not(.unselectable):first', this.element );
if ( to.length )
this.select( to );
},
this._search = search;
this.query = new Query( search );
- this.element.scrollTop(0);
+ this.element.scrollTop( 0 );
},
process: function( results, params ) {
var list = '', alt = true, classes = '',
firstPage = params.page == 1;
- if ( !results ) {
+ if ( ! results ) {
if ( firstPage ) {
- list += '<li class="unselectable"><span class="item-title"><em>'
- + wpLinkL10n.noMatchesFound
- + '</em></span></li>';
+ list += '<li class="unselectable no-matches-found"><span class="item-title"><em>' +
+ wpLinkL10n.noMatchesFound + '</em></span></li>';
}
} else {
$.each( results, function() {
classes = alt ? 'alternate' : '';
- classes += this['title'] ? '' : ' no-title';
+ classes += this.title ? '' : ' no-title';
list += classes ? '<li class="' + classes + '">' : '<li>';
- list += '<input type="hidden" class="item-permalink" value="' + this['permalink'] + '" />';
+ list += '<input type="hidden" class="item-permalink" value="' + this.permalink + '" />';
list += '<span class="item-title">';
- list += this['title'] ? this['title'] : wpLinkL10n.noTitle;
- list += '</span><span class="item-info">' + this['info'] + '</span></li>';
+ list += this.title ? this.title : wpLinkL10n.noTitle;
+ list += '</span><span class="item-info">' + this.info + '</span></li>';
alt = ! alt;
});
}
el = this.element,
bottom = el.scrollTop() + el.height();
- if ( ! this.query.ready() || bottom < this.ul.height() - wpLink.riverBottomThreshold )
+ if ( ! this.query.ready() || bottom < this.contentHeight.height() - wpLink.riverBottomThreshold )
return;
setTimeout(function() {
var newTop = el.scrollTop(),
newBottom = newTop + el.height();
- if ( ! self.query.ready() || newBottom < self.ul.height() - wpLink.riverBottomThreshold )
+ if ( ! self.query.ready() || newBottom < self.contentHeight.height() - wpLink.riverBottomThreshold )
return;
- self.waiting.show();
+ self.waiting.addClass( 'is-active' );
el.scrollTop( newTop + self.waiting.outerHeight() );
- self.ajax( function() { self.waiting.hide(); });
+ self.ajax( function() {
+ self.waiting.removeClass( 'is-active' );
+ });
}, wpLink.timeToTriggerRiver );
}
});
$.extend( Query.prototype, {
ready: function() {
- return !( this.querying || this.allLoaded );
+ return ! ( this.querying || this.allLoaded );
},
ajax: function( callback ) {
var self = this,
this.querying = true;
- $.post( ajaxurl, query, function(r) {
+ $.post( window.ajaxurl, query, function( r ) {
self.page++;
self.querying = false;
- self.allLoaded = !r;
+ self.allLoaded = ! r;
callback( r, query );
- }, "json" );
+ }, 'json' );
}
});
- $(document).ready( wpLink.init );
-})(jQuery);
+ $( document ).ready( wpLink.init );
+})( jQuery, window.wpLinkL10n, window.wp );