	/* phpURL - URL do aktualizacji */
	var phpURL = "ajax/ajax_bilety.php";
	/* tworzy obiekty XMLHttpRequest, które zaktualizuja wiadomosci rozmowy i pobiora wybrany kolor*/
	var xmlHttpGetMessages = createXmlHttpRequestObject();
	/* zmienna, która okresla jak czesto laczyc sie z serwerem*/
	var updateInterval = 1000; // w milisekundach
	// ustawione na true, wyswietla szczególowy komunikat o bledach
	var debugMode = false;
	/* rozpoczyna zapisywanie wiadomosci w pamieci podrecznej */
	var cache = new Array();
	/* lastMessageID - tidentyfikator najswieższej wiadomosci rozmowy */
	var lastMessageID = -1; 

	
	function loguj(txt)
	{
		if(debugMode)
			document.getElementById('test').innerHTML = txt + '<br />' + document.getElementById('test').innerHTML;
		return '';
	}

	function printElt2(element, index, array) 
	{
		if(element==1)//	loguj(element);
			document.getElementById('miejsca').value += ',' + index;
	}
	
	function printElt(element, index, array) 
	{
		document.getElementById('miejsca').value += '||' + index;
		element.forEach(printElt2);
	}
	
	function inicjalizuj_ruch(x,y)
	{
		var k = sala[x][y];
		k = k.toString();

		if(k != 2)
		{
			loguj('k=' + k + ', sala[x][y]=' + sala[x][y]);
			//requestNewMessages();
			var dest = 'img_' + x + '_' + y;
			loguj('dest' + dest);
			switch(k)
			{
				case '0': 
					loguj(' Case 0');
					document.getElementById(dest).src='img/wybrane.jpg';
					sala[x][y] = 1;
					break;
				case '1': 
					document.getElementById(dest).src='img/dost.jpg';
					loguj(' Case 1');
					sala[x][y] = 0;
					break;
				default: 
					loguj(' Case default');
					document.getElementById(dest).src='img/wybrane.jpg';
					sala[x][y] = 1;
			}

		document.getElementById('miejsca').value = '';
		sala.forEach(printElt);
		loguj(document.getElementById('miejsca').value);


		//loguj('tablica sala ' + sala[1][1] + sala[1][2] + sala[1][3] + sala[1][4] + sala[2][1] + sala[2][2] + sala[2][3] + sala[2][4] + sala[3][1] + sala[3][2]);
		}
		return '';
	}
	
	/* zmienia status pojedyńczego fotela */
	function zmien_status(x,y,status)
	{
		var dest = 'img_' + x + '_' + y;
		switch(status)
		{
			case '1': 
				document.getElementById(dest).src='img/wybrane.jpg';
				sala[x][y] = 1;
				break;
			case '2': 
			case '3':
				document.getElementById(dest).src='img/niedost.jpg';
				sala[x][y] = 2;
				break;
			default: 
				document.getElementById(dest).src='img/dost.jpg';
				sala[x][y] = 0;
		}
	}
	
	/* tworzy instancje obiektu XMLHttpRequest */
	function createXmlHttpRequestObject() 
	{
	  //przechowa referencje do obiektu XMLHttpRequest 
	  var xmlHttp;
	  // powinno zadzialac dla przegladarek nowszych niż IE6
	  try
	  {
		// próbuje utworzyc obiekt XMLHttpRequest
		xmlHttp = new XMLHttpRequest();
	  }
	  catch(e)
	  {
		// zakladajac że przegladarka jest IE6 lub starsza
		var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
										"MSXML2.XMLHTTP.5.0",
										"MSXML2.XMLHTTP.4.0",
										"MSXML2.XMLHTTP.3.0",
										"MSXML2.XMLHTTP",
										"Microsoft.XMLHTTP");
		// sprawdza każdy prog id, aż którys zadziala
		for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) 
		{
		  try 
		  { 
			// próbuje utworzyc obiekt XMLHttpRequest
			xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
		  } 
		  catch (e) {}
		}
	  }
	  // zwraca utworzony obiekt lub wyswietla wiadomosc o bledzie
	  if (!xmlHttp)
		alert("Blad podczas tworzenia obiektu XMLHttpRequest.");
	  else 
		return xmlHttp;
	}

	/* funkcja wywolana po wcisnieciu przycisku "Usuń wszystko" */
