Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
YUI.add('io-form', function (Y, NAME) {
2
 
3
/**
4
* Extends IO to enable HTML form data serialization, when specified
5
* in the transaction's configuration object.
6
* @module io
7
* @submodule io-form
8
* @for IO
9
*/
10
 
11
var eUC = encodeURIComponent;
12
 
13
/**
14
 * Enumerate through an HTML form's elements collection
15
 * and return a string comprised of key-value pairs.
16
 *
17
 * @method stringify
18
 * @static
19
 * @param {Node|String} form YUI form node or HTML form id
20
 * @param {Object} [options] Configuration options.
21
 * @param {Boolean} [options.useDisabled=false] Whether to include disabled fields.
22
 * @param {Object|String} [options.extra] Extra values to include. May be a query string or an object with key/value pairs.
23
 * @return {String}
24
 */
25
Y.IO.stringify = function(form, options) {
26
    options = options || {};
27
 
28
    var s = Y.IO.prototype._serialize({
29
        id: form,
30
        useDisabled: options.useDisabled
31
    },
32
    options.extra && typeof options.extra === 'object' ? Y.QueryString.stringify(options.extra) : options.extra);
33
 
34
    return s;
35
};
36
 
37
Y.mix(Y.IO.prototype, {
38
   /**
39
    * Enumerate through an HTML form's elements collection
40
    * and return a string comprised of key-value pairs.
41
    *
42
    * @method _serialize
43
    * @private
44
    * @param {Object} c
45
    * @param {String|Element} c.id YUI form node or HTML form id
46
    * @param {Boolean} c.useDisabled `true` to include disabled fields
47
    * @param {String} s Key-value data defined in the configuration object.
48
    * @return {String}
49
    */
50
    _serialize: function(c, s) {
51
        var data = [],
52
            df = c.useDisabled || false,
53
            item = 0,
54
            id = (typeof c.id === 'string') ? c.id : c.id.getAttribute('id'),
55
            e, f, n, v, d, i, il, j, jl, o;
56
 
57
        if (!id) {
58
            id = Y.guid('io:');
59
            c.id.setAttribute('id', id);
60
        }
61
 
62
        f = Y.config.doc.getElementById(id);
63
 
64
        if (!f || !f.elements) {
65
            return s || '';
66
        }
67
 
68
        // Iterate over the form elements collection to construct the
69
        // label-value pairs.
70
        for (i = 0, il = f.elements.length; i < il; ++i) {
71
            e = f.elements[i];
72
            d = e.disabled;
73
            n = e.name;
74
 
75
            if (df ? n : n && !d) {
76
                n = eUC(n) + '=';
77
                v = eUC(e.value);
78
 
79
                switch (e.type) {
80
                    // Safari, Opera, FF all default options.value from .text if
81
                    // value attribute not specified in markup
82
                    case 'select-one':
83
                        if (e.selectedIndex > -1) {
84
                            o = e.options[e.selectedIndex];
85
                            data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text);
86
                        }
87
                        break;
88
                    case 'select-multiple':
89
                        if (e.selectedIndex > -1) {
90
                            for (j = e.selectedIndex, jl = e.options.length; j < jl; ++j) {
91
                                o = e.options[j];
92
                                if (o.selected) {
93
                                  data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text);
94
                                }
95
                            }
96
                        }
97
                        break;
98
                    case 'radio':
99
                    case 'checkbox':
100
                        if (e.checked) {
101
                            data[item++] = n + v;
102
                        }
103
                        break;
104
                    case 'file':
105
                        // stub case as XMLHttpRequest will only send the file path as a string.
106
                    case undefined:
107
                        // stub case for fieldset element which returns undefined.
108
                    case 'reset':
109
                        // stub case for input type reset button.
110
                    case 'button':
111
                        // stub case for input type button elements.
112
                        break;
113
                    case 'submit':
114
                    default:
115
                        data[item++] = n + v;
116
                }
117
            }
118
        }
119
 
120
        if (s) {
121
            data[item++] = s;
122
        }
123
 
124
        return data.join('&');
125
    }
126
}, true);
127
 
128
 
129
}, '3.18.1', {"requires": ["io-base", "node-base"]});