diff -r 346c88efed21 -r 5e2f62d02dcd wp/wp-admin/js/post.js --- a/wp/wp-admin/js/post.js Mon Jun 08 16:11:51 2015 +0000 +++ b/wp/wp-admin/js/post.js Tue Jun 09 03:35:32 2015 +0200 @@ -1,179 +1,14 @@ -var tagBox, commentsBox, editPermalink, makeSlugeditClickable, WPSetThumbnailHTML, WPSetThumbnailID, WPRemoveThumbnail, wptitlehint; - -// return an array with any duplicate, whitespace or values removed -function array_unique_noempty(a) { - var out = []; - jQuery.each( a, function(key, val) { - val = jQuery.trim(val); - if ( val && jQuery.inArray(val, out) == -1 ) - out.push(val); - } ); - return out; -} - -(function($){ - -tagBox = { - clean : function(tags) { - var comma = postL10n.comma; - if ( ',' !== comma ) - tags = tags.replace(new RegExp(comma, 'g'), ','); - tags = tags.replace(/\s*,\s*/g, ',').replace(/,+/g, ',').replace(/[,\s]+$/, '').replace(/^[,\s]+/, ''); - if ( ',' !== comma ) - tags = tags.replace(/,/g, comma); - return tags; - }, - - parseTags : function(el) { - var id = el.id, num = id.split('-check-num-')[1], taxbox = $(el).closest('.tagsdiv'), - thetags = taxbox.find('.the-tags'), comma = postL10n.comma, - current_tags = thetags.val().split(comma), new_tags = []; - delete current_tags[num]; - - $.each( current_tags, function(key, val) { - val = $.trim(val); - if ( val ) { - new_tags.push(val); - } - }); - - thetags.val( this.clean( new_tags.join(comma) ) ); - - this.quickClicks(taxbox); - return false; - }, - - quickClicks : function(el) { - var thetags = $('.the-tags', el), - tagchecklist = $('.tagchecklist', el), - id = $(el).attr('id'), - current_tags, disabled; - - if ( !thetags.length ) - return; - - disabled = thetags.prop('disabled'); - - current_tags = thetags.val().split(postL10n.comma); - tagchecklist.empty(); - - $.each( current_tags, function( key, val ) { - var span, xbutton; - - val = $.trim( val ); - - if ( ! val ) - return; - - // Create a new span, and ensure the text is properly escaped. - span = $('').text( val ); - - // If tags editing isn't disabled, create the X button. - if ( ! disabled ) { - xbutton = $( 'X' ); - xbutton.click( function(){ tagBox.parseTags(this); }); - span.prepend(' ').prepend( xbutton ); - } - - // Append the span to the tag list. - tagchecklist.append( span ); - }); - }, +/* global postL10n, ajaxurl, wpAjax, setPostThumbnailL10n, postboxes, pagenow, tinymce, alert, deleteUserSetting */ +/* global theList:true, theExtraList:true, getUserSetting, setUserSetting */ - flushTags : function(el, a, f) { - a = a || false; - var tags = $('.the-tags', el), - newtag = $('input.newtag', el), - comma = postL10n.comma, - newtags, text; - - text = a ? $(a).text() : newtag.val(); - tagsval = tags.val(); - newtags = tagsval ? tagsval + comma + text : text; - - newtags = this.clean( newtags ); - newtags = array_unique_noempty( newtags.split(comma) ).join(comma); - tags.val(newtags); - this.quickClicks(el); - - if ( !a ) - newtag.val(''); - if ( 'undefined' == typeof(f) ) - newtag.focus(); - - return false; - }, - - get : function(id) { - var tax = id.substr(id.indexOf('-')+1); - - $.post(ajaxurl, {'action':'get-tagcloud', 'tax':tax}, function(r, stat) { - if ( 0 == r || 'success' != stat ) - r = wpAjax.broken; - - r = $('

'+r+'

