//________________________________________________________________________________________________________
// A J A X 
function ajax(url,handleResp,method,async,varsStr,statusElementID) {
	sq = 0
	if(sq) {
		alert(
			"url: " 		+ url 						+ "\n" + 
			"handleResp: " 	+ handleResp 				+ "\n" +
			"method: " 		+ method 					+ "\n" + 
			"async: " 		+ async 					+ "\n" +
			"varsStr: " + varsStr 				+ "\n" +
		"")
	}
	var that = this		// functioniert...
	this.url 			= url
	// Definiton einer callback Function:  _callback = insertAjaxData    (ohen (), ohne '')
	handleResp ? 		this.handleResponse = handleResp	: this.handleResponse	= handleResponse;
	method ? 			this.method = method 				: this.method 			= 'GET';
	async ? 			this.async = async   				: this.async 			= true;	
	
	// Status Anzeige
	if (statusElementID) {
		// alert(document.getElementById(statusElementID))
		this.statusElement = document.getElementById(statusElementID);
		
		if (!this.statusElement) alert("statusElement id: '"+statusElementID+"' not found. To display a status-light, please deliver an existing element with its id.")
		var statusLight = document.createElement('div')
		var flashCode = '<span style="vertical-align:middle">'
		flashCode += '<object width="18" height="18" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">'
		flashCode += '<param name="movie" value="/cms/images/statuslight.swf">'
		flashCode += '<param name="quality" value="high">'
		flashCode += '<param name="bgcolor" value="#EEEEEE">' 
		flashCode += '<embed src="/cms/images/statuslight.swf" bgcolor="#EEEEEE" quality="high" width="18" height="18" type="application/x-shockwave-flash"></embed>'
		flashCode += '</object></span>'
		statusLight.innerHTML = flashCode + " <span class=\"statuslight\">Updating...</span>"
		this.statusElement.appendChild(statusLight)
		this.statusLight = statusLight;
	}
	// alert(this.handleResponse)
	// Wenn das globale createXMLHttpRequest nicht vorhanden ist, dann hier erstellen
	if (!that.req) 			{	
		that.req = createXMLHttpRequest()
	}		
	that.req.onreadystatechange = function() {
		// alert(that.req.readyState)
		// report("ajax readyState: "  + that.req.readyState)
		switch(that.req.readyState) {
			case 0: // UNINITIALIZED
			case 1: // LOADING
			case 2: // LOADED
			case 3: // INTERACTIVE
				break;
			case 4: // COMPLETED
				// alert("that.handleResponse " +that.handleResponse)
				// alert("that.req.readyState: " + that.req.readyState + "\n"+ "that.req.responseText: "+  that.req.responseText)
				if (that.statusElement && that.statusLight)	that.statusElement.removeChild(that.statusLight)
				if (that.handleResponse) 			{that.handleResponse(that.req.readyState, that.req.responseText)}				// Methode definiert?
				else 								{if (window.handleResponse) handleResponse(req.readyState, req.responseText)}	// Oder Function?
				break;
			default: ; // fehlerhafter Status
		}
	}
	that.req.open(this.method, this.url,this.async)
	this.params = null
	if (this.method.toLowerCase() == 'post') {
		this.params = '&Axax=1' + (varsStr ? varsStr : '') // Axax = 1.. um einen Ajax Requst erkennen zu koennen
		// alert(this.params)
		that.req.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
		/*
		xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlHttp.setRequestHeader("Content-length", param.length);
		xmlHttp.setRequestHeader("Connection", "close");
		*/
	}
	// S E N D
	that.req.send(this.params)
}


