var jsAjaxMap = new Object();

function JSAjax(jsAjaxName, jsRequestMethod) {
	this.jsRequestMethod = 'GET';
	if(jsRequestMethod != null) {
		this.jsRequestMethod = jsRequestMethod;
	}
    this.jsAjaxName = jsAjaxName;
    jsAjaxMap[jsAjaxName] = this;
    this.jsListener       = false;
    this.httpRequest      = false;
    this.enableChutter    = true;
    this.paramMap         = new Object();
    
    this.doAJAXRequestURL = function(jsListener, url, paramStr, readXML, synchron) {
        if(this.httpRequest) return true;
        if(readXML == null) readXML = false;
        if(synchron == null) synchron = false;
        
        this.jsListener = jsListener;
        
        if (window.XMLHttpRequest) {
            this.httpRequest = new XMLHttpRequest();
            if (this.httpRequest.overrideMimeType) {
                this.httpRequest.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) {
            try {
                this.httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    this.httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }
        if (!this.httpRequest) {
            alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
            this.httpRequest = false;
            return false;
        }
        this.httpRequest.onreadystatechange = new Function(
            'jsAjaxMap[\'' + this.jsAjaxName + 
            '\'].doAJAXResponseURL(' + readXML + ')' 
        );
        if(this.jsRequestMethod == 'GET' && paramStr != null) {
	        if(url.indexOf('?') > -1) url+= '&' + paramStr;
	        else url+= '?' + paramStr;
        }
        this.httpRequest.open(this.jsRequestMethod, url, !synchron);
        if(this.enableShutter)
            jsLoadShutter(jsFormName, true);
        if(this.jsRequestMethod == 'POST') {
        	this.httpRequest.setRequestHeader(
        			'Content-Type', 'application/x-www-form-urlencoded');
        	this.httpRequest.send(paramStr);
        } else this.httpRequest.send(null);
        return true;
    }
    
    this.doAJAXResponseURL = function(readXML) {
        if(this.httpRequest) {
            if (this.httpRequest.readyState == 4) {
                if (this.httpRequest.status == 200) {
                    if(readXML)
                        this.jsListener.doResponse(
                            this.httpRequest.responseXML);
                    else 
                        this.jsListener.doResponse(
                            this.httpRequest.responseText);
                    this.httpRequest = false;
                    this.resFunction = false;
                } else if(typeof(this.jsListener.doError) != 'undefined') {
                    this.jsListener.doError(this.httpRequest.status);
                }
            }
        }
    }
    
    this.doAJAXRequest = function(jsListener, paramStr, jsFormName, readXML, enableShutter) {
        if(this.httpRequest) return false;
        
        if(readXML == null) readXML = false;
        if(enableShutter != null) this.enableShutter = enableShutter;
         
        this.jsListener = jsListener;
        var param = 'jsAction=ajax';
        if(paramStr != null) {
            param+= '&' + paramStr;
        }
        
        var url = contextPath + '/jsolution/form/' + jsFormName;
        if (window.XMLHttpRequest) {
            this.httpRequest = new XMLHttpRequest();
            if (this.httpRequest.overrideMimeType) {
                this.httpRequest.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) {
            try {
                this.httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    this.httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }
        if (!this.httpRequest) {
            alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
            this.httpRequest = false;
            return false;
        }
        this.httpRequest.onreadystatechange = new Function(
            'jsAjaxMap[\'' + this.jsAjaxName + '\'].doAJAXResponse(\'' + 
            jsFormName + '\',' + readXML + ')' 
        );
        if(this.jsRequestMethod == 'GET') {
	        if(url.indexOf('?') > -1) url+= '&' + param;
	        else url+= '?' + param;
        }
        this.httpRequest.open(this.jsRequestMethod, url, true);
        if(this.enableShutter)
            jsLoadShutter(jsFormName, true);
        if(this.jsRequestMethod == 'POST') {
        	this.httpRequest.setRequestHeader(
        			'Content-Type', 'application/x-www-form-urlencoded');
        	this.httpRequest.send(param);
        } else this.httpRequest.send(null);
        return true;
    }
    
    this.isRunning = function() {
        if(this.httpRequest) return true;
        return false;
    }

    this.doAJAXResponse = function(jsFormName, readXML) {
        if(this.httpRequest) {
            if (this.httpRequest.readyState == 4) {
                if (this.httpRequest.status == 200) {
                    if(readXML)
                        this.jsListener.doResponse(
                            this.httpRequest.responseXML);
                    else 
                        this.jsListener.doResponse(
                            this.httpRequest.responseText);
                    this.httpRequest = false;
                    this.resFunction = false;
                    if(this.enableShutter)
                        jsLoadShutter(jsFormName, false);
                } else if(typeof(this.jsListener.doError) != 'undefined') {
                    this.jsListener.doError(this.httpRequest.status);
                }
            }
        }
    }
    
    this.setParam = function(pName, pValue) {
        if(pName == null || pValue == null)
            return;
        this.paramMap[pName] = pValue;
    }

    this.getParam = function(pName) {
        if(pName == null)
            return null;
        return this.paramMap[pName];
    }
}
