function AJAX(custom_response, encoded) {
    if (custom_response) custom_response = true;
    else custom_response = false;
    if (encoded) encoded = true;
    else encoded = false;
    
    this.onError = function(error) {alert(error);};

    var ajaxObject = function() {
        try{return new XMLHttpRequest();}catch(ex){};
        try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(ex){};
        try{return new SOAPCall();}
        catch(ex){alert("Your browser does not support AJAX!"); return false};
        return false;
    }

    function m_trim(str) {
	    var	str1 = str.replace(/^\s\s*/, ''),ws = /\s/,i = str.length;
	    while (ws.test(str1.charAt(--i)));
    	return str1.slice(0, i + 1);
    }
    function m_randomText(len){
        var available_chars = [];
        for(var i = 48; i < 58; i++) available_chars[available_chars.length] = String.fromCharCode(i);     
        for(var i = 65; i < 91; i++) available_chars[available_chars.length] = String.fromCharCode(i);
        for(var i = 97; i < 123; i++)available_chars[available_chars.length] = String.fromCharCode(i); 
        if(0==available_chars.length) return false;
        var result="";   
        for(var j=0; j<len; j++){
            var ch=available_chars[Math.floor(Math.random()*available_chars.length)];
            result+=ch;
        }
        return result;
    }

    this.callPage = function(url, callbackFunction, method, args, async) {
        try{
            var ao = ajaxObject();
            ao.onreadystatechange = function() {
                if (ao.readyState == 4 || ao.readyState == "complete") {
                    try {
                        if (ao.status == 200) {
                            if (encoded) var resp = unescape(ao.responseText);
                            else var resp = ao.responseText;  
                            if (custom_response === false) {
                                callbackFunction(resp);
                            } else {
                                var rPage =resp.substring(0,30);
                                rPage = m_trim(rPage);
                                var rAction = resp.substring(30,60);
                                rAction = m_trim(rAction);
                    	    	var len =resp.length;
                                var rText = resp.substring(60,len);
                                callbackFunction(rText, rAction, rPage);
                            }
                        } else {
                            callbackFunction("Error: Bad AJAX response!", "error", "");
                        }
                    } catch (e) {
                        callbackFunction("Error: " + e.description, "error", "");                        
                    }
                }
            }
            
            if (!method) method = "GET";
            if (!args) args = null;
            if (async == null) async = true;
            var re=/\?/g
            if (re.test(url)) url += "&"; else url += "&";
            url += "&rnd12werq=" + m_randomText(20);
            ao.open(method,url,async);
            if (method == "POST") ao.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            ao.send(args);
        } catch(ex) {
            this.onError(ex);
        }
    }
}

