function Request() {

    this.controllerURL = "controller.php";


    this.convertParams = function(hash) {
        var res = [];
        for(k in hash) {
//            res.push(k + "=" + encodeURIComponent(hash[k]));
            res.push(k + "=" + escape(hash[k]));
        }
        return res.join("&");
    }



    this.send = function(params, widget, method) {

        var req;	
        if (window.XMLHttpRequest) {
            try { req = new XMLHttpRequest() } catch(e) {}
        } else if (window.ActiveXObject) {
            try { req = new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
            if (!req) {
                try { req = new ActiveXObject("Msxml2.XMLHTTP") } catch (e) {}
            }
        }

        if(!req) {
            return false;
        }

        var widgetId = widget.id;
        params.module = widget.cfg.module;

        if(!mozilla_nav) {
            var date = new Date();
            params.noCache = "" + date.getTime() + (Math.random() * 1000000);
        }

        req.onreadystatechange = function() {
            if (req.readyState == 4) {
                if ((req.status < 400) && req.responseText) {
                    try {
                        eval("if(kernel.getWidget(widgetId)) { kernel.getWidget(widgetId).dispatchMsg("+req.responseText+")}");
                    } catch(e) {
//                        alert("Error in \n"+e.fileName+"\nat line: "+e.lineNumber+"\n"+e.message);
                    }
        		} else {
//    				alert(req.statusText);
    			}
            }
        }

        if (method == "POST") {
            req.open("POST", this.controllerURL, false);
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            req.send(this.convertParams(params));
        } else {
            req.open("GET", this.controllerURL + "?" + this.convertParams(params), true);
            req.send(null);
        }
        return req;
    }


}








function XMLRequest() {

    this.send = function(url, widget, callback, params, noProxy) {
        var req;	
        if (window.XMLHttpRequest) {
            try { req = new XMLHttpRequest() } catch(e) {}
        } else if (window.ActiveXObject) {
            try { req = new ActiveXObject("MSXML2.XMLHttp") } catch (e) {}
            if (!req) {
                try { req = new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
            }
        }

        if(!req) {
            return false;
        }

        if(!mozilla_nav) {
            var date = new Date();
            noCache = '&noCache='+ date.getTime() + (Math.random() * 1000000);
        } else {
            noCache = '';
        }

        var paramStr = "";
        if(params) {
            for(i in params) {
                paramStr += "&"+i+"="+escape(params[i]);
            }
        }

        var widgetId = widget.id;
        var cf = callback;
        req.onreadystatechange = function() {
            if (req.readyState == 4) {
                if (req.status == 200) {
                    try {
                        if(kernel.getWidget(widgetId)) {
                            kernel.getWidget(widgetId)[cf](req);
                        }
                    } catch(e) {
                        alert("Error in \n"+e.fileName+"\nat line: "+e.lineNumber+"\n"+e.message);
                    }
        		} else {
//    				alert(req.statusText);
    			}
            }
	    //else alert(req.statusText);
        }
        
        if(noProxy == true) {
            req.open("GET", url+"?"+noCache, true);
        } else {
            req.open("GET", "xmlproxy.php?url="+escape(url)+paramStr+noCache, true);
        }
        req.send(null);
        return req;
    }


}
