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