'); - $('a', r).click(function(){ - tagBox.flushTags( $(this).closest('.inside').children('.tagsdiv'), this); - return false; - }); - - $('#'+id).after(r); - }); - }, - - init : function() { - var t = this, ajaxtag = $('div.ajaxtag'); +var commentsBox, WPSetThumbnailHTML, WPSetThumbnailID, WPRemoveThumbnail, wptitlehint, makeSlugeditClickable, editPermalink; +// Back-compat: prevent fatal errors +makeSlugeditClickable = editPermalink = function(){}; - $('.tagsdiv').each( function() { - tagBox.quickClicks(this); - }); - - $('input.tagadd', ajaxtag).click(function(){ - t.flushTags( $(this).closest('.tagsdiv') ); - }); - - $('div.taghint', ajaxtag).click(function(){ - $(this).css('visibility', 'hidden').parent().siblings('.newtag').focus(); - }); +window.wp = window.wp || {}; - $('input.newtag', ajaxtag).blur(function() { - if ( this.value == '' ) - $(this).parent().siblings('.taghint').css('visibility', ''); - }).focus(function(){ - $(this).parent().siblings('.taghint').css('visibility', 'hidden'); - }).keyup(function(e){ - if ( 13 == e.which ) { - tagBox.flushTags( $(this).closest('.tagsdiv') ); - return false; - } - }).keypress(function(e){ - if ( 13 == e.which ) { - e.preventDefault(); - return false; - } - }).each(function(){ - var tax = $(this).closest('div.tagsdiv').attr('id'); - $(this).suggest( ajaxurl + '?action=ajax-tag-search&tax=' + tax, { delay: 500, minchars: 2, multiple: true, multipleSep: postL10n.comma + ' ' } ); - }); - - // save tags on post save/publish - $('#post').submit(function(){ - $('div.tagsdiv').each( function() { - tagBox.flushTags(this, false, 1); - }); - }); - - // tag cloud - $('a.tagcloud-link').click(function(){ - tagBox.get( $(this).attr('id') ); - $(this).unbind().click(function(){ - $(this).siblings('.the-tagcloud').toggle(); - return false; - }); - return false; - }); - } -}; +( function( $ ) { + var titleHasFocus = false; commentsBox = { st : 0, @@ -185,7 +20,7 @@ this.st += num; this.total = total; - $('#commentsdiv .spinner').show(); + $( '#commentsdiv .spinner' ).addClass( 'is-active' ); data = { 'action' : 'get-comments', @@ -200,13 +35,13 @@ function(r) { r = wpAjax.parseAjaxResponse(r); $('#commentsdiv .widefat').show(); - $('#commentsdiv .spinner').hide(); + $( '#commentsdiv .spinner' ).removeClass( 'is-active' ); if ( 'object' == typeof r && r.responses[0] ) { $('#the-comment-list').append( r.responses[0].data ); theList = theExtraList = null; - $("a[className*=':']").unbind(); + $( 'a[className*=\':\']' ).unbind(); if ( commentsBox.st > commentsBox.total ) $('#show-comments').hide(); @@ -240,7 +75,7 @@ WPRemoveThumbnail = function(nonce){ $.post(ajaxurl, { - action:"set-post-thumbnail", post_id: $('#post_ID').val(), thumbnail_id: -1, _ajax_nonce: nonce, cookie: encodeURIComponent(document.cookie) + action: 'set-post-thumbnail', post_id: $( '#post_ID' ).val(), thumbnail_id: -1, _ajax_nonce: nonce, cookie: encodeURIComponent( document.cookie ) }, function(str){ if ( str == '0' ) { alert( setPostThumbnailL10n.error ); @@ -259,16 +94,15 @@ if ( ! post_id || ! $('#post-lock-dialog').length ) return; - send['post_id'] = post_id; + send.post_id = post_id; if ( lock ) - send['lock'] = lock; + send.lock = lock; data['wp-refresh-post-lock'] = send; -}); -// Post locks: update the lock string or show the dialog if somebody has taken over editing -$(document).on( 'heartbeat-tick.refresh-lock', function( e, data ) { +}).on( 'heartbeat-tick.refresh-lock', function( e, data ) { + // Post locks: update the lock string or show the dialog if somebody has taken over editing var received, wrap, avatar; if ( data['wp-refresh-post-lock'] ) { @@ -279,19 +113,16 @@ wrap = $('#post-lock-dialog'); if ( wrap.length && ! wrap.is(':visible') ) { - if ( typeof autosave == 'function' ) { - $(document).on('autosave-disable-buttons.post-lock', function() { - wrap.addClass('saving'); - }).on('autosave-enable-buttons.post-lock', function() { + if ( wp.autosave ) { + // Save the latest changes and disable + $(document).one( 'heartbeat-tick', function() { + wp.autosave.server.suspend(); wrap.removeClass('saving').addClass('saved'); - window.onbeforeunload = null; + $(window).off( 'beforeunload.edit-post' ); }); - // Save the latest changes and disable - if ( ! autosave() ) - window.onbeforeunload = null; - - autosave = function(){}; + wrap.addClass('saving'); + wp.autosave.server.triggerSave(); } if ( received.lock_error.avatar_src ) { @@ -306,6 +137,25 @@ $('#active_post_lock').val( received.new_lock ); } } +}).on( 'before-autosave.update-post-slug', function() { + titleHasFocus = document.activeElement && document.activeElement.id === 'title'; +}).on( 'after-autosave.update-post-slug', function() { + // Create slug area only if not already there + // and the title field was not focused (user was not typing a title) when autosave ran + if ( ! $('#edit-slug-box > *').length && ! titleHasFocus ) { + $.post( ajaxurl, { + action: 'sample-permalink', + post_id: $('#post_ID').val(), + new_title: $('#title').val(), + samplepermalinknonce: $('#samplepermalinknonce').val() + }, + function( data ) { + if ( data != '-1' ) { + $('#edit-slug-box').html(data); + } + } + ); + } }); }(jQuery)); @@ -351,10 +201,25 @@ }(jQuery)); jQuery(document).ready( function($) { - var stamp, visibility, sticky = '', last = 0, co = $('#content'); + var stamp, visibility, $submitButtons, updateVisibility, updateText, + sticky = '', + last = 0, + co = $('#content'), + $document = $(document), + $editSlugWrap = $('#edit-slug-box'), + postId = $('#post_ID').val() || 0, + $submitpost = $('#submitpost'), + releaseLock = true, + $postVisibilitySelect = $('#post-visibility-select'), + $timestampdiv = $('#timestampdiv'), + $postStatusSelect = $('#post-status-select'); postboxes.add_postbox_toggles(pagenow); + // Clear the window name. Otherwise if this is a former preview window where the user navigated to edit another post, + // and the first post is still being edited, clicking Preview there will use this window to show the preview. + window.name = ''; + // Post locks: contain focus inside the dialog. If the dialog is shown, focus the first item. $('#post-lock-dialog .notification-dialog').on( 'keydown', function(e) { if ( e.which != 9 ) @@ -371,13 +236,174 @@ } }).filter(':visible').find('.wp-tab-first').focus(); + // Set the heartbeat interval to 15 sec. if post lock dialogs are enabled + if ( wp.heartbeat && $('#post-lock-dialog').length ) { + wp.heartbeat.interval( 15 ); + } + + // The form is being submitted by the user + $submitButtons = $submitpost.find( ':submit, a.submitdelete, #post-preview' ).on( 'click.edit-post', function( event ) { + var $button = $(this); + + if ( $button.hasClass('disabled') ) { + event.preventDefault(); + return; + } + + if ( $button.hasClass('submitdelete') || $button.is( '#post-preview' ) ) { + return; + } + + // The form submission can be blocked from JS or by using HTML 5.0 validation on some fields. + // Run this only on an actual 'submit'. + $('form#post').off( 'submit.edit-post' ).on( 'submit.edit-post', function( event ) { + if ( event.isDefaultPrevented() ) { + return; + } + + // Stop autosave + if ( wp.autosave ) { + wp.autosave.server.suspend(); + } + + releaseLock = false; + $(window).off( 'beforeunload.edit-post' ); + + $submitButtons.addClass( 'disabled' ); + + if ( $button.attr('id') === 'publish' ) { + $submitpost.find( '#major-publishing-actions .spinner' ).addClass( 'is-active' ); + } else { + $submitpost.find( '#minor-publishing .spinner' ).addClass( 'is-active' ); + } + }); + }); + + // Submit the form saving a draft or an autosave, and show a preview in a new tab + $('#post-preview').on( 'click.post-preview', function( event ) { + var $this = $(this), + $form = $('form#post'), + $previewField = $('input#wp-preview'), + target = $this.attr('target') || 'wp-preview', + ua = navigator.userAgent.toLowerCase(); + + event.preventDefault(); + + if ( $this.hasClass('disabled') ) { + return; + } + + if ( wp.autosave ) { + wp.autosave.server.tempBlockSave(); + } + + $previewField.val('dopreview'); + $form.attr( 'target', target ).submit().attr( 'target', '' ); + + // Workaround for WebKit bug preventing a form submitting twice to the same action. + // https://bugs.webkit.org/show_bug.cgi?id=28633 + if ( ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1 ) { + $form.attr( 'action', function( index, value ) { + return value + '?t=' + ( new Date() ).getTime(); + }); + } + + $previewField.val(''); + }); + + // This code is meant to allow tabbing from Title to Post content. + $('#title').on( 'keydown.editor-focus', function( event ) { + var editor, $textarea; + + if ( event.keyCode === 9 && ! event.ctrlKey && ! event.altKey && ! event.shiftKey ) { + editor = typeof tinymce != 'undefined' && tinymce.get('content'); + $textarea = $('#content'); + + if ( editor && ! editor.isHidden() ) { + editor.focus(); + } else if ( $textarea.length ) { + $textarea.focus(); + } else { + return; + } + + event.preventDefault(); + } + }); + + // Autosave new posts after a title is typed + if ( $( '#auto_draft' ).val() ) { + $( '#title' ).blur( function() { + var cancel; + + if ( ! this.value || $('#edit-slug-box > *').length ) { + return; + } + + // Cancel the autosave when the blur was triggered by the user submitting the form + $('form#post').one( 'submit', function() { + cancel = true; + }); + + window.setTimeout( function() { + if ( ! cancel && wp.autosave ) { + wp.autosave.server.triggerSave(); + } + }, 200 ); + }); + } + + $document.on( 'autosave-disable-buttons.edit-post', function() { + $submitButtons.addClass( 'disabled' ); + }).on( 'autosave-enable-buttons.edit-post', function() { + if ( ! wp.heartbeat || ! wp.heartbeat.hasConnectionError() ) { + $submitButtons.removeClass( 'disabled' ); + } + }).on( 'before-autosave.edit-post', function() { + $( '.autosave-message' ).text( postL10n.savingText ); + }).on( 'after-autosave.edit-post', function( event, data ) { + $( '.autosave-message' ).text( data.message ); + }); + + $(window).on( 'beforeunload.edit-post', function() { + var editor = typeof tinymce !== 'undefined' && tinymce.get('content'); + + if ( ( editor && ! editor.isHidden() && editor.isDirty() ) || + ( wp.autosave && wp.autosave.server.postChanged() ) ) { + + return postL10n.saveAlert; + } + }).on( 'unload.edit-post', function( event ) { + if ( ! releaseLock ) { + return; + } + + // Unload is triggered (by hand) on removing the Thickbox iframe. + // Make sure we process only the main document unload. + if ( event.target && event.target.nodeName != '#document' ) { + return; + } + + $.ajax({ + type: 'POST', + url: ajaxurl, + async: false, + data: { + action: 'wp-remove-post-lock', + _wpnonce: $('#_wpnonce').val(), + post_ID: $('#post_ID').val(), + active_post_lock: $('#active_post_lock').val() + } + }); + }); + // multi-taxonomies if ( $('#tagsdiv-post_tag').length ) { - tagBox.init(); + window.tagBox && window.tagBox.init(); } else { $('#side-sortables, #normal-sortables, #advanced-sortables').children('div.postbox').each(function(){ if ( this.id.indexOf('tagsdiv-') === 0 ) { - tagBox.init(); + window.tagBox && window.tagBox.init(); return false; } }); @@ -401,17 +427,17 @@ $('#' + taxonomy + '-tabs').siblings('.tabs-panel').hide(); $(t).show(); if ( '#' + taxonomy + '-all' == t ) - deleteUserSetting(settingName); + deleteUserSetting( settingName ); else - setUserSetting(settingName, 'pop'); + setUserSetting( settingName, 'pop' ); return false; }); - if ( getUserSetting(settingName) ) + if ( getUserSetting( settingName ) ) $('a[href="#' + taxonomy + '-pop"]', '#' + taxonomy + '-tabs').click(); // Ajax Cat - $('#new' + taxonomy).one( 'focus', function() { $(this).val( '' ).removeClass( 'form-input-tip' ) } ); + $( '#new' + taxonomy ).one( 'focus', function() { $( this ).val( '' ).removeClass( 'form-input-tip' ); } ); $('#new' + taxonomy).keypress( function(event){ if( 13 === event.keyCode ) { @@ -463,7 +489,7 @@ // Custom Fields if ( $('#postcustom').length ) { - $('#the-list').wpList( { addAfter: function( xml, s ) { + $( '#the-list' ).wpList( { addAfter: function() { $('table#list-table').show(); }, addBefore: function( s ) { s.data += '&post_id=' + $('#post_ID').val(); @@ -477,24 +503,23 @@ stamp = $('#timestamp').html(); visibility = $('#post-visibility-display').html(); - function updateVisibility() { - var pvSelect = $('#post-visibility-select'); - if ( $('input:radio:checked', pvSelect).val() != 'public' ) { + updateVisibility = function() { + if ( $postVisibilitySelect.find('input:radio:checked').val() != 'public' ) { $('#sticky').prop('checked', false); $('#sticky-span').hide(); } else { $('#sticky-span').show(); } - if ( $('input:radio:checked', pvSelect).val() != 'password' ) { + if ( $postVisibilitySelect.find('input:radio:checked').val() != 'password' ) { $('#password-span').hide(); } else { $('#password-span').show(); } - } + }; - function updateText() { + updateText = function() { - if ( ! $('#timestampdiv').length ) + if ( ! $timestampdiv.length ) return true; var attemptedDate, originalDate, currentDate, publishOn, postStatus = $('#post_status'), @@ -506,10 +531,10 @@ currentDate = new Date( $('#cur_aa').val(), $('#cur_mm').val() -1, $('#cur_jj').val(), $('#cur_hh').val(), $('#cur_mn').val() ); if ( attemptedDate.getFullYear() != aa || (1 + attemptedDate.getMonth()) != mm || attemptedDate.getDate() != jj || attemptedDate.getMinutes() != mn ) { - $('.timestamp-wrap', '#timestampdiv').addClass('form-invalid'); + $timestampdiv.find('.timestamp-wrap').addClass('form-invalid'); return false; } else { - $('.timestamp-wrap', '#timestampdiv').removeClass('form-invalid'); + $timestampdiv.find('.timestamp-wrap').removeClass('form-invalid'); } if ( attemptedDate > currentDate && $('#original_post_status').val() != 'future' ) { @@ -531,20 +556,20 @@ .replace( '%2$s', jj ) .replace( '%3$s', aa ) .replace( '%4$s', hh ) - .replace( '%5$s', mn ) - + ' ' + .replace( '%5$s', mn ) + + ' ' ); } - if ( $('input:radio:checked', '#post-visibility-select').val() == 'private' ) { + if ( $postVisibilitySelect.find('input:radio:checked').val() == 'private' ) { $('#publish').val( postL10n.update ); - if ( optPublish.length == 0 ) { + if ( 0 === optPublish.length ) { postStatus.append(''); } else { optPublish.html( postL10n.privatelyPublished ); } $('option[value="publish"]', postStatus).prop('selected', true); - $('.edit-post-status', '#misc-publishing-actions').hide(); + $('#misc-publishing-actions .edit-post-status').hide(); } else { if ( $('#original_post_status').val() == 'future' || $('#original_post_status').val() == 'draft' ) { if ( optPublish.length ) { @@ -555,7 +580,7 @@ optPublish.html( postL10n.published ); } if ( postStatus.is(':hidden') ) - $('.edit-post-status', '#misc-publishing-actions').show(); + $('#misc-publishing-actions .edit-post-status').show(); } $('#post-status-display').html($('option:selected', postStatus).text()); if ( $('option:selected', postStatus).val() == 'private' || $('option:selected', postStatus).val() == 'publish' ) { @@ -569,191 +594,203 @@ } } return true; - } + }; - $('.edit-visibility', '#visibility').click(function () { - if ($('#post-visibility-select').is(":hidden")) { + $( '#visibility .edit-visibility').click( function () { + if ( $postVisibilitySelect.is(':hidden') ) { updateVisibility(); - $('#post-visibility-select').slideDown('fast'); + $postVisibilitySelect.slideDown('fast').find('input[type="radio"]').first().focus(); $(this).hide(); } return false; }); - $('.cancel-post-visibility', '#post-visibility-select').click(function () { - $('#post-visibility-select').slideUp('fast'); + $postVisibilitySelect.find('.cancel-post-visibility').click( function( event ) { + $postVisibilitySelect.slideUp('fast'); $('#visibility-radio-' + $('#hidden-post-visibility').val()).prop('checked', true); $('#post_password').val($('#hidden-post-password').val()); $('#sticky').prop('checked', $('#hidden-post-sticky').prop('checked')); $('#post-visibility-display').html(visibility); - $('.edit-visibility', '#visibility').show(); + $('#visibility .edit-visibility').show().focus(); updateText(); - return false; + event.preventDefault(); }); - $('.save-post-visibility', '#post-visibility-select').click(function () { // crazyhorse - multiple ok cancels - var pvSelect = $('#post-visibility-select'); - - pvSelect.slideUp('fast'); - $('.edit-visibility', '#visibility').show(); + $postVisibilitySelect.find('.save-post-visibility').click( function( event ) { // crazyhorse - multiple ok cancels + $postVisibilitySelect.slideUp('fast'); + $('#visibility .edit-visibility').show(); updateText(); - if ( $('input:radio:checked', pvSelect).val() != 'public' ) { + if ( $postVisibilitySelect.find('input:radio:checked').val() != 'public' ) { $('#sticky').prop('checked', false); } // WEAPON LOCKED - if ( true == $('#sticky').prop('checked') ) { + if ( $('#sticky').prop('checked') ) { sticky = 'Sticky'; } else { sticky = ''; } - $('#post-visibility-display').html( postL10n[$('input:radio:checked', pvSelect).val() + sticky] ); - return false; + $('#post-visibility-display').html( postL10n[ $postVisibilitySelect.find('input:radio:checked').val() + sticky ] ); + event.preventDefault(); }); - $('input:radio', '#post-visibility-select').change(function() { + $postVisibilitySelect.find('input:radio').change( function() { updateVisibility(); }); - $('#timestampdiv').siblings('a.edit-timestamp').click(function() { - if ($('#timestampdiv').is(":hidden")) { - $('#timestampdiv').slideDown('fast'); + $timestampdiv.siblings('a.edit-timestamp').click( function( event ) { + if ( $timestampdiv.is( ':hidden' ) ) { + $timestampdiv.slideDown('fast'); $('#mm').focus(); $(this).hide(); } - return false; + event.preventDefault(); }); - $('.cancel-timestamp', '#timestampdiv').click(function() { - $('#timestampdiv').slideUp('fast'); + $timestampdiv.find('.cancel-timestamp').click( function( event ) { + $timestampdiv.slideUp('fast').siblings('a.edit-timestamp').show().focus(); $('#mm').val($('#hidden_mm').val()); $('#jj').val($('#hidden_jj').val()); $('#aa').val($('#hidden_aa').val()); $('#hh').val($('#hidden_hh').val()); $('#mn').val($('#hidden_mn').val()); - $('#timestampdiv').siblings('a.edit-timestamp').show(); updateText(); - return false; + event.preventDefault(); }); - $('.save-timestamp', '#timestampdiv').click(function () { // crazyhorse - multiple ok cancels + $timestampdiv.find('.save-timestamp').click( function( event ) { // crazyhorse - multiple ok cancels if ( updateText() ) { - $('#timestampdiv').slideUp('fast'); - $('#timestampdiv').siblings('a.edit-timestamp').show(); + $timestampdiv.slideUp('fast'); + $timestampdiv.siblings('a.edit-timestamp').show(); } - return false; + event.preventDefault(); }); - $('#post').on( 'submit', function(e){ + $('#post').on( 'submit', function( event ) { if ( ! updateText() ) { - e.preventDefault(); - $('#timestampdiv').show(); - $('#publishing-action .spinner').hide(); - $('#publish').prop('disabled', false).removeClass('button-primary-disabled'); - return false; + event.preventDefault(); + $timestampdiv.show(); + + if ( wp.autosave ) { + wp.autosave.enableButtons(); + } + + $( '#publishing-action .spinner' ).removeClass( 'is-active' ); } }); - $('#post-status-select').siblings('a.edit-post-status').click(function() { - if ($('#post-status-select').is(":hidden")) { - $('#post-status-select').slideDown('fast'); + $postStatusSelect.siblings('a.edit-post-status').click( function( event ) { + if ( $postStatusSelect.is( ':hidden' ) ) { + $postStatusSelect.slideDown('fast').find('select').focus(); $(this).hide(); } - return false; + event.preventDefault(); }); - $('.save-post-status', '#post-status-select').click(function() { - $('#post-status-select').slideUp('fast'); - $('#post-status-select').siblings('a.edit-post-status').show(); + $postStatusSelect.find('.save-post-status').click( function( event ) { + $postStatusSelect.slideUp('fast').siblings('a.edit-post-status').show(); updateText(); - return false; + event.preventDefault(); }); - $('.cancel-post-status', '#post-status-select').click(function() { - $('#post-status-select').slideUp('fast'); - $('#post_status').val($('#hidden_post_status').val()); - $('#post-status-select').siblings('a.edit-post-status').show(); + $postStatusSelect.find('.cancel-post-status').click( function( event ) { + $('#post-status-select').slideUp('fast').siblings( 'a.edit-post-status' ).show().focus(); + $('#post_status').val( $('#hidden_post_status').val() ); updateText(); - return false; + event.preventDefault(); }); } // end submitdiv // permalink - if ( $('#edit-slug-box').length ) { - editPermalink = function(post_id) { - var i, c = 0, e = $('#editable-post-name'), revert_e = e.html(), real_slug = $('#post_name'), revert_slug = real_slug.val(), b = $('#edit-slug-buttons'), revert_b = b.html(), full = $('#editable-post-name-full').html(); + function editPermalink() { + var i, slug_value, + c = 0, + e = $('#editable-post-name'), + revert_e = e.html(), + real_slug = $('#post_name'), + revert_slug = real_slug.val(), + b = $('#edit-slug-buttons'), + revert_b = b.html(), + full = $('#editable-post-name-full'); - $('#view-post-btn').hide(); - b.html(''+postL10n.ok+' '+postL10n.cancel+''); - b.children('.save').click(function() { - var new_slug = e.children('input').val(); - if ( new_slug == $('#editable-post-name-full').text() ) { - return $('.cancel', '#edit-slug-buttons').click(); - } - $.post(ajaxurl, { - action: 'sample-permalink', - post_id: post_id, - new_slug: new_slug, - new_title: $('#title').val(), - samplepermalinknonce: $('#samplepermalinknonce').val() - }, function(data) { - var box = $('#edit-slug-box'); - box.html(data); - if (box.hasClass('hidden')) { - box.fadeIn('fast', function () { - box.removeClass('hidden'); - }); - } - b.html(revert_b); - real_slug.val(new_slug); - makeSlugeditClickable(); - $('#view-post-btn').show(); - }); + // Deal with Twemoji in the post-name + full.find( 'img' ).replaceWith( function() { return this.alt; } ); + full = full.html(); + + $('#view-post-btn').hide(); + b.html(''+postL10n.ok+' '+postL10n.cancel+''); + b.children('.save').click(function() { + var new_slug = e.children('input').val(); + if ( new_slug == $('#editable-post-name-full').text() ) { + b.children('.cancel').click(); return false; - }); - - $('.cancel', '#edit-slug-buttons').click(function() { - $('#view-post-btn').show(); - e.html(revert_e); - b.html(revert_b); - real_slug.val(revert_slug); - return false; - }); - - for ( i = 0; i < full.length; ++i ) { - if ( '%' == full.charAt(i) ) - c++; } + $.post(ajaxurl, { + action: 'sample-permalink', + post_id: postId, + new_slug: new_slug, + new_title: $('#title').val(), + samplepermalinknonce: $('#samplepermalinknonce').val() + }, function(data) { + var box = $('#edit-slug-box'); + box.html(data); + if (box.hasClass('hidden')) { + box.fadeIn('fast', function () { + box.removeClass('hidden'); + }); + } - slug_value = ( c > full.length / 4 ) ? '' : full; - e.html('').children('input').keypress(function(e) { - var key = e.keyCode || 0; - // on enter, just save the new slug, don't save the post - if ( 13 == key ) { - b.children('.save').click(); - return false; - } - if ( 27 == key ) { - b.children('.cancel').click(); - return false; - } - }).keyup(function(e) { - real_slug.val(this.value); - }).focus(); + b.html(revert_b); + real_slug.val(new_slug); + $('#view-post-btn').show(); + }); + return false; + }); + + b.children('.cancel').click(function() { + $('#view-post-btn').show(); + e.html(revert_e); + b.html(revert_b); + real_slug.val(revert_slug); + return false; + }); + + for ( i = 0; i < full.length; ++i ) { + if ( '%' == full.charAt(i) ) + c++; } - makeSlugeditClickable = function() { - $('#editable-post-name').click(function() { - $('#edit-slug-buttons').children('.edit-slug').click(); - }); - } - makeSlugeditClickable(); + slug_value = ( c > full.length / 4 ) ? '' : full; + e.html('').children('input').keypress(function(e) { + var key = e.keyCode || 0; + // on enter, just save the new slug, don't save the post + if ( 13 == key ) { + b.children('.save').click(); + return false; + } + if ( 27 == key ) { + b.children('.cancel').click(); + return false; + } + } ).keyup( function() { + real_slug.val(this.value); + }).focus(); + } + + if ( $editSlugWrap.length ) { + $editSlugWrap.on( 'click', function( event ) { + var $target = $( event.target ); + + if ( $target.is('#editable-post-name') || $target.hasClass('edit-slug') ) { + editPermalink(); + } + }); } // word count if ( typeof(wpWordCount) != 'undefined' ) { - $(document).triggerHandler('wpcountwords', [ co.val() ]); + $document.triggerHandler('wpcountwords', [ co.val() ]); co.keyup( function(e) { var k = e.keyCode || e.charCode; @@ -762,7 +799,7 @@ return true; if ( 13 == k || 8 == last || 46 == last ) - $(document).triggerHandler('wpcountwords', [ co.val() ]); + $document.triggerHandler('wpcountwords', [ co.val() ]); last = k; return true; @@ -774,7 +811,7 @@ var title = $('#' + id), titleprompt = $('#' + id + '-prompt-text'); - if ( title.val() == '' ) + if ( '' === title.val() ) titleprompt.removeClass('screen-reader-text'); titleprompt.click(function(){ @@ -783,7 +820,7 @@ }); title.blur(function(){ - if ( this.value == '' ) + if ( '' === this.value ) titleprompt.removeClass('screen-reader-text'); }).focus(function(){ titleprompt.addClass('screen-reader-text'); @@ -791,130 +828,98 @@ titleprompt.addClass('screen-reader-text'); $(this).unbind(e); }); - } + }; wptitlehint(); - // resizable textarea#content - (function() { - var textarea = $('textarea#content'), offset = null, el; - // No point for touch devices - if ( !textarea.length || 'ontouchstart' in window ) - return; - - function dragging(e) { - textarea.height( Math.max(50, offset + e.pageY) + 'px' ); - return false; - } + // Resize the visual and text editors + ( function() { + var editor, offset, mce, + $textarea = $('textarea#content'), + $handle = $('#post-status-info'), + $postdivrich = $('#postdivrich'); - function endDrag(e) { - var height; - - textarea.focus(); - $(document).unbind('mousemove', dragging).unbind('mouseup', endDrag); - - height = parseInt( textarea.css('height'), 10 ); - - // sanity check - if ( height && height > 50 && height < 5000 ) - setUserSetting( 'ed_size', height ); + // No point for touch devices + if ( ! $textarea.length || 'ontouchstart' in window ) { + // Hide the resize handle + $('#content-resize-handle').hide(); + return; } - textarea.css('resize', 'none'); - el = $('

