
function ajaxMan(){

    //========================================================
    //class variables

        var req         = null;
        var req_type    = "";
        var res_handler = null;

    //========================================================
    //public methods

        //the respose handler needs to accept an
        //XMLHttpRequest object
        this.setResponseHandler = function(handler){
            res_handler = handler;
        }

        this.sendRequest = function(url){
            if(res_handler == null){
                alert("Can't send request: no response handler set.");

            } else {
                setRequestObject();
                
                if(req != null){
                    req.open("GET", url, true);

                    if(req_type == "native"){
                        req.send(null);
                    } else {
                        req.send();
                    }
                }
            }//if(res_handler == null)
        }//this.sendRequest = function(url)

        this.sendPostRequest = function(url,form_id){
            if(res_handler == null){
                alert("Can't send request: no response handler set.");

            } else {
                setRequestObject();
                
                if(req != null){
                    var parameters = serializeForm(form_id);
                    req.open("POST", url, true);
                    //"multipart/form-data" | "application/x-www-form-urlencoded" | "text/plain
                    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
                    req.setRequestHeader("Content-length", parameters.length);
                    req.setRequestHeader("Connection", "close");
                    req.send(parameters);
                }
            }//if(res_handler == null)
        }//this.sendPostRequest = function(url,form)

    //========================================================
    //private methods

        function setRequestObject(){
            //branch for native XMLHttpRequest object
            if(window.XMLHttpRequest){
                req = new XMLHttpRequest();
                req.onreadystatechange = processResponse;
                req_type = "native";

            //branch for IE/Windows ActiveX version
            } else if(window.ActiveXObject){
                req = new ActiveXObject("Microsoft.XMLHTTP");
                if (req) {
                    req.onreadystatechange = processResponse;
                    req_type = "activex";
                }
            } else {
                alert("Can't set request object.");
            }
        }

        function processResponse(){

            if(res_handler == null){
                alert("Can't process response: no response handler set.");

            } else {
                //only if req shows "complete" and "OK"
                if(req.readyState == 4){
                    if(req.status == 200){
                        res_handler(req);
                    } else {
                        alert("XMLHttpRequest status error:\n" + req.statusText);
                    }
                }

            }//if(res_handler == null)
        }//function processResponse()

        function serializeForm(form_id){

            var frm     = document.getElementById(form_id);
            var params  = "";

            for(var i=0;i<frm.length;i++){
                var el = frm.elements[i];
                var type = el.type;
                if(type == "radio" || type == "checkbox"){
                    if(el.checked){
                        if(params != ""){ params += "&"; }
                        params += encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
                    }
                } else if(type == "textarea" || type == "hidden" || type == "text" || type == "password"){
                    if(el.value != null && el.value != ""){
                        if(params != ""){ params += "&"; }
                        params += encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
                    }
                } else if(type == "select-one"){
                        if(params != ""){ params += "&"; }
                        params += encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
                }
            }

            return params;
        }

}//function ajaxMan(){