	////////////////////////////////////////////////////////////////////////////////////////////////////
	// Ajax Globals
	////////////////////////////////////////////////////////////////////////////////////////////////////
	var theatreAjax = new Array();
	theatreAjax['xmlRequest'] = false;
	theatreAjax['targetArray'] = null;
	theatreAjax['requestStatus'] = "IDLE";
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	// Ajax Main-functions
	////////////////////////////////////////////////////////////////////////////////////////////////////
	function theatreAjaxGetXMLHttpRequest()
	{
		if(window.ActiveXObject)
		{
			try
				{theatreAjax['xmlRequest'] = new ActiveXObject("Msxml2.XMLHTTP");}				// IE 6.x
			catch(e)
			{
				try
					{theatreAjax['xmlRequest'] = new ActiveXObject("Microsoft.XMLHTTP");}		// IE 5.x
				catch(e)
					{theatreAjax['xmlRequest'] = false;}
			}
		}
		else if(window.XMLHttpRequest)
		{
			try
				{theatreAjax['xmlRequest'] = new XMLHttpRequest();}								// Mozilla, Opera, Safari
			catch(e)
				{theatreAjax['xmlRequest'] = false;}
		}
		
		return theatreAjax['xmlRequest'];
	}
	
	
	function theatreAjaxGetResponsteText()
	{
		var responseText = theatreTrim(theatreAjax['xmlRequest'].responseText);
		if(responseText.length <= 0)
			return;
		
		return theatreResponseToArray(responseText);
	}
	
	
	function theatreAjaxLoadXMLDoc(url, callback, targetArray)
	{
		theatreAjax['xmlRequest'] = theatreAjaxGetXMLHttpRequest();
		theatreAjax['targetArray'] = targetArray;
		
		if(!theatreAjax['xmlRequest'])	return;
		
		var async = false;
		if(callback)
		{
			theatreAjax['xmlRequest'].onreadystatechange = callback;
			async = true;
		}
		
		theatreAjax['requestStatus'] = "REQUEST";
		theatreAjax['xmlRequest'].open("GET", url, async);
		theatreAjax['xmlRequest'].send("");
		
		if(!async)
			return theatreAjaxGetResponsteText();
	}
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	// Ajax user-defined ASYNC-Callback-functions
	////////////////////////////////////////////////////////////////////////////////////////////////////
	function theatreAjaxCallback()
	{
		if(theatreAjax['xmlRequest'].readyState == 4 && theatreAjax['xmlRequest'].status == 200 && theatreAjax['targetArray'])
		{
			theatreAjax['requestStatus'] = "RESPONSE";
			
			var aResponseText = theatreAjaxGetResponsteText();
			
			// seat booking on a stage
			if(theatreAjax['targetArray']['tdSeat'])
			{
				var oSeat = theatreAjax['targetArray']['tdSeat'];
				var oLC = theatreAjax['targetArray']['trLinkCheckout'];
				var oLCR = theatreAjax['targetArray']['trLinkCheckoutReserve'];
				
				if(aResponseText['status'] == "seatFree")
				{
					var catClass = (aResponseText['statusPlus'] == "seatFreeByBookingOffice") ? "sRB" : ("sC"+aResponseText['category']);
					catClass = (aResponseText['active'] == "n") ? "sRB" : catClass;
					oSeat.className = theatreClassReplace(oSeat.className, catClass);
					
					if(oLC && aResponseText['countSeatsLocked'] <= 0)
						oLC.className = oLC.className.replace(/visible/gi, "hidden");
					
					if(oLCR && aResponseText['countSeatsLocked'] <= 0)
						oLCR.className = oLCR.className.replace(/visible/gi, "hidden");
				}
				else if(aResponseText['status'] == "seatLocked")
				{
					oSeat.className = theatreClassReplace(oSeat.className, "sLM");
					
					if(aResponseText['message'])
						alert(aResponseText['message']);
					
					if(oLC && aResponseText['countSeatsLocked'] > 0)
						oLC.className = oLC.className.replace(/hidden/gi, "visible");
					
					if(oLCR && aResponseText['countSeatsLocked'] > 0)
						oLCR.className = oLCR.className.replace(/hidden/gi, "visible");
				}
				else if(aResponseText['status'] == "seatBooked")
				{
					var catClass = (aResponseText['statusPlus'] == "seatBookedOpened") ? "sBO" : "sB";
					oSeat.className = theatreClassReplace(oSeat.className, catClass);
				}
				else if(aResponseText['status'] == "seatBookedByMe")
				{
					var catClass = (aResponseText['statusPlus'] == "seatBookedOpenedByMe") ? "sBOM" : "sBM";
					oSeat.className = theatreClassReplace(oSeat.className, catClass);
				}
				else if(aResponseText['status'] == "seatReserved")
				{
					var catClass = (aResponseText['statusPlus'] == "seatReservedForBookingOffice") ? "sRB" : "sR";
					catClass = (aResponseText['statusPlus'] == "seatReservedForAbo") ? "sRA" : catClass;
					catClass = (aResponseText['statusPlus'] == "seatReservedForGuestsgroup") ? "sRG" : catClass;
					catClass = (aResponseText['statusPlus'] == "seatReservedForGuestsgroupTicketssend") ? "sRGS" : catClass;
					oSeat.className = theatreClassReplace(oSeat.className, catClass);
				}
				else if(aResponseText['status'] == "seatReservedByMe")
				{
					var catClass = (aResponseText['statusPlus'] == "seatReservedForBookingOffice") ? "sRBM" : "sRM";
					catClass = (aResponseText['statusPlus'] == "seatReservedForAbo") ? "sRAM" : catClass;
					catClass = (aResponseText['statusPlus'] == "seatReservedForGuestsgroup") ? "sRGM" : catClass;
					catClass = (aResponseText['statusPlus'] == "seatReservedForGuestsgroupTicketssend") ? "sRGSM" : catClass;
					oSeat.className = theatreClassReplace(oSeat.className, catClass);
				}
				else if(aResponseText['status'] == "seatInactive")
				{
					oSeat.className = theatreClassReplace(oSeat.className, "sL sIA");
				}
				else if(aResponseText['status'] == "seatHidden")
				{
					oSeat.className = theatreClassReplace(oSeat.className, "sL sH");
				}
				else if(aResponseText['status'] == "seatAlreadyInUse")
				{
					var catClass = (aResponseText['rightlevel'] >= 10) ? "sL" : "sB";
					oSeat.className = theatreClassReplace(oSeat.className, catClass);
					
					alert(aResponseText['message']);
				}
				else if(aResponseText['status'] == "seatAlreadyBooked")
				{
					alert(aResponseText['message']);
				}
				else if(aResponseText['status'] == "seatsMaxNumberReached")
				{
					alert(aResponseText['message']);
				}
				
				// update basket data
				theatreUpdateBasketData(aResponseText);
			}
			
			
			// seat booking from reservation overview
			if(theatreAjax['targetArray']['trTicket'])
			{
				var oTicket = theatreAjax['targetArray']['trTicket'];
				
				if(aResponseText['status'] == "seatReserved")
				{
					oTicket.className = theatreClassReplace(oTicket.className, "tC"+aResponseText['category']);
				}
				else if(aResponseText['status'] == "seatLocked")
				{
					oTicket.className = theatreClassReplace(oTicket.className, "tLM");
					
					if(aResponseText['message'])
						alert(aResponseText['message']);
				}
				else if(aResponseText['status'] == "seatAlreadyInUse")
				{
					oTicket.className = theatreClassReplace(oTicket.className, "tL");
					alert(aResponseText['message']);
				}
				
				// update basket data
				theatreUpdateBasketData(aResponseText);
			}
			
			
			// seat booking from ticket selection overview
			if(theatreAjax['targetArray']['oSeatsCat'])
			{
				var oSeatsCat = theatreAjax['targetArray']['oSeatsCat'];
				var oLC = theatreAjax['targetArray']['tdLinkCheckout'];
				var oLCR = theatreAjax['targetArray']['tdLinkCheckoutReserve'];
				
				if(aResponseText['remainingSeats'] >= 0)
				{
					theatreSetSelectToValue(oSeatsCat, aResponseText['remainingSeats']);
					
					if(aResponseText['status'] == "seatsAlreadyInUse")
					{
						var selectedIndexNext = oSeatsCat.selectedIndex +1;
						while(selectedIndexNext < oSeatsCat.options.length)
							oSeatsCat.removeChild(oSeatsCat[oSeatsCat.options.length -1]);
					}
					
					alert(aResponseText['message']);
				}
				
				if(oLC)
				{
					if(aResponseText['countSeatsLocked'] <= 0)
						oLC.className = oLC.className.replace(/visible/gi, "hidden");
					else
						oLC.className = oLC.className.replace(/hidden/gi, "visible");
				}
				
				if(oLCR)
				{
					if(aResponseText['countSeatsLocked'] <= 0)
						oLCR.className = oLCR.className.replace(/visible/gi, "hidden");
					else
						oLCR.className = oLCR.className.replace(/hidden/gi, "visible");
				}
				
				// update basket data
				theatreUpdateBasketData(aResponseText);
			}
			
			
			// seat booking from tribunekinds overview
			if(theatreAjax['targetArray']['oSeatsTribuneKind'])
			{
				var oSeatsTribuneKind = theatreAjax['targetArray']['oSeatsTribuneKind'];
				var oLC = theatreAjax['targetArray']['tdLinkCheckout'];
				var oLCR = theatreAjax['targetArray']['tdLinkCheckoutReserve'];
				
				if(aResponseText['remainingSeats'] >= 0)
				{
					theatreSetSelectToValue(oSeatsTribuneKind, aResponseText['remainingSeats']);
					
					if(aResponseText['status'] == "seatsAlreadyInUse")
					{
						var selectedIndexNext = oSeatsTribuneKind.selectedIndex +1;
						while(selectedIndexNext < oSeatsTribuneKind.options.length)
							oSeatsTribuneKind.removeChild(oSeatsTribuneKind[oSeatsTribuneKind.options.length -1]);
						
						alert(aResponseText['message']);
					}
					
					if(aResponseText['status'] == "seatsCanNotBeOptimalSelected")
					{
						if(confirm(aResponseText['message']))
							location.href = aResponseText['redirect'];
					}
				}
				
				if(oLC)
				{
					if(aResponseText['countSeatsLocked'] <= 0)
						oLC.className = oLC.className.replace(/visible/gi, "hidden");
					else
						oLC.className = oLC.className.replace(/hidden/gi, "visible");
				}
				
				if(oLCR)
				{
					if(aResponseText['countSeatsLocked'] <= 0)
						oLCR.className = oLCR.className.replace(/visible/gi, "hidden");
					else
						oLCR.className = oLCR.className.replace(/hidden/gi, "visible");
				}
				
				// update basket data
				theatreUpdateBasketData(aResponseText);
			}
			
			// seat booking from seatnumbers overview
			if(theatreAjax['targetArray']['oNumber'])
			{
				var oNumber = theatreAjax['targetArray']['oNumber'];
				var oLC = theatreAjax['targetArray']['tdLinkCheckout'];
				var oLCR = theatreAjax['targetArray']['tdLinkCheckoutReserve'];
				
				for(var i=0; i<oNumber.length; i++)
				{
					var oNotice = document.getElementById("snNoticeF_"+i);
					if(oNotice)
					{
						if(theatreTrim(theatreGetFormFieldValue(oNumber[i])) != "")
						{
							if(aResponseText['message_'+i] != "")
							{
								theatreRemoveClass(oNotice, "requiredL|alrightL");
								
								if(aResponseText['status_'+i] == "failed")
									theatreAddClass(oNotice, "requiredL");
								else if(aResponseText['status_'+i] == "succeed")
									theatreAddClass(oNotice, "alrightL");
								
								if(aResponseText['message_'+i] != "")
									oNotice.innerHTML = aResponseText['message_'+i];
							}
						}
						else
						{
							theatreRemoveClass(oNotice, "requiredL|alrightL");
							oNotice.innerHTML = "";
						}
					}
				}
				
				if(oLC)
				{
					if(aResponseText['countSeatsLocked'] <= 0)
						oLC.className = oLC.className.replace(/visible/gi, "hidden");
					else
						oLC.className = oLC.className.replace(/hidden/gi, "visible");
				}
				
				if(oLCR)
				{
					if(aResponseText['countSeatsLocked'] <= 0)
						oLCR.className = oLCR.className.replace(/visible/gi, "hidden");
					else
						oLCR.className = oLCR.className.replace(/hidden/gi, "visible");
				}
				
				// update basket data
				theatreUpdateBasketData(aResponseText);
				
				if(aResponseText['redirect'] && theatreAjax['targetArray']['printerData'])
				{
					frameSpecialPrinter.location.href = aResponseText['redirect'] + "&autoSaveAndPrintData=" +theatreAjax['targetArray']['printerData'];
				}
			}
			
			
			// tR SYNC
			
			// tSR SYNC
			
			// theatreProcessPaymentData SYNC
			
			// theatreSetPaid SYNC
			
			// theatreSetTicketsSend SYNC
			
			// update filter for statistics
			if(theatreAjax['targetArray']['statistics'])
			{
				if(theatreAjax['targetArray']['stSelectionShippingkind'] && aResponseText['stSelectionShippingkind'])
					theatreAjax['targetArray']['stSelectionShippingkind'].innerHTML = aResponseText['stSelectionShippingkind'];
				
				if(theatreAjax['targetArray']['stSelectionEventsubcategory'] && aResponseText['stSelectionEventsubcategory'])
					theatreAjax['targetArray']['stSelectionEventsubcategory'].innerHTML = aResponseText['stSelectionEventsubcategory'];
				
				if(theatreAjax['targetArray']['stSelectionLocationHall'] && aResponseText['stSelectionLocationHall'])
					theatreAjax['targetArray']['stSelectionLocationHall'].innerHTML = aResponseText['stSelectionLocationHall'];
				
				if(theatreAjax['targetArray']['stSelectionPayment'] && aResponseText['stSelectionPayment'])
					theatreAjax['targetArray']['stSelectionPayment'].innerHTML = aResponseText['stSelectionPayment'];
				
				if(theatreAjax['targetArray']['stSelectionPerformancekind'] && aResponseText['stSelectionPerformancekind'])
					theatreAjax['targetArray']['stSelectionPerformancekind'].innerHTML = aResponseText['stSelectionPerformancekind'];
				
				if(theatreAjax['targetArray']['stSelectionCategory'] && aResponseText['stSelectionCategory'])
					theatreAjax['targetArray']['stSelectionCategory'].innerHTML = aResponseText['stSelectionCategory'];
				
				if(theatreAjax['targetArray']['stSelectionEventtype'] && aResponseText['stSelectionEventtype'])
					theatreAjax['targetArray']['stSelectionEventtype'].innerHTML = aResponseText['stSelectionEventtype'];
				
				if(theatreAjax['targetArray']['stSelectionEvent'] && aResponseText['stSelectionEvent'])
					theatreAjax['targetArray']['stSelectionEvent'].innerHTML = aResponseText['stSelectionEvent'];
				
				if(theatreAjax['targetArray']['stSelectionEventtime'] && aResponseText['stSelectionEventtime'])
					theatreAjax['targetArray']['stSelectionEventtime'].innerHTML = aResponseText['stSelectionEventtime'];
				
				if(theatreAjax['targetArray']['stSelectionRightlevel'] && aResponseText['stSelectionRightlevel'])
					theatreAjax['targetArray']['stSelectionRightlevel'].innerHTML = aResponseText['stSelectionRightlevel'];
				
				if(theatreAjax['targetArray']['stSelectionBookingoffice'] && aResponseText['stSelectionBookingoffice'])
					theatreAjax['targetArray']['stSelectionBookingoffice'].innerHTML = aResponseText['stSelectionBookingoffice'];
				
				if(theatreAjax['targetArray']['stSelectionUser'] && aResponseText['stSelectionUser'])
					theatreAjax['targetArray']['stSelectionUser'].innerHTML = aResponseText['stSelectionUser'];
				
				
				if(aResponseText['stReloadPage'] == "true")	// needed to reload the statistics page, because not all session data is available for the statistics at first call of the page
					location.reload();
			}
			
			theatreAjax['requestStatus'] = "END";
		}
	}
	
	
	// theatreBooking (for seat booking in booking mode)
	function tB(seatID, status, reservationreasonID, active)
	{
		var aBookingData = theatreGetBookingData();
		
		if(Number(aBookingData['eventtimeID']) <= 0 || Number(aBookingData['stageID']) <= 0 || Number(seatID) <= 0)
			return;
		
		var targetArray = new Array();
		targetArray['tdSeat'] = document.getElementById("s"+seatID);
		targetArray['trLinkCheckout'] = document.getElementById("linkCheckout");
		targetArray['trLinkCheckoutReserve'] = document.getElementById("linkCheckoutReserve");
		
		var url = "lib/ajax/booking.php";
		url += "?eventtimeID=" + aBookingData['eventtimeID'];
		url += "&stageID=" + aBookingData['stageID'];
		url += "&seatID=" + seatID;
		url += (status && status != "") ? ("&status=" + status) : "";
		url += (reservationreasonID && reservationreasonID != "") ? ("&reservationreasonID=" + reservationreasonID) : "";
		url += (active && active != "") ? ("&active=" + active) : "";
		theatreAjaxLoadXMLDoc(url, theatreAjaxCallback, targetArray);
	}
	
	
	// theatreEdit (for seat editing in edit mode)
	function tE(seatID, noFrameEditLoad)
	{
		var aBookingData = theatreGetBookingData();
		
		if(Number(aBookingData['eventtimeID']) <= 0 || Number(aBookingData['stageID']) <= 0 || Number(seatID) <= 0)
			return;
		
		var targetArray = new Array();
		targetArray['tdMode'] = document.getElementById("tdMode");
		targetArray['tdSeat'] = document.getElementById("s" + seatID);
		
		var url = "edit.php";
		url += "?eventtimeID=" + aBookingData['eventtimeID'];
		url += "&stageID=" + aBookingData['stageID'];
		url += "&seatID=" + seatID;
		
		if(!noFrameEditLoad)
		{
			// load seat data into the iframe
			targetArray['tdMode'].innerHTML = "<iframe name=\"frameEdit\" src=\"" + url + "\" class=\"frameEdit\" frameborder=\"0\"></iframe>";
			
			// scroll edited seat into the view (works buggy with ie)
			/*if(!theatreCONFIG['IE'])
				targetArray['tdSeat'].scrollIntoView(false);*/
		}
		
		// hilite clicked seat and reset last clicked seat
		if(targetArray['tdSeat'])
		{
			targetArray['tdSeat'].className = targetArray['tdSeat'].className.replace(/ sE/gi, "");
			targetArray['tdSeat'].className = targetArray['tdSeat'].className + " sE";
		}
		
		if(theatreAjax['lastEditedSeat'] && theatreAjax['lastEditedSeat'] != targetArray['tdSeat'])
			theatreAjax['lastEditedSeat'].className = theatreAjax['lastEditedSeat'].className.replace(/ sE/gi, "");
		
		theatreAjax['lastEditedSeat'] = targetArray['tdSeat'];
	}
	
	
	// theatreBooking from Reservation overview
	function tBR(seatID, eventtimeID, stageID)
	{
		var targetArray = new Array();
		targetArray['trTicket'] = document.getElementById("t" +seatID +"_" +eventtimeID);
		
		var url = "lib/ajax/bookingreservation.php";
		url += "?seatID=" + seatID;
		url += "&eventtimeID=" + eventtimeID;
		url += "&stageID=" + stageID;
		theatreAjaxLoadXMLDoc(url, theatreAjaxCallback, targetArray);
	}
	
	
	// theatreBooking from Ticket selection overview (without stage)
	function tBTS(category, thisObj)
	{
		var aBookingData = theatreGetBookingData();
		
		var targetArray = new Array();
		targetArray['oSeatsCat'] = document.getElementById("seatsCat_"+category);
		targetArray['oCostsCat'] = document.getElementById("costsCat_"+category);
		targetArray['tdLinkCheckout'] = document.getElementById("linkCheckout");
		targetArray['tdLinkCheckoutReserve'] = document.getElementById("linkCheckoutReserve");
		
		var seatsNumber = theatreGetFormFieldValue(targetArray['oSeatsCat']);
		var costs = theatreGetFormFieldValue(targetArray['oCostsCat']);
		var thisObjName = (thisObj) ? thisObj.name : "";
		
		if(thisObjName.indexOf("costsCat_") > -1)
		{
			if(costs > 0 && seatsNumber == 0)		seatsNumber = 1;
			else if(costs == 0 && seatsNumber > 0)	seatsNumber = 0;
			
			theatreSetSelectToValue(targetArray['oSeatsCat'], seatsNumber);
		}
		
		var url = "lib/ajax/bookingticketselection.php";
		url += "?eventtimeID=" + aBookingData['eventtimeID'];
		url += "&stageID=" + aBookingData['stageID'];
		url += "&category=" + category;
		url += "&seatsNumber=" + seatsNumber;
		url += (targetArray['oCostsCat']) ? "&costs=" + costs : "";
		theatreAjaxLoadXMLDoc(url, theatreAjaxCallback, targetArray);
	}
	
	
	// theatreBooking from Tribunekinds overview (without stage -> stagex_tribunekinds)
	function tBTK(tribuneKind, category, seatsNumber)
	{
		var aBookingData = theatreGetBookingData();
		
		var targetArray = new Array();
		targetArray['oSeatsTribuneKind'] = document.getElementById("seatsTribuneKind___"+tribuneKind+"___"+category);
		targetArray['tdLinkCheckout'] = document.getElementById("linkCheckout");
		targetArray['tdLinkCheckoutReserve'] = document.getElementById("linkCheckoutReserve");
		
		var url = "lib/ajax/bookingtribunekind.php";
		url += "?eventtimeID=" + aBookingData['eventtimeID'];
		url += "&stageID=" + aBookingData['stageID'];
		url += "&tribuneKind=" + tribuneKind;
		url += "&category=" + category;
		url += "&seatsNumber=" + seatsNumber;
		theatreAjaxLoadXMLDoc(url, theatreAjaxCallback, targetArray);
	}
	
	
	// theatreBooking from Seatnumbers overview (without stage -> stagex_seatnumbers)
	function tBSN(printerData)
	{
		var aBookingData = theatreGetBookingData();
		
		if(aBookingData['requestJson'])
		{
			var targetArray = new Array();
			targetArray['oNumber'] = document.getElementsByName("number");
			targetArray['oBestSeatBooking'] = document.getElementsByName("bestSeatBooking")[0];
			targetArray['oClearBefore'] = document.getElementsByName("clearBefore")[0];
			targetArray['printerData'] = printerData;
			
			targetArray['tdLinkCheckout'] = document.getElementById("linkCheckout");
			targetArray['tdLinkCheckoutReserve'] = document.getElementById("linkCheckoutReserve");
			
			
			if(targetArray['oClearBefore'])
			{
				if(targetArray['oClearBefore'].checked)
				{
					if(!confirm("Möchten wirklich reservierte zuerst freimachen?"))
						targetArray['oClearBefore'] = null;
				}
				else
					targetArray['oClearBefore'] = null;
			}
			
			
			var url = "lib/ajax/bookingseatnumbers.php";
			url += "?eventtimeID=" + aBookingData['eventtimeID'];
			url += "&stageID=" + aBookingData['stageID'];
			url += (targetArray['oBestSeatBooking']) ? "&bestSeatBooking=" + ((targetArray['oBestSeatBooking'].checked) ? "true" : "false") : "";
			url += (targetArray['oClearBefore']) ? "&clearBefore=" + ((targetArray['oClearBefore'].checked) ? "true" : "false") : "";
			url += "&requestJson=" + aBookingData['requestJson'];
			theatreAjaxLoadXMLDoc(url, theatreAjaxCallback, targetArray);
		}
		
		return false;
	}
	
	
	
	// theatreBookingQuick from events overview (book and print)	(SYNC)
	function tBQ(eventtimeID, stageID, seatsNumber)
	{
		var url = "lib/ajax/bookingquick.php";
		url += "?eventtimeID=" + eventtimeID;
		url += "&stageID=" + stageID;
		url += "&seatsNumber=" + seatsNumber;
		url += "&ts="+(new Date()).getTime();					// needed because ie has chaching problems
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(aResponseText)
		{
			if(aResponseText['hrefToTicketsSpecialPrinter'] && frameSpecialPrinter)
				frameSpecialPrinter.location.href = aResponseText['hrefToTicketsSpecialPrinter'];
				
			
			if(aResponseText['status'] == "soldout")
				alert(aResponseText['message']);
		}
	}
	
	
	// theatreSeatInfo (to show seat data in edit mode)
	function tSI(seatID)
	{
		var aBookingData = theatreGetBookingData();
		
		var url = "lib/ajax/seatinfo.php";
		url += "?stageID=" + aBookingData['stageID'];
		url += "&seatID=" + seatID;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(aResponseText)
		{
			var oSeat = document.getElementById("s"+seatID);
			if(oSeat && seatID == aResponseText['seatID'])
			{
				oSeat.removeAttribute("onmouseover");
				oSeat.innerHTML = "<div onmouseover=\""+aResponseText['onmouseover']+"\" onmouseout=\""+aResponseText['onmouseout']+"\" style='position:static;'>" + oSeat.innerHTML + "</div>";
			}
		}
	}
	
	
	function theatreGenerateTransactionNumber(thisObj, theatretypeID)
	{
		var result = "";
		
		var url = "lib/ajax/newtransactionnumber.php";
		url += "?theatretypeID=" + theatretypeID;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(aResponseText)
		{
			if(thisObj)
			{
				thisObj.value = aResponseText['transactionNumber'];
				result = aResponseText['transactionNumber'];
			}
		}
		
		return result;
	}
	
	
	function theatreSetAboTicketssend(bookingID, aboTicketssend)
	{
		var url = "lib/ajax/aboticketssend.php";
		url += "?bookingID=" + bookingID;
		url += "&aboTicketssend=" + aboTicketssend;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(aResponseText['message'])
			alert(aResponseText['message']);
	}
	
	
	function theatreSetPaid(customerID, paid)
	{
		var oTicketsSend = document.getElementsByName("ticketsSend"+customerID)[0];
		var oTRCustomer = theatreGetParent(oTicketsSend, "TR");
		
		var url = "lib/ajax/paid.php";
		url += "?customerID=" + customerID;
		url += "&paid=" + paid;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(!aResponseText['message'])
		{
			if(aResponseText['paid'] == "y")
			{
				oTRCustomer.className = oTRCustomer.className.replace(/markNotPaid/gi, "markPaid");
				oTicketsSend.className = oTicketsSend.className.replace(/displayNone/gi, "displayInline");
			}
			else if(aResponseText['paid'] == "n")
			{
				oTRCustomer.className = oTRCustomer.className.replace(/markPaid/gi, "markNotPaid");
				oTicketsSend.className = oTicketsSend.className.replace(/displayInline/gi, "displayNone");
			}
		}
		else
			alert(aResponseText['message']);
	}
	
	
	function theatreSetTicketsSend(customerID, ticketsSend)
	{
		var oPaid = document.getElementsByName("paid"+customerID)[0];
		var oTicketsSendDate = document.getElementById("ticketsSendDate"+customerID);
		
		var url = "lib/ajax/ticketssend.php";
		url += "?customerID=" + customerID;
		url += "&ticketsSend=" + ticketsSend;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(!aResponseText['message'])
		{
			if(aResponseText['ticketsSend'] == "y")
				oPaid.disabled = true;
			else if(aResponseText['ticketsSend'] == "n")
				oPaid.disabled = false;
			
			oTicketsSendDate.innerHTML = aResponseText['ticketsSendDate'];
		}
		else
			alert(aResponseText['message']);
	}
	
	
	function theatreSetWaitliststatus(waitlistID)
	{
		var oWaitliststatus = document.getElementsByName("waitliststatusID"+waitlistID)[0];
		var oTRWaitlist = theatreGetParent(oWaitliststatus, "TR");
		
		if(oWaitliststatus)
		{
			var url = "lib/ajax/waitliststatus.php";
			url += "?waitlistID=" + waitlistID;
			url += "&waitliststatusID=" + theatreGetFormFieldValue(oWaitliststatus);;
			
			var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
			
			if(!isNaN(aResponseText['waitliststatusID']))
			{
				oTRWaitlist.className = "markID"+aResponseText['waitliststatusID'];
			}
		}
	}
	
	
	function theatreFilterStatistics(thisObj)
	{
		var obj = new Array();
		obj['oShippingkind'] = document.getElementsByName("stShippingkindID")[0];
		obj['oEventsubcategory'] = document.getElementsByName("stEventsubcategoryID")[0];
		obj['oLocationHall'] = document.getElementsByName("stLocationHall")[0];
		obj['oPayment'] = document.getElementsByName("stPaymentID")[0];
		obj['oPerformancekind'] = document.getElementsByName("stPerformancekindID")[0];
		obj['oCategory'] = document.getElementsByName("stCategory")[0];
		obj['oEventtype'] = document.getElementsByName("stEventtypeID")[0];
		obj['oEvent'] = document.getElementsByName("stEventID")[0];
		obj['oEventtime'] = document.getElementsByName("stEventtimeID")[0];
		obj['oRightlevel'] = document.getElementsByName("stRightlevel")[0];
		obj['oBookingoffice'] = document.getElementsByName("stBookingofficeID")[0];
		obj['oUser'] = document.getElementsByName("stUserID")[0];
		
		var targetArray = new Array();
		targetArray['statistics'] = new Object();
		targetArray['stSelectionShippingkind'] = theatreGetParent(obj['oShippingkind'], "SPAN");
		targetArray['stSelectionEventsubcategory'] = theatreGetParent(obj['oEventsubcategory'], "SPAN");
		targetArray['stSelectionLocationHall'] = theatreGetParent(obj['oLocationHall'], "SPAN");
		targetArray['stSelectionPayment'] = theatreGetParent(obj['oPayment'], "SPAN");
		targetArray['stSelectionPerformancekind'] = theatreGetParent(obj['oPerformancekind'], "SPAN");
		targetArray['stSelectionCategory'] = theatreGetParent(obj['oCategory'], "SPAN");
		targetArray['stSelectionEventtype'] = theatreGetParent(obj['oEventtype'], "SPAN");
		targetArray['stSelectionEvent'] = theatreGetParent(obj['oEvent'], "SPAN");
		targetArray['stSelectionEventtime'] = theatreGetParent(obj['oEventtime'], "SPAN");
		targetArray['stSelectionRightlevel'] = theatreGetParent(obj['oRightlevel'], "SPAN");
		targetArray['stSelectionBookingoffice'] = theatreGetParent(obj['oBookingoffice'], "SPAN");
		targetArray['stSelectionUser'] = theatreGetParent(obj['oUser'], "SPAN");
		
		var url = "lib/ajax/statistics.php";
		url += "?stChangedBy=" + ((thisObj) ? thisObj.name : "init");
		url += "&stShippingkindID=" + theatreGetFormFieldValue(obj['oShippingkind']);
		url += "&stEventsubcategoryID=" + theatreGetFormFieldValue(obj['oEventsubcategory']);
		url += "&stLocationHall=" + theatreGetFormFieldValue(obj['oLocationHall']);
		url += "&stPaymentID=" + theatreGetFormFieldValue(obj['oPayment']);
		url += "&stPerformancekindID=" + theatreGetFormFieldValue(obj['oPerformancekind']);
		url += "&stCategory=" + theatreGetFormFieldValue(obj['oCategory']);
		url += "&stEventtypeID=" + theatreGetFormFieldValue(obj['oEventtype']);
		url += "&stEventID=" + theatreGetFormFieldValue(obj['oEvent']);
		url += "&stEventtimeID=" + theatreGetFormFieldValue(obj['oEventtime']);
		url += "&stRightlevel=" + theatreGetFormFieldValue(obj['oRightlevel']);
		url += "&stBookingofficeID=" + theatreGetFormFieldValue(obj['oBookingoffice']);
		url += "&stUserID=" + theatreGetFormFieldValue(obj['oUser']);
		
		theatreAjaxLoadXMLDoc(url, theatreAjaxCallback, targetArray);
	}
	
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	// Ajax user-defined SYNC-Functions
	////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// theatreTicketRemoving (SYNC)
	function tTR(thisObj, eventtimeID, stageID, seatID)
	{
		var targetArray = new Array();
		targetArray['trTicketRemove'] = theatreGetParent(thisObj, "TR");
		targetArray['tableTicketRemove'] = document.getElementById("bet"+eventtimeID);
		
		var url = "lib/ajax/booking.php";
		url += "?eventtimeID=" + eventtimeID;
		url += "&stageID=" + stageID;
		url += "&seatID=" + seatID;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		// seat removing on checkout
		if(targetArray['trTicketRemove'])
		{
			// remove seat from the html table
			if(aResponseText['status'] == "seatFree")
				targetArray['trTicketRemove'].parentNode.removeChild(targetArray['trTicketRemove']);
			
			var countSeatsLockedEventtime = aResponseText['countSeatsLocked'+aResponseText['eventtimeID']];
			if(!countSeatsLockedEventtime || countSeatsLockedEventtime <= 0)
			{
				if(targetArray['tableTicketRemove'])
				{
					targetArray['tableTicketRemove'].className = "displayNone";
					location.reload();
				}
			}
			
			if(aResponseText['reload'] == "true")
				location.reload();
				
			// redirect user to the stage page is user has deleted all tickets on the booking page
			if(aResponseText['countSeatsLocked'] <= 0)
				location.href = aResponseText['redirect'];
			
			// calcualate new prices
			if(aResponseText['eventtimeID'])
				tSR(null, null, aResponseText['eventtimeID']);
			
			// update basket data
			theatreUpdateBasketData(aResponseText);
		}
	}
	
	// theatreTicketRemovingAll (SYNC)
	function tTRAll()
	{
		var targetArray = new Array();
		
		var url = "lib/ajax/emptybasket.php";
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(aResponseText['redirect'])
			location.href = aResponseText['redirect'];
			
		// update basket data
		theatreUpdateBasketData(aResponseText);
	}
	
	// theatreSeatReduction (SYNC)
	theatre['memorizedPaymentID'] = null;
	function tSR(reductionID, bookingID, eventtimeID, customerID)
	{
		var targetArray = new Array();
		targetArray['spanEventtimeTotalPrice'] = document.getElementById("bsPEventtimeTotal"+eventtimeID);
		targetArray['spanEventtimeTotalBookingofficerate'] = document.getElementById("bsPEventtimeTotalBookingofficerate"+eventtimeID);
		targetArray['spanEventtimeTotalSystemrate'] = document.getElementById("bsPEventtimeTotalSystemrate"+eventtimeID);
		targetArray['spanBookingTotalPrice'] = document.getElementById("betPBookingTotal");
		targetArray['spanBookingTotalBookingofficerate'] = document.getElementById("betPBookingTotalBookingofficerate");
		targetArray['spanBookingTotalSystemrate'] = document.getElementById("betPBookingTotalSystemrate");
		targetArray['spanBookingTotalPriceSum'] = document.getElementById("betPBookingTotalSum");
		targetArray['spanEventtimeIdentityCardRequired'] = document.getElementById("betIdentityCardRequired"+eventtimeID);
		targetArray['selectPaymentID'] = document.getElementsByName("paymentID")[0];
		targetArray['trPayment'] = document.getElementById("trPayment");
		
		// voucher
		var voucher = document.getElementsByName("voucher")[0];
		if(voucher)
		{
			if(voucher.value && voucher.value != "")
				targetArray['textVoucher'] = voucher;
			
			targetArray['textVoucherRemaining'] = document.getElementById("pdVoucherRemaining");
		}
		
		// vouchercode
		var voucherCode = document.getElementsByName("voucherCode")[0];
		if(voucherCode)
		{
			if(voucherCode.value && voucherCode.value != "")
				targetArray['textVoucherCode'] = voucherCode;
		}
		
		// vouchercode to remove
		var voucherCodeRemove = document.getElementsByName("voucherCodeRemove")[0];
		if(voucherCodeRemove)
		{
			if(voucherCodeRemove.value && voucherCodeRemove.value != "")
				targetArray['textVoucherCodeRemove'] = voucherCodeRemove;
		}
		
		// vouchercodes list
		targetArray['textVoucherCodes'] = document.getElementById("pdVoucherCodes");
		
		// shippingcosts
		var shippingCosts = document.getElementsByName("shippingCosts")[0];
		if(shippingCosts)
		{
			if(shippingCosts.value && shippingCosts.value != "")
				targetArray['textShippingCosts'] = shippingCosts;
		}
		
		
		var url = "lib/ajax/reduction.php";
		url += "?ts="+(new Date()).getTime();					// needed because ie has chaching problems
		url += (eventtimeID) ? "&eventtimeID=" + eventtimeID : "";
		url += (reductionID) ? "&reductionID=" + reductionID : "";
		url += (bookingID) ? "&bookingID=" + bookingID : "";
		url += (customerID) ? "&customerID=" + customerID : "";
		url += (targetArray['textVoucher']) ? "&voucher=" + targetArray['textVoucher'].value : "";
		url += (targetArray['textVoucherCode']) ? "&voucherCode=" + targetArray['textVoucherCode'].value : "";
		url += (targetArray['textVoucherCodeRemove']) ? "&voucherCodeRemove=" + targetArray['textVoucherCodeRemove'].value : "";
		url += (targetArray['textShippingCosts']) ? "&shippingCosts=" + targetArray['textShippingCosts'].value : "";
		
		var aArrayResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(aArrayResponseText.length > 1)
		{}
		else
		{
			var aArrayResponseTextTmp = new Array();
			aArrayResponseTextTmp[0] = aArrayResponseText;
			aArrayResponseText = aArrayResponseTextTmp;
		}
		
		var reloadPage = false;
		
		for(var a=0; a<aArrayResponseText.length; a++)
		{
			aResponseText = aArrayResponseText[a];
			
			if(bookingID && aResponseText['seatPrice'])
				{targetArray['spanSeatPrice'] = document.getElementById("bsP"+aResponseText['bookingID']);}
			
			// seat reduction price on checkout
			if(targetArray['spanSeatPrice'])						targetArray['spanSeatPrice'].innerHTML = aResponseText['seatPrice'];
			
			// eventtime total reduction price on checkout
			if(targetArray['spanEventtimeTotalPrice'])				targetArray['spanEventtimeTotalPrice'].innerHTML = aResponseText['eventtimeTotalPrice'];
			if(targetArray['spanEventtimeTotalBookingofficerate'])	targetArray['spanEventtimeTotalBookingofficerate'].innerHTML = aResponseText['eventtimeTotalBookingofficerate'];
			if(targetArray['spanEventtimeTotalSystemrate'])			targetArray['spanEventtimeTotalSystemrate'].innerHTML = aResponseText['eventtimeTotalSystemrate'];
			
			// total reduction price on checkout
			if(targetArray['spanBookingTotalPrice'])				targetArray['spanBookingTotalPrice'].innerHTML = aResponseText['bookingTotalPrice'];
			if(targetArray['spanBookingTotalBookingofficerate'])	targetArray['spanBookingTotalBookingofficerate'].innerHTML = aResponseText['bookingTotalBookingofficerate'];
			if(targetArray['spanBookingTotalSystemrate'])			targetArray['spanBookingTotalSystemrate'].innerHTML = aResponseText['bookingTotalSystemrate'];
			
			// total reduction price with shippingCosts on checkout
			if(targetArray['spanBookingTotalPriceSum'])				targetArray['spanBookingTotalPriceSum'].innerHTML = aResponseText['bookingTotalPriceSum'];
			
			// set remaining voucher if available
			if(targetArray['textVoucherRemaining'])					targetArray['textVoucherRemaining'].innerHTML = aResponseText['voucherRemaining'];
			
			// set voucher codes if available
			if(targetArray['textVoucherCodes'])
			{
				if(targetArray['textVoucherCode'])					targetArray['textVoucherCode'].value = "";
				
				targetArray['textVoucherCodes'].innerHTML = aResponseText['voucherCodes'];
			}
			
			// remove voucher code if available
			if(targetArray['textVoucherCodeRemove'])
			{
				if(targetArray['textVoucherCodeRemove'])			targetArray['textVoucherCodeRemove'].value = "";
			}
			
			// set change ticket reduction automatically if available
			if(aResponseText['changeTicketReductionName'] && aResponseText['changeTicketCategory'])
			{
				var aSelectBoxes = document.getElementsByTagName("SELECT");
				for(var i=0; i<aSelectBoxes.length; i++)
				{
					// check only for reduction-Selectboxes without the reductionSet-Selectbox
					if(aSelectBoxes[i].id.match(/reduction\d+/) && aSelectBoxes[i].className.indexOf("bsRSelectSet") < 0)
					{
						// check for non-set selectboxes (only selectboxes with default value)
						if(theatreGetFormFieldValue(aSelectBoxes[i]) == 1)
						{
							// try to get the reductionCategory from the className
							var cat = 1;
							var oTR = theatreGetParent(aSelectBoxes[i], "TR");
							if(oTR)
							{
								var catTmp = oTR.className.split("tC");
								catTmp = parseInt(catTmp[1]);
								cat = isNaN(catTmp) ? 1 : catTmp;
							}
							
							// check for the right category
							if(cat == aResponseText['changeTicketCategory'])
							{
								var reductionValue = theatreGetSelectValueFromText(aSelectBoxes[i], aResponseText['changeTicketReductionName']);
								if(reductionValue)
								{
									theatreSetSelectToValue(aSelectBoxes[i], reductionValue); 
									aSelectBoxes[i].onchange();
									break;
								}
							}
						}
					}
				}
			}
			
			//memorize paymentID
			if(targetArray['selectPaymentID'] && !theatre['memorizedPaymentID'])
				theatre['memorizedPaymentID'] = theatreGetFormFieldValue(targetArray['selectPaymentID']);
			theatre['memorizedPaymentID'] = (theatre['memorizedPaymentID']) ? theatre['memorizedPaymentID'] : 3;
			
			// set paymentID to 5 (voucher) if voucher is higher as totalprice
			if(targetArray['selectPaymentID'] && targetArray['textVoucher'])
			{
				var valVoucher = parseFloat(targetArray['textVoucher'].value);
				var valTotalPrice = parseFloat(aResponseText['bookingTotalPriceSum']);
				var selectedPaymentID = targetArray['selectPaymentID'].options[targetArray['selectPaymentID'].selectedIndex].value;
				
				if(valVoucher > 0 && valTotalPrice <= 0)
					theatreSetSelectToValue(targetArray['selectPaymentID'], 5);
				else if(valVoucher > 0 && valTotalPrice > 0 && selectedPaymentID == "5")
					theatreSetSelectToValue(targetArray['selectPaymentID'], theatre['memorizedPaymentID']);
			}
			
			
			// hide payment fields if total price amounts to 0.00 (e.g. if voucher codes are higher as total price)
			if(aResponseText['voucherCodes'] && targetArray['trPayment'])
			{
				if(aResponseText['bookingTotalPriceSum'] <= 0)
				{
					theatreDiplayPaymentFields(5);
					targetArray['trPayment'].className = targetArray['trPayment'].className.replace(/displayTR/gi, "displayNone");
				}
				else
				{
					theatreDiplayPaymentFields(theatre['memorizedPaymentID']);
					targetArray['trPayment'].className = targetArray['trPayment'].className.replace(/displayNone/gi, "displayTR");
				}
			}
			
			// set reloadPage param if given
			reloadPage = (aResponseText['reload'] == "true") ? true : reloadPage;
			
			
			// show notice if one seat has been marked as reduced
			if(targetArray['spanEventtimeIdentityCardRequired'])
			{
				var oIC = targetArray['spanEventtimeIdentityCardRequired'];
				if(aResponseText['eventtimeSeatsReduced'] > 0)
					oIC.className = oIC.className.replace(/hidden/gi, "visible");
				else
					oIC.className = oIC.className.replace(/visible/gi, "hidden");
			}
			
			
			// update basket data
			theatreUpdateBasketData(aResponseText);
			
			// calculates the back money (function is defined only in checkout.php and for rightlevel >= 10)
			if(typeof theatreCalculateBackMoney != "undefined")
				theatreCalculateBackMoney();
		}
		
		if(reloadPage)
			location.reload();
	}
	
	// same as tSR but only to change a set of reductions
	function tSRSet(reductionID, bookingID, eventtimeID, customerID)
	{
		if(reductionID != "")
		{
			tSR(reductionID, bookingID, eventtimeID, customerID);
			
			// change the selectedIndex of all reduction selectboxes
			var aReductionIDs = reductionID.split(",");
			var aBookingIDs = bookingID.split(",");
			for(var i=0; i<aBookingIDs.length; i++)
			{
				var oSelectReduction = document.getElementsByName("reduction"+aBookingIDs[i])[0];
				
				if(oSelectReduction && !isNaN(aReductionIDs[i]))
					theatreSetSelectToValue(oSelectReduction, aReductionIDs[i]);
			}
		}
	}
	
	
	// (SYNC)
	function theatreProcessPaymentData(country, paymentID, shippingkindID)
	{
		var targetArray = new Array();
		targetArray['tdPaymentData'] = document.getElementById("tdPaymentData");
		
		var callerScriptname = "";
		if(document.URL.indexOf("checkout") > -1)
			callerScriptname = "checkout";
		else if(document.URL.indexOf("bookings_edit") > -1)
			callerScriptname = "bookings_edit";
		
		
		var url = "lib/ajax/payment.php";
		url += "?country=" + country;
		url += (paymentID) ? "&paymentID=" + paymentID : "";
		url += (shippingkindID) ? "&shippingkindID=" + shippingkindID : "";
		url += (callerScriptname) ? "&callerScriptname=" + callerScriptname : "";
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		// output payment data, depending on the rightlevel and selected customer country
		if(targetArray['tdPaymentData'])
		{
			targetArray['tdPaymentData'].innerHTML = aResponseText['paymentData'];
			theatreDiplayPaymentFields(aResponseText['paymentID']);
		}
	}
	
	// (SYNC)
	function theatreProcessLocationData(cityID, locationType, locationTypeID)
	{
		var targetArray = new Array();
		targetArray['tdLocationData'] = document.getElementById("td" +theatreUCFirst(locationType) +"Data");
		
		var url = "lib/ajax/location.php";
		url += "?cityID=" + cityID;
		url += "&locationType=" + locationType;
		url += "&locationTypeID=" + locationTypeID;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		// output location data, depending on the selected city
		if(targetArray['tdLocationData'])
		{
			targetArray['tdLocationData'].innerHTML = aResponseText['locationData'];
			
			// force to load empty hall selection box
			if(locationType)
				theatreProcessHallData(locationTypeID, locationType.replace("location", "hall"), 0);
		}
	}
	
	// (SYNC)
	function theatreProcessHallData(locationID, hallType, hallTypeID)
	{
		var targetArray = new Array();
		targetArray['tdHallData'] = document.getElementById("td" +theatreUCFirst(hallType) +"Data");
		
		var url = "lib/ajax/hall.php";
		url += "?locationID=" + locationID;
		url += "&hallType=" + hallType;
		url += "&hallTypeID=" + hallTypeID;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		// output hall data, depending on the selected location
		if(targetArray['tdHallData'])
		{
			targetArray['tdHallData'].innerHTML = aResponseText['hallData'];
		}
	}
	
	// (SYNC)
	function theatreProcessEventtypeData(theatretypeID, eventtypeID, eventtypeType)
	{
		var targetArray = new Array();
		targetArray['tdEventtypeData'] = document.getElementById("td"+theatreUCFirst(eventtypeType)+"Data");
		
		var url = "lib/ajax/eventtype.php";
		url += "?theatretypeID=" + theatretypeID;
		url += "&eventtypeID=" + eventtypeID;
		url += "&eventtypeType=" + eventtypeType;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		// output eventtype data, depending on the selected theatretype
		if(targetArray['tdEventtypeData'])
		{
			targetArray['tdEventtypeData'].innerHTML = aResponseText['eventtypeData'];
		}
	}
	
	// (SYNC)
	function theatreProcessPeriodEventtimes(targetObj, dateFrom, dateTo, eventtypeID, selectBoxName)
	{
		var url = "lib/ajax/periodeventtimes.php";
		url += "?dateFrom=" + dateFrom;
		url += "&dateTo=" + dateTo;
		url += "&eventtypeID=" + eventtypeID;
		url += (selectBoxName) ? ("&selectBoxName=" + selectBoxName) : "";
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		if(targetObj)
		{
			targetObj.innerHTML = aResponseText['periodEventtimeData'];
		}
	}
	
	// (SYNC)
	function theatreProcessMysearchLocationData(cityID)
	{
		var targetArray = new Array();
		targetArray['tdMysearchLocationData'] = document.getElementById("tdMysearchLocationData");
		
		var url = "lib/ajax/location_mysearch.php";
		url += "?cityID=" + cityID;
		
		var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
		
		// output mysearchLocation data, depending on the selected city
		if(targetArray['tdMysearchLocationData'])
		{
			targetArray['tdMysearchLocationData'].innerHTML = aResponseText['mysearchLocationData'];
		}
	}
	
	// (SYNC)
	function theatreCheckReductionCode(reductionID, thisObj)
	{
		var reductionCode = theatreGetFormFieldValue(thisObj);
		var targetArray = new Array();
		
		var url = "lib/ajax/reductioncode.php";
		url += "?reductionID=" + reductionID;
		url += "&reductionCode=" + escape(reductionCode);
		
		if(!isNaN(reductionID) && reductionCode != "")
		{
			var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
			
			if(aResponseText['reductionCodeOK'] == "true")
			{
				targetArray['reductionData'] = document.getElementById("reductionData_" +reductionID);
				if(targetArray['reductionData'])
				{
					thisObj.blur();
					theatreAddClass(thisObj, "displayNone");
					theatreRemoveClass(targetArray['reductionData'], "displayNone");
				}
			}
		}
	}
	
	
	// (SYNC)
	function theatreSortorder(sortID, swapSortID, direction)
	{
		var targetArray = new Array();
		
		var url = "lib/ajax/sortorder.php";
		url += "?sortID=" + sortID;
		url += "&swapSortID=" + swapSortID;
		url += "&direction=" + direction;
		
		if(!isNaN(sortID) && !isNaN(swapSortID))
		{
			var aResponseText = theatreAjaxLoadXMLDoc(url, null, null);
			
			// output mysearchLocation data, depending on the selected city
			if(aResponseText['success'] != "true")
			{
				//alert("Konnte nicht sortiert werden");
			}
		}
	}
	
	
	// (SYNC)
	function theatreSetTicketsPrinted(customerID, ticketsPrinted)
	{
		var targetArray = new Array();
		targetArray['ticketsPrinted'] = document.getElementsByName("ticketsPrinted"+customerID)[0];
		
		var url = "lib/ajax/ticketsprinted.php";
		url += "?customerID=" + customerID;
		url += "&ticketsPrinted=" + ticketsPrinted;
		
		theatreAjaxLoadXMLDoc(url, null, null);
	}
	
	
	// (ASYNC)
	function theatreStageScrollTo(x, y, tribuneKind, stageContainerName)
	{
		var oStageContainer = document.getElementById("stageContainer");
		if(stageContainerName)
			oStageContainer = document.getElementById(stageContainerName);
		
		if(oStageContainer)
		{
			oStageContainer.scrollLeft = x;
			oStageContainer.scrollTop = y;
			
			if(tribuneKind)
			{
				var url = "lib/ajax/laststageuri.php";
				url += "?tribuneKind=" + tribuneKind;
			
				theatreAjaxLoadXMLDoc(url, function(){}, null);
			}
		}
	}
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	// Misc-functions
	////////////////////////////////////////////////////////////////////////////////////////////////////
	function theatreUpdateBasketData(basketData)
	{
		if(!basketData)
			return;
		
		var oBasketCountTickets = document.getElementById('basketCountTickets');
		var oBasketTotalPrice = document.getElementById('basketTotalPrice');
		var oBasketBoxData = document.getElementById('basketBoxData');
		
		if(oBasketCountTickets && oBasketTotalPrice)
		{
			oBasketCountTickets.innerHTML = basketData['basketCountTickets'];
			oBasketTotalPrice.innerHTML = basketData['basketTotalPrice'];
			
			var oBasketDataExtra = document.getElementById('basketDataExtra');
			var oBastketData = theatreGetParent(oBasketCountTickets, "SPAN");
			
			
			if(basketData['basketCountTickets'] > 0)
			{
				theatreReplaceClass(oBasketBoxData, "displayBlock", "displayNone");
				if(oBasketDataExtra && oBastketData)
				{
					oBasketDataExtra.innerHTML = String(oBastketData.innerHTML).replace(/id/gi, "class");
					theatreReplaceClass(oBasketDataExtra, "visible", "hidden");
				}
			}
			else
			{
				theatreReplaceClass(oBasketBoxData, "displayNone", "displayBlock");
				if(oBasketDataExtra && oBastketData)
				{
					theatreReplaceClass(oBasketDataExtra, "hidden", "visible");
				}
			}
		}
	}
	
	function theatreRemoveVoucherCode(voucherCode)
	{
		var voucherCodeRemove = document.getElementsByName("voucherCodeRemove")[0];
		
		if(voucherCodeRemove && voucherCode)
		{
			voucherCodeRemove.value = voucherCode;
			tSR();
		}
	}