'); - $('#wp-content-wrap').append(el); - el.on('mousedown', function(e) { - offset = textarea.height() - e.pageY; - textarea.blur(); - $(document).mousemove(dragging).mouseup(endDrag); - return false; - }); - })(); - - if ( typeof(tinymce) != 'undefined' ) { - tinymce.onAddEditor.add(function(mce, ed){ - // iOS expands the iframe to full height and the user cannot adjust it. - if ( ed.id != 'content' || tinymce.isIOS5 ) + function dragging( event ) { + if ( $postdivrich.hasClass( 'wp-editor-expand' ) ) { return; + } - function getHeight() { - var height, node = document.getElementById('content_ifr'), - ifr_height = node ? parseInt( node.style.height, 10 ) : 0, - tb_height = $('#content_tbl tr.mceFirst').height(); + if ( mce ) { + editor.theme.resizeTo( null, offset + event.pageY ); + } else { + $textarea.height( Math.max( 50, offset + event.pageY ) ); + } - if ( !ifr_height || !tb_height ) - return false; + event.preventDefault(); + } - // total height including toolbar and statusbar - height = ifr_height + tb_height + 21; - // textarea height = total height - 33px toolbar - height -= 33; + function endDrag() { + var height, toolbarHeight; - return height; + if ( $postdivrich.hasClass( 'wp-editor-expand' ) ) { + return; } - // resize TinyMCE to match the textarea height when switching Text -> Visual - ed.onLoadContent.add( function(ed, o) { - var ifr_height, node = document.getElementById('content'), - height = node ? parseInt( node.style.height, 10 ) : 0, - tb_height = $('#content_tbl tr.mceFirst').height() || 33; + if ( mce ) { + editor.focus(); + toolbarHeight = parseInt( $( '#wp-content-editor-container .mce-toolbar-grp' ).height(), 10 ); - // height cannot be under 50 or over 5000 - if ( !height || height < 50 || height > 5000 ) - height = 360; // default height for the main editor + if ( toolbarHeight < 10 || toolbarHeight > 200 ) { + toolbarHeight = 30; + } - if ( getUserSetting( 'ed_size' ) > 5000 ) - setUserSetting( 'ed_size', 360 ); - - // compensate for padding and toolbars - ifr_height = ( height - tb_height ) + 12; + height = parseInt( $('#content_ifr').css('height'), 10 ) + toolbarHeight - 28; + } else { + $textarea.focus(); + height = parseInt( $textarea.css('height'), 10 ); + } - // sanity check - if ( ifr_height > 50 && ifr_height < 5000 ) { - $('#content_tbl').css('height', '' ); - $('#content_ifr').css('height', ifr_height + 'px' ); - } - }); + $document.off( '.wp-editor-resize' ); + + // sanity check + if ( height && height > 50 && height < 5000 ) { + setUserSetting( 'ed_size', height ); + } + } - // resize the textarea to match TinyMCE's height when switching Visual -> Text - ed.onSaveContent.add( function(ed, o) { - var height = getHeight(); - - if ( !height || height < 50 || height > 5000 ) - return; - - $('textarea#content').css( 'height', height + 'px' ); - }); + $handle.on( 'mousedown.wp-editor-resize', function( event ) { + if ( typeof tinymce !== 'undefined' ) { + editor = tinymce.get('content'); + } - // save on resizing TinyMCE - ed.onPostRender.add(function() { - $('#content_resize').on('mousedown.wp-mce-resize', function(e){ - $(document).on('mouseup.wp-mce-resize', function(e){ - var height; - - $(document).off('mouseup.wp-mce-resize'); + if ( editor && ! editor.isHidden() ) { + mce = true; + offset = $('#content_ifr').height() - event.pageY; + } else { + mce = false; + offset = $textarea.height() - event.pageY; + $textarea.blur(); + } - height = getHeight(); - // sanity check - if ( height && height > 50 && height < 5000 ) - setUserSetting( 'ed_size', height ); - }); - }); - }); - }); + $document.on( 'mousemove.wp-editor-resize', dragging ) + .on( 'mouseup.wp-editor-resize mouseleave.wp-editor-resize', endDrag ); + event.preventDefault(); + }).on( 'mouseup.wp-editor-resize', endDrag ); + })(); + + if ( typeof tinymce !== 'undefined' ) { // When changing post formats, change the editor body class - $('#post-formats-select input.post-format').on( 'change.set-editor-class', function( event ) { + $( '#post-formats-select input.post-format' ).on( 'change.set-editor-class', function() { var editor, body, format = this.id; - if ( format && $( this ).prop('checked') ) { - editor = tinymce.get( 'content' ); - - if ( editor ) { - body = editor.getBody(); - body.className = body.className.replace( /\bpost-format-[^ ]+/, '' ); - editor.dom.addClass( body, format == 'post-format-0' ? 'post-format-standard' : format ); - } + if ( format && $( this ).prop( 'checked' ) && ( editor = tinymce.get( 'content' ) ) ) { + body = editor.getBody(); + body.className = body.className.replace( /\bpost-format-[^ ]+/, '' ); + editor.dom.addClass( body, format == 'post-format-0' ? 'post-format-standard' : format ); + $( document ).trigger( 'editor-classchange' ); } }); }