AjaxClient = function ()
{
	this.params = new Array();
};

AjaxClient.prototype =
{
	url: "",
	async: true,
	mimeType: "text/plain",
			
	errorMsg: false,
	HttpRequest: null,
	rensponseText: null,
	rensponseXml: null,
	rensponseError: null,
	params: null,
	
	onLoading: function(obj){},
    onLoad: function(obj){},
	onSuccess: function(obj){},
    onAbort: function(obj){},
	onError: function(obj){alert("error")},
	
	createXMLHttpRequest: function()
	{
		try
		{
			return new XMLHttpRequest();
		}
		catch(Err1)
		{
			try
			{
				return new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(Err2)
			{
				try
				{
					return new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(Err3)
				{
					return null;
				}
			}
		}
	},
    
    abort: function()
    {
        alert("insideaborting");
        this.HttpRequest.abort();
    },
    
    send: function(method, url, skipRewrite)
	{		
        if(!skipRewrite && url.indexOf("http://") != 0)
        {
            url = setting.siteRootUrl + '/index.php' + url;
        }
        
		this.HttpRequest = this.createXMLHttpRequest();
        this.aborted = false;

		//this.HttpRequest.overrideMimeType(this.mimeType);
		
		var that = this;
        
        if(this.timeout)
            setTimeout(function ()
            {
                that.aborted = true;
                that.HttpRequest.abort();
                delete that.HttpRequest['onreadystatechange'];
                that.HttpRequest = null; 
                
            }, this.timeout); 
            
		if(this.async)
        this.HttpRequest.onreadystatechange = function()
		{
             
			switch(that.HttpRequest.readyState)
			{
				case 1: that.onLoading(that); break;
				case 2: that.onLoad(that); break;
				case 4:

                    if(that.aborted)
                    {
                        that.onAbort(that);
                        return;
                    }
                    
					if(that.HttpRequest.status == 200)
					{
						if(that.mimeType.indexOf('html'))
						{
							that.responseText = that.HttpRequest.responseText;
						}
						else if(that.mimeType.indexOf('xml'))
						{
							that.responseXml = that.HttpRequest.responseXML;
						}
						
						that.onSuccess(that);
					}

					break;
			}			
        	
		}
		
        //this.params["dumm"] = Math.random();
        
		var queryStr = "";
		
		for(var key in this.params)
		{
			if(queryStr != "")
				queryStr += "&";

			queryStr += encodeURIComponent(key) + "=" + encodeURIComponent(this.params[key]);
		}
        
        this.clearParams();
        
//alert("query "+ queryStr);
		if(url != null)
		{
			try
			{
				if(method == "get" && queryStr.length > 0)
				{
					url += (url.indexOf("?") != -1 ? "&" : "?") + queryStr;
				}
				
				this.HttpRequest.open(method, url, this.async);
				
				if(method == "post")
				{
					this.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					this.HttpRequest.send(queryStr);	
				}
				else
				{
					this.HttpRequest.send(null);
				}
                
                if(this.HttpRequest.status == 200)
                {
                    if(this.mimeType.indexOf('html'))
                    {
                        this.responseText = this.HttpRequest.responseText;
                    }
                }
				
			}
			catch(e)
			{
				this.ErrorMsg = e;
				return 0;
			}
		}		
	},
    
    parseJSON: function(text)
    {
        if(!text)text = this.responseText;
        
        return eval("(" + text + ")");
    },
	
	get: function(url)
	{
		this.send("get", url);
	},

	post: function(url)
	{
		this.send("post", url);
	},
	
	/**
	 * @return {ajaxClient}
	 */
	addParam: function(name, value)
	{
		//alert(name+" "+value);
		this.params[name] = value;
		return this;	
	},
    
    clearParams: function()
    {
        this.params = new Array();
        return this;    
    },
	
	set: function(name, value)
	{
		this[name] = value;
		return this;	
	},
	
	fillForm: function(form, data)
	{
		form = $(form);	
		var elements = form.elements;
		
		for(var nr = 0; nr < elements.length; nr++)
		{
			var e = elements[nr];
            
            switch(e.type)
            {
                case "radio":
                case "checkbox":
                    
                    if(data[e.name] != undefined)
                    {
                        e.checked = (data[e.name] == e.value) ? true : false;
                    }
                    
                    break;
                
                default:
                    if(data[e.name] != undefined)e.value = data[e.name]; 

            }

		}
	},
	
	sendForm: function(form, url, method)
	{
		this.form = $(form); 
                                          
		url = url || this.form.action || this.url;
		method = method || this.form.method || "post";

		var elements = this.form.elements;
	
		for(var nr = 0; nr < elements.length; nr++)
		{
			var e = elements[nr];
			if(e.disabled)continue;
			
			switch(e.type)
			{
				case "checkbox":
				case "radio":
					if (e.checked)
					this.addParam(e.name, e.value);
					break;
				
				case "select-one":
					if(e.selectedIndex >= 0)
					this.addParam(e.name, e.options[e.selectedIndex].value);
					break;
				
				case "select-multiple":
					for(var nr2 = 0; nr2 < e.options.length; nr2++)
					if(e.options[nr2].selected)
					this.addParam(e.name, e.options[nr2].value);
					break;
					
				case "button":
				    break;
				
				default:
					this.addParam(e.name, e.value);

			}
	    }
		
		this.send(method, url, true);
  
    },
    
    selectAll: function(field)
    {       
        if(field.length)
        { 
            for(i = 0; i < field.length; i++)
            {
                field[i].checked = true ;
            }
        }
        else
        {
            field.checked = true;
        }
    }
}

var ajax = new AjaxClient();

