sphinx_django/static/jquery.form.js
author amit
Wed, 27 Oct 2010 13:59:11 +0530
changeset 3 de4a2ed2f34b
permissions -rwxr-xr-x
Adding readme files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     1
/*
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     2
 * jQuery Form Plugin
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     3
 * version: 2.28 (10-MAY-2009)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     4
 * @requires jQuery v1.2.2 or later
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     5
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     6
 * Examples and documentation at: http://malsup.com/jquery/form/
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     7
 * Dual licensed under the MIT and GPL licenses:
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     8
 *   http://www.opensource.org/licenses/mit-license.php
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
     9
 *   http://www.gnu.org/licenses/gpl.html
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    10
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    11
;(function($) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    12
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    13
/*
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    14
    Usage Note:
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    15
    -----------
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    16
    Do not use both ajaxSubmit and ajaxForm on the same form.  These
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    17
    functions are intended to be exclusive.  Use ajaxSubmit if you want
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    18
    to bind your own submit handler to the form.  For example,
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    19
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    20
    $(document).ready(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    21
        $('#myForm').bind('submit', function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    22
            $(this).ajaxSubmit({
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    23
                target: '#output'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    24
            });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    25
            return false; // <-- important!
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    26
        });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    27
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    28
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    29
    Use ajaxForm when you want the plugin to manage all the event binding
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    30
    for you.  For example,
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    31
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    32
    $(document).ready(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    33
        $('#myForm').ajaxForm({
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    34
            target: '#output'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    35
        });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    36
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    37
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    38
    When using ajaxForm, the ajaxSubmit function will be invoked for you
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    39
    at the appropriate time.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    40
*/
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    41
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    42
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    43
 * ajaxSubmit() provides a mechanism for immediately submitting
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    44
 * an HTML form using AJAX.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    45
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    46
$.fn.ajaxSubmit = function(options) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    47
    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    48
    if (!this.length) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    49
        log('ajaxSubmit: skipping submit process - no element selected');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    50
        return this;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    51
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    52
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    53
    if (typeof options == 'function')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    54
        options = { success: options };
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    55
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    56
    var url = $.trim(this.attr('action'));
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    57
    if (url) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    58
	    // clean url (don't include hash vaue)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    59
	    url = (url.match(/^([^#]+)/)||[])[1];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    60
   	}
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    61
   	url = url || window.location.href || ''
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    62
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    63
    options = $.extend({
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    64
        url:  url,
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    65
        type: this.attr('method') || 'GET'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    66
    }, options || {});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    67
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    68
    // hook for manipulating the form data before it is extracted;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    69
    // convenient for use with rich editors like tinyMCE or FCKEditor
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    70
    var veto = {};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    71
    this.trigger('form-pre-serialize', [this, options, veto]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    72
    if (veto.veto) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    73
        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    74
        return this;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    75
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    76
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    77
    // provide opportunity to alter form data before it is serialized
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    78
    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    79
        log('ajaxSubmit: submit aborted via beforeSerialize callback');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    80
        return this;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    81
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    82
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    83
    var a = this.formToArray(options.semantic);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    84
    if (options.data) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    85
        options.extraData = options.data;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    86
        for (var n in options.data) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    87
          if(options.data[n] instanceof Array) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    88
            for (var k in options.data[n])
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    89
              a.push( { name: n, value: options.data[n][k] } );
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    90
          }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    91
          else
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    92
             a.push( { name: n, value: options.data[n] } );
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    93
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    94
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    95
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    96
    // give pre-submit callback an opportunity to abort the submit
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    97
    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    98
        log('ajaxSubmit: submit aborted via beforeSubmit callback');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
    99
        return this;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   100
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   101
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   102
    // fire vetoable 'validate' event
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   103
    this.trigger('form-submit-validate', [a, this, options, veto]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   104
    if (veto.veto) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   105
        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   106
        return this;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   107
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   108
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   109
    var q = $.param(a);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   110
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   111
    if (options.type.toUpperCase() == 'GET') {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   112
        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   113
        options.data = null;  // data is null for 'get'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   114
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   115
    else
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   116
        options.data = q; // data is the query string for 'post'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   117
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   118
    var $form = this, callbacks = [];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   119
    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   120
    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   121
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   122
    // perform a load on the target only if dataType is not provided
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   123
    if (!options.dataType && options.target) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   124
        var oldSuccess = options.success || function(){};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   125
        callbacks.push(function(data) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   126
            $(options.target).html(data).each(oldSuccess, arguments);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   127
        });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   128
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   129
    else if (options.success)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   130
        callbacks.push(options.success);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   131
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   132
    options.success = function(data, status) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   133
        for (var i=0, max=callbacks.length; i < max; i++)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   134
            callbacks[i].apply(options, [data, status, $form]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   135
    };
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   136
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   137
    // are there files to upload?
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   138
    var files = $('input:file', this).fieldValue();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   139
    var found = false;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   140
    for (var j=0; j < files.length; j++)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   141
        if (files[j])
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   142
            found = true;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   143
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   144
	var multipart = false;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   145
//	var mp = 'multipart/form-data';
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   146
//	multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   147
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   148
    // options.iframe allows user to force iframe mode
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   149
   if (options.iframe || found || multipart) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   150
       // hack to fix Safari hang (thanks to Tim Molendijk for this)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   151
       // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   152
       if (options.closeKeepAlive)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   153
           $.get(options.closeKeepAlive, fileUpload);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   154
       else
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   155
           fileUpload();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   156
       }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   157
   else
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   158
       $.ajax(options);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   159
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   160
    // fire 'notify' event
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   161
    this.trigger('form-submit-notify', [this, options]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   162
    return this;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   163
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   164
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   165
    // private function for handling file uploads (hat tip to YAHOO!)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   166
    function fileUpload() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   167
        var form = $form[0];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   168
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   169
        if ($(':input[name=submit]', form).length) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   170
            alert('Error: Form elements must not be named "submit".');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   171
            return;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   172
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   173
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   174
        var opts = $.extend({}, $.ajaxSettings, options);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   175
		var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   176
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   177
        var id = 'jqFormIO' + (new Date().getTime());
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   178
        var $io = $('<iframe id="' + id + '" name="' + id + '" src="about:blank" />');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   179
        var io = $io[0];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   180
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   181
        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   182
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   183
        var xhr = { // mock object
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   184
            aborted: 0,
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   185
            responseText: null,
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   186
            responseXML: null,
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   187
            status: 0,
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   188
            statusText: 'n/a',
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   189
            getAllResponseHeaders: function() {},
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   190
            getResponseHeader: function() {},
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   191
            setRequestHeader: function() {},
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   192
            abort: function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   193
                this.aborted = 1;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   194
                $io.attr('src','about:blank'); // abort op in progress
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   195
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   196
        };
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   197
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   198
        var g = opts.global;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   199
        // trigger ajax global events so that activity/block indicators work like normal
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   200
        if (g && ! $.active++) $.event.trigger("ajaxStart");
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   201
        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   202
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   203
		if (s.beforeSend && s.beforeSend(xhr, s) === false) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   204
			s.global && $.active--;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   205
			return;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   206
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   207
        if (xhr.aborted)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   208
            return;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   209
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   210
        var cbInvoked = 0;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   211
        var timedOut = 0;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   212
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   213
        // add submitting element to data if we know it
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   214
        var sub = form.clk;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   215
        if (sub) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   216
            var n = sub.name;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   217
            if (n && !sub.disabled) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   218
                options.extraData = options.extraData || {};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   219
                options.extraData[n] = sub.value;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   220
                if (sub.type == "image") {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   221
                    options.extraData[name+'.x'] = form.clk_x;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   222
                    options.extraData[name+'.y'] = form.clk_y;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   223
                }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   224
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   225
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   226
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   227
        // take a breath so that pending repaints get some cpu time before the upload starts
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   228
        setTimeout(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   229
            // make sure form attrs are set
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   230
            var t = $form.attr('target'), a = $form.attr('action');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   231
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   232
			// update form attrs in IE friendly way
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   233
			form.setAttribute('target',id);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   234
			if (form.getAttribute('method') != 'POST')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   235
				form.setAttribute('method', 'POST');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   236
			if (form.getAttribute('action') != opts.url)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   237
				form.setAttribute('action', opts.url);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   238
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   239
            // ie borks in some cases when setting encoding
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   240
            if (! options.skipEncodingOverride) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   241
                $form.attr({
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   242
                    encoding: 'multipart/form-data',
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   243
                    enctype:  'multipart/form-data'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   244
                });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   245
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   246
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   247
            // support timout
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   248
            if (opts.timeout)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   249
                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   250
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   251
            // add "extra" data to form if provided in options
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   252
            var extraInputs = [];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   253
            try {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   254
                if (options.extraData)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   255
                    for (var n in options.extraData)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   256
                        extraInputs.push(
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   257
                            $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   258
                                .appendTo(form)[0]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   259
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   260
                // add iframe to doc and submit the form
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   261
                $io.appendTo('body');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   262
                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   263
                form.submit();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   264
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   265
            finally {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   266
                // reset attrs and remove "extra" input elements
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   267
				form.setAttribute('action',a);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   268
                t ? form.setAttribute('target', t) : $form.removeAttr('target');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   269
                $(extraInputs).remove();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   270
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   271
        }, 10);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   272
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   273
        var nullCheckFlag = 0;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   274
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   275
        function cb() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   276
            if (cbInvoked++) return;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   277
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   278
            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   279
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   280
            var ok = true;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   281
            try {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   282
                if (timedOut) throw 'timeout';
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   283
                // extract the server response from the iframe
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   284
                var data, doc;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   285
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   286
                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   287
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   288
                if ((doc.body == null || doc.body.innerHTML == '') && !nullCheckFlag) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   289
                    // in some browsers (cough, Opera 9.2.x) the iframe DOM is not always traversable when
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   290
                    // the onload callback fires, so we give them a 2nd chance
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   291
                    nullCheckFlag = 1;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   292
                    cbInvoked--;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   293
                    setTimeout(cb, 100);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   294
                    return;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   295
                }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   296
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   297
                xhr.responseText = doc.body ? doc.body.innerHTML : null;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   298
                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   299
                xhr.getResponseHeader = function(header){
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   300
                    var headers = {'content-type': opts.dataType};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   301
                    return headers[header];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   302
                };
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   303
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   304
                if (opts.dataType == 'json' || opts.dataType == 'script') {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   305
                    var ta = doc.getElementsByTagName('textarea')[0];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   306
                    xhr.responseText = ta ? ta.value : xhr.responseText;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   307
                }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   308
                else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   309
                    xhr.responseXML = toXml(xhr.responseText);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   310
                }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   311
                data = $.httpData(xhr, opts.dataType);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   312
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   313
            catch(e){
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   314
                ok = false;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   315
                $.handleError(opts, xhr, 'error', e);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   316
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   317
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   318
            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   319
            if (ok) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   320
                opts.success(data, 'success');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   321
                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   322
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   323
            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   324
            if (g && ! --$.active) $.event.trigger("ajaxStop");
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   325
            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   326
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   327
            // clean up
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   328
            setTimeout(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   329
                $io.remove();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   330
                xhr.responseXML = null;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   331
            }, 100);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   332
        };
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   333
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   334
        function toXml(s, doc) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   335
            if (window.ActiveXObject) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   336
                doc = new ActiveXObject('Microsoft.XMLDOM');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   337
                doc.async = 'false';
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   338
                doc.loadXML(s);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   339
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   340
            else
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   341
                doc = (new DOMParser()).parseFromString(s, 'text/xml');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   342
            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   343
        };
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   344
    };
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   345
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   346
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   347
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   348
 * ajaxForm() provides a mechanism for fully automating form submission.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   349
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   350
 * The advantages of using this method instead of ajaxSubmit() are:
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   351
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   352
 * 1: This method will include coordinates for <input type="image" /> elements (if the element
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   353
 *    is used to submit the form).
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   354
 * 2. This method will include the submit element's name/value data (for the element that was
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   355
 *    used to submit the form).
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   356
 * 3. This method binds the submit() method to the form for you.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   357
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   358
 * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   359
 * passes the options argument along after properly binding events for submit elements and
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   360
 * the form itself.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   361
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   362
$.fn.ajaxForm = function(options) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   363
    return this.ajaxFormUnbind().bind('submit.form-plugin',function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   364
        $(this).ajaxSubmit(options);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   365
        return false;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   366
    }).each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   367
        // store options in hash
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   368
        $(":submit,input:image", this).bind('click.form-plugin',function(e) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   369
            var form = this.form;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   370
            form.clk = this;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   371
            if (this.type == 'image') {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   372
                if (e.offsetX != undefined) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   373
                    form.clk_x = e.offsetX;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   374
                    form.clk_y = e.offsetY;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   375
                } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   376
                    var offset = $(this).offset();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   377
                    form.clk_x = e.pageX - offset.left;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   378
                    form.clk_y = e.pageY - offset.top;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   379
                } else {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   380
                    form.clk_x = e.pageX - this.offsetLeft;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   381
                    form.clk_y = e.pageY - this.offsetTop;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   382
                }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   383
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   384
            // clear form vars
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   385
            setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   386
        });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   387
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   388
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   389
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   390
// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   391
$.fn.ajaxFormUnbind = function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   392
    this.unbind('submit.form-plugin');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   393
    return this.each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   394
        $(":submit,input:image", this).unbind('click.form-plugin');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   395
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   396
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   397
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   398
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   399
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   400
 * formToArray() gathers form element data into an array of objects that can
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   401
 * be passed to any of the following ajax functions: $.get, $.post, or load.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   402
 * Each object in the array has both a 'name' and 'value' property.  An example of
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   403
 * an array for a simple login form might be:
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   404
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   405
 * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   406
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   407
 * It is this array that is passed to pre-submit callback functions provided to the
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   408
 * ajaxSubmit() and ajaxForm() methods.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   409
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   410
$.fn.formToArray = function(semantic) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   411
    var a = [];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   412
    if (this.length == 0) return a;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   413
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   414
    var form = this[0];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   415
    var els = semantic ? form.getElementsByTagName('*') : form.elements;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   416
    if (!els) return a;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   417
    for(var i=0, max=els.length; i < max; i++) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   418
        var el = els[i];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   419
        var n = el.name;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   420
        if (!n) continue;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   421
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   422
        if (semantic && form.clk && el.type == "image") {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   423
            // handle image inputs on the fly when semantic == true
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   424
            if(!el.disabled && form.clk == el) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   425
            	a.push({name: n, value: $(el).val()});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   426
                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   427
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   428
            continue;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   429
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   430
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   431
        var v = $.fieldValue(el, true);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   432
        if (v && v.constructor == Array) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   433
            for(var j=0, jmax=v.length; j < jmax; j++)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   434
                a.push({name: n, value: v[j]});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   435
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   436
        else if (v !== null && typeof v != 'undefined')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   437
            a.push({name: n, value: v});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   438
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   439
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   440
    if (!semantic && form.clk) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   441
        // input type=='image' are not found in elements array! handle it here
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   442
        var $input = $(form.clk), input = $input[0], n = input.name;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   443
        if (n && !input.disabled && input.type == 'image') {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   444
        	a.push({name: n, value: $input.val()});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   445
            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   446
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   447
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   448
    return a;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   449
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   450
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   451
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   452
 * Serializes form data into a 'submittable' string. This method will return a string
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   453
 * in the format: name1=value1&amp;name2=value2
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   454
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   455
$.fn.formSerialize = function(semantic) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   456
    //hand off to jQuery.param for proper encoding
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   457
    return $.param(this.formToArray(semantic));
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   458
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   459
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   460
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   461
 * Serializes all field elements in the jQuery object into a query string.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   462
 * This method will return a string in the format: name1=value1&amp;name2=value2
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   463
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   464
$.fn.fieldSerialize = function(successful) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   465
    var a = [];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   466
    this.each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   467
        var n = this.name;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   468
        if (!n) return;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   469
        var v = $.fieldValue(this, successful);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   470
        if (v && v.constructor == Array) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   471
            for (var i=0,max=v.length; i < max; i++)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   472
                a.push({name: n, value: v[i]});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   473
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   474
        else if (v !== null && typeof v != 'undefined')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   475
            a.push({name: this.name, value: v});
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   476
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   477
    //hand off to jQuery.param for proper encoding
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   478
    return $.param(a);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   479
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   480
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   481
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   482
 * Returns the value(s) of the element in the matched set.  For example, consider the following form:
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   483
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   484
 *  <form><fieldset>
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   485
 *      <input name="A" type="text" />
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   486
 *      <input name="A" type="text" />
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   487
 *      <input name="B" type="checkbox" value="B1" />
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   488
 *      <input name="B" type="checkbox" value="B2"/>
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   489
 *      <input name="C" type="radio" value="C1" />
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   490
 *      <input name="C" type="radio" value="C2" />
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   491
 *  </fieldset></form>
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   492
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   493
 *  var v = $(':text').fieldValue();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   494
 *  // if no values are entered into the text inputs
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   495
 *  v == ['','']
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   496
 *  // if values entered into the text inputs are 'foo' and 'bar'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   497
 *  v == ['foo','bar']
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   498
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   499
 *  var v = $(':checkbox').fieldValue();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   500
 *  // if neither checkbox is checked
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   501
 *  v === undefined
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   502
 *  // if both checkboxes are checked
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   503
 *  v == ['B1', 'B2']
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   504
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   505
 *  var v = $(':radio').fieldValue();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   506
 *  // if neither radio is checked
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   507
 *  v === undefined
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   508
 *  // if first radio is checked
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   509
 *  v == ['C1']
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   510
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   511
 * The successful argument controls whether or not the field element must be 'successful'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   512
 * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   513
 * The default value of the successful argument is true.  If this value is false the value(s)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   514
 * for each element is returned.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   515
 *
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   516
 * Note: This method *always* returns an array.  If no valid value can be determined the
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   517
 *       array will be empty, otherwise it will contain one or more values.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   518
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   519
$.fn.fieldValue = function(successful) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   520
    for (var val=[], i=0, max=this.length; i < max; i++) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   521
        var el = this[i];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   522
        var v = $.fieldValue(el, successful);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   523
        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   524
            continue;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   525
        v.constructor == Array ? $.merge(val, v) : val.push(v);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   526
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   527
    return val;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   528
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   529
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   530
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   531
 * Returns the value of the field element.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   532
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   533
$.fieldValue = function(el, successful) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   534
    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   535
    if (typeof successful == 'undefined') successful = true;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   536
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   537
    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   538
        (t == 'checkbox' || t == 'radio') && !el.checked ||
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   539
        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   540
        tag == 'select' && el.selectedIndex == -1))
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   541
            return null;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   542
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   543
    if (tag == 'select') {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   544
        var index = el.selectedIndex;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   545
        if (index < 0) return null;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   546
        var a = [], ops = el.options;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   547
        var one = (t == 'select-one');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   548
        var max = (one ? index+1 : ops.length);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   549
        for(var i=(one ? index : 0); i < max; i++) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   550
            var op = ops[i];
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   551
            if (op.selected) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   552
				var v = op.value;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   553
				if (!v) // extra pain for IE...
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   554
                	v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   555
                if (one) return v;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   556
                a.push(v);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   557
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   558
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   559
        return a;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   560
    }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   561
    return el.value;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   562
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   563
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   564
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   565
 * Clears the form data.  Takes the following actions on the form's input fields:
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   566
 *  - input text fields will have their 'value' property set to the empty string
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   567
 *  - select elements will have their 'selectedIndex' property set to -1
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   568
 *  - checkbox and radio inputs will have their 'checked' property set to false
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   569
 *  - inputs of type submit, button, reset, and hidden will *not* be effected
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   570
 *  - button elements will *not* be effected
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   571
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   572
$.fn.clearForm = function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   573
    return this.each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   574
        $('input,select,textarea', this).clearFields();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   575
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   576
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   577
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   578
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   579
 * Clears the selected form elements.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   580
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   581
$.fn.clearFields = $.fn.clearInputs = function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   582
    return this.each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   583
        var t = this.type, tag = this.tagName.toLowerCase();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   584
        if (t == 'text' || t == 'password' || tag == 'textarea')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   585
            this.value = '';
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   586
        else if (t == 'checkbox' || t == 'radio')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   587
            this.checked = false;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   588
        else if (tag == 'select')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   589
            this.selectedIndex = -1;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   590
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   591
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   592
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   593
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   594
 * Resets the form data.  Causes all form elements to be reset to their original value.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   595
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   596
$.fn.resetForm = function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   597
    return this.each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   598
        // guard against an input with the name of 'reset'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   599
        // note that IE reports the reset function as an 'object'
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   600
        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   601
            this.reset();
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   602
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   603
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   604
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   605
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   606
 * Enables or disables any matching elements.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   607
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   608
$.fn.enable = function(b) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   609
    if (b == undefined) b = true;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   610
    return this.each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   611
        this.disabled = !b;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   612
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   613
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   614
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   615
/**
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   616
 * Checks/unchecks any matching checkboxes or radio buttons and
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   617
 * selects/deselects and matching option elements.
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   618
 */
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   619
$.fn.selected = function(select) {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   620
    if (select == undefined) select = true;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   621
    return this.each(function() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   622
        var t = this.type;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   623
        if (t == 'checkbox' || t == 'radio')
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   624
            this.checked = select;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   625
        else if (this.tagName.toLowerCase() == 'option') {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   626
            var $sel = $(this).parent('select');
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   627
            if (select && $sel[0] && $sel[0].type == 'select-one') {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   628
                // deselect all other options
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   629
                $sel.find('option').selected(false);
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   630
            }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   631
            this.selected = select;
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   632
        }
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   633
    });
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   634
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   635
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   636
// helper fn for console logging
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   637
// set $.fn.ajaxSubmit.debug to true to enable debug logging
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   638
function log() {
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   639
    if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   640
        window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   641
};
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   642
de4a2ed2f34b Adding readme files
amit
parents:
diff changeset
   643
})(jQuery);