#

API Docs for: 3.10.3
Show: Inherited Protected Private Deprecated

# File: io/js/io-form.js

    /**
    * Extends IO to enable HTML form data serialization, when specified
    * in the transaction's configuration object.
    * @module io
    * @submodule io-form
    * @for IO
    */

    var eUC = encodeURIComponent;

    /**
     * Enumerate through an HTML form's elements collection
     * and return a string comprised of key-value pairs.
     *
     * @method stringify
     * @static
     * @param {Node|String} form YUI form node or HTML form id
     * @param {Object} [options] Configuration options.
     * @param {Boolean} [options.useDisabled=false] Whether to include disabled fields.
     * @param {Object|String} [options.extra] Extra values to include. May be a query string or an object with key/value pairs.
     * @return {String}
     */
    Y.IO.stringify = function(form, options) {
        options = options || {};

        var s = Y.IO.prototype._serialize({
            id: form,
            useDisabled: options.useDisabled
        },
        options.extra && typeof options.extra === 'object' ? Y.QueryString.stringify(options.extra) : options.extra);

        return s;
    };

    Y.mix(Y.IO.prototype, {
       /**
        * Enumerate through an HTML form's elements collection
        * and return a string comprised of key-value pairs.
        *
        * @method _serialize
        * @private
        * @param {Object} c
        * @param {String|Element} c.id YUI form node or HTML form id
        * @param {Boolean} c.useDisabled `true` to include disabled fields
        * @param {String} s Key-value data defined in the configuration object.
        * @return {String}
        */
        _serialize: function(c, s) {
            var data = [],
                df = c.useDisabled || false,
                item = 0,
                id = (typeof c.id === 'string') ? c.id : c.id.getAttribute('id'),
                e, f, n, v, d, i, il, j, jl, o;

            if (!id) {
                id = Y.guid('io:');
                c.id.setAttribute('id', id);
            }

            f = Y.config.doc.getElementById(id);

            if (!f || !f.elements) {
                return s || '';
            }

            // Iterate over the form elements collection to construct the
            // label-value pairs.
            for (i = 0, il = f.elements.length; i < il; ++i) {
                e = f.elements[i];
                d = e.disabled;
                n = e.name;

                if (df ? n : n && !d) {
                    n = eUC(n) + '=';
                    v = eUC(e.value);

                    switch (e.type) {
                        // Safari, Opera, FF all default options.value from .text if
                        // value attribute not specified in markup
                        case 'select-one':
                            if (e.selectedIndex > -1) {
                                o = e.options[e.selectedIndex];
                                data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text);
                            }
                            break;
                        case 'select-multiple':
                            if (e.selectedIndex > -1) {
                                for (j = e.selectedIndex, jl = e.options.length; j < jl; ++j) {
                                    o = e.options[j];
                                    if (o.selected) {
                                      data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text);
                                    }
                                }
                            }
                            break;
                        case 'radio':
                        case 'checkbox':
                            if (e.checked) {
                                data[item++] = n + v;
                            }
                            break;
                        case 'file':
                            // stub case as XMLHttpRequest will only send the file path as a string.
                        case undefined:
                            // stub case for fieldset element which returns undefined.
                        case 'reset':
                            // stub case for input type reset button.
                        case 'button':
                            // stub case for input type button elements.
                            break;
                        case 'submit':
                        default:
                            data[item++] = n + v;
                    }
                }
            }

            if (s) {
                data[item++] = s;
            }

            Y.log('HTML form serialized. The value is: ' + data.join('&'), 'info', 'io');
            return data.join('&');
        }
    }, true);