function getFormData(form) {
    var dataString = "";

    function addParam(name, value) {
        dataString += (dataString.length > 0 ? "&" : "")
            + escape(name).replace(/\+/g, "%2B") + "="
            + escape(value ? value : "").replace(/\+/g, "%2B");
    }

    var elemArray = form.elements;
    for (var i = 0; i < elemArray.length; i++) {
        var element = elemArray[i];
        try {
	        var elemType = element.type.toUpperCase();
	        var elemName = element.name;
	        if (elemName) {
	        	//alert(elemName + ", type " + elemType + ", val " + element.value);
	            if (elemType == "TEXT"
	                    || elemType == "TEXTAREA"
	                    || elemType == "PASSWORD"
	                    || elemType == "HIDDEN")
	                addParam(elemName, element.value);
	            else if (elemType == "CHECKBOX" && element.checked) 
	            {	            	
	                addParam(elemName, element.value ? element.value : "On");	
	                //alert("getFormData: chkbox " + elemName + ", val " + element.value);
				}   
	            else if (elemType == "RADIO" && element.checked)
	            {
	            	//alert("getFormData: radio " + elemName + ", val " + element.value);
	                addParam(elemName, element.value);
	            }
	            else if (elemType.indexOf("SELECT") != -1)
	                for (var j = 0; j < element.options.length; j++) {
	                    var option = element.options[j];
	                    if (option.selected)
	                        addParam(elemName, option.value ? option.value : option.text);
	                }
	        }         
        } catch ( e ) {
        
        }
    }    
    return dataString;
}

var autoSaveDebug = true;

function submitFormData(form) {
    var xhr;
    if (window.ActiveXObject)
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    else if (window.XMLHttpRequest)
        xhr = new XMLHttpRequest();
    else
        return null;
        
    var method = form.method ? form.method.toUpperCase() : "GET";
    var action = form.action ? form.action : document.URL;
    var data = getFormData(form);

    var url = action;
    if (data && method == "GET")
        url += "?" + data;
    xhr.open(method, url, true);
    
    function submitCallback() {
        if (autoSaveDebug && xhr.readyState == 4 && xhr.status != 200) {
            autoSaveDebug = false;
            alert("Auto-Save Error: "
                + xhr.status + " " + xhr.statusText);
        }
    }
    xhr.onreadystatechange = submitCallback;

    xhr.setRequestHeader("Ajax-Request", "Auto-Save");
    if (method == "POST") {
        xhr.setRequestHeader("Content-Type",
            "application/x-www-form-urlencoded");
        xhr.send(data);
    } else
        xhr.send(null);
    
    return xhr;
}

var autoSaveXHR = new Array(document.forms.length);

function submitAllForms() {
    var formArray = document.forms;
    for (var i = 0; i < formArray.length; i++) {
        if (autoSaveXHR[i]) {
            var oldXHR = autoSaveXHR[i];
            oldXHR.onreadystatechange = function() { };
            oldXHR.abort();
            delete oldXHR;
        }
        autoSaveXHR[i] = submitFormData(formArray[i]);
    }
}

var autoSaveIntervalId = null;

function setAutoSaving(millisec) {
    if (autoSaveIntervalId) {
        clearInterval(autoSaveIntervalId);
        autoSaveIntervalId = null;
    }
    if (millisec != 0)
        autoSaveIntervalId = setInterval(
                "submitAllForms()", millisec);
}

function isAutoSaving() {
    return autoSaveIntervalId != null;
}

