io-form-debug.js revision 76ca635d61eb3f9fb7c9d788a44fa8b1690aa138
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassYUI.add('io-form', function(Y) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Extends the IO base class to enable HTML form data serialization, when specified
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * in the transaction's configuration object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module io
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @submodule io-form
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var eUC = encodeURIComponent;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.mix(Y.io, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Method to enumerate through an HTML form's elements collection
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * and return a string comprised of key-value pairs.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _serialize
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {object} c - YUI form node or HTML form id.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {string} s - Transaction data defined in the configuration.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return string
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _serialize: function(c, s) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var data = [],
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass useDf = c.useDisabled || false,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass item = 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass id = (typeof c.id === 'string') ? c.id : c.id.getAttribute('id'),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e, f, n, v, d, i, il, j, jl, o;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!id) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass id = Y.guid('io:');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass c.id.setAttribute('id', id);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass f = Y.config.doc.getElementById(id);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Iterate over the form elements collection to construct the
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // label-value pairs.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (i = 0, il = f.elements.length; i < il; ++i) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e = f.elements[i];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass d = e.disabled;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass n = e.name;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (useDf ? n : n && !d) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass n = eUC(n) + '=';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass v = eUC(e.value);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass switch (e.type) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Safari, Opera, FF all default options.value from .text if
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // value attribute not specified in markup
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'select-one':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (e.selectedIndex > -1) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass o = e.options[e.selectedIndex];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'select-multiple':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (e.selectedIndex > -1) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (j = e.selectedIndex, jl = e.options.length; j < jl; ++j) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass o = e.options[j];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (o.selected) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data[item++] = n + eUC(o.attributes.value && o.attributes.value.specified ? o.value : o.text);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'radio':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'checkbox':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (e.checked) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data[item++] = n + v;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'file':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // stub case as XMLHttpRequest will only send the file path as a string.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case undefined:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // stub case for fieldset element which returns undefined.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'reset':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // stub case for input type reset button.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'button':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // stub case for input type button elements.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'submit':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass default:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data[item++] = n + v;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log('HTML form serialized. The value is: ' + data.join('&'), 'info', 'io');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return s ? data.join('&') + "&" + s : data.join('&');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }, true);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}, '@VERSION@' ,{requires:['io-base','node-base']});