/* ------------------------------------------------------------------ */
/**
* @param f : Form|HTMLFormElement
* @return string
*/
function serializeForm(f)
{
var gotSubmit = false;
/**
* @param o
*/
function serializeControl(o)
{
/* HTML 4.01: Controls that are disabled cannot be successful. */
if (!o.disabled)
{
/*
* If a form contains more than one submit button,
* only the activated submit button is successful.
* (here: the first one)
*/
var isSubmit = /(^|\s)(submit|image)(\s|$)/i.test(o.type);
if (!gotSubmit || !isSubmit)
{
if (isSubmit) gotSubmit = true;
/*
* For menus, the control name is provided by a SELECT element
* and values are provided by OPTION elements. Only selected
* options may be successful. When no options are selected,
* the control is not successful and neither the name nor any
* values are submitted to the server when the form is submitted.
*/
var m = /(^|\s)(select(-one)?|undefined)(\s|$)/i.exec(o.type);
if (m)
{
/* select-one */
if (m[3])
{
if (o.selectedIndex > -1)
{
items.add(o.name, o.options[o.selectedIndex].value);
}
}
/* select */
else if (m[2])
{
for (var i = 0, opts = o.options, len = opts && opts.length;
i < len; i++)
{
var opt = opts[i];
if (opt.selected)
{
items.add(o.name, opt.value);
}
}
}
}
/*
* All "on" checkboxes may be successful.
* For radio buttons that share the same value of the
* name attribute, only the "on" radio button may be successful.
*/
else if (!/(^|\s)file|reset(\s|$)/i.test(o.type)
&& !(/(^|\s)object(\s|$)/i.test(o.tagName) && o.declare)
&& !/(^|\s)(checkbox|radio)(\s|$)/i.test(o.type)
|| o.checked)
{
items.add(o.name, o.value);
}
}
}
}
var es = getFeature(f, "elements");
if (es)
{
var items = [];
items.add = function(sName, sValue) {
var s = esc(sName) + "=" + esc(sValue);
this.push(s);
};
if (!isMethod(items, "push"))
{
items.push = function() {
for (var i = 0, len = arguments.length; i < len; i++)
{
items[items.length] = arguments[i];
}
};
}
for (var i = 0, len = es.length; i < len; i++)
{
var e = es[i];
/*
* Elements with the same name create a NodeList object,
* however options of select objects are also indexable in Gecko.
*/
if (typeof e[0] != "undefined" && typeof e.options == "undefined")
{
for (var j = 0, len2 = e.length; j < len2; j++)
{
serializeControl(e[j]);
}
}
else
{
serializeControl(e);
}
}
return items.join("&");
}
return "";
}
/* ------------------------------------------------------------------ */
// esc(), getFeature() and isMethod() are user-defined, of course, but you
// probably get the idea..