function print_r(arr,level)
{
	var dumped_text = "";
	if(!level)
		level=0;

	//The padding given at the beginning of the line.
	var level_padding="";
	for(var j=0;j<level+1;j++)
		level_padding += "    ";

	if(typeof(arr) == 'object')
	{ //Array/Hashes/Objects
		for(var item in arr)
		{
			var value = arr[item];
			if(is_array(value) == 'object')
			{ //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += print_r(value,level+1);
			}
			else
			{
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	}
	else
	{ //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}

/*
function print_r(theObj)
{
	var dumped_text1 = "";

	if(theObj.constructor == Array || theObj.constructor == Object)
	{
		dumped_text1+="<ul>";
		for(var p in theObj)
		{
			if(theObj[p].constructor == Array|| theObj[p].constructor == Object)
			{
				dumped_text1+="<li>["+p+"] => "+typeof(theObj)+"</li>";
				dumped_text1+="<ul>";
				print_r(theObj[p]);
				dumped_text1+="</ul>";
			}
			else
			{
				dumped_text1+="<li>["+p+"] => "+theObj[p]+"</li>";
			}
		}
		dumped_text1+="</ul>";
	}
	return dumped_text1;
}
*/

if (typeof DOMParser == "undefined") {
   DOMParser = function () {}

   DOMParser.prototype.parseFromString = function (str, contentType) {
      if (typeof ActiveXObject != "undefined") {
         var d = new ActiveXObject("MSXML.DomDocument");
         d.loadXML(str);
         return d;
      } else if (typeof XMLHttpRequest != "undefined") {
         var req = new XMLHttpRequest;
         req.open("GET", "data:" + (contentType || "application/xml") +
                         ";charset=utf-8," + encodeURIComponent(str), false);
         if (req.overrideMimeType) {
            req.overrideMimeType(contentType);
         }
         req.send(null);
         return req.responseXML;
      }
   }
}

function is_array(obj)
{
	if(!obj)
		return false;
	else if(obj.constructor.toString().indexOf("Array")==-1)
		return false;
	else
		return true;
}

function set_id_html(id,value)
{
	document.getElementById(id).innerHTML=value;
}

function set_id_value(id,value)
{
	document.getElementById(id).value=value;
}

function get_form_elements(form_id)
{
	var form_obj=document.getElementById(form_id);
	var ret_array=Array();
	for(i=0;i<form_obj.length;i++)
	{
		var element=form_obj.elements[i];
		input_type=element.type;
		input_name=element.name;
		input_value=element.value;
		if(input_type=="radio")
		{
			for(j=0;j<form_obj[input_name].length;j++)
			{
				if(form_obj[input_name][j].checked)
				{
					ret_array[input_name]=form_obj[input_name][j].value;
				}
			}
		}
		else if(input_name.indexOf('[]')!=-1)
		{
			if(!ret_array[input_name])
				ret_array[input_name]=Array();

			input_array=Array();
			if(element.checked==true)
				input_array["checked"]=1;
			else
				input_array["checked"]=0;

			input_array["value"]=input_value;
			ret_array[input_name].push(input_array);
		}
		else
		{
			ret_array[input_name]=input_value;
		}
	}
	return ret_array;
}

function parse_rjax_response(xml)
{
	var xmlobject=(new DOMParser()).parseFromString(xml, "text/xml");
	var root=xmlobject.getElementsByTagName('return_xml')[0];

	if(!root)
	{
		return false;
	}
	var ret_array=Array();

	var items=root.getElementsByTagName("item");
	for (var i=0;i<items.length;i++)
	{
		var item = items[i];
		var key = item.getElementsByTagName("key")[0].firstChild.nodeValue;
		// The following has to be done because firefox splits firstChild.nodeValue into 4096 blocks,
		// while IE doesnt recognize textContent
		if(navigator.appName.indexOf('Microsoft') != -1)
		{
			var value = item.getElementsByTagName("value")[0].firstChild.nodeValue;
		}
		else
		{
			var value = item.getElementsByTagName("value")[0].textContent;
		}
		if(value=="NULL")
			value="";
		ret_array[key]=value;
	}
	return ret_array;
}

function parse_rjax_arrays(xml)
{
	var xmlobject=(new DOMParser()).parseFromString(xml, "text/xml");
	var root=xmlobject.getElementsByTagName('return_xml')[0];
	if(!root)
	{
		return false;
	}

	var ret_arrays=Array();
	var in_arrays=root.getElementsByTagName("array");
	for (var i=0;i<in_arrays.length;i++)
	{
		var in_array=in_arrays[i];
		var key = in_array.getElementsByTagName("key")[0].firstChild.nodeValue;
		if(navigator.appName.indexOf('Microsoft') != -1)
			var value = in_array.getElementsByTagName("value")[0].firstChild.nodeValue;
		else
			var value = in_array.getElementsByTagName("value")[0].textContent;


		if(!is_array(ret_arrays[key]))
		{
			ret_arrays[key]=Array();
		}
		ret_arrays[key].push(value);
	}
	return ret_arrays;
}

function parse_rjax_arrays2(xml)
{
   var xmlobject=(new DOMParser()).parseFromString(xml, "text/xml");
   var root=xmlobject.getElementsByTagName('return_xml')[0];
   if(!root)
   {
      return false;
   }

   var ret_arrays2=Array();
   var in_arrays2=root.getElementsByTagName("array2");
   for (var i=0;i<in_arrays2.length;i++)
   {
		var in_array=in_arrays2[i];
      	main_key=in_array.getElementsByTagName("array_key")[0].firstChild.nodeValue;
		if(!is_array(ret_arrays2[main_key]))
			ret_arrays2[main_key]=Array();
		increment=ret_arrays2[main_key].length;
		ret_arrays2[main_key][increment]=Array();
		array_values=in_array.getElementsByTagName("array_values");
		for(var j=0;j<array_values.length;j++)
		{
			array_value=array_values[j]
			key=array_value.getElementsByTagName("key")[0].firstChild.nodeValue;
			if(navigator.appName.indexOf('Microsoft') != -1)
				value=array_value.getElementsByTagName("value")[0].firstChild.nodeValue;
			else
				value=array_value.getElementsByTagName("value")[0].textContent;
			ret_arrays2[main_key][increment][key]=value;
		}
   }
	return ret_arrays2;
}


function GetXmlHttpObject()
{
	var objXMLHttp=null;
	if (window.XMLHttpRequest)
	{
		objXMLHttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	return objXMLHttp;
}

function run_rjax()
{
	var post_value;
	var post_string;
	var xmlHttp=GetXmlHttpObject();
	var xml_response;
	var method="POST";
	var ret_array;
	var ret_arrays;
	var ret_arrays2;

	if(!this.url)
	{
		if(rjax_url)
			this.url=rjax_url;
		else
		{
			alert("RJAX ERROR: URL Missing");
			return false;
		}
	}
	if(!this.operation.length)
	{
		alert("RJAX ERROR: Operation Missing");
		return false;
	}

	post_string='operation='+this.operation;

	for(key in this.in_array)
	{
		if(is_array(this.in_array[key]))
		{
			value_array=this.in_array[key];
			for(i=0;i<value_array.length;i++)
			{
				//if value is an array here we create that array as a post string, with the first value being a 0 or 1 for checked.
				post_value+="&"+escape(key)+"="+escape(value_array[i]["checked"])+escape(value_array[i]["value"]);
			}
		}
		else
		{
			post_value="&"+escape(key)+"="+escape(this.in_array[key]);
		}
		post_string+=post_value;
	}

	if (xmlHttp==null)
	{
		return "ERROR: Browser does not support HTTP Request";
	}

	xmlHttp.open("POST",this.url,false);
	xmlHttp.setRequestHeader("Content-length",post_string.length);
	xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");

	if(method=="POST")
		xmlHttp.send(post_string);
	else
		xmlHttp.send(null);
	if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
		this.xml_response=xmlHttp.responseText;

	if(this.xml_response.length)
	{
		this.ret_array=parse_rjax_response(this.xml_response);
		this.ret_arrays=parse_rjax_arrays(this.xml_response);
		this.ret_arrays2=parse_rjax_arrays2(this.xml_response);

	}
}

function write_array()
{
	alert(this.in_array["key1"]);
	alert(this.operation);
	alert(this.filename);
}

function add_array(array_to_add)
{
	for(key in array_to_add)
	{
		this.in_array[key]=array_to_add[key];
	}
}

function add_id_value(element_id)
{
	this.in_array[element_id]=document.getElementById(element_id).value;
}

function add_value(name,value)
{
	this.in_array[name]=value;
}

function add_form(form_id)
{
	ret_array=get_form_elements(form_id);
	this.add_array(ret_array);
}

function rjax()
{
	this.in_array=Object;
	this.operation;
	this.url;
	this.xml_response;
	this.ret_array;

	this.write_array=write_array;
	this.add_array=add_array;
	this.add_id_value=add_id_value;
	this.add_value=add_value;
	this.add_form=add_form;
	this.run_rjax=run_rjax;
}

function set_visibility(id, visibility)
{
	document.getElementById(id).style.display = visibility;
}
