diff --git a/wp-includes/js/jquery/jquery.form.js b/wp-includes/js/jquery/jquery.form.js index 7a29393537..9b10cab1bd 100644 --- a/wp-includes/js/jquery/jquery.form.js +++ b/wp-includes/js/jquery/jquery.form.js @@ -1,15 +1,16 @@ /* - * jQuery form plugin - * @requires jQuery v1.0.3 + * jQuery Form Plugin + * version: 2.02 (12/16/2007) + * @requires jQuery v1.1 or later * + * Examples at: http://malsup.com/jquery/form/ * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Revision: $Id$ - * Version: 0.9 */ - + (function($) { /** * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX. * @@ -26,15 +27,14 @@ * url: URL to which the form data will be submitted. * default value: value of form's 'action' attribute * - * method: @deprecated use 'type' * type: The method in which the form data should be submitted, 'GET' or 'POST'. * default value: value of form's 'method' attribute (or 'GET' if none found) * - * before: @deprecated use 'beforeSubmit' + * data: Additional data to add to the request, specified as key/value pairs (see $.ajax). + * * beforeSubmit: Callback method to be invoked before the form is submitted. * default value: null * - * after: @deprecated use 'success' * success: Callback method to be invoked after the form has been successfully submitted * and the response has been returned from the server * default value: null @@ -66,10 +66,10 @@ * The dataType option provides a means for specifying how the server response should be handled. * This maps directly to the jQuery.httpData method. The following values are supported: * - * 'xml': if dataType == 'xml' the server response is treated as XML and the 'after' + * 'xml': if dataType == 'xml' the server response is treated as XML and the 'success' * callback method, if specified, will be passed the responseXML value * 'json': if dataType == 'json' the server response will be evaluted and passed to - * the 'after' callback, if specified + * the 'success' callback, if specified * 'script': if dataType == 'script' the server response is evaluated in the global context * * @@ -175,34 +175,38 @@ * @param options object literal containing options which control the form submission process * @cat Plugins/Form * @return jQuery - * @see formToArray - * @see ajaxForm - * @see $.ajax - * @author jQuery Community */ -jQuery.fn.ajaxSubmit = function(options) { +$.fn.ajaxSubmit = function(options) { if (typeof options == 'function') options = { success: options }; - options = jQuery.extend({ - url: this.attr('action') || '', - method: this.attr('method') || 'GET' + options = $.extend({ + url: this.attr('action') || window.location.toString(), + type: this.attr('method') || 'GET' }, options || {}); - // remap deprecated options (temporarily) - options.success = options.success || options.after; - options.beforeSubmit = options.beforeSubmit || options.before; - options.type = options.type || options.method; + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + $.event.trigger('form.pre.serialize', [this, options, veto]); + if (veto.veto) return this; var a = this.formToArray(options.semantic); + if (options.data) { + for (var n in options.data) + a.push( { name: n, value: options.data[n] } ); + } // give pre-submit callback an opportunity to abort the submit if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this; - var q = jQuery.param(a); + // fire vetoable 'validate' event + $.event.trigger('form.submit.validate', [a, this, options, veto]); + if (veto.veto) return this; + + var q = $.param(a);//.replace(/%20/g,'+'); if (options.type.toUpperCase() == 'GET') { - // if url already has a '?' then append args after '&' options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; options.data = null; // data is null for 'get' } @@ -216,8 +220,11 @@ jQuery.fn.ajaxSubmit = function(options) { // perform a load on the target only if dataType is not provided if (!options.dataType && options.target) { var oldSuccess = options.success || function(){}; - callbacks.push(function(data, status) { - jQuery(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, [data, status]); + callbacks.push(function(data) { + if (this.evalScripts) + $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments); + else // jQuery v1.1.4 + $(options.target).html(data).each(oldSuccess, arguments); }); } else if (options.success) @@ -225,12 +232,151 @@ jQuery.fn.ajaxSubmit = function(options) { options.success = function(data, status) { for (var i=0, max=callbacks.length; i < max; i++) - callbacks[i](data, status); + callbacks[i](data, status, $form); }; - jQuery.ajax(options); + // are there files to upload? + var files = $('input:file', this).fieldValue(); + var found = false; + for (var j=0; j < files.length; j++) + if (files[j]) + found = true; + + // options.iframe allows user to force iframe mode + if (options.iframe || found) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if ($.browser.safari && options.closeKeepAlive) + $.get(options.closeKeepAlive, fileUpload); + else + fileUpload(); + } + else + $.ajax(options); + + // fire 'notify' event + $.event.trigger('form.submit.notify', [this, options]); return this; + + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUpload() { + var form = $form[0]; + var opts = $.extend({}, $.ajaxSettings, options); + + var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++; + var $io = $('