    
function Patcher(element) {
    this.element = element;
    this.gotData = patcherGotData;
    return this;
}

function patcherGotData( data ) {
    this.element.innerHTML = data;
}

function patch(element,url,formname) {
    var postdata = false
    if (formname) {
        postdata = buildPOST(formname);
    }
    patcher = Patcher(element);
    makeRequest(url,patcher,postdata);
}

function patchi(element_id, url, formname) {
    ele = document.getElementById(element_id);
    patch(ele,url,formname);
}

function buildPOST(theFormName) {
    theForm = document.forms[theFormName];
    var qs = ''
    for (e=0;e<theForm.elements.length;e++) {
        var name = theForm.elements[e].name;
        if (name!='') {
            switch(theForm.elements[e].type) {
                case "select-multiple":
                    for(var s=0; s<theForm.elements[e].options.length; s++) {
                        if (theForm.elements[e].options[s].selected) {
                            qs+=(qs=='')?'':'&';
                            qs+= name+'='+encodeURIComponent(theForm.elements[e].options[s].value);
                        }
                    }
                    break;
                
                case "checkbox":
                    if (theForm.elements[e].checked) {
                        qs+=(qs=='')?'':'&';
                        qs+= name+'='+encodeURIComponent(theForm.elements[e].value);
                    }
                    break;

                default:
                    qs+=(qs=='')?'':'&';
                    qs+= name+'='+encodeURIComponent(theForm.elements[e].value);
                    break;
            }
        }
    }
    qs+="\n";
    return qs
}

function makeRequest(url, handler, postdata ) {
    var http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
            // See note below about this line
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }
    if (!http_request) {
        alert('Giving up :( Cannot create an XMLHTTP instance');
        return false;
    }
    http_request.onreadystatechange = function() { gotdata(http_request, handler); };
    if (!postdata) {
        http_request.open('GET', url, true);
        http_request.send(null);
    } else {
        http_request.open('POST', url, true);
        http_request.send(postdata);
    }
}

function nodeToObject( node ) {
    var obj = new Object();
    for (var i=0; i<node.childNodes.length; i++) {
        var cnode = node.childNodes[i];
        if (cnode) {
            if (cnode.nodeName != '#text' && cnode.firstChild) {
                obj[cnode.nodeName] = cnode.firstChild.data;
            }
        }
    }
    return obj;
}

    function gotdata( http_request, handler ) {
    if (http_request.readyState == 4) {
        try {
            if (http_request.status == 200 || http_request.status == 0 ) {
                var xmldoc = http_request.responseText;
                handler.gotData(xmldoc);
            } else {
                alert('There was a problem with the request. '+http_request.status);
            }
        } catch(e) {}
    }
}


