WordPress.org

Make WordPress Core

Changeset 41233


Ignore:
Timestamp:
08/05/2017 12:59:12 PM (12 months ago)
Author:
DrewAPicture
Message:

External Libraries: Update jQuery Form (unused in core) to the latest version, 4.2.1.

Fixes #41565.

Location:
trunk/src/wp-includes
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/js/jquery/jquery.form.js

    r25462 r41233  
    11/*!
    22 * jQuery Form Plugin
    3  * version: 3.37.0-2013.07.11
    4  * @requires jQuery v1.5 or later
    5  * Copyright (c) 2013 M. Alsup
    6  * Examples and documentation at: http://malsup.com/jquery/form/
    7  * Project repository: https://github.com/malsup/form
    8  * Dual licensed under the MIT and GPL licenses.
    9  * https://github.com/malsup/form#copyright-and-license
     3 * version: 4.2.1
     4 * Requires jQuery v1.7 or later
     5 * Copyright 2017 Kevin Morris
     6 * Copyright 2006 M. Alsup
     7 * Project repository: https://github.com/jquery-form/form
     8 * Dual licensed under the MIT and LGPLv3 licenses.
     9 * https://github.com/jquery-form/form#license
    1010 */
    11 /*global ActiveXObject */
    12 ;(function($) {
    13 "use strict";
    14 
    15 /*
    16     Usage Note:
    17     -----------
    18     Do not use both ajaxSubmit and ajaxForm on the same form.  These
    19     functions are mutually exclusive.  Use ajaxSubmit if you want
    20     to bind your own submit handler to the form.  For example,
    21 
    22     $(document).ready(function() {
    23         $('#myForm').on('submit', function(e) {
    24             e.preventDefault(); // <-- important
    25             $(this).ajaxSubmit({
    26                 target: '#output'
    27             });
    28         });
    29     });
    30 
    31     Use ajaxForm when you want the plugin to manage all the event binding
    32     for you.  For example,
    33 
    34     $(document).ready(function() {
    35         $('#myForm').ajaxForm({
    36             target: '#output'
    37         });
    38     });
    39 
    40     You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
    41     form does not have to exist when you invoke ajaxForm:
    42 
    43     $('#myForm').ajaxForm({
    44         delegation: true,
    45         target: '#output'
    46     });
    47 
    48     When using ajaxForm, the ajaxSubmit function will be invoked for you
    49     at the appropriate time.
    50 */
    51 
    52 /**
    53  * Feature detection
    54  */
    55 var feature = {};
    56 feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
    57 feature.formdata = window.FormData !== undefined;
    58 
    59 var hasProp = !!$.fn.prop;
    60 
    61 // attr2 uses prop when it can but checks the return type for
    62 // an expected string.  this accounts for the case where a form
    63 // contains inputs with names like "action" or "method"; in those
    64 // cases "prop" returns the element
    65 $.fn.attr2 = function() {
    66     if ( ! hasProp )
    67         return this.attr.apply(this, arguments);
    68     var val = this.prop.apply(this, arguments);
    69     if ( ( val && val.jquery ) || typeof val === 'string' )
    70         return val;
    71     return this.attr.apply(this, arguments);
    72 };
    73 
    74 /**
    75  * ajaxSubmit() provides a mechanism for immediately submitting
    76  * an HTML form using AJAX.
    77  */
    78 $.fn.ajaxSubmit = function(options) {
    79     /*jshint scripturl:true */
    80 
    81     // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
    82     if (!this.length) {
    83         log('ajaxSubmit: skipping submit process - no element selected');
    84         return this;
    85     }
    86 
    87     var method, action, url, $form = this;
    88 
    89     if (typeof options == 'function') {
    90         options = { success: options };
    91     }
    92     else if ( options === undefined ) {
    93         options = {};
    94     }
    95 
    96     method = options.type || this.attr2('method');
    97     action = options.url  || this.attr2('action');
    98 
    99     url = (typeof action === 'string') ? $.trim(action) : '';
    100     url = url || window.location.href || '';
    101     if (url) {
    102         // clean url (don't include hash vaue)
    103         url = (url.match(/^([^#]+)/)||[])[1];
    104     }
    105 
    106     options = $.extend(true, {
    107         url:  url,
    108         success: $.ajaxSettings.success,
    109         type: method || 'GET',
    110         iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
    111     }, options);
    112 
    113     // hook for manipulating the form data before it is extracted;
    114     // convenient for use with rich editors like tinyMCE or FCKEditor
    115     var veto = {};
    116     this.trigger('form-pre-serialize', [this, options, veto]);
    117     if (veto.veto) {
    118         log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
    119         return this;
    120     }
    121 
    122     // provide opportunity to alter form data before it is serialized
    123     if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
    124         log('ajaxSubmit: submit aborted via beforeSerialize callback');
    125         return this;
    126     }
    127 
    128     var traditional = options.traditional;
    129     if ( traditional === undefined ) {
    130         traditional = $.ajaxSettings.traditional;
    131     }
    132 
    133     var elements = [];
    134     var qx, a = this.formToArray(options.semantic, elements);
    135     if (options.data) {
    136         options.extraData = options.data;
    137         qx = $.param(options.data, traditional);
    138     }
    139 
    140     // give pre-submit callback an opportunity to abort the submit
    141     if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
    142         log('ajaxSubmit: submit aborted via beforeSubmit callback');
    143         return this;
    144     }
    145 
    146     // fire vetoable 'validate' event
    147     this.trigger('form-submit-validate', [a, this, options, veto]);
    148     if (veto.veto) {
    149         log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
    150         return this;
    151     }
    152 
    153     var q = $.param(a, traditional);
    154     if (qx) {
    155         q = ( q ? (q + '&' + qx) : qx );
    156     }
    157     if (options.type.toUpperCase() == 'GET') {
    158         options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
    159         options.data = null;  // data is null for 'get'
    160     }
    161     else {
    162         options.data = q; // data is the query string for 'post'
    163     }
    164 
    165     var callbacks = [];
    166     if (options.resetForm) {
    167         callbacks.push(function() { $form.resetForm(); });
    168     }
    169     if (options.clearForm) {
    170         callbacks.push(function() { $form.clearForm(options.includeHidden); });
    171     }
    172 
    173     // perform a load on the target only if dataType is not provided
    174     if (!options.dataType && options.target) {
    175         var oldSuccess = options.success || function(){};
    176         callbacks.push(function(data) {
    177             var fn = options.replaceTarget ? 'replaceWith' : 'html';
    178             $(options.target)[fn](data).each(oldSuccess, arguments);
    179         });
    180     }
    181     else if (options.success) {
    182         callbacks.push(options.success);
    183     }
    184 
    185     options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
    186         var context = options.context || this ;    // jQuery 1.4+ supports scope context
    187         for (var i=0, max=callbacks.length; i < max; i++) {
    188             callbacks[i].apply(context, [data, status, xhr || $form, $form]);
    189         }
    190     };
    191 
    192     if (options.error) {
    193         var oldError = options.error;
    194         options.error = function(xhr, status, error) {
    195             var context = options.context || this;
    196             oldError.apply(context, [xhr, status, error, $form]);
    197         };
    198     }
    199 
    200      if (options.complete) {
    201         var oldComplete = options.complete;
    202         options.complete = function(xhr, status) {
    203             var context = options.context || this;
    204             oldComplete.apply(context, [xhr, status, $form]);
    205         };
    206     }
    207 
    208     // are there files to upload?
    209 
    210     // [value] (issue #113), also see comment:
    211     // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219
    212     var fileInputs = $('input[type=file]:enabled[value!=""]', this);
    213 
    214     var hasFileInputs = fileInputs.length > 0;
    215     var mp = 'multipart/form-data';
    216     var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
    217 
    218     var fileAPI = feature.fileapi && feature.formdata;
    219     log("fileAPI :" + fileAPI);
    220     var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
    221 
    222     var jqxhr;
    223 
    224     // options.iframe allows user to force iframe mode
    225     // 06-NOV-09: now defaulting to iframe mode if file input is detected
    226     if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
    227         // hack to fix Safari hang (thanks to Tim Molendijk for this)
    228         // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
    229         if (options.closeKeepAlive) {
    230             $.get(options.closeKeepAlive, function() {
    231                 jqxhr = fileUploadIframe(a);
    232             });
    233         }
    234         else {
    235             jqxhr = fileUploadIframe(a);
    236         }
    237     }
    238     else if ((hasFileInputs || multipart) && fileAPI) {
    239         jqxhr = fileUploadXhr(a);
    240     }
    241     else {
    242         jqxhr = $.ajax(options);
    243     }
    244 
    245     $form.removeData('jqxhr').data('jqxhr', jqxhr);
    246 
    247     // clear element array
    248     for (var k=0; k < elements.length; k++)
    249         elements[k] = null;
    250 
    251     // fire 'notify' event
    252     this.trigger('form-submit-notify', [this, options]);
    253     return this;
    254 
    255     // utility fn for deep serialization
    256     function deepSerialize(extraData){
    257         var serialized = $.param(extraData, options.traditional).split('&');
    258         var len = serialized.length;
    259         var result = [];
    260         var i, part;
    261         for (i=0; i < len; i++) {
    262             // #252; undo param space replacement
    263             serialized[i] = serialized[i].replace(/\+/g,' ');
    264             part = serialized[i].split('=');
    265             // #278; use array instead of object storage, favoring array serializations
    266             result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);
    267         }
    268         return result;
    269     }
    270 
    271      // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
    272     function fileUploadXhr(a) {
    273         var formdata = new FormData();
    274 
    275         for (var i=0; i < a.length; i++) {
    276             formdata.append(a[i].name, a[i].value);
    277         }
    278 
    279         if (options.extraData) {
    280             var serializedData = deepSerialize(options.extraData);
    281             for (i=0; i < serializedData.length; i++)
    282                 if (serializedData[i])
    283                     formdata.append(serializedData[i][0], serializedData[i][1]);
    284         }
    285 
    286         options.data = null;
    287 
    288         var s = $.extend(true, {}, $.ajaxSettings, options, {
    289             contentType: false,
    290             processData: false,
    291             cache: false,
    292             type: method || 'POST'
    293         });
    294 
    295         if (options.uploadProgress) {
    296             // workaround because jqXHR does not expose upload property
    297             s.xhr = function() {
    298                 var xhr = $.ajaxSettings.xhr();
    299                 if (xhr.upload) {
    300                     xhr.upload.addEventListener('progress', function(event) {
    301                         var percent = 0;
    302                         var position = event.loaded || event.position; /*event.position is deprecated*/
    303                         var total = event.total;
    304                         if (event.lengthComputable) {
    305                             percent = Math.ceil(position / total * 100);
    306                         }
    307                         options.uploadProgress(event, position, total, percent);
    308                     }, false);
    309                 }
    310                 return xhr;
    311             };
    312         }
    313 
    314         s.data = null;
    315             var beforeSend = s.beforeSend;
    316             s.beforeSend = function(xhr, o) {
    317                 o.data = formdata;
    318                 if(beforeSend)
    319                     beforeSend.call(this, xhr, o);
    320         };
    321         return $.ajax(s);
    322     }
    323 
    324     // private function for handling file uploads (hat tip to YAHOO!)
    325     function fileUploadIframe(a) {
    326         var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
    327         var deferred = $.Deferred();
    328 
    329         if (a) {
    330             // ensure that every serialized input is still enabled
    331             for (i=0; i < elements.length; i++) {
    332                 el = $(elements[i]);
    333                 if ( hasProp )
    334                     el.prop('disabled', false);
    335                 else
    336                     el.removeAttr('disabled');
    337             }
    338         }
    339 
    340         s = $.extend(true, {}, $.ajaxSettings, options);
    341         s.context = s.context || s;
    342         id = 'jqFormIO' + (new Date().getTime());
    343         if (s.iframeTarget) {
    344             $io = $(s.iframeTarget);
    345             n = $io.attr2('name');
    346             if (!n)
    347                  $io.attr2('name', id);
    348             else
    349                 id = n;
    350         }
    351         else {
    352             $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
    353             $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
    354         }
    355         io = $io[0];
    356 
    357 
    358         xhr = { // mock object
    359             aborted: 0,
    360             responseText: null,
    361             responseXML: null,
    362             status: 0,
    363             statusText: 'n/a',
    364             getAllResponseHeaders: function() {},
    365             getResponseHeader: function() {},
    366             setRequestHeader: function() {},
    367             abort: function(status) {
    368                 var e = (status === 'timeout' ? 'timeout' : 'aborted');
    369                 log('aborting upload... ' + e);
    370                 this.aborted = 1;
    371 
    372                 try { // #214, #257
    373                     if (io.contentWindow.document.execCommand) {
    374                         io.contentWindow.document.execCommand('Stop');
    375                     }
    376                 }
    377                 catch(ignore) {}
    378 
    379                 $io.attr('src', s.iframeSrc); // abort op in progress
    380                 xhr.error = e;
    381                 if (s.error)
    382                     s.error.call(s.context, xhr, e, status);
    383                 if (g)
    384                     $.event.trigger("ajaxError", [xhr, s, e]);
    385                 if (s.complete)
    386                     s.complete.call(s.context, xhr, e);
    387             }
    388         };
    389 
    390         g = s.global;
    391         // trigger ajax global events so that activity/block indicators work like normal
    392         if (g && 0 === $.active++) {
    393             $.event.trigger("ajaxStart");
    394         }
    395         if (g) {
    396             $.event.trigger("ajaxSend", [xhr, s]);
    397         }
    398 
    399         if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
    400             if (s.global) {
    401                 $.active--;
    402             }
    403             deferred.reject();
    404             return deferred;
    405         }
    406         if (xhr.aborted) {
    407             deferred.reject();
    408             return deferred;
    409         }
    410 
    411         // add submitting element to data if we know it
    412         sub = form.clk;
    413         if (sub) {
    414             n = sub.name;
    415             if (n && !sub.disabled) {
    416                 s.extraData = s.extraData || {};
    417                 s.extraData[n] = sub.value;
    418                 if (sub.type == "image") {
    419                     s.extraData[n+'.x'] = form.clk_x;
    420                     s.extraData[n+'.y'] = form.clk_y;
    421                 }
    422             }
    423         }
    424 
    425         var CLIENT_TIMEOUT_ABORT = 1;
    426         var SERVER_ABORT = 2;
    427                
    428         function getDoc(frame) {
    429             /* it looks like contentWindow or contentDocument do not
    430              * carry the protocol property in ie8, when running under ssl
    431              * frame.document is the only valid response document, since
    432              * the protocol is know but not on the other two objects. strange?
    433              * "Same origin policy" http://en.wikipedia.org/wiki/Same_origin_policy
    434              */
    435            
    436             var doc = null;
    437            
    438             // IE8 cascading access check
    439             try {
    440                 if (frame.contentWindow) {
    441                     doc = frame.contentWindow.document;
    442                 }
    443             } catch(err) {
    444                 // IE8 access denied under ssl & missing protocol
    445                 log('cannot get iframe.contentWindow document: ' + err);
    446             }
    447 
    448             if (doc) { // successful getting content
    449                 return doc;
    450             }
    451 
    452             try { // simply checking may throw in ie8 under ssl or mismatched protocol
    453                 doc = frame.contentDocument ? frame.contentDocument : frame.document;
    454             } catch(err) {
    455                 // last attempt
    456                 log('cannot get iframe.contentDocument: ' + err);
    457                 doc = frame.document;
    458             }
    459             return doc;
    460         }
    461 
    462         // Rails CSRF hack (thanks to Yvan Barthelemy)
    463         var csrf_token = $('meta[name=csrf-token]').attr('content');
    464         var csrf_param = $('meta[name=csrf-param]').attr('content');
    465         if (csrf_param && csrf_token) {
    466             s.extraData = s.extraData || {};
    467             s.extraData[csrf_param] = csrf_token;
    468         }
    469 
    470         // take a breath so that pending repaints get some cpu time before the upload starts
    471         function doSubmit() {
    472             // make sure form attrs are set
    473             var t = $form.attr2('target'), a = $form.attr2('action');
    474 
    475             // update form attrs in IE friendly way
    476             form.setAttribute('target',id);
    477             if (!method) {
    478                 form.setAttribute('method', 'POST');
    479             }
    480             if (a != s.url) {
    481                 form.setAttribute('action', s.url);
    482             }
    483 
    484             // ie borks in some cases when setting encoding
    485             if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
    486                 $form.attr({
    487                     encoding: 'multipart/form-data',
    488                     enctype:  'multipart/form-data'
    489                 });
    490             }
    491 
    492             // support timout
    493             if (s.timeout) {
    494                 timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
    495             }
    496 
    497             // look for server aborts
    498             function checkState() {
    499                 try {
    500                     var state = getDoc(io).readyState;
    501                     log('state = ' + state);
    502                     if (state && state.toLowerCase() == 'uninitialized')
    503                         setTimeout(checkState,50);
    504                 }
    505                 catch(e) {
    506                     log('Server abort: ' , e, ' (', e.name, ')');
    507                     cb(SERVER_ABORT);
    508                     if (timeoutHandle)
    509                         clearTimeout(timeoutHandle);
    510                     timeoutHandle = undefined;
    511                 }
    512             }
    513 
    514             // add "extra" data to form if provided in options
    515             var extraInputs = [];
    516             try {
    517                 if (s.extraData) {
    518                     for (var n in s.extraData) {
    519                         if (s.extraData.hasOwnProperty(n)) {
    520                            // if using the $.param format that allows for multiple values with the same name
    521                            if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
    522                                extraInputs.push(
    523                                $('<input type="hidden" name="'+s.extraData[n].name+'">').val(s.extraData[n].value)
    524                                    .appendTo(form)[0]);
    525                            } else {
    526                                extraInputs.push(
    527                                $('<input type="hidden" name="'+n+'">').val(s.extraData[n])
    528                                    .appendTo(form)[0]);
    529                            }
    530                         }
    531                     }
    532                 }
    533 
    534                 if (!s.iframeTarget) {
    535                     // add iframe to doc and submit the form
    536                     $io.appendTo('body');
    537                     if (io.attachEvent)
    538                         io.attachEvent('onload', cb);
    539                     else
    540                         io.addEventListener('load', cb, false);
    541                 }
    542                 setTimeout(checkState,15);
    543 
    544                 try {
    545                     form.submit();
    546                 } catch(err) {
    547                     // just in case form has element with name/id of 'submit'
    548                     var submitFn = document.createElement('form').submit;
    549                     submitFn.apply(form);
    550                 }
    551             }
    552             finally {
    553                 // reset attrs and remove "extra" input elements
    554                 form.setAttribute('action',a);
    555                 if(t) {
    556                     form.setAttribute('target', t);
    557                 } else {
    558                     $form.removeAttr('target');
    559                 }
    560                 $(extraInputs).remove();
    561             }
    562         }
    563 
    564         if (s.forceSync) {
    565             doSubmit();
    566         }
    567         else {
    568             setTimeout(doSubmit, 10); // this lets dom updates render
    569         }
    570 
    571         var data, doc, domCheckCount = 50, callbackProcessed;
    572 
    573         function cb(e) {
    574             if (xhr.aborted || callbackProcessed) {
    575                 return;
    576             }
    577            
    578             doc = getDoc(io);
    579             if(!doc) {
    580                 log('cannot access response document');
    581                 e = SERVER_ABORT;
    582             }
    583             if (e === CLIENT_TIMEOUT_ABORT && xhr) {
    584                 xhr.abort('timeout');
    585                 deferred.reject(xhr, 'timeout');
    586                 return;
    587             }
    588             else if (e == SERVER_ABORT && xhr) {
    589                 xhr.abort('server abort');
    590                 deferred.reject(xhr, 'error', 'server abort');
    591                 return;
    592             }
    593 
    594             if (!doc || doc.location.href == s.iframeSrc) {
    595                 // response not received yet
    596                 if (!timedOut)
    597                     return;
    598             }
    599             if (io.detachEvent)
    600                 io.detachEvent('onload', cb);
    601             else
    602                 io.removeEventListener('load', cb, false);
    603 
    604             var status = 'success', errMsg;
    605             try {
    606                 if (timedOut) {
    607                     throw 'timeout';
    608                 }
    609 
    610                 var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
    611                 log('isXml='+isXml);
    612                 if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
    613                     if (--domCheckCount) {
    614                         // in some browsers (Opera) the iframe DOM is not always traversable when
    615                         // the onload callback fires, so we loop a bit to accommodate
    616                         log('requeing onLoad callback, DOM not available');
    617                         setTimeout(cb, 250);
    618                         return;
    619                     }
    620                     // let this fall through because server response could be an empty document
    621                     //log('Could not access iframe DOM after mutiple tries.');
    622                     //throw 'DOMException: not available';
    623                 }
    624 
    625                 //log('response detected');
    626                 var docRoot = doc.body ? doc.body : doc.documentElement;
    627                 xhr.responseText = docRoot ? docRoot.innerHTML : null;
    628                 xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
    629                 if (isXml)
    630                     s.dataType = 'xml';
    631                 xhr.getResponseHeader = function(header){
    632                     var headers = {'content-type': s.dataType};
    633                     return headers[header];
    634                 };
    635                 // support for XHR 'status' & 'statusText' emulation :
    636                 if (docRoot) {
    637                     xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
    638                     xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
    639                 }
    640 
    641                 var dt = (s.dataType || '').toLowerCase();
    642                 var scr = /(json|script|text)/.test(dt);
    643                 if (scr || s.textarea) {
    644                     // see if user embedded response in textarea
    645                     var ta = doc.getElementsByTagName('textarea')[0];
    646                     if (ta) {
    647                         xhr.responseText = ta.value;
    648                         // support for XHR 'status' & 'statusText' emulation :
    649                         xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
    650                         xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
    651                     }
    652                     else if (scr) {
    653                         // account for browsers injecting pre around json response
    654                         var pre = doc.getElementsByTagName('pre')[0];
    655                         var b = doc.getElementsByTagName('body')[0];
    656                         if (pre) {
    657                             xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
    658                         }
    659                         else if (b) {
    660                             xhr.responseText = b.textContent ? b.textContent : b.innerText;
    661                         }
    662                     }
    663                 }
    664                 else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
    665                     xhr.responseXML = toXml(xhr.responseText);
    666                 }
    667 
    668                 try {
    669                     data = httpData(xhr, dt, s);
    670                 }
    671                 catch (err) {
    672                     status = 'parsererror';
    673                     xhr.error = errMsg = (err || status);
    674                 }
    675             }
    676             catch (err) {
    677                 log('error caught: ',err);
    678                 status = 'error';
    679                 xhr.error = errMsg = (err || status);
    680             }
    681 
    682             if (xhr.aborted) {
    683                 log('upload aborted');
    684                 status = null;
    685             }
    686 
    687             if (xhr.status) { // we've set xhr.status
    688                 status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
    689             }
    690 
    691             // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
    692             if (status === 'success') {
    693                 if (s.success)
    694                     s.success.call(s.context, data, 'success', xhr);
    695                 deferred.resolve(xhr.responseText, 'success', xhr);
    696                 if (g)
    697                     $.event.trigger("ajaxSuccess", [xhr, s]);
    698             }
    699             else if (status) {
    700                 if (errMsg === undefined)
    701                     errMsg = xhr.statusText;
    702                 if (s.error)
    703                     s.error.call(s.context, xhr, status, errMsg);
    704                 deferred.reject(xhr, 'error', errMsg);
    705                 if (g)
    706                     $.event.trigger("ajaxError", [xhr, s, errMsg]);
    707             }
    708 
    709             if (g)
    710                 $.event.trigger("ajaxComplete", [xhr, s]);
    711 
    712             if (g && ! --$.active) {
    713                 $.event.trigger("ajaxStop");
    714             }
    715 
    716             if (s.complete)
    717                 s.complete.call(s.context, xhr, status);
    718 
    719             callbackProcessed = true;
    720             if (s.timeout)
    721                 clearTimeout(timeoutHandle);
    722 
    723             // clean up
    724             setTimeout(function() {
    725                 if (!s.iframeTarget)
    726                     $io.remove();
    727                 xhr.responseXML = null;
    728             }, 100);
    729         }
    730 
    731         var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
    732             if (window.ActiveXObject) {
    733                 doc = new ActiveXObject('Microsoft.XMLDOM');
    734                 doc.async = 'false';
    735                 doc.loadXML(s);
    736             }
    737             else {
    738                 doc = (new DOMParser()).parseFromString(s, 'text/xml');
    739             }
    740             return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
    741         };
    742         var parseJSON = $.parseJSON || function(s) {
    743             /*jslint evil:true */
    744             return window['eval']('(' + s + ')');
    745         };
    746 
    747         var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
    748 
    749             var ct = xhr.getResponseHeader('content-type') || '',
    750                 xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
    751                 data = xml ? xhr.responseXML : xhr.responseText;
    752 
    753             if (xml && data.documentElement.nodeName === 'parsererror') {
    754                 if ($.error)
    755                     $.error('parsererror');
    756             }
    757             if (s && s.dataFilter) {
    758                 data = s.dataFilter(data, type);
    759             }
    760             if (typeof data === 'string') {
    761                 if (type === 'json' || !type && ct.indexOf('json') >= 0) {
    762                     data = parseJSON(data);
    763                 } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
    764                     $.globalEval(data);
    765                 }
    766             }
    767             return data;
    768         };
    769 
    770         return deferred;
    771     }
    772 };
    773 
    774 /**
    775  * ajaxForm() provides a mechanism for fully automating form submission.
    776  *
    777  * The advantages of using this method instead of ajaxSubmit() are:
    778  *
    779  * 1: This method will include coordinates for <input type="image" /> elements (if the element
    780  *    is used to submit the form).
    781  * 2. This method will include the submit element's name/value data (for the element that was
    782  *    used to submit the form).
    783  * 3. This method binds the submit() method to the form for you.
    784  *
    785  * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
    786  * passes the options argument along after properly binding events for submit elements and
    787  * the form itself.
    788  */
    789 $.fn.ajaxForm = function(options) {
    790     options = options || {};
    791     options.delegation = options.delegation && $.isFunction($.fn.on);
    792 
    793     // in jQuery 1.3+ we can fix mistakes with the ready state
    794     if (!options.delegation && this.length === 0) {
    795         var o = { s: this.selector, c: this.context };
    796         if (!$.isReady && o.s) {
    797             log('DOM not ready, queuing ajaxForm');
    798             $(function() {
    799                 $(o.s,o.c).ajaxForm(options);
    800             });
    801             return this;
    802         }
    803         // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
    804         log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
    805         return this;
    806     }
    807 
    808     if ( options.delegation ) {
    809         $(document)
    810             .off('submit.form-plugin', this.selector, doAjaxSubmit)
    811             .off('click.form-plugin', this.selector, captureSubmittingElement)
    812             .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
    813             .on('click.form-plugin', this.selector, options, captureSubmittingElement);
    814         return this;
    815     }
    816 
    817     return this.ajaxFormUnbind()
    818         .bind('submit.form-plugin', options, doAjaxSubmit)
    819         .bind('click.form-plugin', options, captureSubmittingElement);
    820 };
    821 
    822 // private event handlers
    823 function doAjaxSubmit(e) {
    824     /*jshint validthis:true */
    825     var options = e.data;
    826     if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
    827         e.preventDefault();
    828         $(this).ajaxSubmit(options);
    829     }
    830 }
    831 
    832 function captureSubmittingElement(e) {
    833     /*jshint validthis:true */
    834     var target = e.target;
    835     var $el = $(target);
    836     if (!($el.is("[type=submit],[type=image]"))) {
    837         // is this a child element of the submit el?  (ex: a span within a button)
    838         var t = $el.closest('[type=submit]');
    839         if (t.length === 0) {
    840             return;
    841         }
    842         target = t[0];
    843     }
    844     var form = this;
    845     form.clk = target;
    846     if (target.type == 'image') {
    847         if (e.offsetX !== undefined) {
    848             form.clk_x = e.offsetX;
    849             form.clk_y = e.offsetY;
    850         } else if (typeof $.fn.offset == 'function') {
    851             var offset = $el.offset();
    852             form.clk_x = e.pageX - offset.left;
    853             form.clk_y = e.pageY - offset.top;
    854         } else {
    855             form.clk_x = e.pageX - target.offsetLeft;
    856             form.clk_y = e.pageY - target.offsetTop;
    857         }
    858     }
    859     // clear form vars
    860     setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
    861 }
    862 
    863 
    864 // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
    865 $.fn.ajaxFormUnbind = function() {
    866     return this.unbind('submit.form-plugin click.form-plugin');
    867 };
    868 
    869 /**
    870  * formToArray() gathers form element data into an array of objects that can
    871  * be passed to any of the following ajax functions: $.get, $.post, or load.
    872  * Each object in the array has both a 'name' and 'value' property.  An example of
    873  * an array for a simple login form might be:
    874  *
    875  * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
    876  *
    877  * It is this array that is passed to pre-submit callback functions provided to the
    878  * ajaxSubmit() and ajaxForm() methods.
    879  */
    880 $.fn.formToArray = function(semantic, elements) {
    881     var a = [];
    882     if (this.length === 0) {
    883         return a;
    884     }
    885 
    886     var form = this[0];
    887     var els = semantic ? form.getElementsByTagName('*') : form.elements;
    888     if (!els) {
    889         return a;
    890     }
    891 
    892     var i,j,n,v,el,max,jmax;
    893     for(i=0, max=els.length; i < max; i++) {
    894         el = els[i];
    895         n = el.name;
    896         if (!n || el.disabled) {
    897             continue;
    898         }
    899 
    900         if (semantic && form.clk && el.type == "image") {
    901             // handle image inputs on the fly when semantic == true
    902             if(form.clk == el) {
    903                 a.push({name: n, value: $(el).val(), type: el.type });
    904                 a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
    905             }
    906             continue;
    907         }
    908 
    909         v = $.fieldValue(el, true);
    910         if (v && v.constructor == Array) {
    911             if (elements)
    912                 elements.push(el);
    913             for(j=0, jmax=v.length; j < jmax; j++) {
    914                 a.push({name: n, value: v[j]});
    915             }
    916         }
    917         else if (feature.fileapi && el.type == 'file') {
    918             if (elements)
    919                 elements.push(el);
    920             var files = el.files;
    921             if (files.length) {
    922                 for (j=0; j < files.length; j++) {
    923                     a.push({name: n, value: files[j], type: el.type});
    924                 }
    925             }
    926             else {
    927                 // #180
    928                 a.push({ name: n, value: '', type: el.type });
    929             }
    930         }
    931         else if (v !== null && typeof v != 'undefined') {
    932             if (elements)
    933                 elements.push(el);
    934             a.push({name: n, value: v, type: el.type, required: el.required});
    935         }
    936     }
    937 
    938     if (!semantic && form.clk) {
    939         // input type=='image' are not found in elements array! handle it here
    940         var $input = $(form.clk), input = $input[0];
    941         n = input.name;
    942         if (n && !input.disabled && input.type == 'image') {
    943             a.push({name: n, value: $input.val()});
    944             a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
    945         }
    946     }
    947     return a;
    948 };
    949 
    950 /**
    951  * Serializes form data into a 'submittable' string. This method will return a string
    952  * in the format: name1=value1&amp;name2=value2
    953  */
    954 $.fn.formSerialize = function(semantic) {
    955     //hand off to jQuery.param for proper encoding
    956     return $.param(this.formToArray(semantic));
    957 };
    958 
    959 /**
    960  * Serializes all field elements in the jQuery object into a query string.
    961  * This method will return a string in the format: name1=value1&amp;name2=value2
    962  */
    963 $.fn.fieldSerialize = function(successful) {
    964     var a = [];
    965     this.each(function() {
    966         var n = this.name;
    967         if (!n) {
    968             return;
    969         }
    970         var v = $.fieldValue(this, successful);
    971         if (v && v.constructor == Array) {
    972             for (var i=0,max=v.length; i < max; i++) {
    973                 a.push({name: n, value: v[i]});
    974             }
    975         }
    976         else if (v !== null && typeof v != 'undefined') {
    977             a.push({name: this.name, value: v});
    978         }
    979     });
    980     //hand off to jQuery.param for proper encoding
    981     return $.param(a);
    982 };
    983 
    984 /**
    985  * Returns the value(s) of the element in the matched set.  For example, consider the following form:
    986  *
    987  *  <form><fieldset>
    988  *      <input name="A" type="text" />
    989  *      <input name="A" type="text" />
    990  *      <input name="B" type="checkbox" value="B1" />
    991  *      <input name="B" type="checkbox" value="B2"/>
    992  *      <input name="C" type="radio" value="C1" />
    993  *      <input name="C" type="radio" value="C2" />
    994  *  </fieldset></form>
    995  *
    996  *  var v = $('input[type=text]').fieldValue();
    997  *  // if no values are entered into the text inputs
    998  *  v == ['','']
    999  *  // if values entered into the text inputs are 'foo' and 'bar'
    1000  *  v == ['foo','bar']
    1001  *
    1002  *  var v = $('input[type=checkbox]').fieldValue();
    1003  *  // if neither checkbox is checked
    1004  *  v === undefined
    1005  *  // if both checkboxes are checked
    1006  *  v == ['B1', 'B2']
    1007  *
    1008  *  var v = $('input[type=radio]').fieldValue();
    1009  *  // if neither radio is checked
    1010  *  v === undefined
    1011  *  // if first radio is checked
    1012  *  v == ['C1']
    1013  *
    1014  * The successful argument controls whether or not the field element must be 'successful'
    1015  * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
    1016  * The default value of the successful argument is true.  If this value is false the value(s)
    1017  * for each element is returned.
    1018  *
    1019  * Note: This method *always* returns an array.  If no valid value can be determined the
    1020  *    array will be empty, otherwise it will contain one or more values.
    1021  */
    1022 $.fn.fieldValue = function(successful) {
    1023     for (var val=[], i=0, max=this.length; i < max; i++) {
    1024         var el = this[i];
    1025         var v = $.fieldValue(el, successful);
    1026         if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
    1027             continue;
    1028         }
    1029         if (v.constructor == Array)
    1030             $.merge(val, v);
    1031         else
    1032             val.push(v);
    1033     }
    1034     return val;
    1035 };
    1036 
    1037 /**
    1038  * Returns the value of the field element.
    1039  */
    1040 $.fieldValue = function(el, successful) {
    1041     var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
    1042     if (successful === undefined) {
    1043         successful = true;
    1044     }
    1045 
    1046     if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
    1047         (t == 'checkbox' || t == 'radio') && !el.checked ||
    1048         (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
    1049         tag == 'select' && el.selectedIndex == -1)) {
    1050             return null;
    1051     }
    1052 
    1053     if (tag == 'select') {
    1054         var index = el.selectedIndex;
    1055         if (index < 0) {
    1056             return null;
    1057         }
    1058         var a = [], ops = el.options;
    1059         var one = (t == 'select-one');
    1060         var max = (one ? index+1 : ops.length);
    1061         for(var i=(one ? index : 0); i < max; i++) {
    1062             var op = ops[i];
    1063             if (op.selected) {
    1064                 var v = op.value;
    1065                 if (!v) { // extra pain for IE...
    1066                     v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
    1067                 }
    1068                 if (one) {
    1069                     return v;
    1070                 }
    1071                 a.push(v);
    1072             }
    1073         }
    1074         return a;
    1075     }
    1076     return $(el).val();
    1077 };
    1078 
    1079 /**
    1080  * Clears the form data.  Takes the following actions on the form's input fields:
    1081  *  - input text fields will have their 'value' property set to the empty string
    1082  *  - select elements will have their 'selectedIndex' property set to -1
    1083  *  - checkbox and radio inputs will have their 'checked' property set to false
    1084  *  - inputs of type submit, button, reset, and hidden will *not* be effected
    1085  *  - button elements will *not* be effected
    1086  */
    1087 $.fn.clearForm = function(includeHidden) {
    1088     return this.each(function() {
    1089         $('input,select,textarea', this).clearFields(includeHidden);
    1090     });
    1091 };
    1092 
    1093 /**
    1094  * Clears the selected form elements.
    1095  */
    1096 $.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
    1097     var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
    1098     return this.each(function() {
    1099         var t = this.type, tag = this.tagName.toLowerCase();
    1100         if (re.test(t) || tag == 'textarea') {
    1101             this.value = '';
    1102         }
    1103         else if (t == 'checkbox' || t == 'radio') {
    1104             this.checked = false;
    1105         }
    1106         else if (tag == 'select') {
    1107             this.selectedIndex = -1;
    1108         }
    1109         else if (t == "file") {
    1110             if (/MSIE/.test(navigator.userAgent)) {
    1111                 $(this).replaceWith($(this).clone(true));
     11/* global ActiveXObject */
     12
     13/* eslint-disable */
     14(function (factory) {
     15    if (typeof define === 'function' && define.amd) {
     16        // AMD. Register as an anonymous module.
     17        define(['jquery'], factory);
     18    } else if (typeof module === 'object' && module.exports) {
     19        // Node/CommonJS
     20        module.exports = function( root, jQuery ) {
     21            if (typeof jQuery === 'undefined') {
     22                // require('jQuery') returns a factory that requires window to build a jQuery instance, we normalize how we use modules
     23                // that require this pattern but the window provided is a noop if it's defined (how jquery works)
     24                if (typeof window !== 'undefined') {
     25                    jQuery = require('jquery');
     26                }
     27                else {
     28                    jQuery = require('jquery')(root);
     29                }
     30            }
     31            factory(jQuery);
     32            return jQuery;
     33        };
     34    } else {
     35        // Browser globals
     36        factory(jQuery);
     37    }
     38
     39}(function ($) {
     40/* eslint-enable */
     41    'use strict';
     42
     43    /*
     44        Usage Note:
     45        -----------
     46        Do not use both ajaxSubmit and ajaxForm on the same form. These
     47        functions are mutually exclusive. Use ajaxSubmit if you want
     48        to bind your own submit handler to the form. For example,
     49
     50        $(document).ready(function() {
     51            $('#myForm').on('submit', function(e) {
     52                e.preventDefault(); // <-- important
     53                $(this).ajaxSubmit({
     54                    target: '#output'
     55                });
     56            });
     57        });
     58
     59        Use ajaxForm when you want the plugin to manage all the event binding
     60        for you. For example,
     61
     62        $(document).ready(function() {
     63            $('#myForm').ajaxForm({
     64                target: '#output'
     65            });
     66        });
     67
     68        You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
     69        form does not have to exist when you invoke ajaxForm:
     70
     71        $('#myForm').ajaxForm({
     72            delegation: true,
     73            target: '#output'
     74        });
     75
     76        When using ajaxForm, the ajaxSubmit function will be invoked for you
     77        at the appropriate time.
     78    */
     79
     80    var rCRLF = /\r?\n/g;
     81
     82    /**
     83     * Feature detection
     84     */
     85    var feature = {};
     86
     87    feature.fileapi = $('<input type="file">').get(0).files !== undefined;
     88    feature.formdata = (typeof window.FormData !== 'undefined');
     89
     90    var hasProp = !!$.fn.prop;
     91
     92    // attr2 uses prop when it can but checks the return type for
     93    // an expected string. This accounts for the case where a form
     94    // contains inputs with names like "action" or "method"; in those
     95    // cases "prop" returns the element
     96    $.fn.attr2 = function() {
     97        if (!hasProp) {
     98            return this.attr.apply(this, arguments);
     99        }
     100
     101        var val = this.prop.apply(this, arguments);
     102
     103        if ((val && val.jquery) || typeof val === 'string') {
     104            return val;
     105        }
     106
     107        return this.attr.apply(this, arguments);
     108    };
     109
     110    /**
     111     * ajaxSubmit() provides a mechanism for immediately submitting
     112     * an HTML form using AJAX.
     113     *
     114     * @param   {object|string} options     jquery.form.js parameters or custom url for submission
     115     * @param   {object}        data        extraData
     116     * @param   {string}        dataType    ajax dataType
     117     * @param   {function}      onSuccess   ajax success callback function
     118     */
     119    $.fn.ajaxSubmit = function(options, data, dataType, onSuccess) {
     120        // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
     121        if (!this.length) {
     122            log('ajaxSubmit: skipping submit process - no element selected');
     123
     124            return this;
     125        }
     126
     127        /* eslint consistent-this: ["error", "$form"] */
     128        var method, action, url, $form = this;
     129
     130        if (typeof options === 'function') {
     131            options = {success: options};
     132
     133        } else if (typeof options === 'string' || (options === false && arguments.length > 0)) {
     134            options = {
     135                'url'      : options,
     136                'data'     : data,
     137                'dataType' : dataType
     138            };
     139
     140            if (typeof onSuccess === 'function') {
     141                options.success = onSuccess;
     142            }
     143
     144        } else if (typeof options === 'undefined') {
     145            options = {};
     146        }
     147
     148        method = options.method || options.type || this.attr2('method');
     149        action = options.url || this.attr2('action');
     150
     151        url = (typeof action === 'string') ? $.trim(action) : '';
     152        url = url || window.location.href || '';
     153        if (url) {
     154            // clean url (don't include hash vaue)
     155            url = (url.match(/^([^#]+)/) || [])[1];
     156        }
     157
     158        options = $.extend(true, {
     159            url       : url,
     160            success   : $.ajaxSettings.success,
     161            type      : method || $.ajaxSettings.type,
     162            iframeSrc : /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'     // eslint-disable-line no-script-url
     163        }, options);
     164
     165        // hook for manipulating the form data before it is extracted;
     166        // convenient for use with rich editors like tinyMCE or FCKEditor
     167        var veto = {};
     168
     169        this.trigger('form-pre-serialize', [this, options, veto]);
     170
     171        if (veto.veto) {
     172            log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
     173
     174            return this;
     175        }
     176
     177        // provide opportunity to alter form data before it is serialized
     178        if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
     179            log('ajaxSubmit: submit aborted via beforeSerialize callback');
     180
     181            return this;
     182        }
     183
     184        var traditional = options.traditional;
     185
     186        if (typeof traditional === 'undefined') {
     187            traditional = $.ajaxSettings.traditional;
     188        }
     189
     190        var elements = [];
     191        var qx, a = this.formToArray(options.semantic, elements, options.filtering);
     192
     193        if (options.data) {
     194            var optionsData = $.isFunction(options.data) ? options.data(a) : options.data;
     195
     196            options.extraData = optionsData;
     197            qx = $.param(optionsData, traditional);
     198        }
     199
     200        // give pre-submit callback an opportunity to abort the submit
     201        if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
     202            log('ajaxSubmit: submit aborted via beforeSubmit callback');
     203
     204            return this;
     205        }
     206
     207        // fire vetoable 'validate' event
     208        this.trigger('form-submit-validate', [a, this, options, veto]);
     209        if (veto.veto) {
     210            log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
     211
     212            return this;
     213        }
     214
     215        var q = $.param(a, traditional);
     216
     217        if (qx) {
     218            q = (q ? (q + '&' + qx) : qx);
     219        }
     220
     221        if (options.type.toUpperCase() === 'GET') {
     222            options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
     223            options.data = null;    // data is null for 'get'
     224        } else {
     225            options.data = q;       // data is the query string for 'post'
     226        }
     227
     228        var callbacks = [];
     229
     230        if (options.resetForm) {
     231            callbacks.push(function() {
     232                $form.resetForm();
     233            });
     234        }
     235
     236        if (options.clearForm) {
     237            callbacks.push(function() {
     238                $form.clearForm(options.includeHidden);
     239            });
     240        }
     241
     242        // perform a load on the target only if dataType is not provided
     243        if (!options.dataType && options.target) {
     244            var oldSuccess = options.success || function(){};
     245
     246            callbacks.push(function(data, textStatus, jqXHR) {
     247                var successArguments = arguments,
     248                    fn = options.replaceTarget ? 'replaceWith' : 'html';
     249
     250                $(options.target)[fn](data).each(function(){
     251                    oldSuccess.apply(this, successArguments);
     252                });
     253            });
     254
     255        } else if (options.success) {
     256            if ($.isArray(options.success)) {
     257                $.merge(callbacks, options.success);
    1112258            } else {
    1113                 $(this).val('');
    1114             }
    1115         }
    1116         else if (includeHidden) {
    1117             // includeHidden can be the value true, or it can be a selector string
    1118             // indicating a special test; for example:
    1119             //  $('#myForm').clearForm('.special:hidden')
    1120             // the above would clean hidden inputs that have the class of 'special'
    1121             if ( (includeHidden === true && /hidden/.test(t)) ||
    1122                  (typeof includeHidden == 'string' && $(this).is(includeHidden)) )
    1123                 this.value = '';
    1124         }
    1125     });
    1126 };
    1127 
    1128 /**
    1129  * Resets the form data.  Causes all form elements to be reset to their original value.
    1130  */
    1131 $.fn.resetForm = function() {
    1132     return this.each(function() {
    1133         // guard against an input with the name of 'reset'
    1134         // note that IE reports the reset function as an 'object'
    1135         if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
    1136             this.reset();
    1137         }
    1138     });
    1139 };
    1140 
    1141 /**
    1142  * Enables or disables any matching elements.
    1143  */
    1144 $.fn.enable = function(b) {
    1145     if (b === undefined) {
    1146         b = true;
    1147     }
    1148     return this.each(function() {
    1149         this.disabled = !b;
    1150     });
    1151 };
    1152 
    1153 /**
    1154  * Checks/unchecks any matching checkboxes or radio buttons and
    1155  * selects/deselects and matching option elements.
    1156  */
    1157 $.fn.selected = function(select) {
    1158     if (select === undefined) {
    1159         select = true;
    1160     }
    1161     return this.each(function() {
    1162         var t = this.type;
    1163         if (t == 'checkbox' || t == 'radio') {
    1164             this.checked = select;
    1165         }
    1166         else if (this.tagName.toLowerCase() == 'option') {
    1167             var $sel = $(this).parent('select');
    1168             if (select && $sel[0] && $sel[0].type == 'select-one') {
    1169                 // deselect all other options
    1170                 $sel.find('option').selected(false);
    1171             }
    1172             this.selected = select;
    1173         }
    1174     });
    1175 };
    1176 
    1177 // expose debug var
    1178 $.fn.ajaxSubmit.debug = false;
    1179 
    1180 // helper fn for console logging
    1181 function log() {
    1182     if (!$.fn.ajaxSubmit.debug)
    1183         return;
    1184     var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
    1185     if (window.console && window.console.log) {
    1186         window.console.log(msg);
    1187     }
    1188     else if (window.opera && window.opera.postError) {
    1189         window.opera.postError(msg);
    1190     }
    1191 }
    1192 
    1193 })(jQuery);
     259                callbacks.push(options.success);
     260            }
     261        }
     262
     263        options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
     264            var context = options.context || this;      // jQuery 1.4+ supports scope context
     265
     266            for (var i = 0, max = callbacks.length; i < max; i++) {
     267                callbacks[i].apply(context, [data, status, xhr || $form, $form]);
     268            }
     269        };
     270
     271        if (options.error) {
     272            var oldError = options.error;
     273
     274            options.error = function(xhr, status, error) {
     275                var context = options.context || this;
     276
     277                oldError.apply(context, [xhr, status, error, $form]);
     278            };
     279        }
     280
     281        if (options.complete) {
     282            var oldComplete = options.complete;
     283
     284            options.complete = function(xhr, status) {
     285                var context = options.context || this;
     286
     287                oldComplete.apply(context, [xhr, status, $form]);
     288            };
     289        }
     290
     291        // are there files to upload?
     292
     293        // [value] (issue #113), also see comment:
     294        // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219
     295        var fileInputs = $('input[type=file]:enabled', this).filter(function() {
     296            return $(this).val() !== '';
     297        });
     298        var hasFileInputs = fileInputs.length > 0;
     299        var mp = 'multipart/form-data';
     300        var multipart = ($form.attr('enctype') === mp || $form.attr('encoding') === mp);
     301        var fileAPI = feature.fileapi && feature.formdata;
     302
     303        log('fileAPI :' + fileAPI);
     304
     305        var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
     306        var jqxhr;
     307
     308        // options.iframe allows user to force iframe mode
     309        // 06-NOV-09: now defaulting to iframe mode if file input is detected
     310        if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
     311            // hack to fix Safari hang (thanks to Tim Molendijk for this)
     312            // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
     313            if (options.closeKeepAlive) {
     314                $.get(options.closeKeepAlive, function() {
     315                    jqxhr = fileUploadIframe(a);
     316                });
     317
     318            } else {
     319                jqxhr = fileUploadIframe(a);
     320            }
     321
     322        } else if ((hasFileInputs || multipart) && fileAPI) {
     323            jqxhr = fileUploadXhr(a);
     324
     325        } else {
     326            jqxhr = $.ajax(options);
     327        }
     328
     329        $form.removeData('jqxhr').data('jqxhr', jqxhr);
     330
     331        // clear element array
     332        for (var k = 0; k < elements.length; k++) {
     333            elements[k] = null;
     334        }
     335
     336        // fire 'notify' event
     337        this.trigger('form-submit-notify', [this, options]);
     338
     339        return this;
     340
     341        // utility fn for deep serialization
     342        function deepSerialize(extraData) {
     343            var serialized = $.param(extraData, options.traditional).split('&');
     344            var len = serialized.length;
     345            var result = [];
     346            var i, part;
     347
     348            for (i = 0; i < len; i++) {
     349                // #252; undo param space replacement
     350                serialized[i] = serialized[i].replace(/\+/g, ' ');
     351                part = serialized[i].split('=');
     352                // #278; use array instead of object storage, favoring array serializations
     353                result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);
     354            }
     355
     356            return result;
     357        }
     358
     359        // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
     360        function fileUploadXhr(a) {
     361            var formdata = new FormData();
     362
     363            for (var i = 0; i < a.length; i++) {
     364                formdata.append(a[i].name, a[i].value);
     365            }
     366
     367            if (options.extraData) {
     368                var serializedData = deepSerialize(options.extraData);
     369
     370                for (i = 0; i < serializedData.length; i++) {
     371                    if (serializedData[i]) {
     372                        formdata.append(serializedData[i][0], serializedData[i][1]);
     373                    }
     374                }
     375            }
     376
     377            options.data = null;
     378
     379            var s = $.extend(true, {}, $.ajaxSettings, options, {
     380                contentType : false,
     381                processData : false,
     382                cache       : false,
     383                type        : method || 'POST'
     384            });
     385
     386            if (options.uploadProgress) {
     387                // workaround because jqXHR does not expose upload property
     388                s.xhr = function() {
     389                    var xhr = $.ajaxSettings.xhr();
     390
     391                    if (xhr.upload) {
     392                        xhr.upload.addEventListener('progress', function(event) {
     393                            var percent = 0;
     394                            var position = event.loaded || event.position;          /* event.position is deprecated */
     395                            var total = event.total;
     396
     397                            if (event.lengthComputable) {
     398                                percent = Math.ceil(position / total * 100);
     399                            }
     400
     401                            options.uploadProgress(event, position, total, percent);
     402                        }, false);
     403                    }
     404
     405                    return xhr;
     406                };
     407            }
     408
     409            s.data = null;
     410
     411            var beforeSend = s.beforeSend;
     412
     413            s.beforeSend = function(xhr, o) {
     414                // Send FormData() provided by user
     415                if (options.formData) {
     416                    o.data = options.formData;
     417                } else {
     418                    o.data = formdata;
     419                }
     420
     421                if (beforeSend) {
     422                    beforeSend.call(this, xhr, o);
     423                }
     424            };
     425
     426            return $.ajax(s);
     427        }
     428
     429        // private function for handling file uploads (hat tip to YAHOO!)
     430        function fileUploadIframe(a) {
     431            var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
     432            var deferred = $.Deferred();
     433
     434            // #341
     435            deferred.abort = function(status) {
     436                xhr.abort(status);
     437            };
     438
     439            if (a) {
     440                // ensure that every serialized input is still enabled
     441                for (i = 0; i < elements.length; i++) {
     442                    el = $(elements[i]);
     443                    if (hasProp) {
     444                        el.prop('disabled', false);
     445                    } else {
     446                        el.removeAttr('disabled');
     447                    }
     448                }
     449            }
     450
     451            s = $.extend(true, {}, $.ajaxSettings, options);
     452            s.context = s.context || s;
     453            id = 'jqFormIO' + new Date().getTime();
     454            var ownerDocument = form.ownerDocument;
     455            var $body = $form.closest('body');
     456
     457            if (s.iframeTarget) {
     458                $io = $(s.iframeTarget, ownerDocument);
     459                n = $io.attr2('name');
     460                if (!n) {
     461                    $io.attr2('name', id);
     462                } else {
     463                    id = n;
     464                }
     465
     466            } else {
     467                $io = $('<iframe name="' + id + '" src="' + s.iframeSrc + '" />', ownerDocument);
     468                $io.css({position: 'absolute', top: '-1000px', left: '-1000px'});
     469            }
     470            io = $io[0];
     471
     472
     473            xhr = { // mock object
     474                aborted               : 0,
     475                responseText          : null,
     476                responseXML           : null,
     477                status                : 0,
     478                statusText            : 'n/a',
     479                getAllResponseHeaders : function() {},
     480                getResponseHeader     : function() {},
     481                setRequestHeader      : function() {},
     482                abort                 : function(status) {
     483                    var e = (status === 'timeout' ? 'timeout' : 'aborted');
     484
     485                    log('aborting upload... ' + e);
     486                    this.aborted = 1;
     487
     488                    try { // #214, #257
     489                        if (io.contentWindow.document.execCommand) {
     490                            io.contentWindow.document.execCommand('Stop');
     491                        }
     492                    } catch (ignore) {}
     493
     494                    $io.attr('src', s.iframeSrc); // abort op in progress
     495                    xhr.error = e;
     496                    if (s.error) {
     497                        s.error.call(s.context, xhr, e, status);
     498                    }
     499
     500                    if (g) {
     501                        $.event.trigger('ajaxError', [xhr, s, e]);
     502                    }
     503
     504                    if (s.complete) {
     505                        s.complete.call(s.context, xhr, e);
     506                    }
     507                }
     508            };
     509
     510            g = s.global;
     511            // trigger ajax global events so that activity/block indicators work like normal
     512            if (g && $.active++ === 0) {
     513                $.event.trigger('ajaxStart');
     514            }
     515            if (g) {
     516                $.event.trigger('ajaxSend', [xhr, s]);
     517            }
     518
     519            if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
     520                if (s.global) {
     521                    $.active--;
     522                }
     523                deferred.reject();
     524
     525                return deferred;
     526            }
     527
     528            if (xhr.aborted) {
     529                deferred.reject();
     530
     531                return deferred;
     532            }
     533
     534            // add submitting element to data if we know it
     535            sub = form.clk;
     536            if (sub) {
     537                n = sub.name;
     538                if (n && !sub.disabled) {
     539                    s.extraData = s.extraData || {};
     540                    s.extraData[n] = sub.value;
     541                    if (sub.type === 'image') {
     542                        s.extraData[n + '.x'] = form.clk_x;
     543                        s.extraData[n + '.y'] = form.clk_y;
     544                    }
     545                }
     546            }
     547
     548            var CLIENT_TIMEOUT_ABORT = 1;
     549            var SERVER_ABORT = 2;
     550
     551            function getDoc(frame) {
     552                /* it looks like contentWindow or contentDocument do not
     553                 * carry the protocol property in ie8, when running under ssl
     554                 * frame.document is the only valid response document, since
     555                 * the protocol is know but not on the other two objects. strange?
     556                 * "Same origin policy" http://en.wikipedia.org/wiki/Same_origin_policy
     557                 */
     558
     559                var doc = null;
     560
     561                // IE8 cascading access check
     562                try {
     563                    if (frame.contentWindow) {
     564                        doc = frame.contentWindow.document;
     565                    }
     566                } catch (err) {
     567                    // IE8 access denied under ssl & missing protocol
     568                    log('cannot get iframe.contentWindow document: ' + err);
     569                }
     570
     571                if (doc) { // successful getting content
     572                    return doc;
     573                }
     574
     575                try { // simply checking may throw in ie8 under ssl or mismatched protocol
     576                    doc = frame.contentDocument ? frame.contentDocument : frame.document;
     577                } catch (err) {
     578                    // last attempt
     579                    log('cannot get iframe.contentDocument: ' + err);
     580                    doc = frame.document;
     581                }
     582
     583                return doc;
     584            }
     585
     586            // Rails CSRF hack (thanks to Yvan Barthelemy)
     587            var csrf_token = $('meta[name=csrf-token]').attr('content');
     588            var csrf_param = $('meta[name=csrf-param]').attr('content');
     589
     590            if (csrf_param && csrf_token) {
     591                s.extraData = s.extraData || {};
     592                s.extraData[csrf_param] = csrf_token;
     593            }
     594
     595            // take a breath so that pending repaints get some cpu time before the upload starts
     596            function doSubmit() {
     597                // make sure form attrs are set
     598                var t = $form.attr2('target'),
     599                    a = $form.attr2('action'),
     600                    mp = 'multipart/form-data',
     601                    et = $form.attr('enctype') || $form.attr('encoding') || mp;
     602
     603                // update form attrs in IE friendly way
     604                form.setAttribute('target', id);
     605                if (!method || /post/i.test(method)) {
     606                    form.setAttribute('method', 'POST');
     607                }
     608                if (a !== s.url) {
     609                    form.setAttribute('action', s.url);
     610                }
     611
     612                // ie borks in some cases when setting encoding
     613                if (!s.skipEncodingOverride && (!method || /post/i.test(method))) {
     614                    $form.attr({
     615                        encoding : 'multipart/form-data',
     616                        enctype  : 'multipart/form-data'
     617                    });
     618                }
     619
     620                // support timout
     621                if (s.timeout) {
     622                    timeoutHandle = setTimeout(function() {
     623                        timedOut = true; cb(CLIENT_TIMEOUT_ABORT);
     624                    }, s.timeout);
     625                }
     626
     627                // look for server aborts
     628                function checkState() {
     629                    try {
     630                        var state = getDoc(io).readyState;
     631
     632                        log('state = ' + state);
     633                        if (state && state.toLowerCase() === 'uninitialized') {
     634                            setTimeout(checkState, 50);
     635                        }
     636
     637                    } catch (e) {
     638                        log('Server abort: ', e, ' (', e.name, ')');
     639                        cb(SERVER_ABORT);               // eslint-disable-line callback-return
     640                        if (timeoutHandle) {
     641                            clearTimeout(timeoutHandle);
     642                        }
     643                        timeoutHandle = undefined;
     644                    }
     645                }
     646
     647                // add "extra" data to form if provided in options
     648                var extraInputs = [];
     649
     650                try {
     651                    if (s.extraData) {
     652                        for (var n in s.extraData) {
     653                            if (s.extraData.hasOwnProperty(n)) {
     654                                // if using the $.param format that allows for multiple values with the same name
     655                                if ($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
     656                                    extraInputs.push(
     657                                    $('<input type="hidden" name="' + s.extraData[n].name + '">', ownerDocument).val(s.extraData[n].value)
     658                                        .appendTo(form)[0]);
     659                                } else {
     660                                    extraInputs.push(
     661                                    $('<input type="hidden" name="' + n + '">', ownerDocument).val(s.extraData[n])
     662                                        .appendTo(form)[0]);
     663                                }
     664                            }
     665                        }
     666                    }
     667
     668                    if (!s.iframeTarget) {
     669                        // add iframe to doc and submit the form
     670                        $io.appendTo($body);
     671                    }
     672
     673                    if (io.attachEvent) {
     674                        io.attachEvent('onload', cb);
     675                    } else {
     676                        io.addEventListener('load', cb, false);
     677                    }
     678
     679                    setTimeout(checkState, 15);
     680
     681                    try {
     682                        form.submit();
     683
     684                    } catch (err) {
     685                        // just in case form has element with name/id of 'submit'
     686                        var submitFn = document.createElement('form').submit;
     687
     688                        submitFn.apply(form);
     689                    }
     690
     691                } finally {
     692                    // reset attrs and remove "extra" input elements
     693                    form.setAttribute('action', a);
     694                    form.setAttribute('enctype', et); // #380
     695                    if (t) {
     696                        form.setAttribute('target', t);
     697                    } else {
     698                        $form.removeAttr('target');
     699                    }
     700                    $(extraInputs).remove();
     701                }
     702            }
     703
     704            if (s.forceSync) {
     705                doSubmit();
     706            } else {
     707                setTimeout(doSubmit, 10); // this lets dom updates render
     708            }
     709
     710            var data, doc, domCheckCount = 50, callbackProcessed;
     711
     712            function cb(e) {
     713                if (xhr.aborted || callbackProcessed) {
     714                    return;
     715                }
     716
     717                doc = getDoc(io);
     718                if (!doc) {
     719                    log('cannot access response document');
     720                    e = SERVER_ABORT;
     721                }
     722                if (e === CLIENT_TIMEOUT_ABORT && xhr) {
     723                    xhr.abort('timeout');
     724                    deferred.reject(xhr, 'timeout');
     725
     726                    return;
     727
     728                } else if (e === SERVER_ABORT && xhr) {
     729                    xhr.abort('server abort');
     730                    deferred.reject(xhr, 'error', 'server abort');
     731
     732                    return;
     733                }
     734
     735                if (!doc || doc.location.href === s.iframeSrc) {
     736                    // response not received yet
     737                    if (!timedOut) {
     738                        return;
     739                    }
     740                }
     741
     742                if (io.detachEvent) {
     743                    io.detachEvent('onload', cb);
     744                } else {
     745                    io.removeEventListener('load', cb, false);
     746                }
     747
     748                var status = 'success', errMsg;
     749
     750                try {
     751                    if (timedOut) {
     752                        throw 'timeout';
     753                    }
     754
     755                    var isXml = s.dataType === 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
     756
     757                    log('isXml=' + isXml);
     758
     759                    if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
     760                        if (--domCheckCount) {
     761                            // in some browsers (Opera) the iframe DOM is not always traversable when
     762                            // the onload callback fires, so we loop a bit to accommodate
     763                            log('requeing onLoad callback, DOM not available');
     764                            setTimeout(cb, 250);
     765
     766                            return;
     767                        }
     768                        // let this fall through because server response could be an empty document
     769                        // log('Could not access iframe DOM after mutiple tries.');
     770                        // throw 'DOMException: not available';
     771                    }
     772
     773                    // log('response detected');
     774                    var docRoot = doc.body ? doc.body : doc.documentElement;
     775
     776                    xhr.responseText = docRoot ? docRoot.innerHTML : null;
     777                    xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
     778                    if (isXml) {
     779                        s.dataType = 'xml';
     780                    }
     781                    xhr.getResponseHeader = function(header){
     782                        var headers = {'content-type': s.dataType};
     783
     784                        return headers[header.toLowerCase()];
     785                    };
     786                    // support for XHR 'status' & 'statusText' emulation :
     787                    if (docRoot) {
     788                        xhr.status = Number(docRoot.getAttribute('status')) || xhr.status;
     789                        xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
     790                    }
     791
     792                    var dt = (s.dataType || '').toLowerCase();
     793                    var scr = /(json|script|text)/.test(dt);
     794
     795                    if (scr || s.textarea) {
     796                        // see if user embedded response in textarea
     797                        var ta = doc.getElementsByTagName('textarea')[0];
     798
     799                        if (ta) {
     800                            xhr.responseText = ta.value;
     801                            // support for XHR 'status' & 'statusText' emulation :
     802                            xhr.status = Number(ta.getAttribute('status')) || xhr.status;
     803                            xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
     804
     805                        } else if (scr) {
     806                            // account for browsers injecting pre around json response
     807                            var pre = doc.getElementsByTagName('pre')[0];
     808                            var b = doc.getElementsByTagName('body')[0];
     809
     810                            if (pre) {
     811                                xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
     812                            } else if (b) {
     813                                xhr.responseText = b.textContent ? b.textContent : b.innerText;
     814                            }
     815                        }
     816
     817                    } else if (dt === 'xml' && !xhr.responseXML && xhr.responseText) {
     818                        xhr.responseXML = toXml(xhr.responseText);          // eslint-disable-line no-use-before-define
     819                    }
     820
     821                    try {
     822                        data = httpData(xhr, dt, s);                        // eslint-disable-line no-use-before-define
     823
     824                    } catch (err) {
     825                        status = 'parsererror';
     826                        xhr.error = errMsg = (err || status);
     827                    }
     828
     829                } catch (err) {
     830                    log('error caught: ', err);
     831                    status = 'error';
     832                    xhr.error = errMsg = (err || status);
     833                }
     834
     835                if (xhr.aborted) {
     836                    log('upload aborted');
     837                    status = null;
     838                }
     839
     840                if (xhr.status) { // we've set xhr.status
     841                    status = ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) ? 'success' : 'error';
     842                }
     843
     844                // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
     845                if (status === 'success') {
     846                    if (s.success) {
     847                        s.success.call(s.context, data, 'success', xhr);
     848                    }
     849
     850                    deferred.resolve(xhr.responseText, 'success', xhr);
     851
     852                    if (g) {
     853                        $.event.trigger('ajaxSuccess', [xhr, s]);
     854                    }
     855
     856                } else if (status) {
     857                    if (typeof errMsg === 'undefined') {
     858                        errMsg = xhr.statusText;
     859                    }
     860                    if (s.error) {
     861                        s.error.call(s.context, xhr, status, errMsg);
     862                    }
     863                    deferred.reject(xhr, 'error', errMsg);
     864                    if (g) {
     865                        $.event.trigger('ajaxError', [xhr, s, errMsg]);
     866                    }
     867                }
     868
     869                if (g) {
     870                    $.event.trigger('ajaxComplete', [xhr, s]);
     871                }
     872
     873                if (g && !--$.active) {
     874                    $.event.trigger('ajaxStop');
     875                }
     876
     877                if (s.complete) {
     878                    s.complete.call(s.context, xhr, status);
     879                }
     880
     881                callbackProcessed = true;
     882                if (s.timeout) {
     883                    clearTimeout(timeoutHandle);
     884                }
     885
     886                // clean up
     887                setTimeout(function() {
     888                    if (!s.iframeTarget) {
     889                        $io.remove();
     890                    } else { // adding else to clean up existing iframe response.
     891                        $io.attr('src', s.iframeSrc);
     892                    }
     893                    xhr.responseXML = null;
     894                }, 100);
     895            }
     896
     897            var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
     898                if (window.ActiveXObject) {
     899                    doc = new ActiveXObject('Microsoft.XMLDOM');
     900                    doc.async = 'false';
     901                    doc.loadXML(s);
     902
     903                } else {
     904                    doc = (new DOMParser()).parseFromString(s, 'text/xml');
     905                }
     906
     907                return (doc && doc.documentElement && doc.documentElement.nodeName !== 'parsererror') ? doc : null;
     908            };
     909            var parseJSON = $.parseJSON || function(s) {
     910                /* jslint evil:true */
     911                return window['eval']('(' + s + ')');           // eslint-disable-line dot-notation
     912            };
     913
     914            var httpData = function(xhr, type, s) { // mostly lifted from jq1.4.4
     915
     916                var ct = xhr.getResponseHeader('content-type') || '',
     917                    xml = ((type === 'xml' || !type) && ct.indexOf('xml') >= 0),
     918                    data = xml ? xhr.responseXML : xhr.responseText;
     919
     920                if (xml && data.documentElement.nodeName === 'parsererror') {
     921                    if ($.error) {
     922                        $.error('parsererror');
     923                    }
     924                }
     925                if (s && s.dataFilter) {
     926                    data = s.dataFilter(data, type);
     927                }
     928                if (typeof data === 'string') {
     929                    if ((type === 'json' || !type) && ct.indexOf('json') >= 0) {
     930                        data = parseJSON(data);
     931                    } else if ((type === 'script' || !type) && ct.indexOf('javascript') >= 0) {
     932                        $.globalEval(data);
     933                    }
     934                }
     935
     936                return data;
     937            };
     938
     939            return deferred;
     940        }
     941    };
     942
     943    /**
     944     * ajaxForm() provides a mechanism for fully automating form submission.
     945     *
     946     * The advantages of using this method instead of ajaxSubmit() are:
     947     *
     948     * 1: This method will include coordinates for <input type="image"> elements (if the element
     949     *  is used to submit the form).
     950     * 2. This method will include the submit element's name/value data (for the element that was
     951     *  used to submit the form).
     952     * 3. This method binds the submit() method to the form for you.
     953     *
     954     * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
     955     * passes the options argument along after properly binding events for submit elements and
     956     * the form itself.
     957     */
     958    $.fn.ajaxForm = function(options, data, dataType, onSuccess) {
     959        if (typeof options === 'string' || (options === false && arguments.length > 0)) {
     960            options = {
     961                'url'      : options,
     962                'data'     : data,
     963                'dataType' : dataType
     964            };
     965
     966            if (typeof onSuccess === 'function') {
     967                options.success = onSuccess;
     968            }
     969        }
     970
     971        options = options || {};
     972        options.delegation = options.delegation && $.isFunction($.fn.on);
     973
     974        // in jQuery 1.3+ we can fix mistakes with the ready state
     975        if (!options.delegation && this.length === 0) {
     976            var o = {s: this.selector, c: this.context};
     977
     978            if (!$.isReady && o.s) {
     979                log('DOM not ready, queuing ajaxForm');
     980                $(function() {
     981                    $(o.s, o.c).ajaxForm(options);
     982                });
     983
     984                return this;
     985            }
     986
     987            // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
     988            log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
     989
     990            return this;
     991        }
     992
     993        if (options.delegation) {
     994            $(document)
     995                .off('submit.form-plugin', this.selector, doAjaxSubmit)
     996                .off('click.form-plugin', this.selector, captureSubmittingElement)
     997                .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
     998                .on('click.form-plugin', this.selector, options, captureSubmittingElement);
     999
     1000            return this;
     1001        }
     1002
     1003        return this.ajaxFormUnbind()
     1004            .on('submit.form-plugin', options, doAjaxSubmit)
     1005            .on('click.form-plugin', options, captureSubmittingElement);
     1006    };
     1007
     1008    // private event handlers
     1009    function doAjaxSubmit(e) {
     1010        /* jshint validthis:true */
     1011        var options = e.data;
     1012
     1013        if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
     1014            e.preventDefault();
     1015            $(e.target).closest('form').ajaxSubmit(options); // #365
     1016        }
     1017    }
     1018
     1019    function captureSubmittingElement(e) {
     1020        /* jshint validthis:true */
     1021        var target = e.target;
     1022        var $el = $(target);
     1023
     1024        if (!$el.is('[type=submit],[type=image]')) {
     1025            // is this a child element of the submit el?  (ex: a span within a button)
     1026            var t = $el.closest('[type=submit]');
     1027
     1028            if (t.length === 0) {
     1029                return;
     1030            }
     1031            target = t[0];
     1032        }
     1033
     1034        var form = target.form;
     1035
     1036        form.clk = target;
     1037
     1038        if (target.type === 'image') {
     1039            if (typeof e.offsetX !== 'undefined') {
     1040                form.clk_x = e.offsetX;
     1041                form.clk_y = e.offsetY;
     1042
     1043            } else if (typeof $.fn.offset === 'function') {
     1044                var offset = $el.offset();
     1045
     1046                form.clk_x = e.pageX - offset.left;
     1047                form.clk_y = e.pageY - offset.top;
     1048
     1049            } else {
     1050                form.clk_x = e.pageX - target.offsetLeft;
     1051                form.clk_y = e.pageY - target.offsetTop;
     1052            }
     1053        }
     1054        // clear form vars
     1055        setTimeout(function() {
     1056            form.clk = form.clk_x = form.clk_y = null;
     1057        }, 100);
     1058    }
     1059
     1060
     1061    // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
     1062    $.fn.ajaxFormUnbind = function() {
     1063        return this.off('submit.form-plugin click.form-plugin');
     1064    };
     1065
     1066    /**
     1067     * formToArray() gathers form element data into an array of objects that can
     1068     * be passed to any of the following ajax functions: $.get, $.post, or load.
     1069     * Each object in the array has both a 'name' and 'value' property. An example of
     1070     * an array for a simple login form might be:
     1071     *
     1072     * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
     1073     *
     1074     * It is this array that is passed to pre-submit callback functions provided to the
     1075     * ajaxSubmit() and ajaxForm() methods.
     1076     */
     1077    $.fn.formToArray = function(semantic, elements, filtering) {
     1078        var a = [];
     1079
     1080        if (this.length === 0) {
     1081            return a;
     1082        }
     1083
     1084        var form = this[0];
     1085        var formId = this.attr('id');
     1086        var els = (semantic || typeof form.elements === 'undefined') ? form.getElementsByTagName('*') : form.elements;
     1087        var els2;
     1088
     1089        if (els) {
     1090            els = $.makeArray(els); // convert to standard array
     1091        }
     1092
     1093        // #386; account for inputs outside the form which use the 'form' attribute
     1094        // FinesseRus: in non-IE browsers outside fields are already included in form.elements.
     1095        if (formId && (semantic || /(Edge|Trident)\//.test(navigator.userAgent))) {
     1096            els2 = $(':input[form="' + formId + '"]').get(); // hat tip @thet
     1097            if (els2.length) {
     1098                els = (els || []).concat(els2);
     1099            }
     1100        }
     1101
     1102        if (!els || !els.length) {
     1103            return a;
     1104        }
     1105
     1106        if ($.isFunction(filtering)) {
     1107            els = $.map(els, filtering);
     1108        }
     1109
     1110        var i, j, n, v, el, max, jmax;
     1111
     1112        for (i = 0, max = els.length; i < max; i++) {
     1113            el = els[i];
     1114            n = el.name;
     1115            if (!n || el.disabled) {
     1116                continue;
     1117            }
     1118
     1119            if (semantic && form.clk && el.type === 'image') {
     1120                // handle image inputs on the fly when semantic == true
     1121                if (form.clk === el) {
     1122                    a.push({name: n, value: $(el).val(), type: el.type});
     1123                    a.push({name: n + '.x', value: form.clk_x}, {name: n + '.y', value: form.clk_y});
     1124                }
     1125                continue;
     1126            }
     1127
     1128            v = $.fieldValue(el, true);
     1129            if (v && v.constructor === Array) {
     1130                if (elements) {
     1131                    elements.push(el);
     1132                }
     1133                for (j = 0, jmax = v.length; j < jmax; j++) {
     1134                    a.push({name: n, value: v[j]});
     1135                }
     1136
     1137            } else if (feature.fileapi && el.type === 'file') {
     1138                if (elements) {
     1139                    elements.push(el);
     1140                }
     1141
     1142                var files = el.files;
     1143
     1144                if (files.length) {
     1145                    for (j = 0; j < files.length; j++) {
     1146                        a.push({name: n, value: files[j], type: el.type});
     1147                    }
     1148                } else {
     1149                    // #180
     1150                    a.push({name: n, value: '', type: el.type});
     1151                }
     1152
     1153            } else if (v !== null && typeof v !== 'undefined') {
     1154                if (elements) {
     1155                    elements.push(el);
     1156                }
     1157                a.push({name: n, value: v, type: el.type, required: el.required});
     1158            }
     1159        }
     1160
     1161        if (!semantic && form.clk) {
     1162            // input type=='image' are not found in elements array! handle it here
     1163            var $input = $(form.clk), input = $input[0];
     1164
     1165            n = input.name;
     1166
     1167            if (n && !input.disabled && input.type === 'image') {
     1168                a.push({name: n, value: $input.val()});
     1169                a.push({name: n + '.x', value: form.clk_x}, {name: n + '.y', value: form.clk_y});
     1170            }
     1171        }
     1172
     1173        return a;
     1174    };
     1175
     1176    /**
     1177     * Serializes form data into a 'submittable' string. This method will return a string
     1178     * in the format: name1=value1&amp;name2=value2
     1179     */
     1180    $.fn.formSerialize = function(semantic) {
     1181        // hand off to jQuery.param for proper encoding
     1182        return $.param(this.formToArray(semantic));
     1183    };
     1184
     1185    /**
     1186     * Serializes all field elements in the jQuery object into a query string.
     1187     * This method will return a string in the format: name1=value1&amp;name2=value2
     1188     */
     1189    $.fn.fieldSerialize = function(successful) {
     1190        var a = [];
     1191
     1192        this.each(function() {
     1193            var n = this.name;
     1194
     1195            if (!n) {
     1196                return;
     1197            }
     1198
     1199            var v = $.fieldValue(this, successful);
     1200
     1201            if (v && v.constructor === Array) {
     1202                for (var i = 0, max = v.length; i < max; i++) {
     1203                    a.push({name: n, value: v[i]});
     1204                }
     1205
     1206            } else if (v !== null && typeof v !== 'undefined') {
     1207                a.push({name: this.name, value: v});
     1208            }
     1209        });
     1210
     1211        // hand off to jQuery.param for proper encoding
     1212        return $.param(a);
     1213    };
     1214
     1215    /**
     1216     * Returns the value(s) of the element in the matched set. For example, consider the following form:
     1217     *
     1218     *  <form><fieldset>
     1219     *      <input name="A" type="text">
     1220     *      <input name="A" type="text">
     1221     *      <input name="B" type="checkbox" value="B1">
     1222     *      <input name="B" type="checkbox" value="B2">
     1223     *      <input name="C" type="radio" value="C1">
     1224     *      <input name="C" type="radio" value="C2">
     1225     *  </fieldset></form>
     1226     *
     1227     *  var v = $('input[type=text]').fieldValue();
     1228     *  // if no values are entered into the text inputs
     1229     *  v === ['','']
     1230     *  // if values entered into the text inputs are 'foo' and 'bar'
     1231     *  v === ['foo','bar']
     1232     *
     1233     *  var v = $('input[type=checkbox]').fieldValue();
     1234     *  // if neither checkbox is checked
     1235     *  v === undefined
     1236     *  // if both checkboxes are checked
     1237     *  v === ['B1', 'B2']
     1238     *
     1239     *  var v = $('input[type=radio]').fieldValue();
     1240     *  // if neither radio is checked
     1241     *  v === undefined
     1242     *  // if first radio is checked
     1243     *  v === ['C1']
     1244     *
     1245     * The successful argument controls whether or not the field element must be 'successful'
     1246     * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
     1247     * The default value of the successful argument is true. If this value is false the value(s)
     1248     * for each element is returned.
     1249     *
     1250     * Note: This method *always* returns an array. If no valid value can be determined the
     1251     *  array will be empty, otherwise it will contain one or more values.
     1252     */
     1253    $.fn.fieldValue = function(successful) {
     1254        for (var val = [], i = 0, max = this.length; i < max; i++) {
     1255            var el = this[i];
     1256            var v = $.fieldValue(el, successful);
     1257
     1258            if (v === null || typeof v === 'undefined' || (v.constructor === Array && !v.length)) {
     1259                continue;
     1260            }
     1261
     1262            if (v.constructor === Array) {
     1263                $.merge(val, v);
     1264            } else {
     1265                val.push(v);
     1266            }
     1267        }
     1268
     1269        return val;
     1270    };
     1271
     1272    /**
     1273     * Returns the value of the field element.
     1274     */
     1275    $.fieldValue = function(el, successful) {
     1276        var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
     1277
     1278        if (typeof successful === 'undefined') {
     1279            successful = true;
     1280        }
     1281
     1282        /* eslint-disable no-mixed-operators */
     1283        if (successful && (!n || el.disabled || t === 'reset' || t === 'button' ||
     1284            (t === 'checkbox' || t === 'radio') && !el.checked ||
     1285            (t === 'submit' || t === 'image') && el.form && el.form.clk !== el ||
     1286            tag === 'select' && el.selectedIndex === -1)) {
     1287        /* eslint-enable no-mixed-operators */
     1288            return null;
     1289        }
     1290
     1291        if (tag === 'select') {
     1292            var index = el.selectedIndex;
     1293
     1294            if (index < 0) {
     1295                return null;
     1296            }
     1297
     1298            var a = [], ops = el.options;
     1299            var one = (t === 'select-one');
     1300            var max = (one ? index + 1 : ops.length);
     1301
     1302            for (var i = (one ? index : 0); i < max; i++) {
     1303                var op = ops[i];
     1304
     1305                if (op.selected && !op.disabled) {
     1306                    var v = op.value;
     1307
     1308                    if (!v) { // extra pain for IE...
     1309                        v = (op.attributes && op.attributes.value && !(op.attributes.value.specified)) ? op.text : op.value;
     1310                    }
     1311
     1312                    if (one) {
     1313                        return v;
     1314                    }
     1315
     1316                    a.push(v);
     1317                }
     1318            }
     1319
     1320            return a;
     1321        }
     1322
     1323        return $(el).val().replace(rCRLF, '\r\n');
     1324    };
     1325
     1326    /**
     1327     * Clears the form data. Takes the following actions on the form's input fields:
     1328     *  - input text fields will have their 'value' property set to the empty string
     1329     *  - select elements will have their 'selectedIndex' property set to -1
     1330     *  - checkbox and radio inputs will have their 'checked' property set to false
     1331     *  - inputs of type submit, button, reset, and hidden will *not* be effected
     1332     *  - button elements will *not* be effected
     1333     */
     1334    $.fn.clearForm = function(includeHidden) {
     1335        return this.each(function() {
     1336            $('input,select,textarea', this).clearFields(includeHidden);
     1337        });
     1338    };
     1339
     1340    /**
     1341     * Clears the selected form elements.
     1342     */
     1343    $.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
     1344        var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
     1345
     1346        return this.each(function() {
     1347            var t = this.type, tag = this.tagName.toLowerCase();
     1348
     1349            if (re.test(t) || tag === 'textarea') {
     1350                this.value = '';
     1351
     1352            } else if (t === 'checkbox' || t === 'radio') {
     1353                this.checked = false;
     1354
     1355            } else if (tag === 'select') {
     1356                this.selectedIndex = -1;
     1357
     1358            } else if (t === 'file') {
     1359                if (/MSIE/.test(navigator.userAgent)) {
     1360                    $(this).replaceWith($(this).clone(true));
     1361                } else {
     1362                    $(this).val('');
     1363                }
     1364
     1365            } else if (includeHidden) {
     1366                // includeHidden can be the value true, or it can be a selector string
     1367                // indicating a special test; for example:
     1368                // $('#myForm').clearForm('.special:hidden')
     1369                // the above would clean hidden inputs that have the class of 'special'
     1370                if ((includeHidden === true && /hidden/.test(t)) ||
     1371                    (typeof includeHidden === 'string' && $(this).is(includeHidden))) {
     1372                    this.value = '';
     1373                }
     1374            }
     1375        });
     1376    };
     1377
     1378
     1379    /**
     1380     * Resets the form data or individual elements. Takes the following actions
     1381     * on the selected tags:
     1382     * - all fields within form elements will be reset to their original value
     1383     * - input / textarea / select fields will be reset to their original value
     1384     * - option / optgroup fields (for multi-selects) will defaulted individually
     1385     * - non-multiple options will find the right select to default
     1386     * - label elements will be searched against its 'for' attribute
     1387     * - all others will be searched for appropriate children to default
     1388     */
     1389    $.fn.resetForm = function() {
     1390        return this.each(function() {
     1391            var el = $(this);
     1392            var tag = this.tagName.toLowerCase();
     1393
     1394            switch (tag) {
     1395            case 'input':
     1396                this.checked = this.defaultChecked;
     1397                    // fall through
     1398
     1399            case 'textarea':
     1400                this.value = this.defaultValue;
     1401
     1402                return true;
     1403
     1404            case 'option':
     1405            case 'optgroup':
     1406                var select = el.parents('select');
     1407
     1408                if (select.length && select[0].multiple) {
     1409                    if (tag === 'option') {
     1410                        this.selected = this.defaultSelected;
     1411                    } else {
     1412                        el.find('option').resetForm();
     1413                    }
     1414                } else {
     1415                    select.resetForm();
     1416                }
     1417
     1418                return true;
     1419
     1420            case 'select':
     1421                el.find('option').each(function(i) {                // eslint-disable-line consistent-return
     1422                    this.selected = this.defaultSelected;
     1423                    if (this.defaultSelected && !el[0].multiple) {
     1424                        el[0].selectedIndex = i;
     1425
     1426                        return false;
     1427                    }
     1428                });
     1429
     1430                return true;
     1431
     1432            case 'label':
     1433                var forEl = $(el.attr('for'));
     1434                var list = el.find('input,select,textarea');
     1435
     1436                if (forEl[0]) {
     1437                    list.unshift(forEl[0]);
     1438                }
     1439
     1440                list.resetForm();
     1441
     1442                return true;
     1443
     1444            case 'form':
     1445                    // guard against an input with the name of 'reset'
     1446                    // note that IE reports the reset function as an 'object'
     1447                if (typeof this.reset === 'function' || (typeof this.reset === 'object' && !this.reset.nodeType)) {
     1448                    this.reset();
     1449                }
     1450
     1451                return true;
     1452
     1453            default:
     1454                el.find('form,input,label,select,textarea').resetForm();
     1455
     1456                return true;
     1457            }
     1458        });
     1459    };
     1460
     1461    /**
     1462     * Enables or disables any matching elements.
     1463     */
     1464    $.fn.enable = function(b) {
     1465        if (typeof b === 'undefined') {
     1466            b = true;
     1467        }
     1468
     1469        return this.each(function() {
     1470            this.disabled = !b;
     1471        });
     1472    };
     1473
     1474    /**
     1475     * Checks/unchecks any matching checkboxes or radio buttons and
     1476     * selects/deselects and matching option elements.
     1477     */
     1478    $.fn.selected = function(select) {
     1479        if (typeof select === 'undefined') {
     1480            select = true;
     1481        }
     1482
     1483        return this.each(function() {
     1484            var t = this.type;
     1485
     1486            if (t === 'checkbox' || t === 'radio') {
     1487                this.checked = select;
     1488
     1489            } else if (this.tagName.toLowerCase() === 'option') {
     1490                var $sel = $(this).parent('select');
     1491
     1492                if (select && $sel[0] && $sel[0].type === 'select-one') {
     1493                    // deselect all other options
     1494                    $sel.find('option').selected(false);
     1495                }
     1496
     1497                this.selected = select;
     1498            }
     1499        });
     1500    };
     1501
     1502    // expose debug var
     1503    $.fn.ajaxSubmit.debug = false;
     1504
     1505    // helper fn for console logging
     1506    function log() {
     1507        if (!$.fn.ajaxSubmit.debug) {
     1508            return;
     1509        }
     1510
     1511        var msg = '[jquery.form] ' + Array.prototype.join.call(arguments, '');
     1512
     1513        if (window.console && window.console.log) {
     1514            window.console.log(msg);
     1515
     1516        } else if (window.opera && window.opera.postError) {
     1517            window.opera.postError(msg);
     1518        }
     1519    }
     1520}));
  • trunk/src/wp-includes/js/jquery/jquery.form.min.js

    r25462 r41233  
    11/*!
    22 * jQuery Form Plugin
    3  * version: 3.37.0-2013.07.11
    4  * @requires jQuery v1.5 or later
    5  * Copyright (c) 2013 M. Alsup
    6  * Examples and documentation at: http://malsup.com/jquery/form/
    7  * Project repository: https://github.com/malsup/form
    8  * Dual licensed under the MIT and GPL licenses.
    9  * https://github.com/malsup/form#copyright-and-license
     3 * version: 4.2.1
     4 * Requires jQuery v1.7 or later
     5 * Copyright 2017 Kevin Morris
     6 * Copyright 2006 M. Alsup
     7 * Project repository: https://github.com/jquery-form/form
     8 * Dual licensed under the MIT and LGPLv3 licenses.
     9 * https://github.com/jquery-form/form#license
    1010 */
    11 !function(a){"use strict";function b(b){var c=b.data;b.isDefaultPrevented()||(b.preventDefault(),a(this).ajaxSubmit(c))}function c(b){var c=b.target,d=a(c);if(!d.is("[type=submit],[type=image]")){var e=d.closest("[type=submit]");if(0===e.length)return;c=e[0]}var f=this;if(f.clk=c,"image"==c.type)if(void 0!==b.offsetX)f.clk_x=b.offsetX,f.clk_y=b.offsetY;else if("function"==typeof a.fn.offset){var g=d.offset();f.clk_x=b.pageX-g.left,f.clk_y=b.pageY-g.top}else f.clk_x=b.pageX-c.offsetLeft,f.clk_y=b.pageY-c.offsetTop;setTimeout(function(){f.clk=f.clk_x=f.clk_y=null},100)}function d(){if(a.fn.ajaxSubmit.debug){var b="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(b):window.opera&&window.opera.postError&&window.opera.postError(b)}}var e={};e.fileapi=void 0!==a("<input type='file'/>").get(0).files,e.formdata=void 0!==window.FormData;var f=!!a.fn.prop;a.fn.attr2=function(){if(!f)return this.attr.apply(this,arguments);var a=this.prop.apply(this,arguments);return a&&a.jquery||"string"==typeof a?a:this.attr.apply(this,arguments)},a.fn.ajaxSubmit=function(b){function c(c){var d,e,f=a.param(c,b.traditional).split("&"),g=f.length,h=[];for(d=0;g>d;d++)f[d]=f[d].replace(/\+/g," "),e=f[d].split("="),h.push([decodeURIComponent(e[0]),decodeURIComponent(e[1])]);return h}function g(d){for(var e=new FormData,f=0;f<d.length;f++)e.append(d[f].name,d[f].value);if(b.extraData){var g=c(b.extraData);for(f=0;f<g.length;f++)g[f]&&e.append(g[f][0],g[f][1])}b.data=null;var h=a.extend(!0,{},a.ajaxSettings,b,{contentType:!1,processData:!1,cache:!1,type:i||"POST"});b.uploadProgress&&(h.xhr=function(){var c=a.ajaxSettings.xhr();return c.upload&&c.upload.addEventListener("progress",function(a){var c=0,d=a.loaded||a.position,e=a.total;a.lengthComputable&&(c=Math.ceil(100*(d/e))),b.uploadProgress(a,d,e,c)},!1),c}),h.data=null;var j=h.beforeSend;return h.beforeSend=function(a,b){b.data=e,j&&j.call(this,a,b)},a.ajax(h)}function h(c){function e(a){var b=null;try{a.contentWindow&&(b=a.contentWindow.document)}catch(c){d("cannot get iframe.contentWindow document: "+c)}if(b)return b;try{b=a.contentDocument?a.contentDocument:a.document}catch(c){d("cannot get iframe.contentDocument: "+c),b=a.document}return b}function g(){function b(){try{var a=e(r).readyState;d("state = "+a),a&&"uninitialized"==a.toLowerCase()&&setTimeout(b,50)}catch(c){d("Server abort: ",c," (",c.name,")"),h(A),w&&clearTimeout(w),w=void 0}}var c=l.attr2("target"),f=l.attr2("action");x.setAttribute("target",o),i||x.setAttribute("method","POST"),f!=m.url&&x.setAttribute("action",m.url),m.skipEncodingOverride||i&&!/post/i.test(i)||l.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"}),m.timeout&&(w=setTimeout(function(){v=!0,h(z)},m.timeout));var g=[];try{if(m.extraData)for(var j in m.extraData)m.extraData.hasOwnProperty(j)&&(a.isPlainObject(m.extraData[j])&&m.extraData[j].hasOwnProperty("name")&&m.extraData[j].hasOwnProperty("value")?g.push(a('<input type="hidden" name="'+m.extraData[j].name+'">').val(m.extraData[j].value).appendTo(x)[0]):g.push(a('<input type="hidden" name="'+j+'">').val(m.extraData[j]).appendTo(x)[0]));m.iframeTarget||(q.appendTo("body"),r.attachEvent?r.attachEvent("onload",h):r.addEventListener("load",h,!1)),setTimeout(b,15);try{x.submit()}catch(k){var n=document.createElement("form").submit;n.apply(x)}}finally{x.setAttribute("action",f),c?x.setAttribute("target",c):l.removeAttr("target"),a(g).remove()}}function h(b){if(!s.aborted&&!F){if(E=e(r),E||(d("cannot access response document"),b=A),b===z&&s)return s.abort("timeout"),y.reject(s,"timeout"),void 0;if(b==A&&s)return s.abort("server abort"),y.reject(s,"error","server abort"),void 0;if(E&&E.location.href!=m.iframeSrc||v){r.detachEvent?r.detachEvent("onload",h):r.removeEventListener("load",h,!1);var c,f="success";try{if(v)throw"timeout";var g="xml"==m.dataType||E.XMLDocument||a.isXMLDoc(E);if(d("isXml="+g),!g&&window.opera&&(null===E.body||!E.body.innerHTML)&&--G)return d("requeing onLoad callback, DOM not available"),setTimeout(h,250),void 0;var i=E.body?E.body:E.documentElement;s.responseText=i?i.innerHTML:null,s.responseXML=E.XMLDocument?E.XMLDocument:E,g&&(m.dataType="xml"),s.getResponseHeader=function(a){var b={"content-type":m.dataType};return b[a]},i&&(s.status=Number(i.getAttribute("status"))||s.status,s.statusText=i.getAttribute("statusText")||s.statusText);var j=(m.dataType||"").toLowerCase(),k=/(json|script|text)/.test(j);if(k||m.textarea){var l=E.getElementsByTagName("textarea")[0];if(l)s.responseText=l.value,s.status=Number(l.getAttribute("status"))||s.status,s.statusText=l.getAttribute("statusText")||s.statusText;else if(k){var o=E.getElementsByTagName("pre")[0],p=E.getElementsByTagName("body")[0];o?s.responseText=o.textContent?o.textContent:o.innerText:p&&(s.responseText=p.textContent?p.textContent:p.innerText)}}else"xml"==j&&!s.responseXML&&s.responseText&&(s.responseXML=H(s.responseText));try{D=J(s,j,m)}catch(t){f="parsererror",s.error=c=t||f}}catch(t){d("error caught: ",t),f="error",s.error=c=t||f}s.aborted&&(d("upload aborted"),f=null),s.status&&(f=s.status>=200&&s.status<300||304===s.status?"success":"error"),"success"===f?(m.success&&m.success.call(m.context,D,"success",s),y.resolve(s.responseText,"success",s),n&&a.event.trigger("ajaxSuccess",[s,m])):f&&(void 0===c&&(c=s.statusText),m.error&&m.error.call(m.context,s,f,c),y.reject(s,"error",c),n&&a.event.trigger("ajaxError",[s,m,c])),n&&a.event.trigger("ajaxComplete",[s,m]),n&&!--a.active&&a.event.trigger("ajaxStop"),m.complete&&m.complete.call(m.context,s,f),F=!0,m.timeout&&clearTimeout(w),setTimeout(function(){m.iframeTarget||q.remove(),s.responseXML=null},100)}}}var j,k,m,n,o,q,r,s,t,u,v,w,x=l[0],y=a.Deferred();if(c)for(k=0;k<p.length;k++)j=a(p[k]),f?j.prop("disabled",!1):j.removeAttr("disabled");if(m=a.extend(!0,{},a.ajaxSettings,b),m.context=m.context||m,o="jqFormIO"+(new Date).getTime(),m.iframeTarget?(q=a(m.iframeTarget),u=q.attr2("name"),u?o=u:q.attr2("name",o)):(q=a('<iframe name="'+o+'" src="'+m.iframeSrc+'" />'),q.css({position:"absolute",top:"-1000px",left:"-1000px"})),r=q[0],s={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(b){var c="timeout"===b?"timeout":"aborted";d("aborting upload... "+c),this.aborted=1;try{r.contentWindow.document.execCommand&&r.contentWindow.document.execCommand("Stop")}catch(e){}q.attr("src",m.iframeSrc),s.error=c,m.error&&m.error.call(m.context,s,c,b),n&&a.event.trigger("ajaxError",[s,m,c]),m.complete&&m.complete.call(m.context,s,c)}},n=m.global,n&&0===a.active++&&a.event.trigger("ajaxStart"),n&&a.event.trigger("ajaxSend",[s,m]),m.beforeSend&&m.beforeSend.call(m.context,s,m)===!1)return m.global&&a.active--,y.reject(),y;if(s.aborted)return y.reject(),y;t=x.clk,t&&(u=t.name,u&&!t.disabled&&(m.extraData=m.extraData||{},m.extraData[u]=t.value,"image"==t.type&&(m.extraData[u+".x"]=x.clk_x,m.extraData[u+".y"]=x.clk_y)));var z=1,A=2,B=a("meta[name=csrf-token]").attr("content"),C=a("meta[name=csrf-param]").attr("content");C&&B&&(m.extraData=m.extraData||{},m.extraData[C]=B),m.forceSync?g():setTimeout(g,10);var D,E,F,G=50,H=a.parseXML||function(a,b){return window.ActiveXObject?(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a)):b=(new DOMParser).parseFromString(a,"text/xml"),b&&b.documentElement&&"parsererror"!=b.documentElement.nodeName?b:null},I=a.parseJSON||function(a){return window.eval("("+a+")")},J=function(b,c,d){var e=b.getResponseHeader("content-type")||"",f="xml"===c||!c&&e.indexOf("xml")>=0,g=f?b.responseXML:b.responseText;return f&&"parsererror"===g.documentElement.nodeName&&a.error&&a.error("parsererror"),d&&d.dataFilter&&(g=d.dataFilter(g,c)),"string"==typeof g&&("json"===c||!c&&e.indexOf("json")>=0?g=I(g):("script"===c||!c&&e.indexOf("javascript")>=0)&&a.globalEval(g)),g};return y}if(!this.length)return d("ajaxSubmit: skipping submit process - no element selected"),this;var i,j,k,l=this;"function"==typeof b?b={success:b}:void 0===b&&(b={}),i=b.type||this.attr2("method"),j=b.url||this.attr2("action"),k="string"==typeof j?a.trim(j):"",k=k||window.location.href||"",k&&(k=(k.match(/^([^#]+)/)||[])[1]),b=a.extend(!0,{url:k,success:a.ajaxSettings.success,type:i||"GET",iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},b);var m={};if(this.trigger("form-pre-serialize",[this,b,m]),m.veto)return d("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(b.beforeSerialize&&b.beforeSerialize(this,b)===!1)return d("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var n=b.traditional;void 0===n&&(n=a.ajaxSettings.traditional);var o,p=[],q=this.formToArray(b.semantic,p);if(b.data&&(b.extraData=b.data,o=a.param(b.data,n)),b.beforeSubmit&&b.beforeSubmit(q,this,b)===!1)return d("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[q,this,b,m]),m.veto)return d("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var r=a.param(q,n);o&&(r=r?r+"&"+o:o),"GET"==b.type.toUpperCase()?(b.url+=(b.url.indexOf("?")>=0?"&":"?")+r,b.data=null):b.data=r;var s=[];if(b.resetForm&&s.push(function(){l.resetForm()}),b.clearForm&&s.push(function(){l.clearForm(b.includeHidden)}),!b.dataType&&b.target){var t=b.success||function(){};s.push(function(c){var d=b.replaceTarget?"replaceWith":"html";a(b.target)[d](c).each(t,arguments)})}else b.success&&s.push(b.success);if(b.success=function(a,c,d){for(var e=b.context||this,f=0,g=s.length;g>f;f++)s[f].apply(e,[a,c,d||l,l])},b.error){var u=b.error;b.error=function(a,c,d){var e=b.context||this;u.apply(e,[a,c,d,l])}}if(b.complete){var v=b.complete;b.complete=function(a,c){var d=b.context||this;v.apply(d,[a,c,l])}}var w=a('input[type=file]:enabled[value!=""]',this),x=w.length>0,y="multipart/form-data",z=l.attr("enctype")==y||l.attr("encoding")==y,A=e.fileapi&&e.formdata;d("fileAPI :"+A);var B,C=(x||z)&&!A;b.iframe!==!1&&(b.iframe||C)?b.closeKeepAlive?a.get(b.closeKeepAlive,function(){B=h(q)}):B=h(q):B=(x||z)&&A?g(q):a.ajax(b),l.removeData("jqxhr").data("jqxhr",B);for(var D=0;D<p.length;D++)p[D]=null;return this.trigger("form-submit-notify",[this,b]),this},a.fn.ajaxForm=function(e){if(e=e||{},e.delegation=e.delegation&&a.isFunction(a.fn.on),!e.delegation&&0===this.length){var f={s:this.selector,c:this.context};return!a.isReady&&f.s?(d("DOM not ready, queuing ajaxForm"),a(function(){a(f.s,f.c).ajaxForm(e)}),this):(d("terminating; zero elements found by selector"+(a.isReady?"":" (DOM not ready)")),this)}return e.delegation?(a(document).off("submit.form-plugin",this.selector,b).off("click.form-plugin",this.selector,c).on("submit.form-plugin",this.selector,e,b).on("click.form-plugin",this.selector,e,c),this):this.ajaxFormUnbind().bind("submit.form-plugin",e,b).bind("click.form-plugin",e,c)},a.fn.ajaxFormUnbind=function(){return this.unbind("submit.form-plugin click.form-plugin")},a.fn.formToArray=function(b,c){var d=[];if(0===this.length)return d;var f=this[0],g=b?f.getElementsByTagName("*"):f.elements;if(!g)return d;var h,i,j,k,l,m,n;for(h=0,m=g.length;m>h;h++)if(l=g[h],j=l.name,j&&!l.disabled)if(b&&f.clk&&"image"==l.type)f.clk==l&&(d.push({name:j,value:a(l).val(),type:l.type}),d.push({name:j+".x",value:f.clk_x},{name:j+".y",value:f.clk_y}));else if(k=a.fieldValue(l,!0),k&&k.constructor==Array)for(c&&c.push(l),i=0,n=k.length;n>i;i++)d.push({name:j,value:k[i]});else if(e.fileapi&&"file"==l.type){c&&c.push(l);var o=l.files;if(o.length)for(i=0;i<o.length;i++)d.push({name:j,value:o[i],type:l.type});else d.push({name:j,value:"",type:l.type})}else null!==k&&"undefined"!=typeof k&&(c&&c.push(l),d.push({name:j,value:k,type:l.type,required:l.required}));if(!b&&f.clk){var p=a(f.clk),q=p[0];j=q.name,j&&!q.disabled&&"image"==q.type&&(d.push({name:j,value:p.val()}),d.push({name:j+".x",value:f.clk_x},{name:j+".y",value:f.clk_y}))}return d},a.fn.formSerialize=function(b){return a.param(this.formToArray(b))},a.fn.fieldSerialize=function(b){var c=[];return this.each(function(){var d=this.name;if(d){var e=a.fieldValue(this,b);if(e&&e.constructor==Array)for(var f=0,g=e.length;g>f;f++)c.push({name:d,value:e[f]});else null!==e&&"undefined"!=typeof e&&c.push({name:this.name,value:e})}}),a.param(c)},a.fn.fieldValue=function(b){for(var c=[],d=0,e=this.length;e>d;d++){var f=this[d],g=a.fieldValue(f,b);null===g||"undefined"==typeof g||g.constructor==Array&&!g.length||(g.constructor==Array?a.merge(c,g):c.push(g))}return c},a.fieldValue=function(b,c){var d=b.name,e=b.type,f=b.tagName.toLowerCase();if(void 0===c&&(c=!0),c&&(!d||b.disabled||"reset"==e||"button"==e||("checkbox"==e||"radio"==e)&&!b.checked||("submit"==e||"image"==e)&&b.form&&b.form.clk!=b||"select"==f&&-1==b.selectedIndex))return null;if("select"==f){var g=b.selectedIndex;if(0>g)return null;for(var h=[],i=b.options,j="select-one"==e,k=j?g+1:i.length,l=j?g:0;k>l;l++){var m=i[l];if(m.selected){var n=m.value;if(n||(n=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value),j)return n;h.push(n)}}return h}return a(b).val()},a.fn.clearForm=function(b){return this.each(function(){a("input,select,textarea",this).clearFields(b)})},a.fn.clearFields=a.fn.clearInputs=function(b){var c=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var d=this.type,e=this.tagName.toLowerCase();c.test(d)||"textarea"==e?this.value="":"checkbox"==d||"radio"==d?this.checked=!1:"select"==e?this.selectedIndex=-1:"file"==d?/MSIE/.test(navigator.userAgent)?a(this).replaceWith(a(this).clone(!0)):a(this).val(""):b&&(b===!0&&/hidden/.test(d)||"string"==typeof b&&a(this).is(b))&&(this.value="")})},a.fn.resetForm=function(){return this.each(function(){("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset()})},a.fn.enable=function(a){return void 0===a&&(a=!0),this.each(function(){this.disabled=!a})},a.fn.selected=function(b){return void 0===b&&(b=!0),this.each(function(){var c=this.type;if("checkbox"==c||"radio"==c)this.checked=b;else if("option"==this.tagName.toLowerCase()){var d=a(this).parent("select");b&&d[0]&&"select-one"==d[0].type&&d.find("option").selected(!1),this.selected=b}})},a.fn.ajaxSubmit.debug=!1}(jQuery);
     11!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){"use strict";function b(b){var c=b.data;b.isDefaultPrevented()||(b.preventDefault(),a(b.target).closest("form").ajaxSubmit(c))}function c(b){var c=b.target,d=a(c);if(!d.is("[type=submit],[type=image]")){var e=d.closest("[type=submit]");if(0===e.length)return;c=e[0]}var f=c.form;if(f.clk=c,"image"===c.type)if(void 0!==b.offsetX)f.clk_x=b.offsetX,f.clk_y=b.offsetY;else if("function"==typeof a.fn.offset){var g=d.offset();f.clk_x=b.pageX-g.left,f.clk_y=b.pageY-g.top}else f.clk_x=b.pageX-c.offsetLeft,f.clk_y=b.pageY-c.offsetTop;setTimeout(function(){f.clk=f.clk_x=f.clk_y=null},100)}function d(){if(a.fn.ajaxSubmit.debug){var b="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(b):window.opera&&window.opera.postError&&window.opera.postError(b)}}var e={};e.fileapi=void 0!==a('<input type="file">').get(0).files,e.formdata=void 0!==window.FormData;var f=!!a.fn.prop;a.fn.attr2=function(){if(!f)return this.attr.apply(this,arguments);var a=this.prop.apply(this,arguments);return a&&a.jquery||"string"==typeof a?a:this.attr.apply(this,arguments)},a.fn.ajaxSubmit=function(b,c,g,h){function i(c){var d,e,f=a.param(c,b.traditional).split("&"),g=f.length,h=[];for(d=0;d<g;d++)f[d]=f[d].replace(/\+/g," "),e=f[d].split("="),h.push([decodeURIComponent(e[0]),decodeURIComponent(e[1])]);return h}function j(c){for(var d=new FormData,e=0;e<c.length;e++)d.append(c[e].name,c[e].value);if(b.extraData){var f=i(b.extraData);for(e=0;e<f.length;e++)f[e]&&d.append(f[e][0],f[e][1])}b.data=null;var g=a.extend(!0,{},a.ajaxSettings,b,{contentType:!1,processData:!1,cache:!1,type:l||"POST"});b.uploadProgress&&(g.xhr=function(){var c=a.ajaxSettings.xhr();return c.upload&&c.upload.addEventListener("progress",function(a){var c=0,d=a.loaded||a.position,e=a.total;a.lengthComputable&&(c=Math.ceil(d/e*100)),b.uploadProgress(a,d,e,c)},!1),c}),g.data=null;var h=g.beforeSend;return g.beforeSend=function(a,c){b.formData?c.data=b.formData:c.data=d,h&&h.call(this,a,c)},a.ajax(g)}function k(c){function e(a){var b=null;try{a.contentWindow&&(b=a.contentWindow.document)}catch(a){d("cannot get iframe.contentWindow document: "+a)}if(b)return b;try{b=a.contentDocument?a.contentDocument:a.document}catch(c){d("cannot get iframe.contentDocument: "+c),b=a.document}return b}function g(){function b(){try{var a=e(q).readyState;d("state = "+a),a&&"uninitialized"===a.toLowerCase()&&setTimeout(b,50)}catch(a){d("Server abort: ",a," (",a.name,")"),h(2),w&&clearTimeout(w),w=void 0}}var c=o.attr2("target"),f=o.attr2("action"),g=o.attr("enctype")||o.attr("encoding")||"multipart/form-data";x.setAttribute("target",n),l&&!/post/i.test(l)||x.setAttribute("method","POST"),f!==k.url&&x.setAttribute("action",k.url),k.skipEncodingOverride||l&&!/post/i.test(l)||o.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"}),k.timeout&&(w=setTimeout(function(){v=!0,h(1)},k.timeout));var i=[];try{if(k.extraData)for(var j in k.extraData)k.extraData.hasOwnProperty(j)&&(a.isPlainObject(k.extraData[j])&&k.extraData[j].hasOwnProperty("name")&&k.extraData[j].hasOwnProperty("value")?i.push(a('<input type="hidden" name="'+k.extraData[j].name+'">',z).val(k.extraData[j].value).appendTo(x)[0]):i.push(a('<input type="hidden" name="'+j+'">',z).val(k.extraData[j]).appendTo(x)[0]));k.iframeTarget||p.appendTo(A),q.attachEvent?q.attachEvent("onload",h):q.addEventListener("load",h,!1),setTimeout(b,15);try{x.submit()}catch(a){var m=document.createElement("form").submit;m.apply(x)}}finally{x.setAttribute("action",f),x.setAttribute("enctype",g),c?x.setAttribute("target",c):o.removeAttr("target"),a(i).remove()}}function h(b){if(!r.aborted&&!F){if(E=e(q),E||(d("cannot access response document"),b=2),1===b&&r)return r.abort("timeout"),void y.reject(r,"timeout");if(2===b&&r)return r.abort("server abort"),void y.reject(r,"error","server abort");if(E&&E.location.href!==k.iframeSrc||v){q.detachEvent?q.detachEvent("onload",h):q.removeEventListener("load",h,!1);var c,f="success";try{if(v)throw"timeout";var g="xml"===k.dataType||E.XMLDocument||a.isXMLDoc(E);if(d("isXml="+g),!g&&window.opera&&(null===E.body||!E.body.innerHTML)&&--G)return d("requeing onLoad callback, DOM not available"),void setTimeout(h,250);var i=E.body?E.body:E.documentElement;r.responseText=i?i.innerHTML:null,r.responseXML=E.XMLDocument?E.XMLDocument:E,g&&(k.dataType="xml"),r.getResponseHeader=function(a){return{"content-type":k.dataType}[a.toLowerCase()]},i&&(r.status=Number(i.getAttribute("status"))||r.status,r.statusText=i.getAttribute("statusText")||r.statusText);var j=(k.dataType||"").toLowerCase(),l=/(json|script|text)/.test(j);if(l||k.textarea){var n=E.getElementsByTagName("textarea")[0];if(n)r.responseText=n.value,r.status=Number(n.getAttribute("status"))||r.status,r.statusText=n.getAttribute("statusText")||r.statusText;else if(l){var o=E.getElementsByTagName("pre")[0],s=E.getElementsByTagName("body")[0];o?r.responseText=o.textContent?o.textContent:o.innerText:s&&(r.responseText=s.textContent?s.textContent:s.innerText)}}else"xml"===j&&!r.responseXML&&r.responseText&&(r.responseXML=H(r.responseText));try{D=J(r,j,k)}catch(a){f="parsererror",r.error=c=a||f}}catch(a){d("error caught: ",a),f="error",r.error=c=a||f}r.aborted&&(d("upload aborted"),f=null),r.status&&(f=r.status>=200&&r.status<300||304===r.status?"success":"error"),"success"===f?(k.success&&k.success.call(k.context,D,"success",r),y.resolve(r.responseText,"success",r),m&&a.event.trigger("ajaxSuccess",[r,k])):f&&(void 0===c&&(c=r.statusText),k.error&&k.error.call(k.context,r,f,c),y.reject(r,"error",c),m&&a.event.trigger("ajaxError",[r,k,c])),m&&a.event.trigger("ajaxComplete",[r,k]),m&&!--a.active&&a.event.trigger("ajaxStop"),k.complete&&k.complete.call(k.context,r,f),F=!0,k.timeout&&clearTimeout(w),setTimeout(function(){k.iframeTarget?p.attr("src",k.iframeSrc):p.remove(),r.responseXML=null},100)}}}var i,j,k,m,n,p,q,r,t,u,v,w,x=o[0],y=a.Deferred();if(y.abort=function(a){r.abort(a)},c)for(j=0;j<s.length;j++)i=a(s[j]),f?i.prop("disabled",!1):i.removeAttr("disabled");k=a.extend(!0,{},a.ajaxSettings,b),k.context=k.context||k,n="jqFormIO"+(new Date).getTime();var z=x.ownerDocument,A=o.closest("body");if(k.iframeTarget?(p=a(k.iframeTarget,z),u=p.attr2("name"),u?n=u:p.attr2("name",n)):(p=a('<iframe name="'+n+'" src="'+k.iframeSrc+'" />',z),p.css({position:"absolute",top:"-1000px",left:"-1000px"})),q=p[0],r={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(b){var c="timeout"===b?"timeout":"aborted";d("aborting upload... "+c),this.aborted=1;try{q.contentWindow.document.execCommand&&q.contentWindow.document.execCommand("Stop")}catch(a){}p.attr("src",k.iframeSrc),r.error=c,k.error&&k.error.call(k.context,r,c,b),m&&a.event.trigger("ajaxError",[r,k,c]),k.complete&&k.complete.call(k.context,r,c)}},m=k.global,m&&0==a.active++&&a.event.trigger("ajaxStart"),m&&a.event.trigger("ajaxSend",[r,k]),k.beforeSend&&k.beforeSend.call(k.context,r,k)===!1)return k.global&&a.active--,y.reject(),y;if(r.aborted)return y.reject(),y;(t=x.clk)&&(u=t.name)&&!t.disabled&&(k.extraData=k.extraData||{},k.extraData[u]=t.value,"image"===t.type&&(k.extraData[u+".x"]=x.clk_x,k.extraData[u+".y"]=x.clk_y));var B=a("meta[name=csrf-token]").attr("content"),C=a("meta[name=csrf-param]").attr("content");C&&B&&(k.extraData=k.extraData||{},k.extraData[C]=B),k.forceSync?g():setTimeout(g,10);var D,E,F,G=50,H=a.parseXML||function(a,b){return window.ActiveXObject?(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a)):b=(new DOMParser).parseFromString(a,"text/xml"),b&&b.documentElement&&"parsererror"!==b.documentElement.nodeName?b:null},I=a.parseJSON||function(a){return window.eval("("+a+")")},J=function(b,c,d){var e=b.getResponseHeader("content-type")||"",f=("xml"===c||!c)&&e.indexOf("xml")>=0,g=f?b.responseXML:b.responseText;return f&&"parsererror"===g.documentElement.nodeName&&a.error&&a.error("parsererror"),d&&d.dataFilter&&(g=d.dataFilter(g,c)),"string"==typeof g&&(("json"===c||!c)&&e.indexOf("json")>=0?g=I(g):("script"===c||!c)&&e.indexOf("javascript")>=0&&a.globalEval(g)),g};return y}if(!this.length)return d("ajaxSubmit: skipping submit process - no element selected"),this;var l,m,n,o=this;"function"==typeof b?b={success:b}:"string"==typeof b||b===!1&&arguments.length>0?(b={url:b,data:c,dataType:g},"function"==typeof h&&(b.success=h)):void 0===b&&(b={}),l=b.method||b.type||this.attr2("method"),m=b.url||this.attr2("action"),n="string"==typeof m?a.trim(m):"",n=n||window.location.href||"",n&&(n=(n.match(/^([^#]+)/)||[])[1]),b=a.extend(!0,{url:n,success:a.ajaxSettings.success,type:l||a.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},b);var p={};if(this.trigger("form-pre-serialize",[this,b,p]),p.veto)return d("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(b.beforeSerialize&&b.beforeSerialize(this,b)===!1)return d("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var q=b.traditional;void 0===q&&(q=a.ajaxSettings.traditional);var r,s=[],t=this.formToArray(b.semantic,s,b.filtering);if(b.data){var u=a.isFunction(b.data)?b.data(t):b.data;b.extraData=u,r=a.param(u,q)}if(b.beforeSubmit&&b.beforeSubmit(t,this,b)===!1)return d("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[t,this,b,p]),p.veto)return d("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var v=a.param(t,q);r&&(v=v?v+"&"+r:r),"GET"===b.type.toUpperCase()?(b.url+=(b.url.indexOf("?")>=0?"&":"?")+v,b.data=null):b.data=v;var w=[];if(b.resetForm&&w.push(function(){o.resetForm()}),b.clearForm&&w.push(function(){o.clearForm(b.includeHidden)}),!b.dataType&&b.target){var x=b.success||function(){};w.push(function(c,d,e){var f=arguments,g=b.replaceTarget?"replaceWith":"html";a(b.target)[g](c).each(function(){x.apply(this,f)})})}else b.success&&(a.isArray(b.success)?a.merge(w,b.success):w.push(b.success));if(b.success=function(a,c,d){for(var e=b.context||this,f=0,g=w.length;f<g;f++)w[f].apply(e,[a,c,d||o,o])},b.error){var y=b.error;b.error=function(a,c,d){var e=b.context||this;y.apply(e,[a,c,d,o])}}if(b.complete){var z=b.complete;b.complete=function(a,c){var d=b.context||this;z.apply(d,[a,c,o])}}var A=a("input[type=file]:enabled",this).filter(function(){return""!==a(this).val()}),B=A.length>0,C="multipart/form-data",D=o.attr("enctype")===C||o.attr("encoding")===C,E=e.fileapi&&e.formdata;d("fileAPI :"+E);var F,G=(B||D)&&!E;b.iframe!==!1&&(b.iframe||G)?b.closeKeepAlive?a.get(b.closeKeepAlive,function(){F=k(t)}):F=k(t):F=(B||D)&&E?j(t):a.ajax(b),o.removeData("jqxhr").data("jqxhr",F);for(var H=0;H<s.length;H++)s[H]=null;return this.trigger("form-submit-notify",[this,b]),this},a.fn.ajaxForm=function(e,f,g,h){if(("string"==typeof e||e===!1&&arguments.length>0)&&(e={url:e,data:f,dataType:g},"function"==typeof h&&(e.success=h)),e=e||{},e.delegation=e.delegation&&a.isFunction(a.fn.on),!e.delegation&&0===this.length){var i={s:this.selector,c:this.context};return!a.isReady&&i.s?(d("DOM not ready, queuing ajaxForm"),a(function(){a(i.s,i.c).ajaxForm(e)}),this):(d("terminating; zero elements found by selector"+(a.isReady?"":" (DOM not ready)")),this)}return e.delegation?(a(document).off("submit.form-plugin",this.selector,b).off("click.form-plugin",this.selector,c).on("submit.form-plugin",this.selector,e,b).on("click.form-plugin",this.selector,e,c),this):this.ajaxFormUnbind().on("submit.form-plugin",e,b).on("click.form-plugin",e,c)},a.fn.ajaxFormUnbind=function(){return this.off("submit.form-plugin click.form-plugin")},a.fn.formToArray=function(b,c,d){var f=[];if(0===this.length)return f;var g,h=this[0],i=this.attr("id"),j=b||void 0===h.elements?h.getElementsByTagName("*"):h.elements;if(j&&(j=a.makeArray(j)),i&&(b||/(Edge|Trident)\//.test(navigator.userAgent))&&(g=a(':input[form="'+i+'"]').get(),g.length&&(j=(j||[]).concat(g))),!j||!j.length)return f;a.isFunction(d)&&(j=a.map(j,d));var k,l,m,n,o,p,q;for(k=0,p=j.length;k<p;k++)if(o=j[k],(m=o.name)&&!o.disabled)if(b&&h.clk&&"image"===o.type)h.clk===o&&(f.push({name:m,value:a(o).val(),type:o.type}),f.push({name:m+".x",value:h.clk_x},{name:m+".y",value:h.clk_y}));else if((n=a.fieldValue(o,!0))&&n.constructor===Array)for(c&&c.push(o),l=0,q=n.length;l<q;l++)f.push({name:m,value:n[l]});else if(e.fileapi&&"file"===o.type){c&&c.push(o);var r=o.files;if(r.length)for(l=0;l<r.length;l++)f.push({name:m,value:r[l],type:o.type});else f.push({name:m,value:"",type:o.type})}else null!==n&&void 0!==n&&(c&&c.push(o),f.push({name:m,value:n,type:o.type,required:o.required}));if(!b&&h.clk){var s=a(h.clk),t=s[0];m=t.name,m&&!t.disabled&&"image"===t.type&&(f.push({name:m,value:s.val()}),f.push({name:m+".x",value:h.clk_x},{name:m+".y",value:h.clk_y}))}return f},a.fn.formSerialize=function(b){return a.param(this.formToArray(b))},a.fn.fieldSerialize=function(b){var c=[];return this.each(function(){var d=this.name;if(d){var e=a.fieldValue(this,b);if(e&&e.constructor===Array)for(var f=0,g=e.length;f<g;f++)c.push({name:d,value:e[f]});else null!==e&&void 0!==e&&c.push({name:this.name,value:e})}}),a.param(c)},a.fn.fieldValue=function(b){for(var c=[],d=0,e=this.length;d<e;d++){var f=this[d],g=a.fieldValue(f,b);null===g||void 0===g||g.constructor===Array&&!g.length||(g.constructor===Array?a.merge(c,g):c.push(g))}return c},a.fieldValue=function(b,c){var d=b.name,e=b.type,f=b.tagName.toLowerCase();if(void 0===c&&(c=!0),c&&(!d||b.disabled||"reset"===e||"button"===e||("checkbox"===e||"radio"===e)&&!b.checked||("submit"===e||"image"===e)&&b.form&&b.form.clk!==b||"select"===f&&b.selectedIndex===-1))return null;if("select"===f){var g=b.selectedIndex;if(g<0)return null;for(var h=[],i=b.options,j="select-one"===e,k=j?g+1:i.length,l=j?g:0;l<k;l++){var m=i[l];if(m.selected&&!m.disabled){var n=m.value;if(n||(n=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value),j)return n;h.push(n)}}return h}return a(b).val().replace(/\r?\n/g,"\r\n")},a.fn.clearForm=function(b){return this.each(function(){a("input,select,textarea",this).clearFields(b)})},a.fn.clearFields=a.fn.clearInputs=function(b){var c=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var d=this.type,e=this.tagName.toLowerCase();c.test(d)||"textarea"===e?this.value="":"checkbox"===d||"radio"===d?this.checked=!1:"select"===e?this.selectedIndex=-1:"file"===d?/MSIE/.test(navigator.userAgent)?a(this).replaceWith(a(this).clone(!0)):a(this).val(""):b&&(b===!0&&/hidden/.test(d)||"string"==typeof b&&a(this).is(b))&&(this.value="")})},a.fn.resetForm=function(){return this.each(function(){var b=a(this),c=this.tagName.toLowerCase();switch(c){case"input":this.checked=this.defaultChecked;case"textarea":return this.value=this.defaultValue,!0;case"option":case"optgroup":var d=b.parents("select");return d.length&&d[0].multiple?"option"===c?this.selected=this.defaultSelected:b.find("option").resetForm():d.resetForm(),!0;case"select":return b.find("option").each(function(a){if(this.selected=this.defaultSelected,this.defaultSelected&&!b[0].multiple)return b[0].selectedIndex=a,!1}),!0;case"label":var e=a(b.attr("for")),f=b.find("input,select,textarea");return e[0]&&f.unshift(e[0]),f.resetForm(),!0;case"form":return("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset(),!0;default:return b.find("form,input,label,select,textarea").resetForm(),!0}})},a.fn.enable=function(a){return void 0===a&&(a=!0),this.each(function(){this.disabled=!a})},a.fn.selected=function(b){return void 0===b&&(b=!0),this.each(function(){var c=this.type;if("checkbox"===c||"radio"===c)this.checked=b;else if("option"===this.tagName.toLowerCase()){var d=a(this).parent("select");b&&d[0]&&"select-one"===d[0].type&&d.find("option").selected(!1),this.selected=b}})},a.fn.ajaxSubmit.debug=!1});
     12//# sourceMappingURL=jquery.form.min.js.map
  • trunk/src/wp-includes/script-loader.php

    r41206 r41233  
    249249
    250250    // deprecated, not used in core, most functionality is included in jQuery 1.3
    251     $scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array('jquery'), '3.37.0', 1 );
     251    $scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array('jquery'), '4.2.1', 1 );
    252252
    253253    // jQuery plugins
Note: See TracChangeset for help on using the changeset viewer.