<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[17944] trunk/wp-includes: Update jQuery Form plugin, props duck_, fixes #15909</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg > ul, #logmsg > ol { margin-left: 0; margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/17944">17944</a></dd>
<dt>Author</dt> <dd>azaozz</dd>
<dt>Date</dt> <dd>2011-05-17 14:22:50 +0000 (Tue, 17 May 2011)</dd>
</dl>
<h3>Log Message</h3>
<pre>Update jQuery Form plugin, props duck_, fixes <a href="http://trac.wordpress.org/ticket/15909">#15909</a></pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpincludesjsjqueryjqueryformdevjs">trunk/wp-includes/js/jquery/jquery.form.dev.js</a></li>
<li><a href="#trunkwpincludesjsjqueryjqueryformjs">trunk/wp-includes/js/jquery/jquery.form.js</a></li>
<li><a href="#trunkwpincludesscriptloaderphp">trunk/wp-includes/script-loader.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpincludesjsjqueryjqueryformdevjs"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/js/jquery/jquery.form.dev.js (17943 => 17944)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jquery/jquery.form.dev.js        2011-05-17 06:19:00 UTC (rev 17943)
+++ trunk/wp-includes/js/jquery/jquery.form.dev.js        2011-05-17 14:22:50 UTC (rev 17944)
</span><span class="lines">@@ -1,382 +1,470 @@
</span><del>-/*
</del><ins>+/*!
</ins><span class="cx"> * jQuery Form Plugin
</span><del>- * version: 2.02 (12/16/2007)
- * @requires jQuery v1.1 or later
</del><ins>+ * version: 2.73 (03-MAY-2011)
+ * @requires jQuery v1.3.2 or later
</ins><span class="cx"> *
</span><del>- * Examples at: http://malsup.com/jquery/form/
</del><ins>+ * Examples and documentation at: http://malsup.com/jquery/form/
</ins><span class="cx"> * Dual licensed under the MIT and GPL licenses:
</span><span class="cx"> * http://www.opensource.org/licenses/mit-license.php
</span><span class="cx"> * http://www.gnu.org/licenses/gpl.html
</span><del>- *
- * Revision: $Id$
</del><span class="cx"> */
</span><del>- (function($) {
</del><ins>+;(function($) {
+
+/*
+        Usage Note:
+        -----------
+        Do not use both ajaxSubmit and ajaxForm on the same form. These
+        functions are intended to be exclusive. Use ajaxSubmit if you want
+        to bind your own submit handler to the form. For example,
+
+        $(document).ready(function() {
+                $('#myForm').bind('submit', function(e) {
+                        e.preventDefault(); // <-- important
+                        $(this).ajaxSubmit({
+                                target: '#output'
+                        });
+                });
+        });
+
+        Use ajaxForm when you want the plugin to manage all the event binding
+        for you. For example,
+
+        $(document).ready(function() {
+                $('#myForm').ajaxForm({
+                        target: '#output'
+                });
+        });
+
+        When using ajaxForm, the ajaxSubmit function will be invoked for you
+        at the appropriate time.
+*/
+
</ins><span class="cx"> /**
</span><del>- * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
- *
- * ajaxSubmit accepts a single argument which can be either a success callback function
- * or an options Object. If a function is provided it will be invoked upon successful
- * completion of the submit and will be passed the response from the server.
- * If an options Object is provided, the following attributes are supported:
- *
- * target: Identifies the element(s) in the page to be updated with the server response.
- * This value may be specified as a jQuery selection string, a jQuery object,
- * or a DOM element.
- * default value: null
- *
- * url: URL to which the form data will be submitted.
- * default value: value of form's 'action' attribute
- *
- * 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)
- *
- * 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
- *
- * 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
- *
- * dataType: Expected dataType of the response. One of: null, 'xml', 'script', or 'json'
- * default value: null
- *
- * semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
- * default value: false
- *
- * resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
- *
- * clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
- *
- *
- * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
- * validating the form data. If the 'beforeSubmit' callback returns false then the form will
- * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
- * in array format, the jQuery object, and the options object passed into ajaxSubmit.
- * The form data array takes the following form:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * If a 'success' callback method is provided it is invoked after the response has been returned
- * from the server. It is passed the responseText or responseXML value (depending on dataType).
- * See jQuery.ajax for further details.
- *
- *
- * 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 '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 'success' callback, if specified
- * 'script': if dataType == 'script' the server response is evaluated in the global context
- *
- *
- * Note that it does not make sense to use both the 'target' and 'dataType' options. If both
- * are provided the target will be ignored.
- *
- * The semantic argument can be used to force form serialization in semantic order.
- * This is normally true anyway, unless the form contains input elements of type='image'.
- * If your form must be submitted with name/value pairs in semantic order and your form
- * contains an input of type='image" then pass true for this arg, otherwise pass false
- * (or nothing) to avoid the overhead for this logic.
- *
- *
- * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
- *
- * $("#form-id").submit(function() {
- * $(this).ajaxSubmit(options);
- * return false; // cancel conventional submit
- * });
- *
- * When using ajaxForm(), however, this is done for you.
- *
- * @example
- * $('#myForm').ajaxSubmit(function(data) {
- * alert('Form submit succeeded! Server returned: ' + data);
- * });
- * @desc Submit form and alert server response
- *
- *
- * @example
- * var options = {
- * target: '#myTargetDiv'
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Submit form and update page element with server response
- *
- *
- * @example
- * var options = {
- * success: function(responseText) {
- * alert(responseText);
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Submit form and alert the server response
- *
- *
- * @example
- * var options = {
- * beforeSubmit: function(formArray, jqForm) {
- * if (formArray.length == 0) {
- * alert('Please enter data.');
- * return false;
- * }
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Pre-submit validation which aborts the submit operation if form data is empty
- *
- *
- * @example
- * var options = {
- * url: myJsonUrl.php,
- * dataType: 'json',
- * success: function(data) {
- * // 'data' is an object representing the the evaluated json data
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc json data returned and evaluated
- *
- *
- * @example
- * var options = {
- * url: myXmlUrl.php,
- * dataType: 'xml',
- * success: function(responseXML) {
- * // responseXML is XML document object
- * var data = $('myElement', responseXML).text();
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc XML data returned from server
- *
- *
- * @example
- * var options = {
- * resetForm: true
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc submit form and reset it if successful
- *
- * @example
- * $('#myForm).submit(function() {
- * $(this).ajaxSubmit();
- * return false;
- * });
- * @desc Bind form's submit event to use ajaxSubmit
- *
- *
- * @name ajaxSubmit
- * @type jQuery
- * @param options object literal containing options which control the form submission process
- * @cat Plugins/Form
- * @return jQuery
</del><ins>+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
</ins><span class="cx"> */
</span><span class="cx"> $.fn.ajaxSubmit = function(options) {
</span><del>- if (typeof options == 'function')
- options = { success: options };
</del><ins>+        // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+        if (!this.length) {
+                log('ajaxSubmit: skipping submit process - no element selected');
+                return this;
+        }
</ins><span class="cx">
</span><del>- options = $.extend({
- url: this.attr('action') || window.location.toString(),
- type: this.attr('method') || 'GET'
- }, options || {});
</del><ins>+        if (typeof options == 'function') {
+                options = { success: options };
+        }
</ins><span class="cx">
</span><del>- // 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;
</del><ins>+        var action = this.attr('action');
+        var url = (typeof action === 'string') ? $.trim(action) : '';
+        if (url) {
+                // clean url (don't include hash vaue)
+                url = (url.match(/^([^#]+)/)||[])[1];
+        }
+        url = url || window.location.href || '';
</ins><span class="cx">
</span><del>- var a = this.formToArray(options.semantic);
</del><ins>+        options = $.extend(true, {
+                url: url,
+                success: $.ajaxSettings.success,
+                type: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57)
+                iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+        }, options);
+
+        // hook for manipulating the form data before it is extracted;
+        // convenient for use with rich editors like tinyMCE or FCKEditor
+        var veto = {};
+        this.trigger('form-pre-serialize', [this, options, veto]);
+        if (veto.veto) {
+                log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+                return this;
+        }
+
+        // provide opportunity to alter form data before it is serialized
+        if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+                log('ajaxSubmit: submit aborted via beforeSerialize callback');
+                return this;
+        }
+
+        var n,v,a = this.formToArray(options.semantic);
</ins><span class="cx">         if (options.data) {
</span><del>-         for (var n in options.data)
-         a.push( { name: n, value: options.data[n] } );
</del><ins>+                options.extraData = options.data;
+                for (n in options.data) {
+                        if(options.data[n] instanceof Array) {
+                                for (var k in options.data[n]) {
+                                        a.push( { name: n, value: options.data[n][k] } );
+                                }
+                        }
+                        else {
+                                v = options.data[n];
+                                v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
+                                a.push( { name: n, value: v } );
+                        }
+                }
</ins><span class="cx">         }
</span><span class="cx">
</span><del>- // give pre-submit callback an opportunity to abort the submit
- if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
</del><ins>+        // give pre-submit callback an opportunity to abort the submit
+        if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+                log('ajaxSubmit: submit aborted via beforeSubmit callback');
+                return this;
+        }
</ins><span class="cx">
</span><del>- // fire vetoable 'validate' event
- $.event.trigger('form.submit.validate', [a, this, options, veto]);
- if (veto.veto) return this;
</del><ins>+        // fire vetoable 'validate' event
+        this.trigger('form-submit-validate', [a, this, options, veto]);
+        if (veto.veto) {
+                log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+                return this;
+        }
</ins><span class="cx">
</span><del>- var q = $.param(a);//.replace(/%20/g,'+');
</del><ins>+        var q = $.param(a);
</ins><span class="cx">
</span><del>- if (options.type.toUpperCase() == 'GET') {
- options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
- options.data = null; // data is null for 'get'
- }
- else
- options.data = q; // data is the query string for 'post'
</del><ins>+        if (options.type.toUpperCase() == 'GET') {
+                options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+                options.data = null; // data is null for 'get'
+        }
+        else {
+                options.data = q; // data is the query string for 'post'
+        }
</ins><span class="cx">
</span><del>- var $form = this, callbacks = [];
- if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
- if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
</del><ins>+        var $form = this, callbacks = [];
+        if (options.resetForm) {
+                callbacks.push(function() { $form.resetForm(); });
+        }
+        if (options.clearForm) {
+                callbacks.push(function() { $form.clearForm(); });
+        }
</ins><span class="cx">
</span><del>- // 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) {
- 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)
- callbacks.push(options.success);
</del><ins>+        // 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) {
+                        var fn = options.replaceTarget ? 'replaceWith' : 'html';
+                        $(options.target)[fn](data).each(oldSuccess, arguments);
+                });
+        }
+        else if (options.success) {
+                callbacks.push(options.success);
+        }
</ins><span class="cx">
</span><del>- options.success = function(data, status) {
- for (var i=0, max=callbacks.length; i < max; i++)
- callbacks[i](data, status, $form);
- };
</del><ins>+        options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+                var context = options.context || options; // jQuery 1.4+ supports scope context
+                for (var i=0, max=callbacks.length; i < max; i++) {
+                        callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+                }
+        };
</ins><span class="cx">
</span><del>- // 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;
</del><ins>+        // are there files to upload?
+        var fileInputs = $('input:file', this).length > 0;
+        var mp = 'multipart/form-data';
+        var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
</ins><span class="cx">
</span><del>- // 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);
</del><ins>+        // options.iframe allows user to force iframe mode
+        // 06-NOV-09: now defaulting to iframe mode if file input is detected
+ if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
+         // hack to fix Safari hang (thanks to Tim Molendijk for this)
+         // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+         if (options.closeKeepAlive) {
+                 $.get(options.closeKeepAlive, fileUpload);
+                }
+         else {
+                 fileUpload();
+                }
+ }
+ else {
+                $.ajax(options);
+ }
</ins><span class="cx">
</span><del>- // fire 'notify' event
- $.event.trigger('form.submit.notify', [this, options]);
- return this;
</del><ins>+        // fire 'notify' event
+        this.trigger('form-submit-notify', [this, options]);
+        return this;
</ins><span class="cx">
</span><span class="cx">
</span><del>- // private function for handling file uploads (hat tip to YAHOO!)
- function fileUpload() {
- var form = $form[0];
- var opts = $.extend({}, $.ajaxSettings, options);
</del><ins>+        // private function for handling file uploads (hat tip to YAHOO!)
+        function fileUpload() {
+                var form = $form[0];
</ins><span class="cx">
</span><del>- var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
- var $io = $('<iframe id="' + id + '" name="' + id + '" />');
- var io = $io[0];
- var op8 = $.browser.opera && window.opera.version() < 9;
- if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
- $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
</del><ins>+                if ($(':input[name=submit],:input[id=submit]', form).length) {
+                        // if there is an input with a name or id of 'submit' then we won't be
+                        // able to invoke the submit fn on the form (at least not x-browser)
+                        alert('Error: Form elements must not have name or id of "submit".');
+                        return;
+                }
</ins><span class="cx">
</span><del>- var xhr = { // mock object
- responseText: null,
- responseXML: null,
- status: 0,
- statusText: 'n/a',
- getAllResponseHeaders: function() {},
- getResponseHeader: function() {},
- setRequestHeader: function() {}
- };
</del><ins>+                var s = $.extend(true, {}, $.ajaxSettings, options);
+                s.context = s.context || s;
+                var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id;
+                var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" />');
+                var io = $io[0];
</ins><span class="cx">
</span><del>- var g = opts.global;
- // trigger ajax global events so that activity/block indicators work like normal
- if (g && ! $.active++) $.event.trigger("ajaxStart");
- if (g) $.event.trigger("ajaxSend", [xhr, opts]);
</del><ins>+                $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
</ins><span class="cx">
</span><del>- var cbInvoked = 0;
- var timedOut = 0;
</del><ins>+                var xhr = { // mock object
+                        aborted: 0,
+                        responseText: null,
+                        responseXML: null,
+                        status: 0,
+                        statusText: 'n/a',
+                        getAllResponseHeaders: function() {},
+                        getResponseHeader: function() {},
+                        setRequestHeader: function() {},
+                        abort: function(status) {
+                                var e = (status === 'timeout' ? 'timeout' : 'aborted');
+                                log('aborting upload... ' + e);
+                                this.aborted = 1;
+                                $io.attr('src', s.iframeSrc); // abort op in progress
+                                xhr.error = e;
+                                s.error && s.error.call(s.context, xhr, e, e);
+                                g && $.event.trigger("ajaxError", [xhr, s, e]);
+                                s.complete && s.complete.call(s.context, xhr, e);
+                        }
+                };
</ins><span class="cx">
</span><del>- // take a breath so that pending repaints get some cpu time before the upload starts
- setTimeout(function() {
- // make sure form attrs are set
- var encAttr = form.encoding ? 'encoding' : 'enctype';
- var t = $form.attr('target');
- $form.attr({
- target: id,
- method: 'POST',
- action: opts.url
- });
- form[encAttr] = 'multipart/form-data';
</del><ins>+                var g = s.global;
+                // trigger ajax global events so that activity/block indicators work like normal
+                if (g && ! $.active++) {
+                        $.event.trigger("ajaxStart");
+                }
+                if (g) {
+                        $.event.trigger("ajaxSend", [xhr, s]);
+                }
</ins><span class="cx">
</span><del>- // support timout
- if (opts.timeout)
- setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
</del><ins>+                if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+                        if (s.global) {
+                                $.active--;
+                        }
+                        return;
+                }
+                if (xhr.aborted) {
+                        return;
+                }
</ins><span class="cx">
</span><del>- // add iframe to doc and submit the form
- $io.appendTo('body');
- io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
- form.submit();
- $form.attr('target', t); // reset target
- }, 10);
</del><ins>+                var timedOut = 0, timeoutHandle;
</ins><span class="cx">
</span><del>- function cb() {
- if (cbInvoked++) return;
</del><ins>+                // add submitting element to data if we know it
+                var sub = form.clk;
+                if (sub) {
+                        var n = sub.name;
+                        if (n && !sub.disabled) {
+                                s.extraData = s.extraData || {};
+                                s.extraData[n] = sub.value;
+                                if (sub.type == "image") {
+                                        s.extraData[n+'.x'] = form.clk_x;
+                                        s.extraData[n+'.y'] = form.clk_y;
+                                }
+                        }
+                }
</ins><span class="cx">
</span><ins>+                // take a breath so that pending repaints get some cpu time before the upload starts
+                function doSubmit() {
+                        // make sure form attrs are set
+                        var t = $form.attr('target'), a = $form.attr('action');
+
+                        // update form attrs in IE friendly way
+                        form.setAttribute('target',id);
+                        if (form.getAttribute('method') != 'POST') {
+                                form.setAttribute('method', 'POST');
+                        }
+                        if (form.getAttribute('action') != s.url) {
+                                form.setAttribute('action', s.url);
+                        }
+
+                        // ie borks in some cases when setting encoding
+                        if (! s.skipEncodingOverride) {
+                                $form.attr({
+                                        encoding: 'multipart/form-data',
+                                        enctype: 'multipart/form-data'
+                                });
+                        }
+
+                        // support timout
+                        if (s.timeout) {
+                                timeoutHandle = setTimeout(function() { timedOut = true; cb(true); }, s.timeout);
+                        }
+
+                        // add "extra" data to form if provided in options
+                        var extraInputs = [];
+                        try {
+                                if (s.extraData) {
+                                        for (var n in s.extraData) {
+                                                extraInputs.push(
+                                                        $('<input type="hidden" name="'+n+'" value="'+s.extraData[n]+'" />')
+                                                                .appendTo(form)[0]);
+                                        }
+                                }
+
+                                // add iframe to doc and submit the form
+                                $io.appendTo('body');
+ io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+                                form.submit();
+                        }
+                        finally {
+                                // reset attrs and remove "extra" input elements
+                                form.setAttribute('action',a);
+                                if(t) {
+                                        form.setAttribute('target', t);
+                                } else {
+                                        $form.removeAttr('target');
+                                }
+                                $(extraInputs).remove();
+                        }
+                }
+
+                if (s.forceSync) {
+                        doSubmit();
+                }
+                else {
+                        setTimeout(doSubmit, 10); // this lets dom updates render
+                }
+
+                var data, doc, domCheckCount = 50, callbackProcessed;
+
+                function cb(e) {
+                        if (xhr.aborted || callbackProcessed) {
+                                return;
+                        }
+                        if (e === true && xhr) {
+                                xhr.abort('timeout');
+                                return;
+                        }
+
+                        var doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+                        if (!doc || doc.location.href == s.iframeSrc) {
+                                // response not received yet
+                                if (!timedOut)
+                                        return;
+                        }
</ins><span class="cx"> io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
</span><span class="cx">
</span><del>- var ok = true;
- try {
- if (timedOut) throw 'timeout';
- // extract the server response from the iframe
- var data, doc;
- doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
- xhr.responseText = doc.body ? doc.body.innerHTML : null;
- xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
</del><ins>+                        var ok = true;
+                        try {
+                                if (timedOut) {
+                                        throw 'timeout';
+                                }
</ins><span class="cx">
</span><del>- if (opts.dataType == 'json' || opts.dataType == 'script') {
- var ta = doc.getElementsByTagName('textarea')[0];
- data = ta ? ta.value : xhr.responseText;
- if (opts.dataType == 'json')
- eval("data = " + data);
- else
- $.globalEval(data);
- }
- else if (opts.dataType == 'xml') {
- data = xhr.responseXML;
- if (!data && xhr.responseText != null)
- data = toXml(xhr.responseText);
- }
- else {
- data = xhr.responseText;
- }
- }
- catch(e){
- ok = false;
- $.handleError(opts, xhr, 'error', e);
- }
</del><ins>+                                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+                                log('isXml='+isXml);
+                                if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
+                                        if (--domCheckCount) {
+                                                // in some browsers (Opera) the iframe DOM is not always traversable when
+                                                // the onload callback fires, so we loop a bit to accommodate
+                                                log('requeing onLoad callback, DOM not available');
+                                                setTimeout(cb, 250);
+                                                return;
+                                        }
+                                        // let this fall through because server response could be an empty document
+                                        //log('Could not access iframe DOM after mutiple tries.');
+                                        //throw 'DOMException: not available';
+                                }
</ins><span class="cx">
</span><del>- // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
- if (ok) {
- opts.success(data, 'success');
- if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
- }
- if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
- if (g && ! --$.active) $.event.trigger("ajaxStop");
- if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
</del><ins>+                                //log('response detected');
+                                xhr.responseText = doc.body ? doc.body.innerHTML : doc.documentElement ? doc.documentElement.innerHTML : null;
+                                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+                                if (isXml)
+                                        s.dataType = 'xml';
+                                xhr.getResponseHeader = function(header){
+                                        var headers = {'content-type': s.dataType};
+                                        return headers[header];
+                                };
</ins><span class="cx">
</span><del>- // clean up
- setTimeout(function() {
- $io.remove();
- xhr.responseXML = null;
- }, 100);
- };
</del><ins>+                                var scr = /(json|script|text)/.test(s.dataType);
+                                if (scr || s.textarea) {
+                                        // see if user embedded response in textarea
+                                        var ta = doc.getElementsByTagName('textarea')[0];
+                                        if (ta) {
+                                                xhr.responseText = ta.value;
+                                        }
+                                        else if (scr) {
+                                                // account for browsers injecting pre around json response
+                                                var pre = doc.getElementsByTagName('pre')[0];
+                                                var b = doc.getElementsByTagName('body')[0];
+                                                if (pre) {
+                                                        xhr.responseText = pre.textContent;
+                                                }
+                                                else if (b) {
+                                                        xhr.responseText = b.innerHTML;
+                                                }
+                                        }
+                                }
+                                else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
+                                        xhr.responseXML = toXml(xhr.responseText);
+                                }
</ins><span class="cx">
</span><del>- function toXml(s, doc) {
- if (window.ActiveXObject) {
- doc = new ActiveXObject('Microsoft.XMLDOM');
- doc.async = 'false';
- doc.loadXML(s);
- }
- else
- doc = (new DOMParser()).parseFromString(s, 'text/xml');
- return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
- };
- };
</del><ins>+                                data = httpData(xhr, s.dataType, s);
+                        }
+                        catch(e){
+                                log('error caught:',e);
+                                ok = false;
+                                xhr.error = e;
+                                s.error && s.error.call(s.context, xhr, 'error', e);
+                                g && $.event.trigger("ajaxError", [xhr, s, e]);
+                        }
+
+                        if (xhr.aborted) {
+                                log('upload aborted');
+                                ok = false;
+                        }
+
+                        // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+                        if (ok) {
+                                s.success && s.success.call(s.context, data, 'success', xhr);
+                                g && $.event.trigger("ajaxSuccess", [xhr, s]);
+                        }
+
+                        g && $.event.trigger("ajaxComplete", [xhr, s]);
+
+                        if (g && ! --$.active) {
+                                $.event.trigger("ajaxStop");
+                        }
+
+                        s.complete && s.complete.call(s.context, xhr, ok ? 'success' : 'error');
+
+                        callbackProcessed = true;
+                        if (s.timeout)
+                                clearTimeout(timeoutHandle);
+
+                        // clean up
+                        setTimeout(function() {
+                                $io.removeData('form-plugin-onload');
+                                $io.remove();
+                                xhr.responseXML = null;
+                        }, 100);
+                }
+
+                var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
+                        if (window.ActiveXObject) {
+                                doc = new ActiveXObject('Microsoft.XMLDOM');
+                                doc.async = 'false';
+                                doc.loadXML(s);
+                        }
+                        else {
+                                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+                        }
+                        return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+                };
+                var parseJSON = $.parseJSON || function(s) {
+                        return window['eval']('(' + s + ')');
+                };
+
+                var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
+                        var ct = xhr.getResponseHeader('content-type') || '',
+                                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+                                data = xml ? xhr.responseXML : xhr.responseText;
+
+                        if (xml && data.documentElement.nodeName === 'parsererror') {
+                                $.error && $.error('parsererror');
+                        }
+                        if (s && s.dataFilter) {
+                                data = s.dataFilter(data, type);
+                        }
+                        if (typeof data === 'string') {
+                                if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+                                        data = parseJSON(data);
+                                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+                                        $.globalEval(data);
+                                }
+                        }
+                        return data;
+                };
+        }
</ins><span class="cx"> };
</span><del>-$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
</del><span class="cx">
</span><span class="cx"> /**
</span><span class="cx"> * ajaxForm() provides a mechanism for fully automating form submission.
</span><span class="lines">@@ -384,112 +472,70 @@
</span><span class="cx"> * The advantages of using this method instead of ajaxSubmit() are:
</span><span class="cx"> *
</span><span class="cx"> * 1: This method will include coordinates for <input type="image" /> elements (if the element
</span><del>- * is used to submit the form).
</del><ins>+ *        is used to submit the form).
</ins><span class="cx"> * 2. This method will include the submit element's name/value data (for the element that was
</span><del>- * used to submit the form).
</del><ins>+ *        used to submit the form).
</ins><span class="cx"> * 3. This method binds the submit() method to the form for you.
</span><span class="cx"> *
</span><del>- * Note that for accurate x/y coordinates of image submit elements in all browsers
- * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
- *
</del><span class="cx"> * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
</span><span class="cx"> * passes the options argument along after properly binding events for submit elements and
</span><del>- * the form itself. See ajaxSubmit for a full description of the options argument.
- *
- *
- * @example
- * var options = {
- * target: '#myTargetDiv'
- * };
- * $('#myForm').ajaxSForm(options);
- * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
- * when the form is submitted.
- *
- *
- * @example
- * var options = {
- * success: function(responseText) {
- * alert(responseText);
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Bind form's submit event so that server response is alerted after the form is submitted.
- *
- *
- * @example
- * var options = {
- * beforeSubmit: function(formArray, jqForm) {
- * if (formArray.length == 0) {
- * alert('Please enter data.');
- * return false;
- * }
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Bind form's submit event so that pre-submit callback is invoked before the form
- * is submitted.
- *
- *
- * @name ajaxForm
- * @param options object literal containing options which control the form submission process
- * @return jQuery
- * @cat Plugins/Form
- * @type jQuery
</del><ins>+ * the form itself.
</ins><span class="cx"> */
</span><span class="cx"> $.fn.ajaxForm = function(options) {
</span><del>- return this.ajaxFormUnbind().submit(submitHandler).each(function() {
- // store options in hash
- this.formPluginId = $.fn.ajaxForm.counter++;
- $.fn.ajaxForm.optionHash[this.formPluginId] = options;
- $(":submit,input:image", this).click(clickHandler);
- });
-};
</del><ins>+        // in jQuery 1.3+ we can fix mistakes with the ready state
+        if (this.length === 0) {
+                var o = { s: this.selector, c: this.context };
+                if (!$.isReady && o.s) {
+                        log('DOM not ready, queuing ajaxForm');
+                        $(function() {
+                                $(o.s,o.c).ajaxForm(options);
+                        });
+                        return this;
+                }
+                // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+                log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+                return this;
+        }
</ins><span class="cx">
</span><del>-$.fn.ajaxForm.counter = 1;
-$.fn.ajaxForm.optionHash = {};
-
-function clickHandler(e) {
- var $form = this.form;
- $form.clk = this;
- if (this.type == 'image') {
- if (e.offsetX != undefined) {
- $form.clk_x = e.offsetX;
- $form.clk_y = e.offsetY;
- } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
- var offset = $(this).offset();
- $form.clk_x = e.pageX - offset.left;
- $form.clk_y = e.pageY - offset.top;
- } else {
- $form.clk_x = e.pageX - this.offsetLeft;
- $form.clk_y = e.pageY - this.offsetTop;
- }
- }
- // clear form vars
- setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
</del><ins>+        return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
+                if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+                        e.preventDefault();
+                        $(this).ajaxSubmit(options);
+                }
+        }).bind('click.form-plugin', function(e) {
+                var target = e.target;
+                var $el = $(target);
+                if (!($el.is(":submit,input:image"))) {
+                        // is this a child element of the submit el? (ex: a span within a button)
+                        var t = $el.closest(':submit');
+                        if (t.length == 0) {
+                                return;
+                        }
+                        target = t[0];
+                }
+                var form = this;
+                form.clk = target;
+                if (target.type == 'image') {
+                        if (e.offsetX != undefined) {
+                                form.clk_x = e.offsetX;
+                                form.clk_y = e.offsetY;
+                        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+                                var offset = $el.offset();
+                                form.clk_x = e.pageX - offset.left;
+                                form.clk_y = e.pageY - offset.top;
+                        } else {
+                                form.clk_x = e.pageX - target.offsetLeft;
+                                form.clk_y = e.pageY - target.offsetTop;
+                        }
+                }
+                // clear form vars
+                setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+        });
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-function submitHandler() {
- // retrieve options from hash
- var id = this.formPluginId;
- var options = $.fn.ajaxForm.optionHash[id];
- $(this).ajaxSubmit(options);
- return false;
-};
-
-/**
- * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
- *
- * @name ajaxFormUnbind
- * @return jQuery
- * @cat Plugins/Form
- * @type jQuery
- */
</del><ins>+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
</ins><span class="cx"> $.fn.ajaxFormUnbind = function() {
</span><del>- this.unbind('submit', submitHandler);
- return this.each(function() {
- $(":submit,input:image", this).unbind('click', clickHandler);
- });
-
</del><ins>+        return this.unbind('submit.form-plugin click.form-plugin');
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> /**
</span><span class="lines">@@ -502,144 +548,103 @@
</span><span class="cx"> *
</span><span class="cx"> * It is this array that is passed to pre-submit callback functions provided to the
</span><span class="cx"> * ajaxSubmit() and ajaxForm() methods.
</span><del>- *
- * The semantic argument can be used to force form serialization in semantic order.
- * This is normally true anyway, unless the form contains input elements of type='image'.
- * If your form must be submitted with name/value pairs in semantic order and your form
- * contains an input of type='image" then pass true for this arg, otherwise pass false
- * (or nothing) to avoid the overhead for this logic.
- *
- * @example var data = $("#myForm").formToArray();
- * $.post( "myscript.cgi", data );
- * @desc Collect all the data from a form and submit it to the server.
- *
- * @name formToArray
- * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
- * @type Array<Object>
- * @cat Plugins/Form
</del><span class="cx"> */
</span><span class="cx"> $.fn.formToArray = function(semantic) {
</span><del>- var a = [];
- if (this.length == 0) return a;
</del><ins>+        var a = [];
+        if (this.length === 0) {
+                return a;
+        }
</ins><span class="cx">
</span><del>- var form = this[0];
- var els = semantic ? form.getElementsByTagName('*') : form.elements;
- if (!els) return a;
- for(var i=0, max=els.length; i < max; i++) {
- var el = els[i];
- var n = el.name;
- if (!n) continue;
</del><ins>+        var form = this[0];
+        var els = semantic ? form.getElementsByTagName('*') : form.elements;
+        if (!els) {
+                return a;
+        }
</ins><span class="cx">
</span><del>- if (semantic && form.clk && el.type == "image") {
- // handle image inputs on the fly when semantic == true
- if(!el.disabled && form.clk == el)
- a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
- continue;
- }
</del><ins>+        var i,j,n,v,el,max,jmax;
+        for(i=0, max=els.length; i < max; i++) {
+                el = els[i];
+                n = el.name;
+                if (!n) {
+                        continue;
+                }
</ins><span class="cx">
</span><del>- var v = $.fieldValue(el, true);
- if (v && v.constructor == Array) {
- for(var j=0, jmax=v.length; j < jmax; j++)
- a.push({name: n, value: v[j]});
- }
- else if (v !== null && typeof v != 'undefined')
- a.push({name: n, value: v});
- }
</del><ins>+                if (semantic && form.clk && el.type == "image") {
+                        // handle image inputs on the fly when semantic == true
+                        if(!el.disabled && form.clk == el) {
+                                a.push({name: n, value: $(el).val()});
+                                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+                        }
+                        continue;
+                }
</ins><span class="cx">
</span><del>- if (!semantic && form.clk) {
- // input type=='image' are not found in elements array! handle them here
- var inputs = form.getElementsByTagName("input");
- for(var i=0, max=inputs.length; i < max; i++) {
- var input = inputs[i];
- var n = input.name;
- if(n && !input.disabled && input.type == "image" && form.clk == input)
- a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
- }
- }
- return a;
</del><ins>+                v = $.fieldValue(el, true);
+                if (v && v.constructor == Array) {
+                        for(j=0, jmax=v.length; j < jmax; j++) {
+                                a.push({name: n, value: v[j]});
+                        }
+                }
+                else if (v !== null && typeof v != 'undefined') {
+                        a.push({name: n, value: v});
+                }
+        }
+
+        if (!semantic && form.clk) {
+                // input type=='image' are not found in elements array! handle it here
+                var $input = $(form.clk), input = $input[0];
+                n = input.name;
+                if (n && !input.disabled && input.type == 'image') {
+                        a.push({name: n, value: $input.val()});
+                        a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+                }
+        }
+        return a;
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-
</del><span class="cx"> /**
</span><span class="cx"> * Serializes form data into a 'submittable' string. This method will return a string
</span><span class="cx"> * in the format: name1=value1&amp;name2=value2
</span><del>- *
- * The semantic argument can be used to force form serialization in semantic order.
- * If your form must be submitted with name/value pairs in semantic order then pass
- * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
- * this logic (which can be significant for very large forms).
- *
- * @example var data = $("#myForm").formSerialize();
- * $.ajax('POST', "myscript.cgi", data);
- * @desc Collect all the data from a form into a single string
- *
- * @name formSerialize
- * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
- * @type String
- * @cat Plugins/Form
</del><span class="cx"> */
</span><span class="cx"> $.fn.formSerialize = function(semantic) {
</span><del>- //hand off to jQuery.param for proper encoding
- return $.param(this.formToArray(semantic));
</del><ins>+        //hand off to jQuery.param for proper encoding
+        return $.param(this.formToArray(semantic));
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-
</del><span class="cx"> /**
</span><span class="cx"> * Serializes all field elements in the jQuery object into a query string.
</span><span class="cx"> * This method will return a string in the format: name1=value1&amp;name2=value2
</span><del>- *
- * The successful argument controls whether or not serialization is limited to
- * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.
- *
- * @example var data = $("input").formSerialize();
- * @desc Collect the data from all successful input elements into a query string
- *
- * @example var data = $(":radio").formSerialize();
- * @desc Collect the data from all successful radio input elements into a query string
- *
- * @example var data = $("#myForm :checkbox").formSerialize();
- * @desc Collect the data from all successful checkbox input elements in myForm into a query string
- *
- * @example var data = $("#myForm :checkbox").formSerialize(false);
- * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
- *
- * @example var data = $(":input").formSerialize();
- * @desc Collect the data from all successful input, select, textarea and button elements into a query string
- *
- * @name fieldSerialize
- * @param successful true if only successful controls should be serialized (default is true)
- * @type String
- * @cat Plugins/Form
</del><span class="cx"> */
</span><span class="cx"> $.fn.fieldSerialize = function(successful) {
</span><del>- var a = [];
- this.each(function() {
- var n = this.name;
- if (!n) return;
- var v = $.fieldValue(this, successful);
- if (v && v.constructor == Array) {
- for (var i=0,max=v.length; i < max; i++)
- a.push({name: n, value: v[i]});
- }
- else if (v !== null && typeof v != 'undefined')
- a.push({name: this.name, value: v});
- });
- //hand off to jQuery.param for proper encoding
- return $.param(a);
</del><ins>+        var a = [];
+        this.each(function() {
+                var n = this.name;
+                if (!n) {
+                        return;
+                }
+                var v = $.fieldValue(this, successful);
+                if (v && v.constructor == Array) {
+                        for (var i=0,max=v.length; i < max; i++) {
+                                a.push({name: n, value: v[i]});
+                        }
+                }
+                else if (v !== null && typeof v != 'undefined') {
+                        a.push({name: this.name, value: v});
+                }
+        });
+        //hand off to jQuery.param for proper encoding
+        return $.param(a);
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-
</del><span class="cx"> /**
</span><span class="cx"> * Returns the value(s) of the element in the matched set. For example, consider the following form:
</span><span class="cx"> *
</span><span class="cx"> * <form><fieldset>
</span><del>- * <input name="A" type="text" />
- * <input name="A" type="text" />
- * <input name="B" type="checkbox" value="B1" />
- * <input name="B" type="checkbox" value="B2"/>
- * <input name="C" type="radio" value="C1" />
- * <input name="C" type="radio" value="C2" />
</del><ins>+ *         <input name="A" type="text" />
+ *         <input name="A" type="text" />
+ *         <input name="B" type="checkbox" value="B1" />
+ *         <input name="B" type="checkbox" value="B2"/>
+ *         <input name="C" type="radio" value="C1" />
+ *         <input name="C" type="radio" value="C2" />
</ins><span class="cx"> * </fieldset></form>
</span><span class="cx"> *
</span><span class="cx"> * var v = $(':text').fieldValue();
</span><span class="lines">@@ -666,95 +671,62 @@
</span><span class="cx"> * for each element is returned.
</span><span class="cx"> *
</span><span class="cx"> * Note: This method *always* returns an array. If no valid value can be determined the
</span><del>- * array will be empty, otherwise it will contain one or more values.
- *
- * @example var data = $("#myPasswordElement").fieldValue();
- * alert(data[0]);
- * @desc Alerts the current value of the myPasswordElement element
- *
- * @example var data = $("#myForm :input").fieldValue();
- * @desc Get the value(s) of the form elements in myForm
- *
- * @example var data = $("#myForm :checkbox").fieldValue();
- * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
- *
- * @example var data = $("#mySingleSelect").fieldValue();
- * @desc Get the value(s) of the select control
- *
- * @example var data = $(':text').fieldValue();
- * @desc Get the value(s) of the text input or textarea elements
- *
- * @example var data = $("#myMultiSelect").fieldValue();
- * @desc Get the values for the select-multiple control
- *
- * @name fieldValue
- * @param Boolean successful true if only the values for successful controls should be returned (default is true)
- * @type Array<String>
- * @cat Plugins/Form
</del><ins>+ *         array will be empty, otherwise it will contain one or more values.
</ins><span class="cx"> */
</span><span class="cx"> $.fn.fieldValue = function(successful) {
</span><del>- for (var val=[], i=0, max=this.length; i < max; i++) {
- var el = this[i];
- var v = $.fieldValue(el, successful);
- if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
- continue;
- v.constructor == Array ? $.merge(val, v) : val.push(v);
- }
- return val;
</del><ins>+        for (var val=[], i=0, max=this.length; i < max; i++) {
+                var el = this[i];
+                var v = $.fieldValue(el, successful);
+                if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+                        continue;
+                }
+                v.constructor == Array ? $.merge(val, v) : val.push(v);
+        }
+        return val;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> /**
</span><span class="cx"> * Returns the value of the field element.
</span><del>- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true. If the given element is not
- * successful and the successful arg is not false then the returned value will be null.
- *
- * Note: If the successful flag is true (default) but the element is not successful, the return will be null
- * Note: The value returned for a successful select-multiple element will always be an array.
- * Note: If the element has no value the return value will be undefined.
- *
- * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
- * @desc Gets the current value of the myPasswordElement element
- *
- * @name fieldValue
- * @param Element el The DOM element for which the value will be returned
- * @param Boolean successful true if value returned must be for a successful controls (default is true)
- * @type String or Array<String> or null or undefined
- * @cat Plugins/Form
</del><span class="cx"> */
</span><span class="cx"> $.fieldValue = function(el, successful) {
</span><del>- var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
- if (typeof successful == 'undefined') successful = true;
</del><ins>+        var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+        if (successful === undefined) {
+                successful = true;
+        }
</ins><span class="cx">
</span><del>- if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
- (t == 'checkbox' || t == 'radio') && !el.checked ||
- (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
- tag == 'select' && el.selectedIndex == -1))
- return null;
</del><ins>+        if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+                (t == 'checkbox' || t == 'radio') && !el.checked ||
+                (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+                tag == 'select' && el.selectedIndex == -1)) {
+                        return null;
+        }
</ins><span class="cx">
</span><del>- if (tag == 'select') {
- var index = el.selectedIndex;
- if (index < 0) return null;
- var a = [], ops = el.options;
- var one = (t == 'select-one');
- var max = (one ? index+1 : ops.length);
- for(var i=(one ? index : 0); i < max; i++) {
- var op = ops[i];
- if (op.selected) {
- // extra pain for IE...
- var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
- if (one) return v;
- a.push(v);
- }
- }
- return a;
- }
- return el.value;
</del><ins>+        if (tag == 'select') {
+                var index = el.selectedIndex;
+                if (index < 0) {
+                        return null;
+                }
+                var a = [], ops = el.options;
+                var one = (t == 'select-one');
+                var max = (one ? index+1 : ops.length);
+                for(var i=(one ? index : 0); i < max; i++) {
+                        var op = ops[i];
+                        if (op.selected) {
+                                var v = op.value;
+                                if (!v) { // extra pain for IE...
+                                        v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+                                }
+                                if (one) {
+                                        return v;
+                                }
+                                a.push(v);
+                        }
+                }
+                return a;
+        }
+        return $(el).val();
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-
</del><span class="cx"> /**
</span><span class="cx"> * Clears the form data. Takes the following actions on the form's input fields:
</span><span class="cx"> * - input text fields will have their 'value' property set to the empty string
</span><span class="lines">@@ -762,111 +734,93 @@
</span><span class="cx"> * - checkbox and radio inputs will have their 'checked' property set to false
</span><span class="cx"> * - inputs of type submit, button, reset, and hidden will *not* be effected
</span><span class="cx"> * - button elements will *not* be effected
</span><del>- *
- * @example $('form').clearForm();
- * @desc Clears all forms on the page.
- *
- * @name clearForm
- * @type jQuery
- * @cat Plugins/Form
</del><span class="cx"> */
</span><span class="cx"> $.fn.clearForm = function() {
</span><del>- return this.each(function() {
- $('input,select,textarea', this).clearFields();
- });
</del><ins>+        return this.each(function() {
+                $('input,select,textarea', this).clearFields();
+        });
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> /**
</span><del>- * Clears the selected form elements. Takes the following actions on the matched elements:
- * - input text fields will have their 'value' property set to the empty string
- * - select elements will have their 'selectedIndex' property set to -1
- * - checkbox and radio inputs will have their 'checked' property set to false
- * - inputs of type submit, button, reset, and hidden will *not* be effected
- * - button elements will *not* be effected
- *
- * @example $('.myInputs').clearFields();
- * @desc Clears all inputs with class myInputs
- *
- * @name clearFields
- * @type jQuery
- * @cat Plugins/Form
</del><ins>+ * Clears the selected form elements.
</ins><span class="cx"> */
</span><span class="cx"> $.fn.clearFields = $.fn.clearInputs = function() {
</span><del>- return this.each(function() {
- var t = this.type, tag = this.tagName.toLowerCase();
- if (t == 'text' || t == 'password' || tag == 'textarea')
- this.value = '';
- else if (t == 'checkbox' || t == 'radio')
- this.checked = false;
- else if (tag == 'select')
- this.selectedIndex = -1;
- });
</del><ins>+        return this.each(function() {
+                var t = this.type, tag = this.tagName.toLowerCase();
+                if (t == 'text' || t == 'password' || tag == 'textarea') {
+                        this.value = '';
+                }
+                else if (t == 'checkbox' || t == 'radio') {
+                        this.checked = false;
+                }
+                else if (tag == 'select') {
+                        this.selectedIndex = -1;
+                }
+        });
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-
</del><span class="cx"> /**
</span><span class="cx"> * Resets the form data. Causes all form elements to be reset to their original value.
</span><del>- *
- * @example $('form').resetForm();
- * @desc Resets all forms on the page.
- *
- * @name resetForm
- * @type jQuery
- * @cat Plugins/Form
</del><span class="cx"> */
</span><span class="cx"> $.fn.resetForm = function() {
</span><del>- return this.each(function() {
- // guard against an input with the name of 'reset'
- // note that IE reports the reset function as an 'object'
- if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
- this.reset();
- });
</del><ins>+        return this.each(function() {
+                // guard against an input with the name of 'reset'
+                // note that IE reports the reset function as an 'object'
+                if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+                        this.reset();
+                }
+        });
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-
</del><span class="cx"> /**
</span><span class="cx"> * Enables or disables any matching elements.
</span><del>- *
- * @example $(':radio').enabled(false);
- * @desc Disables all radio buttons
- *
- * @name select
- * @type jQuery
- * @cat Plugins/Form
</del><span class="cx"> */
</span><del>-$.fn.enable = function(b) {
- if (b == undefined) b = true;
- return this.each(function() {
- this.disabled = !b
- });
</del><ins>+$.fn.enable = function(b) {
+        if (b === undefined) {
+                b = true;
+        }
+        return this.each(function() {
+                this.disabled = !b;
+        });
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> /**
</span><span class="cx"> * Checks/unchecks any matching checkboxes or radio buttons and
</span><span class="cx"> * selects/deselects and matching option elements.
</span><del>- *
- * @example $(':checkbox').selected();
- * @desc Checks all checkboxes
- *
- * @name select
- * @type jQuery
- * @cat Plugins/Form
</del><span class="cx"> */
</span><del>-$.fn.select = function(select) {
- if (select == undefined) select = true;
- return this.each(function() {
- var t = this.type;
- if (t == 'checkbox' || t == 'radio')
- this.checked = select;
- else if (this.tagName.toLowerCase() == 'option') {
- var $sel = $(this).parent('select');
- if (select && $sel[0] && $sel[0].type == 'select-one') {
- // deselect all other options
- $sel.find('option').select(false);
- }
- this.selected = select;
- }
- });
</del><ins>+$.fn.selected = function(select) {
+        if (select === undefined) {
+                select = true;
+        }
+        return this.each(function() {
+                var t = this.type;
+                if (t == 'checkbox' || t == 'radio') {
+                        this.checked = select;
+                }
+                else if (this.tagName.toLowerCase() == 'option') {
+                        var $sel = $(this).parent('select');
+                        if (select && $sel[0] && $sel[0].type == 'select-one') {
+                                // deselect all other options
+                                $sel.find('option').selected(false);
+                        }
+                        this.selected = select;
+                }
+        });
</ins><span class="cx"> };
</span><span class="cx">
</span><ins>+// helper fn for console logging
+// set $.fn.ajaxSubmit.debug to true to enable debug logging
+function log() {
+        if ($.fn.ajaxSubmit.debug) {
+                var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+                if (window.console && window.console.log) {
+                        window.console.log(msg);
+                }
+                else if (window.opera && window.opera.postError) {
+                        window.opera.postError(msg);
+                }
+        }
+};
+
</ins><span class="cx"> })(jQuery);
</span><ins>+
</ins></span></pre></div>
<a id="trunkwpincludesjsjqueryjqueryformjs"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/js/jquery/jquery.form.js (17943 => 17944)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jquery/jquery.form.js        2011-05-17 06:19:00 UTC (rev 17943)
+++ trunk/wp-includes/js/jquery/jquery.form.js        2011-05-17 14:22:50 UTC (rev 17944)
</span><span class="lines">@@ -1 +1,11 @@
</span><del>-(function($){$.fn.ajaxSubmit=function(options){if(typeof options=="function"){options={success:options}}options=$.extend({url:this.attr("action")||window.location.toString(),type:this.attr("method")||"GET"},options||{});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]})}}if(options.beforeSubmit&&options.beforeSubmit(a,this,options)===false){return this}$.event.trigger("form.submit.validate",[a,this,options,veto]);if(veto.veto){return this}var q=$.param(a);if(options.type.toUpperCase()=="GET"){options.url+=(options.url.indexOf("?")>=0?"&":"?")+q;options.data=null}else{options.data=q}var $form=this,callbacks=[];if(options.resetForm){callbacks.push(function(){$form.resetForm()})}if(optio
ns.clearForm){callbacks.push(function(){$form.clearForm()})}if(!options.dataType&&options.target){var oldSuccess=options.success||function(){};callbacks.push(function(data){if(this.evalScripts){$(options.target).attr("innerHTML",data).evalScripts().each(oldSuccess,arguments)}else{$(options.target).html(data).each(oldSuccess,arguments)}})}else{if(options.success){callbacks.push(options.success)}}options.success=function(data,status){for(var i=0,max=callbacks.length;i<max;i++){callbacks[i](data,status,$form)}};var files=$("input:file",this).fieldValue();var found=false;for(var j=0;j<files.length;j++){if(files[j]){found=true}}if(options.iframe||found){if($.browser.safari&&options.closeKeepAlive){$.get(options.closeKeepAlive,fileUpload)}else{fileUpload()}}else{$.ajax(options)}$.event.trigger("form.submit.notify",[this,options]);return this;function fileUpload(){var form=$form[0];var opts=$.extend({},$.ajaxSettings,options);var
id="jqFormIO"+$.fn.ajaxSubmit.counter++;var $io=$('<iframe id="'+id+'" name="'+id+'" />');var io=$io[0];var op8=$.browser.opera&&window.opera.version()<9;if($.browser.msie||op8){io.src='javascript:false;document.write("");'}$io.css({position:"absolute",top:"-1000px",left:"-1000px"});var xhr={responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){}};var g=opts.global;if(g&&!$.active++){$.event.trigger("ajaxStart")}if(g){$.event.trigger("ajaxSend",[xhr,opts])}var cbInvoked=0;var timedOut=0;setTimeout(function(){var encAttr=form.encoding?"encoding":"enctype";var t=$form.attr("target");$form.attr({target:id,method:"POST",action:opts.url});form[encAttr]="multipart/form-data";if(opts.timeout){setTimeout(functio
n(){timedOut=true;cb()},opts.timeout)}$io.appendTo("body");io.attachEvent?io.attachEvent("onload",cb):io.addEventListener("load",cb,false);form.submit();$form.attr("target",t)},10);function cb(){if(cbInvoked++){return}io.detachEvent?io.detachEvent("onload",cb):io.removeEventListener("load",cb,false);var ok=true;try{if(timedOut){throw"timeout"}var data,doc;doc=io.contentWindow?io.contentWindow.document:io.contentDocument?io.contentDocument:io.document;xhr.responseText=doc.body?doc.body.innerHTML:null;xhr.responseXML=doc.XMLDocument?doc.XMLDocument:doc;if(opts.dataType=="json"||opts.dataType=="script"){var ta=doc.getElementsByTagName("textarea")[0];data=ta?ta.value:xhr.responseText;if(opts.dataType=="json"){eval("data = "+data)}else{$.globalEval(data)}}else{if(opts.dataType=="xml"){data=xhr.responseXML;if(!data&&xhr.responseText!=null){data=
toXml(xhr.responseText)}}else{data=xhr.responseText}}}catch(e){ok=false;$.handleError(opts,xhr,"error",e)}if(ok){opts.success(data,"success");if(g){$.event.trigger("ajaxSuccess",[xhr,opts])}}if(g){$.event.trigger("ajaxComplete",[xhr,opts])}if(g&&!--$.active){$.event.trigger("ajaxStop")}if(opts.complete){opts.complete(xhr,ok?"success":"error")}setTimeout(function(){$io.remove();xhr.responseXML=null},100)}function toXml(s,doc){if(window.ActiveXObject){doc=new ActiveXObject("Microsoft.XMLDOM");doc.async="false";doc.loadXML(s)}else{doc=(new DOMParser()).parseFromString(s,"text/xml")}return(doc&&doc.documentElement&&doc.documentElement.tagName!="parsererror")?doc:null}}};$.fn.ajaxSubmit.counter=0;$.fn.ajaxForm=function(options){return this.ajaxFormUnbind().submit(submitHandler).each(function(){this.formPluginId=$.fn.ajaxForm.counter++;$.fn.ajaxForm
.optionHash[this.formPluginId]=options;$(":submit,input:image",this).click(clickHandler)})};$.fn.ajaxForm.counter=1;$.fn.ajaxForm.optionHash={};function clickHandler(e){var $form=this.form;$form.clk=this;if(this.type=="image"){if(e.offsetX!=undefined){$form.clk_x=e.offsetX;$form.clk_y=e.offsetY}else{if(typeof $.fn.offset=="function"){var offset=$(this).offset();$form.clk_x=e.pageX-offset.left;$form.clk_y=e.pageY-offset.top}else{$form.clk_x=e.pageX-this.offsetLeft;$form.clk_y=e.pageY-this.offsetTop}}}setTimeout(function(){$form.clk=$form.clk_x=$form.clk_y=null},10)}function submitHandler(){var id=this.formPluginId;var options=$.fn.ajaxForm.optionHash[id];$(this).ajaxSubmit(options);return false}$.fn.ajaxFormUnbind=function(){this.unbind("submit",submitHandler);return this.each(function(){$(":submit,input:image",this).unbind("click",clickHandler)})};$.fn.formToArray=function(semantic){var a=[];if(this.length==0){retur
n a}var form=this[0];var els=semantic?form.getElementsByTagName("*"):form.elements;if(!els){return a}for(var i=0,max=els.length;i<max;i++){var el=els[i];var n=el.name;if(!n){continue}if(semantic&&form.clk&&el.type=="image"){if(!el.disabled&&form.clk==el){a.push({name:n+".x",value:form.clk_x},{name:n+".y",value:form.clk_y})}continue}var v=$.fieldValue(el,true);if(v&&v.constructor==Array){for(var j=0,jmax=v.length;j<jmax;j++){a.push({name:n,value:v[j]})}}else{if(v!==null&&typeof v!="undefined"){a.push({name:n,value:v})}}}if(!semantic&&form.clk){var inputs=form.getElementsByTagName("input");for(var i=0,max=inputs.length;i<max;i++){var input=inputs[i];var n=input.name;if(n&&!input.disabled&&input.type=="image"&&form.clk==input){a.push({name:n+".x",value:form.clk_x},{name:n+".y",value:form.clk_y})}}}return a};$.
fn.formSerialize=function(semantic){return $.param(this.formToArray(semantic))};$.fn.fieldSerialize=function(successful){var a=[];this.each(function(){var n=this.name;if(!n){return}var v=$.fieldValue(this,successful);if(v&&v.constructor==Array){for(var i=0,max=v.length;i<max;i++){a.push({name:n,value:v[i]})}}else{if(v!==null&&typeof v!="undefined"){a.push({name:this.name,value:v})}}});return $.param(a)};$.fn.fieldValue=function(successful){for(var val=[],i=0,max=this.length;i<max;i++){var el=this[i];var v=$.fieldValue(el,successful);if(v===null||typeof v=="undefined"||(v.constructor==Array&&!v.length)){continue}v.constructor==Array?$.merge(val,v):val.push(v)}return val};$.fieldValue=function(el,successful){var n=el.name,t=el.type,tag=el.tagName.toLowerCase();if(typeof successful=="undefined"){successful=true}if(successful&&(!n||el.disabled||t=="reset"||t=="button"||(t=="checkbox"
;||t=="radio")&&!el.checked||(t=="submit"||t=="image")&&el.form&&el.form.clk!=el||tag=="select"&&el.selectedIndex==-1)){return null}if(tag=="select"){var index=el.selectedIndex;if(index<0){return null}var a=[],ops=el.options;var one=(t=="select-one");var max=(one?index+1:ops.length);for(var i=(one?index:0);i<max;i++){var op=ops[i];if(op.selected){var v=$.browser.msie&&!(op.attributes.value.specified)?op.text:op.value;if(one){return v}a.push(v)}}return a}return el.value};$.fn.clearForm=function(){return this.each(function(){$("input,select,textarea",this).clearFields()})};$.fn.clearFields=$.fn.clearInputs=function(){return this.each(function(){var t=this.type,tag=this.tagName.toLowerCase();if(t=="text"||t=="password"||tag=="textarea"){this.value=""}else{if(t=="checkbox"||t=="radio"){this.checked=false}e
lse{if(tag=="select"){this.selectedIndex=-1}}}})};$.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType)){this.reset()}})};$.fn.enable=function(b){if(b==undefined){b=true}return this.each(function(){this.disabled=!b})};$.fn.select=function(select){if(select==undefined){select=true}return this.each(function(){var t=this.type;if(t=="checkbox"||t=="radio"){this.checked=select}else{if(this.tagName.toLowerCase()=="option"){var $sel=$(this).parent("select");if(select&&$sel[0]&&$sel[0].type=="select-one"){$sel.find("option").select(false)}this.selected=select}}})}})(jQuery);
</del><span class="cx">\ No newline at end of file
</span><ins>+/*
+ * jQuery Form Plugin
+ * version: 2.73 (03-MAY-2011)
+ * @requires jQuery v1.3.2 or later
+ *
+ * Examples and documentation 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
+ */
+(function(b){b.fn.ajaxSubmit=function(t){if(!this.length){a("ajaxSubmit: skipping submit process - no element selected");return this}if(typeof t=="function"){t={success:t}}var h=this.attr("action");var d=(typeof h==="string")?b.trim(h):"";if(d){d=(d.match(/^([^#]+)/)||[])[1]}d=d||window.location.href||"";t=b.extend(true,{url:d,success:b.ajaxSettings.success,type:this[0].getAttribute("method")||"GET",iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var u={};this.trigger("form-pre-serialize",[this,t,u]);if(u.veto){a("ajaxSubmit: submit vetoed via form-pre-serialize trigger");return this}if(t.beforeSerialize&&t.beforeSerialize(this,t)===false){a("ajaxSubmit: submit aborted via beforeSerialize callback");return this}var f,p,m=this.formToArray(t.semantic);if(t.data){t.extraData=t.data;for(f in t.
data){if(t.data[f] instanceof Array){for(var i in t.data[f]){m.push({name:f,value:t.data[f][i]})}}else{p=t.data[f];p=b.isFunction(p)?p():p;m.push({name:f,value:p})}}}if(t.beforeSubmit&&t.beforeSubmit(m,this,t)===false){a("ajaxSubmit: submit aborted via beforeSubmit callback");return this}this.trigger("form-submit-validate",[m,this,t,u]);if(u.veto){a("ajaxSubmit: submit vetoed via form-submit-validate trigger");return this}var c=b.param(m);if(t.type.toUpperCase()=="GET"){t.url+=(t.url.indexOf("?")>=0?"&":"?")+c;t.data=null}else{t.data=c}var s=this,l=[];if(t.resetForm){l.push(function(){s.resetForm()})}if(t.clearForm){l.push(function(){s.clearForm()})}if(!t.dataType&&t.target){var r=t.success||function(){};l.push(function(n){var k=t.replaceTarget?"replaceWith":"html";b(t.target)[k](n).each(r,arguments)})}else{if(t.success){l.push(t.success)}}t.success=function(w,n,x
){var v=t.context||t;for(var q=0,k=l.length;q<k;q++){l[q].apply(v,[w,n,x||s,s])}};var g=b("input:file",this).length>0;var e="multipart/form-data";var j=(s.attr("enctype")==e||s.attr("encoding")==e);if(t.iframe!==false&&(g||t.iframe||j)){if(t.closeKeepAlive){b.get(t.closeKeepAlive,o)}else{o()}}else{b.ajax(t)}this.trigger("form-submit-notify",[this,t]);return this;function o(){var v=s[0];if(b(":input[name=submit],:input[id=submit]",v).length){alert('Error: Form elements must not have name or id of "submit".');return}var D=b.extend(true,{},b.ajaxSettings,t);D.context=D.context||D;var G="jqFormIO"+(new Date().getTime()),A="_"+G;var x=b('<iframe id="'+G+'" name="'+G+'" src="'+D.iframeSrc+'" />');var B=x[0];x.css({position:"absolute",top:"-1000px",left:"-1000px"});var y={aborted:0,responseText:null,responseXML:nul
l,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(n){var O=(n==="timeout"?"timeout":"aborted");a("aborting upload... "+O);this.aborted=1;x.attr("src",D.iframeSrc);y.error=O;D.error&&D.error.call(D.context,y,O,O);K&&b.event.trigger("ajaxError",[y,D,O]);D.complete&&D.complete.call(D.context,y,O)}};var K=D.global;if(K&&!b.active++){b.event.trigger("ajaxStart")}if(K){b.event.trigger("ajaxSend",[y,D])}if(D.beforeSend&&D.beforeSend.call(D.context,y,D)===false){if(D.global){b.active--}return}if(y.aborted){return}var J=0,C;var z=v.clk;if(z){var H=z.name;if(H&&!z.disabled){D.extraData=D.extraData||{};D.extraData[H]=z.value;if(z.type=="image"){D.extraData[H+".x"]=v.clk_x;D.extraData[H+".y"]=v.clk_y}}}function I(){var Q=s.attr("
target"),O=s.attr("action");v.setAttribute("target",G);if(v.getAttribute("method")!="POST"){v.setAttribute("method","POST")}if(v.getAttribute("action")!=D.url){v.setAttribute("action",D.url)}if(!D.skipEncodingOverride){s.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"})}if(D.timeout){C=setTimeout(function(){J=true;F(true)},D.timeout)}var P=[];try{if(D.extraData){for(var R in D.extraData){P.push(b('<input type="hidden" name="'+R+'" value="'+D.extraData[R]+'" />').appendTo(v)[0])}}x.appendTo("body");B.attachEvent?B.attachEvent("onload",F):B.addEventListener("load",F,false);v.submit()}finally{v.setAttribute("action",O);if(Q){v.setAttribute("target",Q)}else{s.removeAttr("target")}b(P).remove()}}if(D.forceSync){I()}else{setTimeout(I,10)}var M,N,L=50,w;function F(T
){if(y.aborted||w){return}if(T===true&&y){y.abort("timeout");return}var S=B.contentWindow?B.contentWindow.document:B.contentDocument?B.contentDocument:B.document;if(!S||S.location.href==D.iframeSrc){if(!J){return}}B.detachEvent?B.detachEvent("onload",F):B.removeEventListener("load",F,false);var P=true;try{if(J){throw"timeout"}var U=D.dataType=="xml"||S.XMLDocument||b.isXMLDoc(S);a("isXml="+U);if(!U&&window.opera&&(S.body==null||S.body.innerHTML=="")){if(--L){a("requeing onLoad callback, DOM not available");setTimeout(F,250);return}}y.responseText=S.body?S.body.innerHTML:S.documentElement?S.documentElement.innerHTML:null;y.responseXML=S.XMLDocument?S.XMLDocument:S;if(U){D.dataType="xml"}y.getResponseHeader=function(W){var V={"content-type":D.dataType};return V[W]};var R=/(json|script|text)/.test(D.dataType);if(R||D.textarea){var O=S.getElementsByTagName(
"textarea")[0];if(O){y.responseText=O.value}else{if(R){var Q=S.getElementsByTagName("pre")[0];var n=S.getElementsByTagName("body")[0];if(Q){y.responseText=Q.textContent}else{if(n){y.responseText=n.innerHTML}}}}}else{if(D.dataType=="xml"&&!y.responseXML&&y.responseText!=null){y.responseXML=E(y.responseText)}}M=k(y,D.dataType,D)}catch(T){a("error caught:",T);P=false;y.error=T;D.error&&D.error.call(D.context,y,"error",T);K&&b.event.trigger("ajaxError",[y,D,T])}if(y.aborted){a("upload aborted");P=false}if(P){D.success&&D.success.call(D.context,M,"success",y);K&&b.event.trigger("ajaxSuccess",[y,D])}K&&b.event.trigger("ajaxComplete",[y,D]);if(K&&!--b.active){b.event.trigger("ajaxStop")}D.complete&&D.complete.call(D.context,y,P?"success":"error");w=true;if(D.timeout){clearT
imeout(C)}setTimeout(function(){x.removeData("form-plugin-onload");x.remove();y.responseXML=null},100)}var E=b.parseXML||function(n,O){if(window.ActiveXObject){O=new ActiveXObject("Microsoft.XMLDOM");O.async="false";O.loadXML(n)}else{O=(new DOMParser()).parseFromString(n,"text/xml")}return(O&&O.documentElement&&O.documentElement.nodeName!="parsererror")?O:null};var q=b.parseJSON||function(n){return window["eval"]("("+n+")")};var k=function(S,Q,P){var O=S.getResponseHeader("content-type")||"",n=Q==="xml"||!Q&&O.indexOf("xml")>=0,R=n?S.responseXML:S.responseText;if(n&&R.documentElement.nodeName==="parsererror"){b.error&&b.error("parsererror")}if(P&&P.dataFilter){R=P.dataFilter(R,Q)}if(typeof R==="string"){if(Q==="json"||!Q&&O.indexOf("json")>=0){R=q
(R)}else{if(Q==="script"||!Q&&O.indexOf("javascript")>=0){b.globalEval(R)}}}return R}}};b.fn.ajaxForm=function(c){if(this.length===0){var d={s:this.selector,c:this.context};if(!b.isReady&&d.s){a("DOM not ready, queuing ajaxForm");b(function(){b(d.s,d.c).ajaxForm(c)});return this}a("terminating; zero elements found by selector"+(b.isReady?"":" (DOM not ready)"));return this}return this.ajaxFormUnbind().bind("submit.form-plugin",function(f){if(!f.isDefaultPrevented()){f.preventDefault();b(this).ajaxSubmit(c)}}).bind("click.form-plugin",function(j){var i=j.target;var g=b(i);if(!(g.is(":submit,input:image"))){var f=g.closest(":submit");if(f.length==0){return}i=f[0]}var h=this;h.clk=i;if(i.type=="image"){if(j.offsetX!=undefined){h.clk_x=j.offsetX;h.clk_y=j.offsetY}else{if(typeof b.fn.offset=="function"){var k=g.offset();h.clk_x=j.pageX-k.left;
h.clk_y=j.pageY-k.top}else{h.clk_x=j.pageX-i.offsetLeft;h.clk_y=j.pageY-i.offsetTop}}}setTimeout(function(){h.clk=h.clk_x=h.clk_y=null},100)})};b.fn.ajaxFormUnbind=function(){return this.unbind("submit.form-plugin click.form-plugin")};b.fn.formToArray=function(q){var p=[];if(this.length===0){return p}var d=this[0];var g=q?d.getElementsByTagName("*"):d.elements;if(!g){return p}var k,h,f,r,e,m,c;for(k=0,m=g.length;k<m;k++){e=g[k];f=e.name;if(!f){continue}if(q&&d.clk&&e.type=="image"){if(!e.disabled&&d.clk==e){p.push({name:f,value:b(e).val()});p.push({name:f+".x",value:d.clk_x},{name:f+".y",value:d.clk_y})}continue}r=b.fieldValue(e,true);if(r&&r.constructor==Array){for(h=0,c=r.length;h<c;h++){p.push({name:f,value:r[h]})}}else{if(r!==null&&typeof r!="undefined"){p.push({name:f,value:r})}}}if(!q&&d.clk){var l=b(d.clk),o=l[0];f=o.name;if(f&&!o.disabled&&
;o.type=="image"){p.push({name:f,value:l.val()});p.push({name:f+".x",value:d.clk_x},{name:f+".y",value:d.clk_y})}}return p};b.fn.formSerialize=function(c){return b.param(this.formToArray(c))};b.fn.fieldSerialize=function(d){var c=[];this.each(function(){var h=this.name;if(!h){return}var f=b.fieldValue(this,d);if(f&&f.constructor==Array){for(var g=0,e=f.length;g<e;g++){c.push({name:h,value:f[g]})}}else{if(f!==null&&typeof f!="undefined"){c.push({name:this.name,value:f})}}});return b.param(c)};b.fn.fieldValue=function(h){for(var g=[],e=0,c=this.length;e<c;e++){var f=this[e];var d=b.fieldValue(f,h);if(d===null||typeof d=="undefined"||(d.constructor==Array&&!d.length)){continue}d.constructor==Array?b.merge(g,d):g.push(d)}return g};b.fieldValue=function(c,j){var e=c.name,p=c.type,q=c.tagName.toLowerCase();if(j===undefined){j=true}if(j&&(!e||c.disabled||p=="reset"||p=="button&quo
t;||(p=="checkbox"||p=="radio")&&!c.checked||(p=="submit"||p=="image")&&c.form&&c.form.clk!=c||q=="select"&&c.selectedIndex==-1)){return null}if(q=="select"){var k=c.selectedIndex;if(k<0){return null}var m=[],d=c.options;var g=(p=="select-one");var l=(g?k+1:d.length);for(var f=(g?k:0);f<l;f++){var h=d[f];if(h.selected){var o=h.value;if(!o){o=(h.attributes&&h.attributes.value&&!(h.attributes.value.specified))?h.text:h.value}if(g){return o}m.push(o)}}return m}return b(c).val()};b.fn.clearForm=function(){return this.each(function(){b("input,select,textarea",this).clearFields()})};b.fn.clearFields=b.fn.clearInputs=function(){return this.each(function(){var d=this.type,c=this.tagName.toLowerCase();if(d=="text"||d=="password"||c=="textarea"){this.value=""}else{if(d=="checkbox"||d=="radio"){
this.checked=false}else{if(c=="select"){this.selectedIndex=-1}}}})};b.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType)){this.reset()}})};b.fn.enable=function(c){if(c===undefined){c=true}return this.each(function(){this.disabled=!c})};b.fn.selected=function(c){if(c===undefined){c=true}return this.each(function(){var d=this.type;if(d=="checkbox"||d=="radio"){this.checked=c}else{if(this.tagName.toLowerCase()=="option"){var e=b(this).parent("select");if(c&&e[0]&&e[0].type=="select-one"){e.find("option").selected(false)}this.selected=c}}})};function a(){if(b.fn.ajaxSubmit.debug){var c="[jquery.form] "+Array.prototype.join.call(arguments,"");if(window.console&&window.console.log){window.console.log(c)}else{if(window.opera&&window.opera.postError)
{window.opera.postError(c)}}}}})(jQuery);
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpincludesscriptloaderphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/script-loader.php (17943 => 17944)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/script-loader.php        2011-05-17 06:19:00 UTC (rev 17943)
+++ trunk/wp-includes/script-loader.php        2011-05-17 14:22:50 UTC (rev 17944)
</span><span class="lines">@@ -166,7 +166,7 @@
</span><span class="cx">         $scripts->add_data( 'jquery-ui-dialog', 'group', 1 );
</span><span class="cx">
</span><span class="cx">         // deprecated, not used in core, most functionality is included in jQuery 1.3
</span><del>-        $scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array('jquery'), '2.02m');
</del><ins>+        $scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array('jquery'), '2.73');
</ins><span class="cx">         $scripts->add_data( 'jquery-form', 'group', 1 );
</span><span class="cx">
</span><span class="cx">         $scripts->add( 'jquery-color', "/wp-includes/js/jquery/jquery.color$suffix.js", array('jquery'), '2.0-4561m');
</span></span></pre>
</div>
</div>
</body>
</html>