source: sandbox/expresso-solr/solr/example/work/jetty-0.0.0.0-8983-solr.war-_solr-any-/webapp/js/lib/jquery.form.js @ 7588

Revision 7588, 21.8 KB checked in by adir, 11 years ago (diff)

Ticket #000 - Adicionando a integracao de buscas com Solr na base a ser isnerida na comunidade

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