/*	function deleteMessages()
	{
	  // ustawia flage, która okresla, że wiadomosci sa usuwane
	  params = "mode=DeleteAndRetrieveNew";  
	  // dodaje wiadomosc do kolejki
	  cache.push(params);
	}
*/
	/* wysyla asynchroniczne żadanie, aby pobrac nowe wiadomosci, wyslac je lub usunac*/
	function requestNewMessages()
	{  
	  // kontynuuje jesli xmlHttpGetMessages nie jest pusty
	  if(xmlHttpGetMessages)
	  {
		try
		{
		  // nie zaczyna nowej operacji na serwerze, jesli jakas jest wykonywana
		  if (xmlHttpGetMessages.readyState == 4 || 
			  xmlHttpGetMessages.readyState == 0) 
		  {
			// przechowa parametry potrzebne do wykonania żadania na serwerze
			var params = "";
			// jesli w kolejce czekaja wiadomosci, to pobiera najstarsza
			if (cache.length>0)
			  params = cache.shift();
			// jesli pamiec jest pusta, pobiera nowa wiadomosc
			else
			  params = "last_id=" + lastID + "&spektakl=" + spektakl;
			loguj(params);
			// wywoluje dzialania po stronie serwera
			xmlHttpGetMessages.open("POST", phpURL, true);
			xmlHttpGetMessages.setRequestHeader("Content-Type", 
									   "application/x-www-form-urlencoded");
			xmlHttpGetMessages.onreadystatechange = handleReceivingMessages;
	 
			xmlHttpGetMessages.send(params);
			setTimeout("requestNewMessages();", updateInterval);
		  }
		  else
		  {
			// sprawdza ponownie czy sa nowe wiadomosci
			setTimeout("requestNewMessages();", updateInterval);
		  }
		}
		catch(e)
		{
		  displayError(e.toString());
		}
	  }
	}


	/* funkcja obslugujaca odpowiedz HTTP podczas aktualizacji wiadomosci*/
	function handleReceivingMessages() 
	{
	  // kontynuuje jesli proces jest zakończony
	  if (xmlHttpGetMessages.readyState == 4) 
	  {
		// kontynuuje, jesli status HTTP ma wartosc "OK"
		if (xmlHttpGetMessages.status == 200) 
		{
		  try
		  {
			// przetwarza odpowiedz serwera
			readMessages();
		  }
		  catch(e)
		  {
			// wyswietla wiadomosc o bledzie
			displayError(e.toString());
		  }
		} 
		else
		{
		  // wyswietla wiadomosc o bledzie
		  displayError(xmlHttpGetMessages.statusText);
		}
	  }
	}

	/* funkcja obslugujaca odpowiedz serwera podczas aktualizacji wiadomosci*/
	function readMessages()
	{  
	  // pobiera odpowiedz serwera
	  var response = xmlHttpGetMessages.responseText;
	  // blad serwera?
	  if (response.indexOf("ERRNO") >= 0 
		  || response.indexOf("blad:") >= 0
		  || response.length == 0)
		throw(response.length == 0 ? "Pusta odpowiedz serwera." : response);
	  // pobiera element dokumentu
	  response = xmlHttpGetMessages.responseXML.documentElement;
	  // pobiera flage okreslajaca czy okno rozmowy zostalo wyczyszczone czy nie
	//  clearChat = 
	//		   response.getElementsByTagName("clear").item(0).firstChild.data;
	  // pobiera tablice z odpowiedzi serwera
	  idArray = response.getElementsByTagName("id");
	  xArray = response.getElementsByTagName("x");
	  yArray = response.getElementsByTagName("y");
	  statusArray = response.getElementsByTagName("status");
	  // dodaje nowa wiadomosc do okna rozmowy
	  displayMessages(idArray, xArray, yArray, statusArray);
	  // przechowuje lokalnie ID ostatniej otrzymanej wiadomosci
	 // if(idArray.length>0)
	//	lastMessageID = idArray.item(idArray.length - 1).firstChild.data;
	  // ponownie uruchamia sekwencje
	  setTimeout("requestNewMessages();", updateInterval);
	}

	/* funkcja dodajaca nowe wiadomosci do okna rozmowy */
	function displayMessages(idArray, xArray, yArray, statusArray)
	{
	  // każdy przebieg petli dodaje nowa wiadomosc
	  for(var i=0; i<idArray.length; i++)
	  {
		// pobiera szczególy wiadomosci
		var x = xArray.item(i).firstChild.data.toString();
		var y = yArray.item(i).firstChild.data.toString();
		var status = statusArray.item(i).firstChild.data.toString();
		lastID = idArray.item(i).firstChild.data.toString();
		// tworzy kod HTML, który wyswietli wiadomosc
		loguj(x + ', ' + y + ', ' + status + 'id=' + lastID);
		zmien_status(x,y,status);
	  }
	}

	// funkcja wyswietlajaca komunikat o bledzie
	function displayError(message)
	{
	  // wyswietla wiadomosc o bledzie ze szczególami technicznymi, jesli debugMode ma ustawienie true
	  //displayMessage("Blad podczas dostepu do serwera! "+
		//(debugMode ? "<br/>" + message : ""));
		return '';
	}
	
	/* usuwa spacje z poczatku i końca lańcucha*/
	function trim(s)
	{
		return s.replace(/(^\s+)|(\s+$)/g, "")
	}
