﻿function HttpRequest() {

    var $try = function () {
        for (var i=0; i<arguments.length; i++) {
            if (arguments[i] instanceof Function) {
                try {
                    return arguments[i]();
                } catch (err) { }
            }
        }
        return null;
    };
    
    var _req = $try(
                function () { return new XMLHttpRequest(); },
                function () { return new ActiveXObject("Msxml2.XMLHTTP"); },
                function () { return new ActiveXObject("Microsoft.XMLHTTP"); }
            ) || null;
    return _req;
};

function AjaxRequest(url, async, charset) {    
    url = url;
    async = async || true;
    charset = charset || "utf-8";
    
    if (url == null || url == undefined)
        return null;
    
    var req = new HttpRequest();
    if (req == null || req == undefined)
        return null;
        
    var __self = this;
    var lock = false;
        
    __self.unInitialized = function(obj) {};
    __self.onLoading = function(obj) {};
    __self.onLoaded = function(obj) {};
    __self.onInteractive = function(obj) {};
    __self.onComplete = function(obj) {};
    
    __self.getHttpRequest = function() {
        return req;
    };
    
    __self.getURL = function() {
        return url;
    };
    
    if (async) {
        req.onreadystatechange = function () {
            switch (req.readyState) {
                case 0:
                    if (__self.unInitialized) {
                        __self.unInitialized(req);
                    }
                    break;
                case 1:
                    if (__self.onLoading) {
                        __self.onLoading(req);
                    }
                    break;
                case 2:
                    if (__self.onLoaded) {
                        __self.onLoaded(req);
                    }
                    break;
                case 3:
                    if (__self.onInteractive) {
                        __self.onInteractive(req);
                    }
                    break;
                case 4:
                    if (__self.onComplete) {
                        __self.onComplete(req);
                    }
                    break;
            }
        }
    }
    
    __self.send = function (method, data, provider) {        
        method = method || "GET";
        var url = __self.getURL();
        
        if (data && provider) data = provider(data);
        
        if (data && method == "GET") {
            url = url.indexOf("?")!=-1 ? url+"&"+data : url+"?"+data;
        }
        
        req.open(method, url, async);
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset="+charset);
        
        if (data && method != "GET") {
            req.send(data);
        } else {
            req.send(null);
        }
    };
    
    __self.post = function (data) {
        __self.send("POST", data);
    };
    
    __self.get = function (data) {
        __self.send("GET", data);
    };
    
    __self.postObjectUTF8 = function (obj) {
        __self.send("POST", data, function(data) {
            var ret = [];
            for (var each in data) {
                ret.push(encodeURIComponent(each)+"="+encodeURIComponent(data[each]));
            }
            return ret.join("&");
        });
    };
    
    __self.dispose = function () {
        for (var key in __self) {
            delete __self[key];
        }
    };

};
