// Form handling stuff

var ELEMENT_NODE = 1;

function form_gather_data(form, submitButton, includeUncheckedBoxes)
{
    var data = "";
    
	enable_submits(form, false);

	for (var i=0; i<form.childNodes.length; i++)
    {
        var child = form.childNodes[i];
        if (child.nodeType == ELEMENT_NODE)
        {
            data += form_recurse_get_controls(child, includeUncheckedBoxes);
        }
    }
    
    if (submitButton && submitButton.name && submitButton.name !== "")
    {
        data += "&" + submitButton.name + "=" + submitButton.value;
    }
	
	return data.substr(1, data.length-1);
}

function form_onsubmit(form, event, target)
{
    var evt = event ? event : window.event;
    var submitButton = evt.explicitOriginalTarget;
    
    var data = form_gather_data(form, submitButton);

    if (target.charAt(target.length-1) == "&")
    {
        target = target.substring(0, target.length-1);
    }

    sendRequest(target + ((target.indexOf("?") >= 0) ? "&" : "?") + data);

    return false;
}

function form_recurse_get_controls(elem, includeUncheckedBoxes)
{
    var data = "";
    var i;
    
    switch (elem.nodeName)
    {
    case "INPUT":
        switch (elem.type.toLowerCase())
        {
        case "checkbox":
            if (elem.checked || includeUncheckedBoxes)
            {
                data += "&" + elem.name + "=" + (elem.checked ? elem.value : "");
            }
            break;
        case "radio":
            if (elem.checked)
            {
                data += "&" + elem.name + "=" + elem.value;
            }
            break;
        case "submit":
            break; // ignore these
        default:
            data += "&" + elem.name + "=" + elem.value;
            break;
        }
        break;
    case "TEXTAREA":
        data += "&" + elem.name + "=" + elem.value;
        break;
    case "SELECT":
        if (elem.multiple)
        {
            for (i=0; i<elem.options.length; i++)
            {
                var opt = elem.options[i];
                if (opt.selected)
                {
                    data += "&" + elem.name + "=" + opt.value;
                }
            }
        }
        else
        {
            data += "&" + elem.name + "=" + elem.options[elem.selectedIndex].value;
        }
        break;
    default:
        for (i=0; i<elem.childNodes.length; i++)
        {
            var child = elem.childNodes[i];
            if (child.nodeType == ELEMENT_NODE)
            {
                data += form_recurse_get_controls(child, includeUncheckedBoxes);
            }
        }
        break;
    }

    return data;
}

function enable_submits(form, enable)
{
    if (typeof enable == "undefined") { enable = true; }

	var inputs = form.getElementsByTagName("INPUT");
	for (var i=0; i<inputs.length; i++)
	{
		if (inputs[i].type == "submit")
        {
            if (enable)
            {
                inputs[i].removeAttribute("disabled");
            }
            else
            {
                inputs[i].setAttribute("disabled", true);
            }
        }
	}
}

// vim: expandtab cindent:

