

function AjaxRequest(action, params)
{
    this.ON_COMPLETE= "OnComplete";

    this.AddOnCompleteListener      =  AddOnCompleteListener;
    this.MakeQuery                  =  MakeQuery;
    this.GetXmlHttpRequestObject    =  GetXmlHttpRequestObject;
    this.OnHttpRequestEvent         =  OnHttpRequestEvent;
    	
    this.listeners  = new Array();
    this.action     = action;
    this.params     = params;
    this.searchReq  = this.GetXmlHttpRequestObject();
}

function AddOnCompleteListener(type, listener)
{
    this.listeners.push([type, listener]);
    //this.listeners[this.listeners.length] = listener;
}

function MakeQuery()
{
    if (this.searchReq != null)
    {	
        var queryString = "";
        for (var k in this.params)
        {
             if (queryString == "") queryString = k + "=" + URLEncode(this.params[k]);
             else                   queryString = queryString + "&" + k + "=" + URLEncode(this.params[k]);
        }
          
	    try {
		
			this.searchReq.abort();
			this.searchReq.open("GET", this.action + '?' + queryString, true);
			
			//this.searchReq.onreadystatechange = this.OnHttpRequestEvent;			
			//this.searchReq.ajaxRequest = this;
			
			this.searchReq.onreadystatechange = VFWAjaxBindMethod(this.OnHttpRequestEvent, this);
			
			this.searchReq.send(null);
			return true;
		}
		catch (e)
		{
			alert("Can't connect to server:\n" + e.toString());

		}
    }
    
    return false;
}

function VFWAjaxBindMethod(fn, obj) {
    return function() {
        fn.apply(obj, arguments)
    };
}

function GetXmlHttpRequestObject() 
{
    if (window.XMLHttpRequest)      return new XMLHttpRequest();
    else if(window.ActiveXObject)   return new ActiveXObject("Microsoft.XMLHTTP");
    else                            alert("Seu navegador nao suporta AJAX. Por favor, atualize seu navegador!");
    
    return null;
}

function OnHttpRequestEvent()
{	
	var searchReq = this.searchReq;
    if (this != null && searchReq.readyState == 4)
    {
        for (var i = 0; i <  this.listeners.length; i++)
        {
            var result =  TextToXML(searchReq.responseText);
            if (this.listeners[i][0] == "OnComplete") this.listeners[i][1](result);  
        }
    }
		
	/*
    var ajaxRequest =  this.ajaxRequest;
    if (ajaxRequest != null && this.readyState == 4)
    {
        for (var i = 0; i <  ajaxRequest.listeners.length; i++)
        {
            var result =  TextToXML(this.responseText);
            if (ajaxRequest.listeners[i][0] == "OnComplete") ajaxRequest.listeners[i][1](result);  
        }
    }
    */
}

function TextToXML(text)
{
    try //Internet Explorer
    {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(text);
        return xmlDoc;
    }
    catch(e)
    {
        try //Firefox, Mozilla, Opera, etc.
        {
            parser = new DOMParser();
            xmlDoc = parser.parseFromString(text,"text/xml");
            return xmlDoc;
        }
        catch(e) 
        {
            alert(e.message);
        }
    }
    return null;
}