/**
 * Basic AJAX abstraction class.
 * 
 * This is a basic XMLHTTPRequest object abstraction class that supports IE, 
 * post method for larger requests, queuing and customized response handling.
 * 
 * This library class is licensed under the LGPL for easy inclusion in other 
 * software; just be sure that this notice stays in tact and any improvements 
 * to the library class itself are submitted back to me.
 * 
 * @author Jordon Mears <jordoncm@gmail.com>
 * @license http://www.gnu.org/licenses/lgpl.html LGPL
 * @link http://www.finefrog.com/projects/#utilities
 */
function ajax() {
    var create_request_object = function() {
        var ro;
        var browser = navigator.appName;
        if(browser == 'Microsoft Internet Explorer') {
            ro = new ActiveXObject('Microsoft.XMLHTTP');
        } else {
            ro = new XMLHttpRequest();
        }
        return ro;
    }
    
    var http = create_request_object();
    var active = false;
    var queue = new Array();
    
    var send_request = function(url, query_string) {
        if(!query_string) {
            query_string = '';
        }
        
        active = true;
        http.open('post', url, true);
        http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        http.setRequestHeader('Content-length', query_string.length);
        http.setRequestHeader('Connection', 'close');
        http.onreadystatechange = handle_response;
        http.send(query_string);
    }
    
    var handle_response = function() {
        if(http.readyState == 4) {
            var response = http.responseText;
            var tmp = queue.shift();
            var handle = tmp['handle'];
            var handle_args = tmp['handle_args'];
            
            if(handle) {
                if(handle_args) {
                    var arg_str = 'response';
                    for(var i = 0; i < handle_args.length; i++) {
                        arg_str += ', ' + handle_args[i];
                    }
                    eval(handle + '(' + arg_str + ');');
                } else {
                    eval(handle + '(response);');
                }
            }
            
            if(queue.length != 0) {
                http = create_request_object();
                send_request(queue[0]['url'], queue[0]['query_string']);
            } else {
                http = create_request_object();
                active = false;
            }
        }
    }
    
    this.send = function(url, query_string, handle, handle_args) {
        var tmp = new Array();
        tmp['url']          = url;
        tmp['query_string'] = query_string;
        tmp['handle']       = handle;
        tmp['handle_args']  = handle_args;
        
        queue.push(tmp);
        
        if(!active && queue.length) {
            send_request(queue[0]['url'], queue[0]['query_string']);
        }
    }
    
    this.is_active = function() {
        if(active) {
            return queue.length;
        } else {
            return false;
        }
    }
}
