web/wp-includes/js/autosave.dev.js
changeset 204 09a1c134465b
parent 203 f507feede89a
child 205 a4f7897e21a9
equal deleted inserted replaced
203:f507feede89a 204:09a1c134465b
     1 var autosave, autosaveLast = '', autosavePeriodical, autosaveOldMessage = '', autosaveDelayPreview = false, notSaved = true, blockSave = false, fullscreen, autosaveLockRelease = true;
       
     2 
       
     3 jQuery(document).ready( function($) {
       
     4 	var dotabkey = true;
       
     5 
       
     6 	autosaveLast = $('#post #title').val() + $('#post #content').val();
       
     7 	autosavePeriodical = $.schedule({time: autosaveL10n.autosaveInterval * 1000, func: function() { autosave(); }, repeat: true, protect: true});
       
     8 
       
     9 	//Disable autosave after the form has been submitted
       
    10 	$("#post").submit(function() {
       
    11 		$.cancel(autosavePeriodical);
       
    12 		autosaveLockRelease = false;
       
    13 	});
       
    14 
       
    15 	$('input[type="submit"], a.submitdelete', '#submitpost').click(function(){
       
    16 		blockSave = true;
       
    17 		window.onbeforeunload = null;
       
    18 		$(':button, :submit', '#submitpost').each(function(){
       
    19 			var t = $(this);
       
    20 			if ( t.hasClass('button-primary') )
       
    21 				t.addClass('button-primary-disabled');
       
    22 			else
       
    23 				t.addClass('button-disabled');
       
    24 		});
       
    25 		if ( $(this).attr('id') == 'publish' )
       
    26 			$('#ajax-loading').css('visibility', 'visible');
       
    27 		else
       
    28 			$('#draft-ajax-loading').css('visibility', 'visible');
       
    29 	});
       
    30 
       
    31 	window.onbeforeunload = function(){
       
    32 		var mce = typeof(tinyMCE) != 'undefined' ? tinyMCE.activeEditor : false, title, content;
       
    33 
       
    34 		if ( mce && !mce.isHidden() ) {
       
    35 			if ( mce.isDirty() )
       
    36 				return autosaveL10n.saveAlert;
       
    37 		} else {
       
    38 			if ( fullscreen && fullscreen.settings.visible ) {
       
    39 				title = $('#wp-fullscreen-title').val();
       
    40 				content = $("#wp_mce_fullscreen").val();
       
    41 			} else {
       
    42 				title = $('#post #title').val();
       
    43 				content = $('#post #content').val();
       
    44 			}
       
    45 
       
    46 			if ( ( title || content ) && title + content != autosaveLast )
       
    47 				return autosaveL10n.saveAlert;
       
    48 		}
       
    49 	};
       
    50 
       
    51 	$(window).unload( function(e) {
       
    52 		if ( ! autosaveLockRelease )
       
    53 			return;
       
    54 
       
    55 		// unload fires (twice) on removing the Thickbox iframe. Make sure we process only the main document unload.
       
    56 		if ( e.target && e.target.nodeName != '#document' )
       
    57 			return;
       
    58 
       
    59 		$.ajax({
       
    60 			type: 'POST',
       
    61 			url: ajaxurl,
       
    62 			async: false,
       
    63 			data: {
       
    64 				action: 'wp-remove-post-lock',
       
    65 				_wpnonce: $('#_wpnonce').val(),
       
    66 				post_ID: $('#post_ID').val(),
       
    67 				active_post_lock: $('#active_post_lock').val()
       
    68 			}
       
    69 		});
       
    70 	} );
       
    71 
       
    72 	// preview
       
    73 	$('#post-preview').click(function(){
       
    74 		if ( $('#auto_draft').val() == '1' && notSaved ) {
       
    75 			autosaveDelayPreview = true;
       
    76 			autosave();
       
    77 			return false;
       
    78 		}
       
    79 		doPreview();
       
    80 		return false;
       
    81 	});
       
    82 
       
    83 	doPreview = function() {
       
    84 		$('input#wp-preview').val('dopreview');
       
    85 		$('form#post').attr('target', 'wp-preview').submit().attr('target', '');
       
    86 
       
    87 		/*
       
    88 		 * Workaround for WebKit bug preventing a form submitting twice to the same action.
       
    89 		 * https://bugs.webkit.org/show_bug.cgi?id=28633
       
    90 		 */
       
    91 		if ( $.browser.safari ) {
       
    92 			$('form#post').attr('action', function(index, value) {
       
    93 				return value + '?t=' + new Date().getTime();
       
    94 			});
       
    95 		}
       
    96 
       
    97 		$('input#wp-preview').val('');
       
    98 	}
       
    99 
       
   100 	//  This code is meant to allow tabbing from Title to Post if tinyMCE is defined.
       
   101 	if ( typeof tinyMCE != 'undefined' ) {
       
   102 		$('#title')[$.browser.opera ? 'keypress' : 'keydown'](function (e) {
       
   103 			if ( e.which == 9 && !e.shiftKey && !e.controlKey && !e.altKey ) {
       
   104 				if ( ($('#auto_draft').val() == '1') && ($("#title").val().length > 0) ) { autosave(); }
       
   105 				if ( tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden() && dotabkey ) {
       
   106 					e.preventDefault();
       
   107 					dotabkey = false;
       
   108 					tinyMCE.activeEditor.focus();
       
   109 					return false;
       
   110 				}
       
   111 			}
       
   112 		});
       
   113 	}
       
   114 
       
   115 	// autosave new posts after a title is typed but not if Publish or Save Draft is clicked
       
   116 	if ( '1' == $('#auto_draft').val() ) {
       
   117 		$('#title').blur( function() {
       
   118 			if ( !this.value || $('#auto_draft').val() != '1' )
       
   119 				return;
       
   120 			delayed_autosave();
       
   121 		});
       
   122 	}
       
   123 });
       
   124 
       
   125 function autosave_parse_response(response) {
       
   126 	var res = wpAjax.parseAjaxResponse(response, 'autosave'), message = '', postID, sup;
       
   127 
       
   128 	if ( res && res.responses && res.responses.length ) {
       
   129 		message = res.responses[0].data; // The saved message or error.
       
   130 		// someone else is editing: disable autosave, set errors
       
   131 		if ( res.responses[0].supplemental ) {
       
   132 			sup = res.responses[0].supplemental;
       
   133 			if ( 'disable' == sup['disable_autosave'] ) {
       
   134 				autosave = function() {};
       
   135 				autosaveLockRelease = false;
       
   136 				res = { errors: true };
       
   137 			}
       
   138 
       
   139 			if ( sup['active-post-lock'] ) {
       
   140 				jQuery('#active_post_lock').val( sup['active-post-lock'] );
       
   141 			}
       
   142 
       
   143 			if ( sup['alert'] ) {
       
   144 				jQuery('#autosave-alert').remove();
       
   145 				jQuery('#titlediv').after('<div id="autosave-alert" class="error below-h2"><p>' + sup['alert'] + '</p></div>');
       
   146 			}
       
   147 
       
   148 			jQuery.each(sup, function(selector, value) {
       
   149 				if ( selector.match(/^replace-/) ) {
       
   150 					jQuery('#'+selector.replace('replace-', '')).val(value);
       
   151 				}
       
   152 			});
       
   153 		}
       
   154 
       
   155 		// if no errors: add slug UI
       
   156 		if ( !res.errors ) {
       
   157 			postID = parseInt( res.responses[0].id, 10 );
       
   158 			if ( !isNaN(postID) && postID > 0 ) {
       
   159 				autosave_update_slug(postID);
       
   160 			}
       
   161 		}
       
   162 	}
       
   163 	if ( message ) { // update autosave message
       
   164 		jQuery('.autosave-message').html(message);
       
   165 	} else if ( autosaveOldMessage && res ) {
       
   166 		jQuery('.autosave-message').html( autosaveOldMessage );
       
   167 	}
       
   168 	return res;
       
   169 }
       
   170 
       
   171 // called when autosaving pre-existing post
       
   172 function autosave_saved(response) {
       
   173 	blockSave = false;
       
   174 	autosave_parse_response(response); // parse the ajax response
       
   175 	autosave_enable_buttons(); // re-enable disabled form buttons
       
   176 }
       
   177 
       
   178 // called when autosaving new post
       
   179 function autosave_saved_new(response) {
       
   180 	blockSave = false;
       
   181 	var res = autosave_parse_response(response), postID;
       
   182 	if ( res && res.responses.length && !res.errors ) {
       
   183 		// An ID is sent only for real auto-saves, not for autosave=0 "keepalive" saves
       
   184 		postID = parseInt( res.responses[0].id, 10 );
       
   185 		if ( !isNaN(postID) && postID > 0 ) {
       
   186 			notSaved = false;
       
   187 			jQuery('#auto_draft').val('0'); // No longer an auto-draft
       
   188 		}
       
   189 		autosave_enable_buttons();
       
   190 		if ( autosaveDelayPreview ) {
       
   191 			autosaveDelayPreview = false;
       
   192 			doPreview();
       
   193 		}
       
   194 	} else {
       
   195 		autosave_enable_buttons(); // re-enable disabled form buttons
       
   196 	}
       
   197 }
       
   198 
       
   199 function autosave_update_slug(post_id) {
       
   200 	// create slug area only if not already there
       
   201 	if ( 'undefined' != makeSlugeditClickable && jQuery.isFunction(makeSlugeditClickable) && !jQuery('#edit-slug-box > *').size() ) {
       
   202 		jQuery.post( ajaxurl, {
       
   203 				action: 'sample-permalink',
       
   204 				post_id: post_id,
       
   205 				new_title: fullscreen && fullscreen.settings.visible ? jQuery('#wp-fullscreen-title').val() : jQuery('#title').val(),
       
   206 				samplepermalinknonce: jQuery('#samplepermalinknonce').val()
       
   207 			},
       
   208 			function(data) {
       
   209 				if ( data !== '-1' ) {
       
   210 					jQuery('#edit-slug-box').html(data);
       
   211 					makeSlugeditClickable();
       
   212 				}
       
   213 			}
       
   214 		);
       
   215 	}
       
   216 }
       
   217 
       
   218 function autosave_loading() {
       
   219 	jQuery('.autosave-message').html(autosaveL10n.savingText);
       
   220 }
       
   221 
       
   222 function autosave_enable_buttons() {
       
   223 	// delay that a bit to avoid some rare collisions while the DOM is being updated.
       
   224 	setTimeout(function(){
       
   225 		jQuery(':button, :submit', '#submitpost').removeAttr('disabled');
       
   226 		jQuery('.ajax-loading').css('visibility', 'hidden');
       
   227 	}, 500);
       
   228 }
       
   229 
       
   230 function autosave_disable_buttons() {
       
   231 	jQuery(':button, :submit', '#submitpost').prop('disabled', true);
       
   232 	// Re-enable 5 sec later. Just gives autosave a head start to avoid collisions.
       
   233 	setTimeout(autosave_enable_buttons, 5000);
       
   234 }
       
   235 
       
   236 function delayed_autosave() {
       
   237 	setTimeout(function(){
       
   238 		if ( blockSave )
       
   239 			return;
       
   240 		autosave();
       
   241 	}, 200);
       
   242 }
       
   243 
       
   244 autosave = function() {
       
   245 	// (bool) is rich editor enabled and active
       
   246 	blockSave = true;
       
   247 	var rich = (typeof tinyMCE != "undefined") && tinyMCE.activeEditor && !tinyMCE.activeEditor.isHidden(),
       
   248 		post_data, doAutoSave, ed, origStatus, successCallback;
       
   249 
       
   250 	autosave_disable_buttons();
       
   251 
       
   252 	post_data = {
       
   253 		action: "autosave",
       
   254 		post_ID:  jQuery("#post_ID").val() || 0,
       
   255 		autosavenonce: jQuery('#autosavenonce').val(),
       
   256 		post_type: jQuery('#post_type').val() || "",
       
   257 		autosave: 1
       
   258 	};
       
   259 
       
   260 	jQuery('.tags-input').each( function() {
       
   261 		post_data[this.name] = this.value;
       
   262 	} );
       
   263 
       
   264 	// We always send the ajax request in order to keep the post lock fresh.
       
   265 	// This (bool) tells whether or not to write the post to the DB during the ajax request.
       
   266 	doAutoSave = true;
       
   267 
       
   268 	// No autosave while thickbox is open (media buttons)
       
   269 	if ( jQuery("#TB_window").css('display') == 'block' )
       
   270 		doAutoSave = false;
       
   271 
       
   272 	/* Gotta do this up here so we can check the length when tinyMCE is in use */
       
   273 	if ( rich && doAutoSave ) {
       
   274 		ed = tinyMCE.activeEditor;
       
   275 		// Don't run while the TinyMCE spellcheck is on. It resets all found words.
       
   276 		if ( ed.plugins.spellchecker && ed.plugins.spellchecker.active ) {
       
   277 			doAutoSave = false;
       
   278 		} else {
       
   279 			if ( 'mce_fullscreen' == ed.id || 'wp_mce_fullscreen' == ed.id )
       
   280 				tinyMCE.get('content').setContent(ed.getContent({format : 'raw'}), {format : 'raw'});
       
   281 			tinyMCE.triggerSave();
       
   282 		}
       
   283 	}
       
   284 
       
   285 	if ( fullscreen && fullscreen.settings.visible ) {
       
   286 		post_data["post_title"] = jQuery('#wp-fullscreen-title').val() || '';
       
   287 		post_data["content"] = jQuery("#wp_mce_fullscreen").val() || '';
       
   288 	} else {
       
   289 		post_data["post_title"] = jQuery("#title").val() || '';
       
   290 		post_data["content"] = jQuery("#content").val() || '';
       
   291 	}
       
   292 
       
   293 	if ( jQuery('#post_name').val() )
       
   294 		post_data["post_name"] = jQuery('#post_name').val();
       
   295 
       
   296 	// Nothing to save or no change.
       
   297 	if ( ( post_data["post_title"].length == 0 && post_data["content"].length == 0 ) || post_data["post_title"] + post_data["content"] == autosaveLast ) {
       
   298 		doAutoSave = false;
       
   299 	}
       
   300 
       
   301 	origStatus = jQuery('#original_post_status').val();
       
   302 
       
   303 	goodcats = ([]);
       
   304 	jQuery("[name='post_category[]']:checked").each( function(i) {
       
   305 		goodcats.push(this.value);
       
   306 	} );
       
   307 	post_data["catslist"] = goodcats.join(",");
       
   308 
       
   309 	if ( jQuery("#comment_status").prop("checked") )
       
   310 		post_data["comment_status"] = 'open';
       
   311 	if ( jQuery("#ping_status").prop("checked") )
       
   312 		post_data["ping_status"] = 'open';
       
   313 	if ( jQuery("#excerpt").size() )
       
   314 		post_data["excerpt"] = jQuery("#excerpt").val();
       
   315 	if ( jQuery("#post_author").size() )
       
   316 		post_data["post_author"] = jQuery("#post_author").val();
       
   317 	if ( jQuery("#parent_id").val() )
       
   318 		post_data["parent_id"] = jQuery("#parent_id").val();
       
   319 	post_data["user_ID"] = jQuery("#user-id").val();
       
   320 	if ( jQuery('#auto_draft').val() == '1' )
       
   321 		post_data["auto_draft"] = '1';
       
   322 
       
   323 	if ( doAutoSave ) {
       
   324 		autosaveLast = post_data["post_title"] + post_data["content"];
       
   325 		jQuery(document).triggerHandler('wpcountwords', [ post_data["content"] ]);
       
   326 	} else {
       
   327 		post_data['autosave'] = 0;
       
   328 	}
       
   329 
       
   330 	if ( post_data["auto_draft"] == '1' ) {
       
   331 		successCallback = autosave_saved_new; // new post
       
   332 	} else {
       
   333 		successCallback = autosave_saved; // pre-existing post
       
   334 	}
       
   335 
       
   336 	autosaveOldMessage = jQuery('#autosave').html();
       
   337 	jQuery.ajax({
       
   338 		data: post_data,
       
   339 		beforeSend: doAutoSave ? autosave_loading : null,
       
   340 		type: "POST",
       
   341 		url: ajaxurl,
       
   342 		success: successCallback
       
   343 	});
       
   344 }