Changeset 11326


Ignore:
Timestamp:
Oct 17, 2010, 2:57:32 AM (12 years ago)
Author:
livings124
Message:

update jquery.form to 2.47

Location:
trunk/web/javascript/jquery
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/web/javascript/jquery/jquery.form.js

    r11325 r11326  
    1 /*
     1/*!
    22 * jQuery Form Plugin
    3  * version: 2.21 (08-FEB-2009)
    4  * @requires jQuery v1.2.2 or later
     3 * version: 2.47 (04-SEP-2010)
     4 * @requires jQuery v1.3.2 or later
    55 *
    66 * Examples and documentation at: http://malsup.com/jquery/form/
     
    1212
    1313/*
    14     Usage Note: 
    15     -----------
    16     Do not use both ajaxSubmit and ajaxForm on the same form.  These
    17     functions are intended to be exclusive.  Use ajaxSubmit if you want
    18     to bind your own submit handler to the form.  For example,
    19 
    20     $(document).ready(function() {
    21         $('#myForm').bind('submit', function() {
    22             $(this).ajaxSubmit({
    23                 target: '#output'
    24             });
    25             return false; // <-- important!
    26         });
    27     });
    28 
    29     Use ajaxForm when you want the plugin to manage all the event binding
    30     for you.  For example,
    31 
    32     $(document).ready(function() {
    33         $('#myForm').ajaxForm({
    34             target: '#output'
    35         });
    36     });
    37        
    38     When using ajaxForm, the ajaxSubmit function will be invoked for you
    39     at the appropriate time. 
     14        Usage Note:
     15        -----------
     16        Do not use both ajaxSubmit and ajaxForm on the same form.  These
     17        functions are intended to be exclusive.  Use ajaxSubmit if you want
     18        to bind your own submit handler to the form.  For example,
     19
     20        $(document).ready(function() {
     21                $('#myForm').bind('submit', function() {
     22                        $(this).ajaxSubmit({
     23                                target: '#output'
     24                        });
     25                        return false; // <-- important!
     26                });
     27        });
     28
     29        Use ajaxForm when you want the plugin to manage all the event binding
     30        for you.  For example,
     31
     32        $(document).ready(function() {
     33                $('#myForm').ajaxForm({
     34                        target: '#output'
     35                });
     36        });
     37
     38        When using ajaxForm, the ajaxSubmit function will be invoked for you
     39        at the appropriate time.
    4040*/
    4141
    4242/**
    43  * ajaxSubmit() provides a mechanism for immediately submitting 
     43 * ajaxSubmit() provides a mechanism for immediately submitting
    4444 * an HTML form using AJAX.
    4545 */
    4646$.fn.ajaxSubmit = function(options) {
    47     // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
    48     if (!this.length) {
    49         log('ajaxSubmit: skipping submit process - no element selected');
    50         return this;
    51     }
    52 
    53     if (typeof options == 'function')
    54         options = { success: options };
    55 
    56     options = $.extend({
    57         url:  this.attr('action') || window.location.toString(),
    58         type: this.attr('method') || 'GET'
    59     }, options || {});
    60 
    61     // hook for manipulating the form data before it is extracted;
    62     // convenient for use with rich editors like tinyMCE or FCKEditor
    63     var veto = {};
    64     this.trigger('form-pre-serialize', [this, options, veto]);
    65     if (veto.veto) {
    66         log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
    67         return this;
    68     }
    69 
    70     // provide opportunity to alter form data before it is serialized
    71     if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
    72         log('ajaxSubmit: submit aborted via beforeSerialize callback');
    73         return this;
    74     }   
    75    
    76     var a = this.formToArray(options.semantic);
    77     if (options.data) {
    78         options.extraData = options.data;
    79         for (var n in options.data) {
    80           if(options.data[n] instanceof Array) {
    81             for (var k in options.data[n])
    82               a.push( { name: n, value: options.data[n][k] } )
    83           } 
    84           else
    85              a.push( { name: n, value: options.data[n] } );
    86         }
    87     }
    88 
    89     // give pre-submit callback an opportunity to abort the submit
    90     if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
    91         log('ajaxSubmit: submit aborted via beforeSubmit callback');
    92         return this;
    93     }   
    94 
    95     // fire vetoable 'validate' event
    96     this.trigger('form-submit-validate', [a, this, options, veto]);
    97     if (veto.veto) {
    98         log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
    99         return this;
    100     }   
    101 
    102     var q = $.param(a);
    103 
    104     if (options.type.toUpperCase() == 'GET') {
    105         options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
    106         options.data = null;  // data is null for 'get'
    107     }
    108     else
    109         options.data = q; // data is the query string for 'post'
    110 
    111     var $form = this, callbacks = [];
    112     if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
    113     if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
    114 
    115     // perform a load on the target only if dataType is not provided
    116     if (!options.dataType && options.target) {
    117         var oldSuccess = options.success || function(){};
    118         callbacks.push(function(data) {
    119             $(options.target).html(data).each(oldSuccess, arguments);
    120         });
    121     }
    122     else if (options.success)
    123         callbacks.push(options.success);
    124 
    125     options.success = function(data, status) {
    126         for (var i=0, max=callbacks.length; i < max; i++)
    127             callbacks[i].apply(options, [data, status, $form]);
    128     };
    129 
    130     // are there files to upload?
    131     var files = $('input:file', this).fieldValue();
    132     var found = false;
    133     for (var j=0; j < files.length; j++)
    134         if (files[j])
    135             found = true;
    136 
    137     // options.iframe allows user to force iframe mode
    138    if (options.iframe || found) {
    139        // hack to fix Safari hang (thanks to Tim Molendijk for this)
    140        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
    141        if (options.closeKeepAlive)
    142            $.get(options.closeKeepAlive, fileUpload);
    143        else
    144            fileUpload();
    145        }
    146    else
    147        $.ajax(options);
    148 
    149     // fire 'notify' event
    150     this.trigger('form-submit-notify', [this, options]);
    151     return this;
    152 
    153 
    154     // private function for handling file uploads (hat tip to YAHOO!)
    155     function fileUpload() {
    156         var form = $form[0];
    157        
    158         if ($(':input[name=submit]', form).length) {
    159             alert('Error: Form elements must not be named "submit".');
    160             return;
    161         }
    162        
    163         var opts = $.extend({}, $.ajaxSettings, options);
    164                 var s = jQuery.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);
    165 
    166         var id = 'jqFormIO' + (new Date().getTime());
    167         var $io = $('<iframe id="' + id + '" name="' + id + '" src="about:blank" />');
    168         var io = $io[0];
    169 
    170         $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
    171 
    172         var xhr = { // mock object
    173             aborted: 0,
    174             responseText: null,
    175             responseXML: null,
    176             status: 0,
    177             statusText: 'n/a',
    178             getAllResponseHeaders: function() {},
    179             getResponseHeader: function() {},
    180             setRequestHeader: function() {},
    181             abort: function() {
    182                 this.aborted = 1;
    183                 $io.attr('src','about:blank'); // abort op in progress
    184             }
    185         };
    186 
    187         var g = opts.global;
    188         // trigger ajax global events so that activity/block indicators work like normal
    189         if (g && ! $.active++) $.event.trigger("ajaxStart");
    190         if (g) $.event.trigger("ajaxSend", [xhr, opts]);
    191 
    192                 if (s.beforeSend && s.beforeSend(xhr, s) === false) {
    193                         s.global && jQuery.active--;
     47        // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
     48        if (!this.length) {
     49                log('ajaxSubmit: skipping submit process - no element selected');
     50                return this;
     51        }
     52
     53        if (typeof options == 'function') {
     54                options = { success: options };
     55        }
     56
     57        var url = $.trim(this.attr('action'));
     58        if (url) {
     59                // clean url (don't include hash vaue)
     60                url = (url.match(/^([^#]+)/)||[])[1];
     61        }
     62        url = url || window.location.href || '';
     63
     64        options = $.extend(true, {
     65                url:  url,
     66                type: this.attr('method') || 'GET',
     67                iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
     68        }, options);
     69
     70        // hook for manipulating the form data before it is extracted;
     71        // convenient for use with rich editors like tinyMCE or FCKEditor
     72        var veto = {};
     73        this.trigger('form-pre-serialize', [this, options, veto]);
     74        if (veto.veto) {
     75                log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
     76                return this;
     77        }
     78
     79        // provide opportunity to alter form data before it is serialized
     80        if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
     81                log('ajaxSubmit: submit aborted via beforeSerialize callback');
     82                return this;
     83        }
     84
     85        var n,v,a = this.formToArray(options.semantic);
     86        if (options.data) {
     87                options.extraData = options.data;
     88                for (n in options.data) {
     89                        if(options.data[n] instanceof Array) {
     90                                for (var k in options.data[n]) {
     91                                        a.push( { name: n, value: options.data[n][k] } );
     92                                }
     93                        }
     94                        else {
     95                                v = options.data[n];
     96                                v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
     97                                a.push( { name: n, value: v } );
     98                        }
     99                }
     100        }
     101
     102        // give pre-submit callback an opportunity to abort the submit
     103        if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
     104                log('ajaxSubmit: submit aborted via beforeSubmit callback');
     105                return this;
     106        }
     107
     108        // fire vetoable 'validate' event
     109        this.trigger('form-submit-validate', [a, this, options, veto]);
     110        if (veto.veto) {
     111                log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
     112                return this;
     113        }
     114
     115        var q = $.param(a);
     116
     117        if (options.type.toUpperCase() == 'GET') {
     118                options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
     119                options.data = null;  // data is null for 'get'
     120        }
     121        else {
     122                options.data = q; // data is the query string for 'post'
     123        }
     124
     125        var $form = this, callbacks = [];
     126        if (options.resetForm) {
     127                callbacks.push(function() { $form.resetForm(); });
     128        }
     129        if (options.clearForm) {
     130                callbacks.push(function() { $form.clearForm(); });
     131        }
     132
     133        // perform a load on the target only if dataType is not provided
     134        if (!options.dataType && options.target) {
     135                var oldSuccess = options.success || function(){};
     136                callbacks.push(function(data) {
     137                        var fn = options.replaceTarget ? 'replaceWith' : 'html';
     138                        $(options.target)[fn](data).each(oldSuccess, arguments);
     139                });
     140        }
     141        else if (options.success) {
     142                callbacks.push(options.success);
     143        }
     144
     145        options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
     146                var context = options.context || options;   // jQuery 1.4+ supports scope context
     147                for (var i=0, max=callbacks.length; i < max; i++) {
     148                        callbacks[i].apply(context, [data, status, xhr || $form, $form]);
     149                }
     150        };
     151
     152        // are there files to upload?
     153        var fileInputs = $('input:file', this).length > 0;
     154        var mp = 'multipart/form-data';
     155        var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
     156
     157        // options.iframe allows user to force iframe mode
     158        // 06-NOV-09: now defaulting to iframe mode if file input is detected
     159   if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
     160           // hack to fix Safari hang (thanks to Tim Molendijk for this)
     161           // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
     162           if (options.closeKeepAlive) {
     163                   $.get(options.closeKeepAlive, fileUpload);
     164                }
     165           else {
     166                   fileUpload();
     167                }
     168   }
     169   else {
     170           $.ajax(options);
     171   }
     172
     173        // fire 'notify' event
     174        this.trigger('form-submit-notify', [this, options]);
     175        return this;
     176
     177
     178        // private function for handling file uploads (hat tip to YAHOO!)
     179        function fileUpload() {
     180                var form = $form[0];
     181
     182                if ($(':input[name=submit],:input[id=submit]', form).length) {
     183                        // if there is an input with a name or id of 'submit' then we won't be
     184                        // able to invoke the submit fn on the form (at least not x-browser)
     185                        alert('Error: Form elements must not have name or id of "submit".');
    194186                        return;
    195         }
    196         if (xhr.aborted)
    197             return;
    198        
    199         var cbInvoked = 0;
    200         var timedOut = 0;
    201 
    202         // add submitting element to data if we know it
    203         var sub = form.clk;
    204         if (sub) {
    205             var n = sub.name;
    206             if (n && !sub.disabled) {
    207                 options.extraData = options.extraData || {};
    208                 options.extraData[n] = sub.value;
    209                 if (sub.type == "image") {
    210                     options.extraData[name+'.x'] = form.clk_x;
    211                     options.extraData[name+'.y'] = form.clk_y;
    212                 }
    213             }
    214         }
    215 
    216         // take a breath so that pending repaints get some cpu time before the upload starts
    217         setTimeout(function() {
    218             // make sure form attrs are set
    219             var t = $form.attr('target'), a = $form.attr('action');
     187                }
     188               
     189                var s = $.extend(true, {}, $.ajaxSettings, options);
     190                s.context = s.context || s;
     191                var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id;
     192                window[fn] = function() {
     193                        var f = $io.data('form-plugin-onload');
     194                        if (f) {
     195                                f();
     196                                window[fn] = undefined;
     197                                try { delete window[fn]; } catch(e){}
     198                        }
     199                }
     200                var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" onload="window[\'_\'+this.id]()" />');
     201                var io = $io[0];
     202
     203                $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
     204
     205                var xhr = { // mock object
     206                        aborted: 0,
     207                        responseText: null,
     208                        responseXML: null,
     209                        status: 0,
     210                        statusText: 'n/a',
     211                        getAllResponseHeaders: function() {},
     212                        getResponseHeader: function() {},
     213                        setRequestHeader: function() {},
     214                        abort: function() {
     215                                this.aborted = 1;
     216                                $io.attr('src', s.iframeSrc); // abort op in progress
     217                        }
     218                };
     219
     220                var g = s.global;
     221                // trigger ajax global events so that activity/block indicators work like normal
     222                if (g && ! $.active++) {
     223                        $.event.trigger("ajaxStart");
     224                }
     225                if (g) {
     226                        $.event.trigger("ajaxSend", [xhr, s]);
     227                }
     228
     229                if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
     230                        if (s.global) {
     231                                $.active--;
     232                        }
     233                        return;
     234                }
     235                if (xhr.aborted) {
     236                        return;
     237                }
     238
     239                var cbInvoked = false;
     240                var timedOut = 0;
     241
     242                // add submitting element to data if we know it
     243                var sub = form.clk;
     244                if (sub) {
     245                        var n = sub.name;
     246                        if (n && !sub.disabled) {
     247                                s.extraData = s.extraData || {};
     248                                s.extraData[n] = sub.value;
     249                                if (sub.type == "image") {
     250                                        s.extraData[n+'.x'] = form.clk_x;
     251                                        s.extraData[n+'.y'] = form.clk_y;
     252                                }
     253                        }
     254                }
     255
     256                // take a breath so that pending repaints get some cpu time before the upload starts
     257                function doSubmit() {
     258                        // make sure form attrs are set
     259                        var t = $form.attr('target'), a = $form.attr('action');
    220260
    221261                        // update form attrs in IE friendly way
    222262                        form.setAttribute('target',id);
    223                         if (form.getAttribute('method') != 'POST')
     263                        if (form.getAttribute('method') != 'POST') {
    224264                                form.setAttribute('method', 'POST');
    225                         if (form.getAttribute('action') != opts.url)
    226                                 form.setAttribute('action', opts.url);
    227                                                        
    228             // ie borks in some cases when setting encoding
    229             if (! options.skipEncodingOverride) {
    230                 $form.attr({
    231                     encoding: 'multipart/form-data',
    232                     enctype:  'multipart/form-data'
    233                 });
    234             }
    235 
    236             // support timout
    237             if (opts.timeout)
    238                 setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
    239 
    240             // add "extra" data to form if provided in options
    241             var extraInputs = [];
    242             try {
    243                 if (options.extraData)
    244                     for (var n in options.extraData)
    245                         extraInputs.push(
    246                             $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
    247                                 .appendTo(form)[0]);
    248            
    249                 // add iframe to doc and submit the form
    250                 $io.appendTo('body');
    251                 io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
    252                 form.submit();
    253             }
    254             finally {
    255                 // reset attrs and remove "extra" input elements
     265                        }
     266                        if (form.getAttribute('action') != s.url) {
     267                                form.setAttribute('action', s.url);
     268                        }
     269
     270                        // ie borks in some cases when setting encoding
     271                        if (! s.skipEncodingOverride) {
     272                                $form.attr({
     273                                        encoding: 'multipart/form-data',
     274                                        enctype:  'multipart/form-data'
     275                                });
     276                        }
     277
     278                        // support timout
     279                        if (s.timeout) {
     280                                setTimeout(function() { timedOut = true; cb(); }, s.timeout);
     281                        }
     282
     283                        // add "extra" data to form if provided in options
     284                        var extraInputs = [];
     285                        try {
     286                                if (s.extraData) {
     287                                        for (var n in s.extraData) {
     288                                                extraInputs.push(
     289                                                        $('<input type="hidden" name="'+n+'" value="'+s.extraData[n]+'" />')
     290                                                                .appendTo(form)[0]);
     291                                        }
     292                                }
     293
     294                                // add iframe to doc and submit the form
     295                                $io.appendTo('body');
     296                                $io.data('form-plugin-onload', cb);
     297                                form.submit();
     298                        }
     299                        finally {
     300                                // reset attrs and remove "extra" input elements
    256301                                form.setAttribute('action',a);
    257                 t ? form.setAttribute('target', t) : $form.removeAttr('target');
    258                 $(extraInputs).remove();
    259             }
    260         }, 10);
    261 
    262         var nullCheckFlag = 0;
    263                
    264         function cb() {
    265             if (cbInvoked++) return;
    266            
    267             io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
    268 
    269             var ok = true;
    270             try {
    271                 if (timedOut) throw 'timeout';
    272                 // extract the server response from the iframe
    273                 var data, doc;
    274 
    275                 doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
    276                
    277                 if ((doc.body == null || doc.body.innerHTML == '') && !nullCheckFlag) {
    278                     // in some browsers (cough, Opera 9.2.x) the iframe DOM is not always traversable when
    279                     // the onload callback fires, so we give them a 2nd chance
    280                     nullCheckFlag = 1;
    281                     cbInvoked--;
    282                     setTimeout(cb, 100);
    283                     return;
    284                 }
    285                
    286                 xhr.responseText = doc.body ? doc.body.innerHTML : null;
    287                 xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
    288                 xhr.getResponseHeader = function(header){
    289                     var headers = {'content-type': opts.dataType};
    290                     return headers[header];
    291                 };
    292 
    293                 if (opts.dataType == 'json' || opts.dataType == 'script') {
    294                     var ta = doc.getElementsByTagName('textarea')[0];
    295                     xhr.responseText = ta ? ta.value : xhr.responseText;
    296                 }
    297                 else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
    298                     xhr.responseXML = toXml(xhr.responseText);
    299                 }
    300                 data = $.httpData(xhr, opts.dataType);
    301             }
    302             catch(e){
    303                 ok = false;
    304                 $.handleError(opts, xhr, 'error', e);
    305             }
    306 
    307             // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
    308             if (ok) {
    309                 opts.success(data, 'success');
    310                 if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
    311             }
    312             if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
    313             if (g && ! --$.active) $.event.trigger("ajaxStop");
    314             if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
    315 
    316             // clean up
    317             setTimeout(function() {
    318                 $io.remove();
    319                 xhr.responseXML = null;
    320             }, 100);
    321         };
    322 
    323         function toXml(s, doc) {
    324             if (window.ActiveXObject) {
    325                 doc = new ActiveXObject('Microsoft.XMLDOM');
    326                 doc.async = 'false';
    327                 doc.loadXML(s);
    328             }
    329             else
    330                 doc = (new DOMParser()).parseFromString(s, 'text/xml');
    331             return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
    332         };
    333     };
     302                                if(t) {
     303                                        form.setAttribute('target', t);
     304                                } else {
     305                                        $form.removeAttr('target');
     306                                }
     307                                $(extraInputs).remove();
     308                        }
     309                }
     310
     311                if (s.forceSync) {
     312                        doSubmit();
     313                }
     314                else {
     315                        setTimeout(doSubmit, 10); // this lets dom updates render
     316                }
     317       
     318                var data, doc, domCheckCount = 50;
     319
     320                function cb() {
     321                        if (cbInvoked) {
     322                                return;
     323                        }
     324
     325                        $io.removeData('form-plugin-onload');
     326                       
     327                        var ok = true;
     328                        try {
     329                                if (timedOut) {
     330                                        throw 'timeout';
     331                                }
     332                                // extract the server response from the iframe
     333                                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
     334                               
     335                                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
     336                                log('isXml='+isXml);
     337                                if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
     338                                        if (--domCheckCount) {
     339                                                // in some browsers (Opera) the iframe DOM is not always traversable when
     340                                                // the onload callback fires, so we loop a bit to accommodate
     341                                                log('requeing onLoad callback, DOM not available');
     342                                                setTimeout(cb, 250);
     343                                                return;
     344                                        }
     345                                        // let this fall through because server response could be an empty document
     346                                        //log('Could not access iframe DOM after mutiple tries.');
     347                                        //throw 'DOMException: not available';
     348                                }
     349
     350                                //log('response detected');
     351                                cbInvoked = true;
     352                                xhr.responseText = doc.documentElement ? doc.documentElement.innerHTML : null;
     353                                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
     354                                xhr.getResponseHeader = function(header){
     355                                        var headers = {'content-type': s.dataType};
     356                                        return headers[header];
     357                                };
     358
     359                                var scr = /(json|script)/.test(s.dataType);
     360                                if (scr || s.textarea) {
     361                                        // see if user embedded response in textarea
     362                                        var ta = doc.getElementsByTagName('textarea')[0];
     363                                        if (ta) {
     364                                                xhr.responseText = ta.value;
     365                                        }
     366                                        else if (scr) {
     367                                                // account for browsers injecting pre around json response
     368                                                var pre = doc.getElementsByTagName('pre')[0];
     369                                                if (pre) {
     370                                                        xhr.responseText = pre.innerHTML;
     371                                                }
     372                                        }                         
     373                                }
     374                                else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
     375                                        xhr.responseXML = toXml(xhr.responseText);
     376                                }
     377                                data = $.httpData(xhr, s.dataType);
     378                        }
     379                        catch(e){
     380                                log('error caught:',e);
     381                                ok = false;
     382                                xhr.error = e;
     383                                $.handleError(s, xhr, 'error', e);
     384                        }
     385
     386                        // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
     387                        if (ok) {
     388                                s.success.call(s.context, data, 'success', xhr);
     389                                if (g) {
     390                                        $.event.trigger("ajaxSuccess", [xhr, s]);
     391                                }
     392                        }
     393                        if (g) {
     394                                $.event.trigger("ajaxComplete", [xhr, s]);
     395                        }
     396                        if (g && ! --$.active) {
     397                                $.event.trigger("ajaxStop");
     398                        }
     399                        if (s.complete) {
     400                                s.complete.call(s.context, xhr, ok ? 'success' : 'error');
     401                        }
     402
     403                        // clean up
     404                        setTimeout(function() {
     405                                $io.removeData('form-plugin-onload');
     406                                $io.remove();
     407                                xhr.responseXML = null;
     408                        }, 100);
     409                }
     410
     411                function toXml(s, doc) {
     412                        if (window.ActiveXObject) {
     413                                doc = new ActiveXObject('Microsoft.XMLDOM');
     414                                doc.async = 'false';
     415                                doc.loadXML(s);
     416                        }
     417                        else {
     418                                doc = (new DOMParser()).parseFromString(s, 'text/xml');
     419                        }
     420                        return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
     421                }
     422        }
    334423};
    335424
     
    340429 *
    341430 * 1: This method will include coordinates for <input type="image" /> elements (if the element
    342  *    is used to submit the form).
     431 *      is used to submit the form).
    343432 * 2. This method will include the submit element's name/value data (for the element that was
    344  *    used to submit the form).
     433 *      used to submit the form).
    345434 * 3. This method binds the submit() method to the form for you.
    346435 *
     
    348437 * passes the options argument along after properly binding events for submit elements and
    349438 * the form itself.
    350  */ 
     439 */
    351440$.fn.ajaxForm = function(options) {
    352     return this.ajaxFormUnbind().bind('submit.form-plugin',function() {
    353         $(this).ajaxSubmit(options);
    354         return false;
    355     }).each(function() {
    356         // store options in hash
    357         $(":submit,input:image", this).bind('click.form-plugin',function(e) {
    358             var form = this.form;
    359             form.clk = this;
    360             if (this.type == 'image') {
    361                 if (e.offsetX != undefined) {
    362                     form.clk_x = e.offsetX;
    363                     form.clk_y = e.offsetY;
    364                 } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
    365                     var offset = $(this).offset();
    366                     form.clk_x = e.pageX - offset.left;
    367                     form.clk_y = e.pageY - offset.top;
    368                 } else {
    369                     form.clk_x = e.pageX - this.offsetLeft;
    370                     form.clk_y = e.pageY - this.offsetTop;
    371                 }
    372             }
    373             // clear form vars
    374             setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10);
    375         });
    376     });
     441        // in jQuery 1.3+ we can fix mistakes with the ready state
     442        if (this.length === 0) {
     443                var o = { s: this.selector, c: this.context };
     444                if (!$.isReady && o.s) {
     445                        log('DOM not ready, queuing ajaxForm');
     446                        $(function() {
     447                                $(o.s,o.c).ajaxForm(options);
     448                        });
     449                        return this;
     450                }
     451                // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
     452                log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
     453                return this;
     454        }
     455       
     456        return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
     457                if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
     458                        e.preventDefault();
     459                        $(this).ajaxSubmit(options);
     460                }
     461        }).bind('click.form-plugin', function(e) {
     462                var target = e.target;
     463                var $el = $(target);
     464                if (!($el.is(":submit,input:image"))) {
     465                        // is this a child element of the submit el?  (ex: a span within a button)
     466                        var t = $el.closest(':submit');
     467                        if (t.length == 0) {
     468                                return;
     469                        }
     470                        target = t[0];
     471                }
     472                var form = this;
     473                form.clk = target;
     474                if (target.type == 'image') {
     475                        if (e.offsetX != undefined) {
     476                                form.clk_x = e.offsetX;
     477                                form.clk_y = e.offsetY;
     478                        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
     479                                var offset = $el.offset();
     480                                form.clk_x = e.pageX - offset.left;
     481                                form.clk_y = e.pageY - offset.top;
     482                        } else {
     483                                form.clk_x = e.pageX - target.offsetLeft;
     484                                form.clk_y = e.pageY - target.offsetTop;
     485                        }
     486                }
     487                // clear form vars
     488                setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
     489        });
    377490};
    378491
    379492// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
    380493$.fn.ajaxFormUnbind = function() {
    381     this.unbind('submit.form-plugin');
    382     return this.each(function() {
    383         $(":submit,input:image", this).unbind('click.form-plugin');
    384     });
    385 
     494        return this.unbind('submit.form-plugin click.form-plugin');
    386495};
    387496
     
    398507 */
    399508$.fn.formToArray = function(semantic) {
    400     var a = [];
    401     if (this.length == 0) return a;
    402 
    403     var form = this[0];
    404     var els = semantic ? form.getElementsByTagName('*') : form.elements;
    405     if (!els) return a;
    406     for(var i=0, max=els.length; i < max; i++) {
    407         var el = els[i];
    408         var n = el.name;
    409         if (!n) continue;
    410 
    411         if (semantic && form.clk && el.type == "image") {
    412             // handle image inputs on the fly when semantic == true
    413             if(!el.disabled && form.clk == el)
    414                 a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
    415             continue;
    416         }
    417 
    418         var v = $.fieldValue(el, true);
    419         if (v && v.constructor == Array) {
    420             for(var j=0, jmax=v.length; j < jmax; j++)
    421                 a.push({name: n, value: v[j]});
    422         }
    423         else if (v !== null && typeof v != 'undefined')
    424             a.push({name: n, value: v});
    425     }
    426 
    427     if (!semantic && form.clk) {
    428         // input type=='image' are not found in elements array! handle them here
    429         var inputs = form.getElementsByTagName("input");
    430         for(var i=0, max=inputs.length; i < max; i++) {
    431             var input = inputs[i];
    432             var n = input.name;
    433             if(n && !input.disabled && input.type == "image" && form.clk == input)
    434                 a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
    435         }
    436     }
    437     return a;
     509        var a = [];
     510        if (this.length === 0) {
     511                return a;
     512        }
     513
     514        var form = this[0];
     515        var els = semantic ? form.getElementsByTagName('*') : form.elements;
     516        if (!els) {
     517                return a;
     518        }
     519       
     520        var i,j,n,v,el;
     521        for(i=0, max=els.length; i < max; i++) {
     522                el = els[i];
     523                n = el.name;
     524                if (!n) {
     525                        continue;
     526                }
     527
     528                if (semantic && form.clk && el.type == "image") {
     529                        // handle image inputs on the fly when semantic == true
     530                        if(!el.disabled && form.clk == el) {
     531                                a.push({name: n, value: $(el).val()});
     532                                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
     533                        }
     534                        continue;
     535                }
     536
     537                v = $.fieldValue(el, true);
     538                if (v && v.constructor == Array) {
     539                        for(j=0, jmax=v.length; j < jmax; j++) {
     540                                a.push({name: n, value: v[j]});
     541                        }
     542                }
     543                else if (v !== null && typeof v != 'undefined') {
     544                        a.push({name: n, value: v});
     545                }
     546        }
     547
     548        if (!semantic && form.clk) {
     549                // input type=='image' are not found in elements array! handle it here
     550                var $input = $(form.clk), input = $input[0];
     551                n = input.name;
     552                if (n && !input.disabled && input.type == 'image') {
     553                        a.push({name: n, value: $input.val()});
     554                        a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
     555                }
     556        }
     557        return a;
    438558};
    439559
     
    443563 */
    444564$.fn.formSerialize = function(semantic) {
    445     //hand off to jQuery.param for proper encoding
    446     return $.param(this.formToArray(semantic));
     565        //hand off to jQuery.param for proper encoding
     566        return $.param(this.formToArray(semantic));
    447567};
    448568
     
    452572 */
    453573$.fn.fieldSerialize = function(successful) {
    454     var a = [];
    455     this.each(function() {
    456         var n = this.name;
    457         if (!n) return;
    458         var v = $.fieldValue(this, successful);
    459         if (v && v.constructor == Array) {
    460             for (var i=0,max=v.length; i < max; i++)
    461                 a.push({name: n, value: v[i]});
    462         }
    463         else if (v !== null && typeof v != 'undefined')
    464             a.push({name: this.name, value: v});
    465     });
    466     //hand off to jQuery.param for proper encoding
    467     return $.param(a);
     574        var a = [];
     575        this.each(function() {
     576                var n = this.name;
     577                if (!n) {
     578                        return;
     579                }
     580                var v = $.fieldValue(this, successful);
     581                if (v && v.constructor == Array) {
     582                        for (var i=0,max=v.length; i < max; i++) {
     583                                a.push({name: n, value: v[i]});
     584                        }
     585                }
     586                else if (v !== null && typeof v != 'undefined') {
     587                        a.push({name: this.name, value: v});
     588                }
     589        });
     590        //hand off to jQuery.param for proper encoding
     591        return $.param(a);
    468592};
    469593
     
    472596 *
    473597 *  <form><fieldset>
    474  *      <input name="A" type="text" />
    475  *      <input name="A" type="text" />
    476  *      <input name="B" type="checkbox" value="B1" />
    477  *      <input name="B" type="checkbox" value="B2"/>
    478  *      <input name="C" type="radio" value="C1" />
    479  *      <input name="C" type="radio" value="C2" />
     598 *        <input name="A" type="text" />
     599 *        <input name="A" type="text" />
     600 *        <input name="B" type="checkbox" value="B1" />
     601 *        <input name="B" type="checkbox" value="B2"/>
     602 *        <input name="C" type="radio" value="C1" />
     603 *        <input name="C" type="radio" value="C2" />
    480604 *  </fieldset></form>
    481605 *
     
    504628 *
    505629 * Note: This method *always* returns an array.  If no valid value can be determined the
    506  *       array will be empty, otherwise it will contain one or more values.
     630 *         array will be empty, otherwise it will contain one or more values.
    507631 */
    508632$.fn.fieldValue = function(successful) {
    509     for (var val=[], i=0, max=this.length; i < max; i++) {
    510         var el = this[i];
    511         var v = $.fieldValue(el, successful);
    512         if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
    513             continue;
    514         v.constructor == Array ? $.merge(val, v) : val.push(v);
    515     }
    516     return val;
     633        for (var val=[], i=0, max=this.length; i < max; i++) {
     634                var el = this[i];
     635                var v = $.fieldValue(el, successful);
     636                if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
     637                        continue;
     638                }
     639                v.constructor == Array ? $.merge(val, v) : val.push(v);
     640        }
     641        return val;
    517642};
    518643
     
    521646 */
    522647$.fieldValue = function(el, successful) {
    523     var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
    524     if (typeof successful == 'undefined') successful = true;
    525 
    526     if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
    527         (t == 'checkbox' || t == 'radio') && !el.checked ||
    528         (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
    529         tag == 'select' && el.selectedIndex == -1))
    530             return null;
    531 
    532     if (tag == 'select') {
    533         var index = el.selectedIndex;
    534         if (index < 0) return null;
    535         var a = [], ops = el.options;
    536         var one = (t == 'select-one');
    537         var max = (one ? index+1 : ops.length);
    538         for(var i=(one ? index : 0); i < max; i++) {
    539             var op = ops[i];
    540             if (op.selected) {
     648        var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
     649        if (successful === undefined) {
     650                successful = true;
     651        }
     652
     653        if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
     654                (t == 'checkbox' || t == 'radio') && !el.checked ||
     655                (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
     656                tag == 'select' && el.selectedIndex == -1)) {
     657                        return null;
     658        }
     659
     660        if (tag == 'select') {
     661                var index = el.selectedIndex;
     662                if (index < 0) {
     663                        return null;
     664                }
     665                var a = [], ops = el.options;
     666                var one = (t == 'select-one');
     667                var max = (one ? index+1 : ops.length);
     668                for(var i=(one ? index : 0); i < max; i++) {
     669                        var op = ops[i];
     670                        if (op.selected) {
    541671                                var v = op.value;
    542                                 if (!v) // extra pain for IE...
    543                         v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
    544                 if (one) return v;
    545                 a.push(v);
    546             }
    547         }
    548         return a;
    549     }
    550     return el.value;
     672                                if (!v) { // extra pain for IE...
     673                                        v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
     674                                }
     675                                if (one) {
     676                                        return v;
     677                                }
     678                                a.push(v);
     679                        }
     680                }
     681                return a;
     682        }
     683        return $(el).val();
    551684};
    552685
     
    560693 */
    561694$.fn.clearForm = function() {
    562     return this.each(function() {
    563         $('input,select,textarea', this).clearFields();
    564     });
     695        return this.each(function() {
     696                $('input,select,textarea', this).clearFields();
     697        });
    565698};
    566699
     
    569702 */
    570703$.fn.clearFields = $.fn.clearInputs = function() {
    571     return this.each(function() {
    572         var t = this.type, tag = this.tagName.toLowerCase();
    573         if (t == 'text' || t == 'password' || tag == 'textarea')
    574             this.value = '';
    575         else if (t == 'checkbox' || t == 'radio')
    576             this.checked = false;
    577         else if (tag == 'select')
    578             this.selectedIndex = -1;
    579     });
     704        return this.each(function() {
     705                var t = this.type, tag = this.tagName.toLowerCase();
     706                if (t == 'text' || t == 'password' || tag == 'textarea') {
     707                        this.value = '';
     708                }
     709                else if (t == 'checkbox' || t == 'radio') {
     710                        this.checked = false;
     711                }
     712                else if (tag == 'select') {
     713                        this.selectedIndex = -1;
     714                }
     715        });
    580716};
    581717
     
    584720 */
    585721$.fn.resetForm = function() {
    586     return this.each(function() {
    587         // guard against an input with the name of 'reset'
    588         // note that IE reports the reset function as an 'object'
    589         if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
    590             this.reset();
    591     });
     722        return this.each(function() {
     723                // guard against an input with the name of 'reset'
     724                // note that IE reports the reset function as an 'object'
     725                if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
     726                        this.reset();
     727                }
     728        });
    592729};
    593730
     
    595732 * Enables or disables any matching elements.
    596733 */
    597 $.fn.enable = function(b) {
    598     if (b == undefined) b = true;
    599     return this.each(function() {
    600         this.disabled = !b
    601     });
     734$.fn.enable = function(b) {
     735        if (b === undefined) {
     736                b = true;
     737        }
     738        return this.each(function() {
     739                this.disabled = !b;
     740        });
    602741};
    603742
     
    607746 */
    608747$.fn.selected = function(select) {
    609     if (select == undefined) select = true;
    610     return this.each(function() {
    611         var t = this.type;
    612         if (t == 'checkbox' || t == 'radio')
    613             this.checked = select;
    614         else if (this.tagName.toLowerCase() == 'option') {
    615             var $sel = $(this).parent('select');
    616             if (select && $sel[0] && $sel[0].type == 'select-one') {
    617                 // deselect all other options
    618                 $sel.find('option').selected(false);
    619             }
    620             this.selected = select;
    621         }
    622     });
     748        if (select === undefined) {
     749                select = true;
     750        }
     751        return this.each(function() {
     752                var t = this.type;
     753                if (t == 'checkbox' || t == 'radio') {
     754                        this.checked = select;
     755                }
     756                else if (this.tagName.toLowerCase() == 'option') {
     757                        var $sel = $(this).parent('select');
     758                        if (select && $sel[0] && $sel[0].type == 'select-one') {
     759                                // deselect all other options
     760                                $sel.find('option').selected(false);
     761                        }
     762                        this.selected = select;
     763                }
     764        });
    623765};
    624766
     
    626768// set $.fn.ajaxSubmit.debug to true to enable debug logging
    627769function log() {
    628     if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
    629         window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
     770        if ($.fn.ajaxSubmit.debug) {
     771                var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
     772                if (window.console && window.console.log) {
     773                        window.console.log(msg);
     774                }
     775                else if (window.opera && window.opera.postError) {
     776                        window.opera.postError(msg);
     777                }
     778        }
    630779};
    631780
  • trunk/web/javascript/jquery/jquery.form.min.js

    r8002 r11326  
    1 ;(function($){$.fn.ajaxSubmit=function(options){if(!this.length){log('ajaxSubmit: skipping submit process - no element selected');return this;}
    2 if(typeof options=='function')
    3 options={success:options};options=$.extend({url:this.attr('action')||window.location.toString(),type:this.attr('method')||'GET'},options||{});var veto={};this.trigger('form-pre-serialize',[this,options,veto]);if(veto.veto){log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');return this;}
    4 if(options.beforeSerialize&&options.beforeSerialize(this,options)===false){log('ajaxSubmit: submit aborted via beforeSerialize callback');return this;}
    5 var a=this.formToArray(options.semantic);if(options.data){options.extraData=options.data;for(var n in options.data){if(options.data[n]instanceof Array){for(var k in options.data[n])
    6 a.push({name:n,value:options.data[n][k]})}
    7 else
    8 a.push({name:n,value:options.data[n]});}}
    9 if(options.beforeSubmit&&options.beforeSubmit(a,this,options)===false){log('ajaxSubmit: submit aborted via beforeSubmit callback');return this;}
    10 this.trigger('form-submit-validate',[a,this,options,veto]);if(veto.veto){log('ajaxSubmit: submit vetoed via form-submit-validate trigger');return this;}
    11 var q=$.param(a);if(options.type.toUpperCase()=='GET'){options.url+=(options.url.indexOf('?')>=0?'&':'?')+q;options.data=null;}
    12 else
    13 options.data=q;var $form=this,callbacks=[];if(options.resetForm)callbacks.push(function(){$form.resetForm();});if(options.clearForm)callbacks.push(function(){$form.clearForm();});if(!options.dataType&&options.target){var oldSuccess=options.success||function(){};callbacks.push(function(data){$(options.target).html(data).each(oldSuccess,arguments);});}
    14 else if(options.success)
    15 callbacks.push(options.success);options.success=function(data,status){for(var i=0,max=callbacks.length;i<max;i++)
    16 callbacks[i].apply(options,[data,status,$form]);};var files=$('input:file',this).fieldValue();var found=false;for(var j=0;j<files.length;j++)
    17 if(files[j])
    18 found=true;if(options.iframe||found){if(options.closeKeepAlive)
    19 $.get(options.closeKeepAlive,fileUpload);else
    20 fileUpload();}
    21 else
    22 $.ajax(options);this.trigger('form-submit-notify',[this,options]);return this;function fileUpload(){var form=$form[0];if($(':input[name=submit]',form).length){alert('Error: Form elements must not be named "submit".');return;}
    23 var opts=$.extend({},$.ajaxSettings,options);var s=jQuery.extend(true,{},$.extend(true,{},$.ajaxSettings),opts);var id='jqFormIO'+(new Date().getTime());var $io=$('<iframe id="'+id+'" name="'+id+'" src="about:blank" />');var io=$io[0];$io.css({position:'absolute',top:'-1000px',left:'-1000px'});var xhr={aborted:0,responseText:null,responseXML:null,status:0,statusText:'n/a',getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(){this.aborted=1;$io.attr('src','about:blank');}};var g=opts.global;if(g&&!$.active++)$.event.trigger("ajaxStart");if(g)$.event.trigger("ajaxSend",[xhr,opts]);if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;return;}
    24 if(xhr.aborted)
    25 return;var cbInvoked=0;var timedOut=0;var sub=form.clk;if(sub){var n=sub.name;if(n&&!sub.disabled){options.extraData=options.extraData||{};options.extraData[n]=sub.value;if(sub.type=="image"){options.extraData[name+'.x']=form.clk_x;options.extraData[name+'.y']=form.clk_y;}}}
    26 setTimeout(function(){var t=$form.attr('target'),a=$form.attr('action');form.setAttribute('target',id);if(form.getAttribute('method')!='POST')
    27 form.setAttribute('method','POST');if(form.getAttribute('action')!=opts.url)
    28 form.setAttribute('action',opts.url);if(!options.skipEncodingOverride){$form.attr({encoding:'multipart/form-data',enctype:'multipart/form-data'});}
    29 if(opts.timeout)
    30 setTimeout(function(){timedOut=true;cb();},opts.timeout);var extraInputs=[];try{if(options.extraData)
    31 for(var n in options.extraData)
    32 extraInputs.push($('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />').appendTo(form)[0]);$io.appendTo('body');io.attachEvent?io.attachEvent('onload',cb):io.addEventListener('load',cb,false);form.submit();}
    33 finally{form.setAttribute('action',a);t?form.setAttribute('target',t):$form.removeAttr('target');$(extraInputs).remove();}},10);var nullCheckFlag=0;function cb(){if(cbInvoked++)return;io.detachEvent?io.detachEvent('onload',cb):io.removeEventListener('load',cb,false);var ok=true;try{if(timedOut)throw'timeout';var data,doc;doc=io.contentWindow?io.contentWindow.document:io.contentDocument?io.contentDocument:io.document;if((doc.body==null||doc.body.innerHTML=='')&&!nullCheckFlag){nullCheckFlag=1;cbInvoked--;setTimeout(cb,100);return;}
    34 xhr.responseText=doc.body?doc.body.innerHTML:null;xhr.responseXML=doc.XMLDocument?doc.XMLDocument:doc;xhr.getResponseHeader=function(header){var headers={'content-type':opts.dataType};return headers[header];};if(opts.dataType=='json'||opts.dataType=='script'){var ta=doc.getElementsByTagName('textarea')[0];xhr.responseText=ta?ta.value:xhr.responseText;}
    35 else if(opts.dataType=='xml'&&!xhr.responseXML&&xhr.responseText!=null){xhr.responseXML=toXml(xhr.responseText);}
    36 data=$.httpData(xhr,opts.dataType);}
    37 catch(e){ok=false;$.handleError(opts,xhr,'error',e);}
    38 if(ok){opts.success(data,'success');if(g)$.event.trigger("ajaxSuccess",[xhr,opts]);}
    39 if(g)$.event.trigger("ajaxComplete",[xhr,opts]);if(g&&!--$.active)$.event.trigger("ajaxStop");if(opts.complete)opts.complete(xhr,ok?'success':'error');setTimeout(function(){$io.remove();xhr.responseXML=null;},100);};function toXml(s,doc){if(window.ActiveXObject){doc=new ActiveXObject('Microsoft.XMLDOM');doc.async='false';doc.loadXML(s);}
    40 else
    41 doc=(new DOMParser()).parseFromString(s,'text/xml');return(doc&&doc.documentElement&&doc.documentElement.tagName!='parsererror')?doc:null;};};};$.fn.ajaxForm=function(options){return this.ajaxFormUnbind().bind('submit.form-plugin',function(){$(this).ajaxSubmit(options);return false;}).each(function(){$(":submit,input:image",this).bind('click.form-plugin',function(e){var form=this.form;form.clk=this;if(this.type=='image'){if(e.offsetX!=undefined){form.clk_x=e.offsetX;form.clk_y=e.offsetY;}else if(typeof $.fn.offset=='function'){var offset=$(this).offset();form.clk_x=e.pageX-offset.left;form.clk_y=e.pageY-offset.top;}else{form.clk_x=e.pageX-this.offsetLeft;form.clk_y=e.pageY-this.offsetTop;}}
    42 setTimeout(function(){form.clk=form.clk_x=form.clk_y=null;},10);});});};$.fn.ajaxFormUnbind=function(){this.unbind('submit.form-plugin');return this.each(function(){$(":submit,input:image",this).unbind('click.form-plugin');});};$.fn.formToArray=function(semantic){var a=[];if(this.length==0)return a;var form=this[0];var els=semantic?form.getElementsByTagName('*'):form.elements;if(!els)return a;for(var i=0,max=els.length;i<max;i++){var el=els[i];var n=el.name;if(!n)continue;if(semantic&&form.clk&&el.type=="image"){if(!el.disabled&&form.clk==el)
    43 a.push({name:n+'.x',value:form.clk_x},{name:n+'.y',value:form.clk_y});continue;}
    44 var v=$.fieldValue(el,true);if(v&&v.constructor==Array){for(var j=0,jmax=v.length;j<jmax;j++)
    45 a.push({name:n,value:v[j]});}
    46 else if(v!==null&&typeof v!='undefined')
    47 a.push({name:n,value:v});}
    48 if(!semantic&&form.clk){var inputs=form.getElementsByTagName("input");for(var i=0,max=inputs.length;i<max;i++){var input=inputs[i];var n=input.name;if(n&&!input.disabled&&input.type=="image"&&form.clk==input)
    49 a.push({name:n+'.x',value:form.clk_x},{name:n+'.y',value:form.clk_y});}}
    50 return a;};$.fn.formSerialize=function(semantic){return $.param(this.formToArray(semantic));};$.fn.fieldSerialize=function(successful){var a=[];this.each(function(){var n=this.name;if(!n)return;var v=$.fieldValue(this,successful);if(v&&v.constructor==Array){for(var i=0,max=v.length;i<max;i++)
    51 a.push({name:n,value:v[i]});}
    52 else if(v!==null&&typeof v!='undefined')
    53 a.push({name:this.name,value:v});});return $.param(a);};$.fn.fieldValue=function(successful){for(var val=[],i=0,max=this.length;i<max;i++){var el=this[i];var v=$.fieldValue(el,successful);if(v===null||typeof v=='undefined'||(v.constructor==Array&&!v.length))
    54 continue;v.constructor==Array?$.merge(val,v):val.push(v);}
    55 return val;};$.fieldValue=function(el,successful){var n=el.name,t=el.type,tag=el.tagName.toLowerCase();if(typeof successful=='undefined')successful=true;if(successful&&(!n||el.disabled||t=='reset'||t=='button'||(t=='checkbox'||t=='radio')&&!el.checked||(t=='submit'||t=='image')&&el.form&&el.form.clk!=el||tag=='select'&&el.selectedIndex==-1))
    56 return null;if(tag=='select'){var index=el.selectedIndex;if(index<0)return null;var a=[],ops=el.options;var one=(t=='select-one');var max=(one?index+1:ops.length);for(var i=(one?index:0);i<max;i++){var op=ops[i];if(op.selected){var v=op.value;if(!v)
    57 v=(op.attributes&&op.attributes['value']&&!(op.attributes['value'].specified))?op.text:op.value;if(one)return v;a.push(v);}}
    58 return a;}
    59 return el.value;};$.fn.clearForm=function(){return this.each(function(){$('input,select,textarea',this).clearFields();});};$.fn.clearFields=$.fn.clearInputs=function(){return this.each(function(){var t=this.type,tag=this.tagName.toLowerCase();if(t=='text'||t=='password'||tag=='textarea')
    60 this.value='';else if(t=='checkbox'||t=='radio')
    61 this.checked=false;else if(tag=='select')
    62 this.selectedIndex=-1;});};$.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=='function'||(typeof this.reset=='object'&&!this.reset.nodeType))
    63 this.reset();});};$.fn.enable=function(b){if(b==undefined)b=true;return this.each(function(){this.disabled=!b});};$.fn.selected=function(select){if(select==undefined)select=true;return this.each(function(){var t=this.type;if(t=='checkbox'||t=='radio')
    64 this.checked=select;else if(this.tagName.toLowerCase()=='option'){var $sel=$(this).parent('select');if(select&&$sel[0]&&$sel[0].type=='select-one'){$sel.find('option').selected(false);}
    65 this.selected=select;}});};function log(){if($.fn.ajaxSubmit.debug&&window.console&&window.console.log)
    66 window.console.log('[jquery.form] '+Array.prototype.join.call(arguments,''));};})(jQuery);
     1/*!
     2 * jQuery Form Plugin
     3 * version: 2.47 (04-SEP-2010)
     4 * @requires jQuery v1.3.2 or later
     5 *
     6 * Examples and documentation at: http://malsup.com/jquery/form/
     7 * Dual licensed under the MIT and GPL licenses:
     8 *   http://www.opensource.org/licenses/mit-license.php
     9 *   http://www.gnu.org/licenses/gpl.html
     10 */
     11(function(b){b.fn.ajaxSubmit=function(s){if(!this.length){a("ajaxSubmit: skipping submit process - no element selected");return this}if(typeof s=="function"){s={success:s}}var d=b.trim(this.attr("action"));if(d){d=(d.match(/^([^#]+)/)||[])[1]}d=d||window.location.href||"";s=b.extend(true,{url:d,type:this.attr("method")||"GET",iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},s);var t={};this.trigger("form-pre-serialize",[this,s,t]);if(t.veto){a("ajaxSubmit: submit vetoed via form-pre-serialize trigger");return this}if(s.beforeSerialize&&s.beforeSerialize(this,s)===false){a("ajaxSubmit: submit aborted via beforeSerialize callback");return this}var f,o,l=this.formToArray(s.semantic);if(s.data){s.extraData=s.data;for(f in s.data){if(s.data[f] instanceof Array){for(var h in s.data[f]){l.push({name:f,value:s.data[f][h]})}}else{o=s.data[f];o=b.isFunction(o)?o():o;l.push({name:f,value:o})}}}if(s.beforeSubmit&&s.beforeSubmit(l,this,s)===false){a("ajaxSubmit: submit aborted via beforeSubmit callback");return this}this.trigger("form-submit-validate",[l,this,s,t]);if(t.veto){a("ajaxSubmit: submit vetoed via form-submit-validate trigger");return this}var c=b.param(l);if(s.type.toUpperCase()=="GET"){s.url+=(s.url.indexOf("?")>=0?"&":"?")+c;s.data=null}else{s.data=c}var r=this,j=[];if(s.resetForm){j.push(function(){r.resetForm()})}if(s.clearForm){j.push(function(){r.clearForm()})}if(!s.dataType&&s.target){var p=s.success||function(){};j.push(function(n){var k=s.replaceTarget?"replaceWith":"html";b(s.target)[k](n).each(p,arguments)})}else{if(s.success){j.push(s.success)}}s.success=function(v,n,w){var u=s.context||s;for(var q=0,k=j.length;q<k;q++){j[q].apply(u,[v,n,w||r,r])}};var g=b("input:file",this).length>0;var e="multipart/form-data";var i=(r.attr("enctype")==e||r.attr("encoding")==e);if(s.iframe!==false&&(g||s.iframe||i)){if(s.closeKeepAlive){b.get(s.closeKeepAlive,m)}else{m()}}else{b.ajax(s)}this.trigger("form-submit-notify",[this,s]);return this;function m(){var k=r[0];if(b(":input[name=submit],:input[id=submit]",k).length){alert('Error: Form elements must not have name or id of "submit".');return}var y=b.extend(true,{},b.ajaxSettings,s);y.context=y.context||y;var B="jqFormIO"+(new Date().getTime()),w="_"+B;window[w]=function(){var n=q.data("form-plugin-onload");if(n){n();window[w]=undefined;try{delete window[w]}catch(K){}}};var q=b('<iframe id="'+B+'" name="'+B+'" src="'+y.iframeSrc+'" onload="window[\'_\'+this.id]()" />');var x=q[0];q.css({position:"absolute",top:"-1000px",left:"-1000px"});var u={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(){this.aborted=1;q.attr("src",y.iframeSrc)}};var G=y.global;if(G&&!b.active++){b.event.trigger("ajaxStart")}if(G){b.event.trigger("ajaxSend",[u,y])}if(y.beforeSend&&y.beforeSend.call(y.context,u,y)===false){if(y.global){b.active--}return}if(u.aborted){return}var C=false;var F=0;var v=k.clk;if(v){var D=v.name;if(D&&!v.disabled){y.extraData=y.extraData||{};y.extraData[D]=v.value;if(v.type=="image"){y.extraData[D+".x"]=k.clk_x;y.extraData[D+".y"]=k.clk_y}}}function E(){var M=r.attr("target"),K=r.attr("action");k.setAttribute("target",B);if(k.getAttribute("method")!="POST"){k.setAttribute("method","POST")}if(k.getAttribute("action")!=y.url){k.setAttribute("action",y.url)}if(!y.skipEncodingOverride){r.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"})}if(y.timeout){setTimeout(function(){F=true;A()},y.timeout)}var L=[];try{if(y.extraData){for(var N in y.extraData){L.push(b('<input type="hidden" name="'+N+'" value="'+y.extraData[N]+'" />').appendTo(k)[0])}}q.appendTo("body");q.data("form-plugin-onload",A);k.submit()}finally{k.setAttribute("action",K);if(M){k.setAttribute("target",M)}else{r.removeAttr("target")}b(L).remove()}}if(y.forceSync){E()}else{setTimeout(E,10)}var I,J,H=50;function A(){if(C){return}q.removeData("form-plugin-onload");var K=true;try{if(F){throw"timeout"}J=x.contentWindow?x.contentWindow.document:x.contentDocument?x.contentDocument:x.document;var O=y.dataType=="xml"||J.XMLDocument||b.isXMLDoc(J);a("isXml="+O);if(!O&&window.opera&&(J.body==null||J.body.innerHTML=="")){if(--H){a("requeing onLoad callback, DOM not available");setTimeout(A,250);return}}C=true;u.responseText=J.documentElement?J.documentElement.innerHTML:null;u.responseXML=J.XMLDocument?J.XMLDocument:J;u.getResponseHeader=function(Q){var P={"content-type":y.dataType};return P[Q]};var N=/(json|script)/.test(y.dataType);if(N||y.textarea){var n=J.getElementsByTagName("textarea")[0];if(n){u.responseText=n.value}else{if(N){var M=J.getElementsByTagName("pre")[0];if(M){u.responseText=M.innerHTML}}}}else{if(y.dataType=="xml"&&!u.responseXML&&u.responseText!=null){u.responseXML=z(u.responseText)}}I=b.httpData(u,y.dataType)}catch(L){a("error caught:",L);K=false;u.error=L;b.handleError(y,u,"error",L)}if(K){y.success.call(y.context,I,"success",u);if(G){b.event.trigger("ajaxSuccess",[u,y])}}if(G){b.event.trigger("ajaxComplete",[u,y])}if(G&&!--b.active){b.event.trigger("ajaxStop")}if(y.complete){y.complete.call(y.context,u,K?"success":"error")}setTimeout(function(){q.removeData("form-plugin-onload");q.remove();u.responseXML=null},100)}function z(n,K){if(window.ActiveXObject){K=new ActiveXObject("Microsoft.XMLDOM");K.async="false";K.loadXML(n)}else{K=(new DOMParser()).parseFromString(n,"text/xml")}return(K&&K.documentElement&&K.documentElement.tagName!="parsererror")?K:null}}};b.fn.ajaxForm=function(c){if(this.length===0){var d={s:this.selector,c:this.context};if(!b.isReady&&d.s){a("DOM not ready, queuing ajaxForm");b(function(){b(d.s,d.c).ajaxForm(c)});return this}a("terminating; zero elements found by selector"+(b.isReady?"":" (DOM not ready)"));return this}return this.ajaxFormUnbind().bind("submit.form-plugin",function(f){if(!f.isDefaultPrevented()){f.preventDefault();b(this).ajaxSubmit(c)}}).bind("click.form-plugin",function(j){var i=j.target;var g=b(i);if(!(g.is(":submit,input:image"))){var f=g.closest(":submit");if(f.length==0){return}i=f[0]}var h=this;h.clk=i;if(i.type=="image"){if(j.offsetX!=undefined){h.clk_x=j.offsetX;h.clk_y=j.offsetY}else{if(typeof b.fn.offset=="function"){var k=g.offset();h.clk_x=j.pageX-k.left;h.clk_y=j.pageY-k.top}else{h.clk_x=j.pageX-i.offsetLeft;h.clk_y=j.pageY-i.offsetTop}}}setTimeout(function(){h.clk=h.clk_x=h.clk_y=null},100)})};b.fn.ajaxFormUnbind=function(){return this.unbind("submit.form-plugin click.form-plugin")};b.fn.formToArray=function(o){var m=[];if(this.length===0){return m}var c=this[0];var f=o?c.getElementsByTagName("*"):c.elements;if(!f){return m}var h,g,e,p,d;for(h=0,max=f.length;h<max;h++){d=f[h];e=d.name;if(!e){continue}if(o&&c.clk&&d.type=="image"){if(!d.disabled&&c.clk==d){m.push({name:e,value:b(d).val()});m.push({name:e+".x",value:c.clk_x},{name:e+".y",value:c.clk_y})}continue}p=b.fieldValue(d,true);if(p&&p.constructor==Array){for(g=0,jmax=p.length;g<jmax;g++){m.push({name:e,value:p[g]})}}else{if(p!==null&&typeof p!="undefined"){m.push({name:e,value:p})}}}if(!o&&c.clk){var k=b(c.clk),l=k[0];e=l.name;if(e&&!l.disabled&&l.type=="image"){m.push({name:e,value:k.val()});m.push({name:e+".x",value:c.clk_x},{name:e+".y",value:c.clk_y})}}return m};b.fn.formSerialize=function(c){return b.param(this.formToArray(c))};b.fn.fieldSerialize=function(d){var c=[];this.each(function(){var h=this.name;if(!h){return}var f=b.fieldValue(this,d);if(f&&f.constructor==Array){for(var g=0,e=f.length;g<e;g++){c.push({name:h,value:f[g]})}}else{if(f!==null&&typeof f!="undefined"){c.push({name:this.name,value:f})}}});return b.param(c)};b.fn.fieldValue=function(h){for(var g=[],e=0,c=this.length;e<c;e++){var f=this[e];var d=b.fieldValue(f,h);if(d===null||typeof d=="undefined"||(d.constructor==Array&&!d.length)){continue}d.constructor==Array?b.merge(g,d):g.push(d)}return g};b.fieldValue=function(c,j){var e=c.name,p=c.type,q=c.tagName.toLowerCase();if(j===undefined){j=true}if(j&&(!e||c.disabled||p=="reset"||p=="button"||(p=="checkbox"||p=="radio")&&!c.checked||(p=="submit"||p=="image")&&c.form&&c.form.clk!=c||q=="select"&&c.selectedIndex==-1)){return null}if(q=="select"){var k=c.selectedIndex;if(k<0){return null}var m=[],d=c.options;var g=(p=="select-one");var l=(g?k+1:d.length);for(var f=(g?k:0);f<l;f++){var h=d[f];if(h.selected){var o=h.value;if(!o){o=(h.attributes&&h.attributes.value&&!(h.attributes.value.specified))?h.text:h.value}if(g){return o}m.push(o)}}return m}return b(c).val()};b.fn.clearForm=function(){return this.each(function(){b("input,select,textarea",this).clearFields()})};b.fn.clearFields=b.fn.clearInputs=function(){return this.each(function(){var d=this.type,c=this.tagName.toLowerCase();if(d=="text"||d=="password"||c=="textarea"){this.value=""}else{if(d=="checkbox"||d=="radio"){this.checked=false}else{if(c=="select"){this.selectedIndex=-1}}}})};b.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType)){this.reset()}})};b.fn.enable=function(c){if(c===undefined){c=true}return this.each(function(){this.disabled=!c})};b.fn.selected=function(c){if(c===undefined){c=true}return this.each(function(){var d=this.type;if(d=="checkbox"||d=="radio"){this.checked=c}else{if(this.tagName.toLowerCase()=="option"){var e=b(this).parent("select");if(c&&e[0]&&e[0].type=="select-one"){e.find("option").selected(false)}this.selected=c}}})};function a(){if(b.fn.ajaxSubmit.debug){var c="[jquery.form] "+Array.prototype.join.call(arguments,"");if(window.console&&window.console.log){window.console.log(c)}else{if(window.opera&&window.opera.postError){window.opera.postError(c)}}}}})(jQuery);
Note: See TracChangeset for help on using the changeset viewer.