function createXMLHttpRequest() {
	var req = null;
	try {
		req = new ActiveXObject("MSXML2.XMLHTTP");
	}
	catch (err_MSXML2) {
 		try {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (err_Microsoft) {
			if(typeof XMLHttpRequest != "undefined") req = new XMLHttpRequest;
		}
	}
	return req;
}

function handleStateChange() {
	switch(req.readyState) {
		case 0: // UNINITIALIZED
		case 1: // LOADING
		case 2: // LOADED
		case 3: // INTERACTIVE
			break;
		case 4: // COMPLETED
			// alert(req.handleResponse)
			if (req.handleResponse) 			{req.handleResponse(req.status, req.responseText)}							// Methode definiert?
			else 								{if (window.handleResponse) handleResponse(req.status, req.responseText)}	// Oder Function?
			break;
		default: ; // fehlerhafter Status
	}
}
// nur zum testen
function handleResponse(status, vals) {
	// if(vals) alert(vals)
}

function getHTMLVarsForAjax(mode,formname) {
	
	/*
	Erweitern: 
		-	Ueberpruefen, ob Edit exisitert
		-	n- Froms finden und alle VAriablen bereitstellen, wenn mehrer forms
		
	02.01.09: Erweitert, kann jetzt auch alle Formular-Elemente erfassen, wenn kein Formular gegeben ist	
	*/
	if (!formname) formName = 'edit' // formname = '';
	var valStr = ''
	if (mode=='all' || mode=='post') {
		if (document[formname]) {
			// alert("postvars fuer Formular")
			// nur dieses gegebene Formular
			flength = document[formname].elements.length
		} else {
			// alle erfassen und in Array speichern
			// alert("postvars fuer ganze Seite")
			var allTextAreas 	= document.getElementsByTagName('textarea');
			var allInput 		= document.getElementsByTagName('input');
			var allSelect 		= document.getElementsByTagName('select');
			var allArr 			= new Array();
			for (var i=0;i<allTextAreas.length;i++)  	{allArr.push(allTextAreas[i])}
			for (var i=0;i<allInput.length;i++) 		{allArr.push(allInput[i])}
			for (var i=0;i<allSelect.length;i++) 		{allArr.push(allSelect[i])}
			// report("allTextAreas: " + allTextAreas.length)
			// report("allInput: " 	+ allInput.length)
			// report("allSelect: " 	+ allSelect.length)
			// report("allArr: " 		+ allArr.length)
			flength = allArr.length
		}
		// alert("flength: " + flength)
		for (var i=0;i<flength;i++) {
			// teststr = document[formname].elements[i].id
			// Ergebnis = teststr.search(mode);
			if (document[formname]) f = document[formname].elements[i]
			else 					f = allArr[i]
			ftype 	= f.type;
			fname 	= f.name
			fvalue  = '';
			switch (ftype) {
				case 'checkbox': 
					if (f.checked) 	fvalue = f.value
					else 			fvalue = 'ignore'
				break;
				case 'radio': 
					if (f.checked) 	fvalue = f.value
					else 			fvalue = 'ignore'
				break;
				case 'select-one': 
					fvalue = f.options[f.options.selectedIndex].value
				break;
				case 'select-multiple': 
					// wenn nicht selected, value ist die 1. Option!
					fvalue = f.options[f.options.selectedIndex].value
					//else  						 fvalue = f.options[0].value
				break;
				case 'button': 
					fvalue = ''
				break;
				default: 
					fvalue  = f.value
			} // end switch
			if (fvalue != 'ignore') {
				//valStr += '&' + fname + '=' + escape(fvalue);
				valStr += '&' + fname + '=' + fvalue;
			}
		}
	}
	// alert("valStr " + valStr)
	// report(valStr)
	return valStr
}



// Einzelne Bilder:
function updateElementViaAjax(elID,url,formName,usePostvars,statusElement) {
	/* I N F O
	erwartet:	elID    				eine element.id
				url						ajax-Url
	optional	formname				
				usePostvars				Postvars des Formulars "formname" mitliefern?
				statusElement			updateverlauf anzeigen?	
	
	
	
	*/
	// t = new timer()
	// alert(elID)
	sq = 0
	_callback 	= function(state, vals) {
		document.getElementById(elID).innerHTML = vals
		// window['moveablegridObj_' + viewname] = new moveablegridObj(viewname,'',1)
		// report(vals)
		evalScripts(vals)
	}
	_method 		= 'post'
	_async 			= 1
	_url 			= url
	_statusElemet 	= statusElement
	_postvars 		= ''
	if (usePostvars && usePostvars != 'none') _postvars = getHTMLVarsForAjax('all',formName)
	// alert(_postvars)
	if (sq) {alert(
		"elID: " 			+ elID + "\n" +
		"_url: " 			+ _url + "\n" +
		"usePostvars: " 	+ usePostvars + "\n" +
		"_postvars: " 		+ _postvars + "\n" +
		"_callback: " 		+ _callback + "\n" +
		"_method: " 		+ _method + "\n" +
		"_async: " 			+ _async + "\n"
	)}
	// url,handleResp,method,async,postVarsStr
	ajaxProcess = new ajax(_url,_callback,_method,_async,_postvars,_statusElemet); // handle respons ost der defaultwert und muss nicht extra angegeben werden
}



function evalScripts(str) {
	// eval() inline Javascript aus dem Ajax Request.
	// alert(str)
	// var muster = /(<script (language ?= ?"[jJ]avascript">|type ?= ?"text\/[jJ]avascript">))([\s\S]*?)(<\/script>)/igm   ; // findert: auch umbrochen Javascript code
	// <script type="text/javascript" geht noch nicht...wird vom Muster noch nicht erkannt, da muss ich nochmal ran...
	var muster = /(<script language ?= ?"[jJ]avascript">)([\s\S]*?)(<\/script>)/igm   ; // findert: auch umbrochen Javascript code
	var resArr
	while((resArr = muster.exec(str)) != null) {
		// alert(resArr.join("\n\nxx\n\n"))
		eval(resArr[2]) // fuehrt den Javascript code aus.
	}
}
//________________________________________________________________________________________________________




function save_header_settings(InterfaceName,servicestate,editLayerHeight) {
	// alert("save_header_settings settingsstr InterfaceName:" + InterfaceName + " servicestate: "  + servicestate + " editLayerHeight: " + editLayerHeight)
	req = createXMLHttpRequest();
	req.onreadystatechange = handleStateChange;
	// req.handleResponse = function(){alert("handleResponse")}
	req.open('GET','/cms/codebase/ajax/save_header_settings.php?InterfaceName='+InterfaceName+'&servicestate='+servicestate+"&editLayerHeight="+editLayerHeight, true);
	req.send(null)
}
function save_editor_position(ecargopos) {
	// alert("save_header_settings settingsstr " + settingsstr)
	req = createXMLHttpRequest();
	req.onreadystatechange = handleStateChange;
	req.open('GET','/cms/codebase/ajax/save_editor_position.php?ecargopos='+ecargopos, true);
	req.send(null)
}































/*
// Stand 27.03.08
// A J A X 
var req				// +++ Achtung: req muss global definiert sein!
var ajaxProcess
// Aufruf:
// ajaxProcess = new ajax(url,createDataMesh);
// ajaxProcess = new ajax(url,callbackfunction,'POST',true);
function ajax(url,handleResp,method,async) {
	var that = this		// das habe ich nicht ganz verstanden, aber es functioniert...
	this.url 			= url
	handleResp ? 		this.handleResponse = handleResp: this.handleResponse	= handleResponse;
	method ? 			this.method = method 			: this.method 			= 'GET';
	async ? 			this.async = async   			: this.async 			= true;	
	// alert(this.handleResponse)
	// Wenn das globale createXMLHttpRequest nicht vorhanden ist, dann hier erstellen
	if (!that.req) 			{	
		that.req = createXMLHttpRequest()
	}		
	that.req.onreadystatechange = function() {
		// alert(that.req.readyState)
		switch(that.req.readyState) {
			case 0: // UNINITIALIZED
			case 1: // LOADING
			case 2: // LOADED
			case 3: // INTERACTIVE
				break;
			case 4: // COMPLETED
				// alert("that.handleResponse " +that.handleResponse)
				if (that.handleResponse) 			{that.handleResponse(that.req.status, that.req.responseText)}				// Methode definiert?
				else 								{if (window.handleResponse) handleResponse(req.status, req.responseText)}	// Oder Function?
				break;
			default: ; // fehlerhafter Status
		}
	}
	// S E N D
	that.req.open(this.method,this.url,this.async)
	that.req.send(null)
}
function createXMLHttpRequest() {
	var req = null;
	try {
		req = new ActiveXObject("MSXML2.XMLHTTP");
	}
	catch (err_MSXML2) {
 		try {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (err_Microsoft) {
			if(typeof XMLHttpRequest != "undefined") req = new XMLHttpRequest;
		}
	}
	return req;
}
// A J A X 
var req
function handleStateChange() {
	switch(req.readyState) {
		case 0: // UNINITIALIZED
		case 1: // LOADING
		case 2: // LOADED
		case 3: // INTERACTIVE
			break;
		case 4: // COMPLETED
			// alert(req.handleResponse)
			if (req.handleResponse) 			{req.handleResponse(req.status, req.responseText)}							// Methode definiert?
			else 								{if (window.handleResponse) handleResponse(req.status, req.responseText)}	// Oder Function?
			break;
		default: ; // fehlerhafter Status
	}
}
// nur zum testen
function handleResponse(status, vals) {
	// if(vals) alert(vals)
}
*/