//Tiny lib, AJAX client (c)Alexander Melanchenko, http://alexnd.com

//default responce object
function $_AJAXRESPONCE(){}
$_AJAXRESPONCE.prototype.obj=null;
$_AJAXRESPONCE.prototype.data=null;
$_AJAXRESPONCE.prototype.responce=function(){
	//alert(arguments[0]);
}
$_AJAXRESPONCE.prototype.error=function(){
	//alert('error: '+arguments[0]);
}

//XMLHttpRequest wrapper
var $AJAXC={
	_httprequests: [],
	_httpresponses: [],
	_httpresponses_data: [],
	_httpresponses_headers: [],
	
	create_httprequest: function(){
		var n=((arguments.length)?arguments[0]:''); 
		var r=null;
		if('undefined'!=typeof XMLHttpRequest) r=new XMLHttpRequest();
		//$DBG.dump(r);
		if(r==null && 'undefined'!=typeof ActiveXObject){
			try{
				r=new ActiveXObject('MSXML2.XMLHTTP.4.0');
			}catch(e){
				try{
					r=new ActiveXObject('MSXML2.XMLHTTP.3.0');
				}catch(e2){
					try{
						r=new ActiveXObject('MSXML2.XMLHTTP');
					}catch(e3){
						try{
							r=new ActiveXObject('Microsoft.XMLHTTP');
						}catch(e4){
							r=null;
						}
					}
				}
			}
		}
		if(r==null && window.createRequest) r=window.createRequest();
		if(n!='')$AJAXC._httprequests[n]=r;
		return r;
	},
	
	delete_request: function(d){
		if('object'==typeof $AJAXC._httprequests[n]){
			$AJAXC._httprequests[n].r=null;
			$AJAXC._httprequests[n]=null;
		}
	},
	
	create_responce: function()
	{
		var r = new $_AJAXRESPONCE();
		if(arguments.length) r.responce = arguments[0];
		if(arguments.length>1) r.error = arguments[1];
		var n=((arguments.length>2)?arguments[2]:''); 
		if(n!='')$AJAXC._httpresponses[n]=r;
		return r;
	},
	
	send_request: function(a)
	{
		if('undefined'==typeof a.url) return null;
		
		if('undefined'!=typeof a.id_request && a.id_request!='' && 'undefined'!=typeof $AJAXC._httprequests[a.id_request]){
			var rq=$AJAXC._httprequests[a.id_request];
		}
		else if('object'==typeof $AJAXC._lasthttprequest){
			var rq=$AJAXC._httprequests[a.id_request];
		}else var rq=null;
		if('object'!=typeof rq){
			if('undefined'!=typeof a.id_request && a.id_request!='') rq=$AJAXC.create_httprequest(a.id_request);
			else rq=$AJAXC.create_httprequest();
		}
		
		if('undefined'==typeof a.id_request) a.id_request='';
		
		if('undefined'!=typeof a.data_type){
			if('string'==typeof a.data_typ)a.data_type=a.data_type.toLowerCase();
		}else a.data_type='';
		if(!(a.data_type=='text' || a.data_type=='html' || a.data_type=='xml')) a.data_type='text';
		
		if('undefined'==typeof a.data) a.data='';
		
		if('undefined'!=typeof a.method){
			if('string'==typeof a.method)a.method=a.method.toLowerCase();
		}else a.method='get';
		
		if('undefined'==typeof a.type) a.type=0;
		
		if('undefined'!=typeof a.mimetype){
			if(!('string'==typeof a.mimetype && a.mimetype!='')) a.mimetype='text/xml';
		}
		
		//$DBG.alert(rq);
		//alert(typeof rq);
		
		if('object'!=typeof rq) return null;
		//TODO: support for old browsers (like opera7) - work through null-frame ajax emulation
		
		if(a.id_request!='')
		{
			if('undefined'==typeof $AJAXC._httpresponses[a.id_request]) $AJAXC._httpresponses[a.id_request]={};
			if('function'==typeof a.callback_responce) $AJAXC._httpresponses[a.id_request].responce = a.callback_responce;
			if('function'==typeof a.callback_error) $AJAXC._httpresponses[a.id_request].error = a.callback_error;
			$AJAXC._httpresponses[a.id_request].obj = rq;
			$AJAXC._httpresponses[a.id_request].type = a.data_type;
		}
		
		try{
			//if('function'==typeof rq.onreadystatechange){
				rq.onreadystatechange=function(){
					if(rq.readyState==4){
						if(rq.status>399 && rq.status<600){
							if('function'==typeof a.callback_responce){
								a.callback_responce(rq.status, a.id_request);
							}
						}else{// && rq.status==200
							//alert(rq.status);
							if(a.data_type=='html'){
								if(a.id_request!='') $AJAXC._httpresponses[a.id_request].data = rq.responseBody;
								a.callback_responce(rq.responseBody, rq.status, a.id_request);
							}
							else if(a.data_type=='xml'){
								if(a.id_request!='') $AJAXC._httpresponses[a.id_request].data = rq.responseXML;
								a.callback_responce(rq.responseXML, rq.status, a.id_request);
							}
							else{
								if(a.id_request!='') $AJAXC._httpresponses[a.id_request].data = rq.responseText;
								a.callback_responce(rq.responseText, rq.status, a.id_request);
							}
						}
					}
				}
			//}
			
			if('undefined'!=typeof a.login && 'undefined'!=typeof a.password){
				//alert('auth');
				rq.open(a.method, a.url, a.type, a.login, a.password);
			}
			else{
				if('string'==typeof a.data){
					if( !(a.data.charAt(a.data.length-1)=='&' || a.url.charAt(0)=='&') ){
						//if(a.url.indexOf('?')==-1) a.url+='?';
						//else a.url+='&';
						a.url+='&';
					}
					a.url+=a.data;
				}
				rq.open(a.method, a.url, a.type);
			}

//prompt('ajax url', a.url);

			if('undefined'!=typeof a.mimetype && a.mimetype!='' && 'undefined'!=typeof rq.overrideMimeType){
				rq.overrideMimeType(a.mimetype);
			}
			
			if('undefined'!=typeof rq.setRequestHeader)
			{
				if('undefined'!=typeof a.headers && a.headers.length){
					for(var h in a.headers) rq.setRequestHeader(h, a.headers[h]);
				}
				if('undefined'!=typeof a.nocache) rq.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
				if(a.method=='post'){
					rq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
					rq.setRequestHeader('Content-Length', a.data.length);
					if('undefined'!=typeof a.close) rq.setRequestHeader('Connection', 'close');
				}
			}
			
			rq.send(a.data);
	
		}catch(_){}
	}
	
/*
	
function $delete_request(i){
	if('object'==typeof document._aj[i]){ document._aj[i].r=null;document._aj[i]=null;}
}

function $stop_request(i){
	if('object'==typeof document._aj[i]) document._aj[i].r.abort();
}

function $get_request_headers(i){
	if(undefined!=document._aj[i] && undefined!=document._aj[i].r.getAllResponseHeaders) return document._aj[i].r.getAllResponseHeaders();
	else return null;
}

function $get_request_header(i, s){
	if(undefined!=document._aj[i] && undefined!=document._aj[i].r.getResponseHeader) return document._aj[i].r.getResponseHeader(s);
	else return null;
}

	
*/
	
	
}
