/*
	Author: Aphex, ratkevicius [at] gmail.com 
	Version: 0.2
	Date: 2006 04 18
*/
function Afx_XHR (){	
	this.query=query;
	this.query2=query2;
		/*
		Kuriamas xml http užklausos objektas pagal browserio sugebejimus. Tikrai veikia ant IE 6 ir Mozilos, ant kitų netestuota. 
		Param: Void
		Return: XMLHttpRequestObject	
	*/
	function createRequest()
	{
		var oHttpRequest=false;
		if (window.XMLHttpRequest) {
			oHttpRequest = new XMLHttpRequest();
			if (oHttpRequest.overrideMimeType) oHttpRequest.overrideMimeType('text/xml');
		} else if (window.ActiveXObject) {
			try {
				oHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					oHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
		if (!oHttpRequest) {
			alert('Negaliu sukurti XML HTTP užklausos');
			return false;
		} else {
			return oHttpRequest;
		}		
	}
	/*
		Vienintelė public funkcija užklausai suformuoti
		Param: 
			sUrl:String - skritptas
			fHandler:Function - funkcija įvykdoma kai viskas užsikrauna tvarkingai, jai perduodamas XMLHttpRequestObject
			sMethod:String (POST,GET)
			sVars:String - kintamieji perduodami jei vyksta post'as
		Return: Void	
	*/	
	function query (sUrl,fHandler,sMethod,sVars)
	{	
		var oHttpRequest=createRequest();		
		
		if(typeof(sVars)=="undefined") sVars='';
		if(typeof(sMethod)=="undefined") sMethod='GET';
		
		oHttpRequest.onreadystatechange=function ()
		{
			if (oHttpRequest.readyState == 4) {			
				if (oHttpRequest.status == 200) {
					fHandler(oHttpRequest);
				} else {
					alert("Negaliu užkrauti duomenų:\n" + oHttpRequest.statusText+"\n"+oHttpRequest.status);
				}
			}
		}
		
		
		if(String(sMethod).toUpperCase()=='GET') get(sUrl,oHttpRequest);
		else if (String(sMethod).toUpperCase()=='POST') post(sUrl,oHttpRequest,sVars);
	}
	function query2 (sUrl,fHandler,sMethod,aVars,aHVars)
	{
		var oHttpRequest=createRequest();	
		if(typeof(sMethod)=='') sMethod='GET';			
		
		oHttpRequest.onreadystatechange=function ()
		{
			if (oHttpRequest.readyState == 4 || oHttpRequest.readyState =='complete') {			
				if (oHttpRequest.status == 200) {
					fHandler(oHttpRequest,aHVars);
				} else {
					alert("Negaliu užkrauti duomenų:\n" + oHttpRequest.statusText+"\n"+oHttpRequest.status);
				}
			}
		}
		if(String(sMethod).toUpperCase()=='GET') get(sUrl,oHttpRequest,aVars);
		else if (String(sMethod).toUpperCase()=='POST') post(sUrl,oHttpRequest,aVars);		
	}
	function make_varstr_from_object(oVars)
	{
		var sVars='';
		if(typeof(oVars.nodeName)!='undefined' && oVars.nodeName.toLowerCase()=='form') oVars=make_varstr_from_form(oVars);		
		for (var i in oVars) sVars+=i+'='+encodeURIComponent(oVars[i])+'&';
		return sVars;
	}
	function make_varstr_from_form(oParent)
	{
		var inputs=oParent.getElementsByTagName('input');
		var textareas=oParent.getElementsByTagName('textarea');
		var selects=oParent.getElementsByTagName('select');
		var array=new Array();
		var aCheckboxes=new Array();
		for(var i=0; i<	inputs.length; i++)	{
			switch (inputs.item(i).type)
			{
				case 'checkbox':
					if(inputs.item(i).checked==true) {
						if(inputs.item(i).name.substr(inputs.item(i).name.length-2)=='[]') {
							sNewName=inputs.item(i).name.substr(0,inputs.item(i).name.length-2);
							if(typeof(aCheckboxes[sNewName])=='undefined') aCheckboxes[sNewName]=0;
							else aCheckboxes[sNewName]++;
							sNewName+='['+aCheckboxes[sNewName]+']';
						} else sNewName=inputs.item(i).name;						
						array[sNewName]=inputs.item(i).value;						
					}
					break;
				case 'hidden':
					array[inputs.item(i).name]=inputs.item(i).value;
					break;
				case 'radio':
					array[inputs.item(i).name]=inputs.item(i).value;
					break;
				case 'file':
					alert('input type file unsuported');
					break;
				case 'button':
					array[inputs.item(i).name]=inputs.item(i).value;
					break;
				case 'image':
					array[inputs.item(i).name]=inputs.item(i).value;
					break;
				case 'password':
					array[inputs.item(i).name]=inputs.item(i).value;
					break;
				case 'submit':
					array[inputs.item(i).name]=inputs.item(i).value;					
					break;
				case 'text':
					array[inputs.item(i).name]=inputs.item(i).value;
					break;
			}
		}
		for(var i=0; i<	textareas.length; i++)	{
			array[textareas.item(i).name]=textareas.item(i).value;
		}
		for(var i=0; i<	selects.length; i++)	{
			array[selects.item(i).name]=selects.item(i).value;
		}
		return array;
	}
	/*
		Requestas GET'inamas
		Param: 
			sUrl:String - skritptas
			oHttpRequest: Object
		Return: Void	
	*/		
	function get (sUrl,oHttpRequest,aVars)
	{		
		oHttpRequest.open('GET', sUrl+'?'+make_varstr_from_object(aVars), true);
		oHttpRequest.send(null);		
	}
	/*
		Requestas POST'inamas
		Param: 
			sUrl:String - skritptas
			oHttpRequest: Object
			sVars:String
		Return: Void	
	*/	
	function post(sUrl,oHttpRequest,aVars)
	{		
		oHttpRequest.open('POST', sUrl, true);
		oHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		oHttpRequest.setRequestHeader("Content-length", aVars.length);
		oHttpRequest.setRequestHeader("Connection", "close");
		oHttpRequest.send(make_varstr_from_object(aVars));
	}
}
