var buffer = new Array();             /* not used yet, one day, maybe one day... . */
var arAjx  = new Array();


/* ajFetch - used to do GET data */
function ajFetch( uri, dest ) {
        var curInstance;

        if(arAjx.length == 1) {
                curInstance = 1;
                arAjx[1] = new apexAjax;
        } else {
                var found = false;
                var arAjxLength = arAjx.length;
                for(i = 1; i < arAjxLength; i++) {
                        if(arAjx[i].Status()) {
                                curInstance = i;
                                found = true;
                        }
                }
                if( !found ) {
                        arAjx.push(new apexAjax);
                        curInstance = arAjx.length;
                        arAjx[curInstance] = new apexAjax;
                }
        }
        arAjx[curInstance].GET(uri, dest);

}
/* ajPost - used to do POST data */
function ajPost(uri, dest, postdata) {
        var curInstance;

        if(arAjx.length == 1) {
                curInstance = 1;
                arAjx[1] = new apexAjax;
        } else {
                var found = false;
                var arAjxLength = arAjx.length;
                for(i = 1; i < arAjxLength; i++) {
                        if(arAjx[i].Status()) {
                                curInstance = i;
                                found = true;
                        }
                }
                if( !found ) {
                        arAjx.push(new apexAjax);
                        curInstance = arAjx.length;
                        arAjx[curInstance] = new apexAjax;
                }
        }
        arAjx[curInstance].POST(uri, dest, postdata);
}

function apexAjax() {
        this.GET = ax_reqItem;
        this.POST = ax_postItem;
        this.Status = ax_status;

        var ajaxobj = ax_createRequest();
        var free = true;
        var dest_output = null;
        var init = false;

        function ax_status() {
                return free;
        }
        function ax_createRequest() {
                if(window.XMLHttpRequest) {
                        return new XMLHttpRequest();
                } else if(window.ActiveXObject) {
                        var msxmls = new Array (
                                     'Msxml2.XMLHTTP.5.0',
                                     'Msxml2.XMLHTTP.4.0',
                                     'Msxml2.XMLHTTP.3.0',
                                     'Msxml2.XMLHTTP',
                                     'Microsoft.XMLHTTP'
                                    );
                        for(var i = 0; i < msxmls.length; i++) {
                                try {
                                        return new ActiveXObject(msxmls[i]);
                                } catch(e) {
                                        // do nada.
                                }
                        }
                }
                throw new Error("Could not intantiate XMLHttpRequest");
        }

        function ax_reqItem(uri, dest) {
                if(free && (uri != null) && (dest != null) && ((ajaxobj.readyState == 0) || (ajaxobj.readyState == 4))) {
                        dest_output = dest;

                        ajaxobj.open("GET", uri, true);
                        ajaxobj.onreadystatechange = ax_reqCallback;
                        //ajaxobj.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
                        ajaxobj.send(null);
                        free = false;
                } else {
                        return false;
                }
        }
        function ax_postItem(uri, dest, postdata) {
                if( free && (uri != null) && (dest != null) && ((ajaxobj.readyState == 0) || (ajaxobj.readyState == 4)) ) {
                        dest_output = dest;

                        ajaxobj.open("POST", uri, true);
                        ajaxobj.onreadystatechange = ax_reqCallback;
                        //ajaxobj.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
                        ajaxobj.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
                        ajaxobj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                        ajaxobj.send(postdata);
                        free = false;
                } else {
                        return false;
                }

        }

        function ax_reqCallback() {
                if(ajaxobj.readyState == 4) {
                        //
                        var results = ajaxobj.responseText;

                        /* First answer received?, set initComplete to true */
                        if(!init) {
                                init = true;
                        }

                        if(typeof(results)=='string' && results != null && results != '') {
                                /* Function callback evaluator */
                                if(typeof(dest_output) == 'function') {
                                        /* Function detected, pass data to function */
																				dest_output(results);
                                        //eval(dest_output + "(results);");
                                } else {
                                        /* Not a function, pass data to the html object */
                                        if( typeof document.getElementById(dest_output).innerHTML != "undefined" ) {
                                                document.getElementById(dest_output).innerHTML = results;
                                        } else {
                                                // should throw an error here or something.
                                        }
                                }
                        }
                        free = true;
                }
        }


}
