var CurrentAjaxQuery = null
var arrAjaxQueries=new Array()

var objajaxquery = null;
var blnAjaxQueryExecuting = false;

function ajax_query()
{
	this.Type="GET";
	this.Params="";
	this.Callback=null;
	this.arrTags=null;
	this.QueryURL="";
}

function get_ajax_query_object()
{
	var xmlHttp=null;
	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e)
	{
		// Internet Explorer
		try
		{
		xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
		xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlHttp;
}

function perform_ajax_query( url,callback,arr_requesttags )
{
	new_query = new ajax_query;

	new_query.Type = "GET";
	new_query.Callback = callback;
	new_query.arrTags = arr_requesttags;
	new_query.QueryURL = url;

	arrAjaxQueries.push(new_query);

	ajax_get_next_query();
}

function perform_ajax_post( url,params,callback,arr_requesttags )
{
	new_query = new ajax_query;

	new_query.Type = "POST";
	new_query.Params = params;
	new_query.Callback = callback;
	new_query.arrTags = arr_requesttags;
	new_query.QueryURL = url;

	arrAjaxQueries.push(new_query);

	ajax_get_next_query();
}

function submit_form_to_ajax_query( objform,url,callback,arr_requesttags )
{
	var str_arguments = convert_form_into_argument_string(objform);
	perform_ajax_post(url, str_arguments, callback, arr_requesttags);
}

function convert_form_into_argument_string( objform )
{
	var str_arguments = "";
	for (var i=0; i<objform.childNodes.length; i++) 
	{
		switch ( objform.childNodes[i].tagName )
		{
			case "FIELDSET":
				str_arguments += convert_form_into_argument_string(objform.childNodes[i]);
				break;

			case "LABEL":
				str_arguments += convert_form_into_argument_string(objform.childNodes[i]);
				break;
				
			case "DIV":
				str_arguments += convert_form_into_argument_string(objform.childNodes[i]);
				break;

			case "INPUT":
			   switch ( objform.childNodes[i].type )
			   {
			      case "text":
			         str_arguments += objform.childNodes[i].name + "=" + objform.childNodes[i].value + "&";
			         break;
			      
				  case "password":
			         str_arguments += objform.childNodes[i].name + "=" + objform.childNodes[i].value + "&";
			         break;
				  
			      case "checkbox":
			         if (objform.childNodes[i].checked) 
						{
                     str_arguments += objform.childNodes[i].name + "=" + objform.childNodes[i].value + "&";
					   } 
					   else 
					   {
					      str_arguments += objform.childNodes[i].name + "=&";
					   }
					   break;

					case "radio":
                  		if (objform.childNodes[i].checked) 
					   {
						   str_arguments += objform.childNodes[i].name + "=" + objform.childNodes[i].value + "&";
					   }
					   break;
				   case "file":
					   str_arguments += objform.childNodes[i].name + "=" + objform.childNodes[i].value + "&";
					   break;
					case "hidden":
			         str_arguments += objform.childNodes[i].name + "=" + objform.childNodes[i].value + "&";
			         break;
			   }
			   
				break;


			case "SELECT":
				var sel = objform.childNodes[i];
				str_arguments += sel.name + "=" + sel.options[sel.selectedIndex].value + "&";
				break;    
				
			case "TEXTAREA":
				str_arguments += objform.childNodes[i].name + "=" + objform.childNodes[i].value + "&";
			   
				break;     
		}
	}
	return str_arguments;
}

function ajax_get_next_query()
{
	if ( blnAjaxQueryExecuting == true ) return;
	if ( arrAjaxQueries.length == 0 ) return;

	blnAjaxQueryExecuting = true

	CurrentAjaxQuery = arrAjaxQueries.shift();

	objajaxquery = get_ajax_query_object();
	
	if (CurrentAjaxQuery.Type == "GET") 
	{
		objajaxquery.onreadystatechange = ajax_query_statechange;
		
		objajaxquery.open("GET", CurrentAjaxQuery.QueryURL, true);
		objajaxquery.send(null);
	}
	else if ( CurrentAjaxQuery.Type == "POST" )
	{
		objajaxquery.open("POST", CurrentAjaxQuery.QueryURL, true);
		objajaxquery.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		objajaxquery.setRequestHeader("Content-length", CurrentAjaxQuery.Params);
		objajaxquery.setRequestHeader("Connection", "close");

		objajaxquery.onreadystatechange = ajax_query_statechange;

		objajaxquery.send(CurrentAjaxQuery.Params);
	}
}


function ajax_query_statechange() 
{ 
	if (objajaxquery.readyState==4)
	{ 
		CurrentAjaxQuery.Callback(CurrentAjaxQuery.arrTags,objajaxquery.responseText);
		blnAjaxQueryExecuting = false;
		ajax_get_next_query();
	}
}
