var xmlReq = null,that=null;

function isdefined( variable)
{
    return (typeof(window[variable]) == "undefined")?  false: true;
}

function tajax()
{
	var data;
	var url;
	var http_request;
	var result;
	var handleFunction;
	this.returnRequestData=returnRequestData;
	this.getXML=getXML;
	this.handleFormRequest=handleFormRequest;
	this.handleFormResponse=handleFormResponse;

	function getXML(url,handlefunction,parameters)
	{
		this.http_request =false;
		if (window.XMLHttpRequest)
		{
			this.http_request = new XMLHttpRequest();
			if (this.http_request.overrideMimeType)
			{
				this.http_request.overrideMimeType('text/html');
			}
		} else if (window.ActiveXObject)
		{
			try {
				this.http_request = new ActiveXObject('Msxml2.XMLHTTP');
			} catch (e) {
				try {
				this.http_request = new ActiveXObject('Microsoft.XMLHTTP');
				} catch (e) {}
			}
		}
		if (!this.http_request) {
			alert('Cannot create XMLHTTP instance');
			return false;
		}
		this.handlefunction = handlefunction;
		that=this;
		this.http_request.onreadystatechange = returnRequestData;
		this.http_request.open('POST', url, true);
		this.http_request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		this.http_request.setRequestHeader('Content-length', parameters.length);
		this.http_request.setRequestHeader('Connection', 'close');
		this.http_request.send(parameters);
	}

	function handleFormRequest(url,handlefunction,data)
	{
		this.url = url;
		this.data = data;
		var parameters = '';
		if(typeof data == 'object')
		{
			if (data && data.tagName == 'FORM')
			{
				var formElements = data.elements;
				for( var i=0; i < formElements.length; i++)
				{
					if (!formElements[i].name)
						continue;
					if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false)
						continue;
					if (formElements[i].disabled && formElements[i].disabled == true)
						continue;
					var name = formElements[i].name;
					if (name)
					{
						if (parameters != '') parameters += '&';
						if(formElements[i].type.substr(0,7)=='select-')
						{
							for (var j = 0; j < formElements[i].length; j++)
							{
								if (formElements[i].options[j].selected == true)
									if(formElements[i].options[j].value)parameters += name+'='+encodeURIComponent(formElements[i].options[j].value);
									else parameters += name+'='+encodeURIComponent(formElements[i].options[j].innerText);
							}
						}
						else
						{
							if(formElements[i].type=='textarea' && typeof(tinyMCE) != "undefined" && tinyMCE.get(name) && tinyMCE.get(name).isHidden()==false)
                            {
                                parameters += name+'='+encodeURIComponent(tinyMCE.get(name).getContent());
                            }
                            else parameters += name+'='+encodeURIComponent(formElements[i].value);
						}
					}
				}
			}
			else for(var c = 0; c < data.length ; c++)
			{
				if( c == 0 ) parameters = data[c] + '=' + encodeURIComponent( document.getElementById(data[c]).value );
				else parameters = parameters + '&' + data[c] + '=' + encodeURIComponent( document.getElementById(data[c]).value );
			}
		}
		else if (typeof data == 'string')
		{
			parameters = data + '=' + encodeURIComponent( document.getElementById(data).value );
		}

		xmlReq = getXML(url,handlefunction,parameters);
	}

	function returnRequestData() {
		if (that.http_request.readyState == 4) {
			if (that.http_request.status == 200) {
				that.result = that.http_request.responseText;
				if(that.handlefunction.length == 0)eval('handleFormResponse(\''+that.result+'\');');
				else eval(that.handlefunction+'(\''+that.result+'\');');
			} else {
				alert('Die Tajax-Anfrage wurde unterbrochen!');
			}
		}
	}
	function handleFormResponse(response)
	{
		var headerstart=response.search(/::tajax-response::/);
		if(headerstart==-1) alert('No Tajax-Response: '+response);
		if(headerstart>=0)
		{
			var responseparts=response.split(/::tajax-response::/);
			for(var ri=0;ri<responseparts.length;ri++)
			{
				if(responseparts[ri].length>0)
				{
					if(responseparts[ri].search(/::tajax-form-data::/)>-1)
					{
						responsepart = responseparts[ri].replace(/::tajax-form-data::/,'');
						var datafields=responsepart.split('::tajax_dataset::');
						for(var i=0;i<datafields.length;i++)
						{
							dataarray=datafields[i].split('::tajax_data::');
							if(dataarray)
							{
								if(dataarray[0]=='tajax-form')var tajax_form=dataarray[1]
								else if(dataarray[0]=='tajax-prefix')var tajax_prefix=dataarray[1];
								else
								{
									if(eval('document.' + tajax_form + '.' + tajax_prefix + dataarray[0]))
									{
										var tajax_field_type = eval('document.' + tajax_form + '.' + tajax_prefix + dataarray[0] + '.type');
										if(tajax_field_type=='radio' || tajax_field_type=='checkbox')
										{
											if(dataarray[1]=='on' || dataarray[1]==1)eval('document.' + tajax_form + '.' + tajax_prefix + dataarray[0] + '.checked=\'checked\';');
											else eval('document.' + tajax_form + '.' + tajax_prefix + dataarray[0] + '.checked=false;');
										}
										else if(tajax_field_type.substr(0,7)=='select-')
										{
											var formElements = eval('document.' + tajax_form + '.' + tajax_prefix + dataarray[0]);
											for (var j = 0; j < formElements.length; j++)
											{
												if (formElements.options[j].value == dataarray[1] || formElements.options[j].innerText == dataarray[1])formElements.options[j].selected = true;
											}
										}
										else
										{
											if(tajax_field_type=='textarea' && typeof(tinyMCE) != "undefined" && tinyMCE.get(tajax_prefix + dataarray[0]))
                                            {
                                                tinyMCE.get(tajax_prefix + dataarray[0]).setContent(dataarray[1])
                                            }else{
                                                eval('var element = document.' + tajax_form + '.' + tajax_prefix + dataarray[0]);
											    element.value = dataarray[1];
											}
										}
									}
								}
								if(1==2)
								{if(dataarray[0]=='ObjectLayout') if(dataarray[1]=='1') document.getElementById('layout_ObjectLayout').checked=true;
								else document.getElementById('layout_ObjectLayout').checked=false;
								else if(document.getElementById('layout_'+dataarray[0])) document.getElementById('layout_'+dataarray[0]).value=dataarray[1];}
							}
							else
							{
								alert(datafields[i]);
							}
						}
					}
					else if(responseparts[ri].search(/::tajax-dom-data::/)>-1)
					{
						responsepart = responseparts[ri].replace(/::tajax-dom-data::/,'');
						parseDOMdata(responsepart);
					}
					else if(responseparts[ri].search(/::tajax-JS-response::/)>-1)
					{
						responsepart = responseparts[ri].replace(/::tajax-JS-response::/,'');
						dataarray=responsepart.split('::tajax_data::');
						if(dataarray)
						{
							if(dataarray[0]=='tajax-js')eval(dataarray[1]);
						}
					}else alert('tajax-response is broken: '+response);
				}
			}
		}
	}
	function parseDOMdata(responsepart)
	{
						var datafields=responsepart.split('::tajax_dataset::');
						var objectstring='';
						for(var i=0;i<datafields.length;i++)
						{
							dataarray=datafields[i].split('::tajax_data::');
							if(dataarray)
							{
								if(dataarray[0]=='tajax-parent-obj')var tajax_parent_obj=dataarray[1];
								else if(dataarray[0]=='tajax-obj-type')
								{
									var tajax_obj_type=dataarray[1];
									if(tajax_obj_type.length==0)var addChild=false;
									else var addChild=true;
									if(addChild==false) var newOBJ=document.getElementById(tajax_parent_obj);
									else var newOBJ = document.createElement(tajax_obj_type);
									if(addChild)document.getElementById(tajax_parent_obj).appendChild(newOBJ);
								}
								else
								{
									if(dataarray[0]=='value')
									{
										var Textknoten = document.createTextNode(dataarray[1]);
										newOBJ.appendChild(Textknoten);
  									}
  									else if(dataarray[0]=='style')
  									{
  										/*		var Style = document.createAttribute(dataarray[0]);
												Style.nodeValue = dataarray[1];
												newOBJ.setAttributeNode(Style);*/
										var styles=dataarray[1].split(/;;/);
  										for(var si=0;si<styles.length;si++)
  										{
  											if(styles[si].length>0)
  											{
  												var style = styles[si].split(/:/);
  												if(style[1].match(/'/)) eval('newOBJ.style.'+style[0]+'='+style[1].replace(/'/,'\''));
  												else eval('newOBJ.style.'+style[0]+'=\''+style[1]+'\'');
  											}
  										}
  									}
  									else
  									{
  										var attribs=dataarray[1].split(/;;/);
  										for(var si=0;si<attribs.length;si++)
  										{
  											if(attribs[si].length>0)
  											{
  												attrib=attribs[si].split(/=/);
  												var Attribut = document.createAttribute(attrib[0]);
  												var Attributwert='';
  												for(var sia=1;sia<attrib.length;sia++)
  												{
  												  Attributwert+=attrib[sia];
  												  if(sia<attrib.length-1)Attributwert+='=';
  												}
												Attribut.nodeValue = Attributwert;
												if(attrib[0].substr(0,2)=="on")eval('newOBJ.'+attrib[0]+' = function(){'+attrib[1]+';}');
                                                else newOBJ.setAttributeNode(Attribut);
                                                //newOBJ.setAttribute(attrib[0],Attributwert);
											//	alert('newOBJ.'+attrib[0]+'=\''+attrib[1]+'\'');
  											//	eval('newOBJ.'+attrib[0]+'=\''+attrib[1]+'\'');
  											}
  										}
 									}
								}
							}
							else
							{
								alert(datafields[i]);
							}
						}
	}
}
var tajax=new tajax();
