var srv_part = "/libs/ajah/inc/ajah.php";
var AjahObjects=new Array;

AjahObj = function()
{

	this.errors=new Array;

	this.print_errors=function() //На случай ошибки
	{
		for(i in this.errors)
		{
			alert('Ajah error: '+this.errors[i]);
		}
	}

	this.setError = function(e_type)
	{
		this.req.abort();
		this.timeout=null;
		switch(e_type)
		{
			case 'timeout':
				this.errors.push('Timeout');
			break;
			case 'obj_fail':
				this.errors.push('Ajax object not created');
			break;
			case 400:
				this.errors.push("400: Bad Request.");
			break;
			case 401:
				this.errors.push("401: Unauthorized.");
			break;
			case 402:
				this.errors.push("402: Payment Required.");
			break;
			case 403:
				this.errors.push("403: Forbidden.");
			break;
			case 404:
				this.errors.push("404: Not Found.");
			break;
			case 405:
				this.errors.push("405: Method Not Allowed.");
			break;
			case 406:
				this.errors.push("406: Not Acceptable.");
			break;
			case 407:
				this.errors.push("407: Proxy Authentication Required.");
			break;
			case 408:
				this.errors.push("408: Request Time-out.");
			break;
			case 409:
				this.errors.push("409: Conflict.");
			break;
			case 410:
				this.errors.push("410: Gone.");
			break;
			case 411:
				this.errors.push("411: Length Required.");
			break;
			case 412:
				this.errors.push("412: Precondition Failed.");
			break;
			case 413:
				this.errors.push("413: Request Entity Too Large.");
			break;
			case 414:
				this.errors.push("414: Request-URI Too Long.");
			break;
			case 415:
				this.errors.push("415: Unsupported Media Type.");
			break;
			case 500:
				this.errors.push("500: Internal Server Error.");
			break;
			case 501:
				this.errors.push("501: Not Implemented.");
			break;
			case 502:
				this.errors.push("502: Bad Gateway.");
			break;
			case 503:
				this.errors.push("503: Service Unavailable.");
			break;
			case 504:
				this.errors.push("504: Gateway Time-out.");
			break;
			case 505:
				this.errors.push("505: HTTP Version not supported.");
			break;
			default:
				this.errors.push(e_type);
			break;
		}
		if(this.printErrors) this.print_errors();
		if(this.error_func) eval(this.error_func+'("'+e_type+'")');
		//this.destroy();
	}

	this.startResponse=function(srv_fnc, call_fnc, prms)
	{
		if(srv_fnc) this.serv_func = srv_fnc;
		if(call_fnc) this.callback_func = call_fnc;
		if(prms) this.params = prms;
		
		var query="fnc=";
		query+= (this.serv_func)? this.serv_func : "default_f";
		query+= (this.callback_func)? "&callback=" + this.callback_func : "";
		query+= (this.params)? "&json=" + encodeURIComponent(JSON.stringify(this.params)) : "";
		this.req=createAJAXObject();
		this.resp_type=(this.resp_type)?this.resp_type:'POST';
		this.timeout_value=(this.timeout_value)?this.timeout_value:5000;
		this.printErrors=(this.printErrors)?this.printErrors:false;
		this.timeout =  setTimeout("AjahObjects."+this.ob_name+".setError('timeout')", this.timeout_value);
		
		if(this.req)
		{
			try
			{
				this.req.open(this.resp_type, srv_part, true);
				this.req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				this.req.setRequestHeader("Content-length", this.params.length);
				this.req.setRequestHeader("Connection", "close");
				obj_name=this.ob_name;
				this.req.onreadystatechange = function ()
				{	
					eval("var rsc = AjahObjects."+obj_name+".req.readyState");
					
					if(rsc == 4)
					{
						try
						{
							eval("clearTimeout(AjahObjects."+obj_name+".timeout)");
							eval("AjahObjects."+obj_name+".timeout = null");
							eval("AjahObjects."+obj_name+".workupResponse()");
						}
						catch(e)
						{
							eval("AjahObjects."+obj_name+".setError('"+e.name+" at line "+e.lineNumber+": "+e.message+"')");
						}
						
					}
				}
				this.req.send(query);
			}
			catch(e)
			{
    this.setError(e.fileName.substring(7,e.fileName.length)+': '+e.name+' at line '+e.lineNumber+': '+e.message);
			}

		}
		else this.setError('obj_fail');
	}
	this.workupResponse=function()
	{
		try
		{
  			clearTimeout(this.timeout);
  			this.timeout = null;
    			if (this.req.status == 200)
    			{
				response = JSON.parse(this.req.responseText);
				
    				if(response.action)
				{
					eval(response.action);
				}

				//this.destroy();
			}
			else if(this.req.status!=0) this.setError(this.req.status);
		}
		catch(e)
		{
			this.setError(e.fileName.substring(7,e.fileName.length)+': '+e.name+' at line '+e.lineNumber+': '+e.message);
		}
			
	}

	this.destroy=function()
	{
		try { delete AjahObjects[this.ob_name];}
		catch(e) {this.setError(e.fileName.substring(7,e.fileName.length)+': '+e.name+' at line '+e.lineNumber+': '+e.message);}
	}

	function createAJAXObject()
	{
		var ajax=null;
		if (window.XMLHttpRequest)
			try { ajax=new XMLHttpRequest(); } catch (e) {this.setError(e.fileName.substring(7,e.fileName.length)+': '+e.name+' at line '+e.lineNumber+': '+e.message);}
		else
		{
			if(!ajax) try { ajax=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {this.setError(e.fileName.substring(7,e.fileName.length)+': '+e.name+' at line '+e.lineNumber+': '+e.message);}
			if(!ajax) try { ajax=new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {this.setError(e.fileName.substring(7,e.fileName.length)+': '+e.name+' at line '+e.lineNumber+': '+e.message);}
		}
		return ajax;
	}
}


function CreateAjah(a_name)
{
	if (AjahObjects[a_name]) 
	{
		alert("Object with name '"+a_name+"' aleready exists. Object '"+a_name+"' wasn't created.");
		return false;
	}
	obj=new AjahObj();
	obj.ob_name=a_name;
	AjahObjects[a_name]=obj;
	return true;
}
