// Obsluga funkcjonalnosci typu Ajax

// holds an instance of XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();

// creates an XMLHttpRequest instance
function createXmlHttpRequestObject()
{
	// w tej zmiennej bedzie referencja do obiektu XMLHttpRequest
	var xmlHttp;
	// to powinno zadzialac we wszystkich przegladarkach oprocz IE
	try
	{
		// probojemy stworzyc obiekt XMLHttpRequest
		xmlHttp = new XMLHttpRequest();
	}
	catch(e)
	{
		// zakładamy że przeglądarka to IE6 lub starszy
		var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");
		// probujemy w kazdym z nich
		for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
		{
			try
			{
				// probujemy stworzyc obiekt XMLHttpRequest 
				xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
			}
			catch (e) {}
		}
	}
	// zwraca utworzony obiekt lub wyswietla komunikat o bledzie
	if (!xmlHttp)
		alert("Błąd podczas tworzenia obiektu XMLHttpRequest.");
	else
		return xmlHttp;
}

/////////////////////// W Y W O L A N I A /////////////////////////////

// wywolanie wyswietlenia drzewa watków z których jeden jest rozwinięty a ewentualny post jest wyświetlony w sekcji podgląd
function otworzForum(watek,post,lang)
{
	// tylko jesli xmlHttp różny od void
	if (xmlHttp)
	{
		// próba podłączenia do serwera
		try
		{
			//zmieniamy wartosc akcji w taki sposob zeby wywolal sie odpowiedni kod w kontrolerze
			// i tworzymy string z parametrami
			var params = "watek=" + watek + "&post=" + post + "&akcja=1&lang=" + lang;
			
			// inicjujemy połączenie ajax
			xmlHttp.open("GET", "../class/kontrolerForum.php?" + params, true);
			// okreslamy ktora funkcja ma obsluzyc odpowiedz
			xmlHttp.onreadystatechange = handleRequestOdrysujForum;
			xmlHttp.send(null);
		}
		// komunikat o błędzie
		catch (e)
		{
			//Wersja developerska
			//alert("Nie mogę połączyć się z serwerem:\n" + e.toString());
			alert("Nie mogę połączyć się z serwerem.");
		}
	}
}

// wyswietlenie formularza odpowiedzi na post w sekcji podglad
// i guzików
function nowyPost(watek,post,lang)
{
	// tylko jesli xmlHttp różny od void
	if (xmlHttp)
	{
		// próba podłączenia do serwera
		try
		{
			//zmieniamy wartosc akcji w taki sposob zeby wywolal sie odpowiedni kod w kontrolerze
			// i tworzymy string z parametrami
			var params = "watek=" + watek + "&post=" + post + "&akcja=2&lang=" + lang;
			
			// inicjujemy połączenie ajax
			xmlHttp.open("GET", "../class/kontrolerForum.php?" + params, true);
			// okreslamy ktora funkcja ma obsluzyc odpowiedz
			xmlHttp.onreadystatechange = handleRequestOdrysujPost	;
			xmlHttp.send(null);
		}
		// komunikat o błędzie
		catch (e)
		{
			//Wersja developerska
			//alert("Nie mogę połączyć się z serwerem:\n" + e.toString());
			alert("Nie mogę połączyć się z serwerem.");
		}
	}
}

// zapisanie wypełnionego przez juzera formularza w bazie i odrysowanie forum
// i guzików
function zapiszPost(lang)
{
	// tylko jesli xmlHttp różny od void
	if (xmlHttp)
	{
		// próba podłączenia do serwera
		try
		{
			var topic = document.getElementById("topic").value;
			var sender = document.getElementById("sender").value;
			var parent = document.getElementById("parent").value;
			var content = document.getElementById("content").value;
			var key = document.getElementById("key").value;
			var email = document.getElementById("email").value;
			var secret = MD5(document.getElementById("secret").value);
			//zmieniamy wartosc akcji w taki sposob zeby wywolal sie odpowiedni kod w kontrolerze
			// i tworzymy string z parametrami
			var params = "topic=" + topic + "&sender=" + sender + "&email=" + email + "&parent=" + parent + "&content=" + content + "&akcja=3" + "&secret=" + secret + "&key=" + key + "&lang=" + lang;

			// inicjujemy połączenie ajax w trybie GET
			xmlHttp.open("GET", "../class/kontrolerForum.php?" + encodeURI(params), true);
			// a tu na przyszłość w trybie POST
			//xmlHttp.open("POST", "kontrolerForum.php?" + params, true);
			//xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			//XmlHttp.send('topic=' + escape(topic) + '&sender=' + escape(sender) + '&email=' + escape(email) + '&parent=' + escape(parent) + '&content=' + escape(content) + '&secret=' + escape(secret) + '&akcja=3');
			
			// okreslamy ktora funkcja ma obsluzyc odpowiedz
			xmlHttp.onreadystatechange = handleRequestOdrysujForum;
			xmlHttp.send(null);
		}
		// komunikat o błędzie
		catch (e)
		{
			//Wersja developerska
			//alert("Nie mogę połączyć się z serwerem:\n" + e.toString());
			alert("Nie mogę połączyć się z serwerem.");
		}
	}
}
/////////////////////// O D P O W I E D Z I /////////////////////////////

///////////////////////////////
// Odrysowanie całego forum
///////////////////////////////

//funkcja obsługi wywoływana gdy zmienia się status połączenia http
//dla funkcji odrysowujących całe forum razem z drzewem wątków
function handleRequestOdrysujForum()
{
	// jeśli readyState = 4, jesteśmy gotowi do odczytu serverResponse
	if (xmlHttp.readyState == 4)
	{
		// continue only if HTTP status is "OK"
		if (xmlHttp.status == 200)
		{
			try
			{
				// jest ok więc obsługujemy odpowiedź z serwera w osobnej funkcji
				responseOdrysujForum();
			}
			catch(e)
			{
				// komunikat o błędzie - wersja developerska
				//alert("Error reading the response: " + e.toString());
				alert("Error reading the response. Please try again or contact administrator.");
			}
		}
		else
		{
			// wyświetlenie komunikatu o statusie - wersja developerska 
			//alert("There was a problem retrieving the data:\n" + xmlHttp.statusText);
			alert("There was a problem retrieving the data. Please try again or contact administrator.");
		}
	}
}

function responseOdrysujForum()
{
	// read the message from the server
	var xmlResponse = xmlHttp.responseXML;
	
	// wyłapywanie błędów xml'a w IE i Operze
	if (!xmlResponse || !xmlResponse.documentElement)
		throw("Nieprawidłowa struktura XML:\n" + xmlHttp.responseText);
	
	// wyłapywanie ewentualnych błędów w Firefoksie
	var rootNodeName = xmlResponse.documentElement.nodeName;
	if (rootNodeName == "parsererror") throw("Nieprawidłowa struktura XML.");
	
	// tworzymy referencje do dokumentu xml
	xmlRoot = xmlResponse.documentElement;

	// wyszukujemy wezly kolejnych sekcji strony i pakujemy do tablicy
	sekcjaNodes = xmlRoot.getElementsByTagName("sekcja");
		
	// generujemy odpowiednie HTML'e z kolejnych elementów tablicy
	var drzewoHtml = sekcjaNodes[0].firstChild.data;
	
	// tworzymy referencje do obiektów na stronie
	drzewoDiv = document.getElementById("drzewo");

	// wrzucamy treść do obiektów na stronie
	drzewoDiv.innerHTML = drzewoHtml;
	
	//sekcje podglad i buttons Content obslugujemy warunkowo, o ile są w xml'u
	if(sekcjaNodes.length > 1) {
		var podgladHtml = sekcjaNodes[1].firstChild.data;
		var buttonsHtml = sekcjaNodes[2].firstChild.data;
		
		podgladDiv = document.getElementById("podglad");
		buttonsDiv = document.getElementById("buttons");

		podgladDiv.innerHTML = podgladHtml;
		buttonsDiv.innerHTML = buttonsHtml;
	}
}

///////////////////////////////////
// Odrysowanie samej wiadomosci
///////////////////////////////////

//funkcja obsługi wywoływana gdy zmienia się status połączenia http
//dla funkcji odrysowujących tylko treść posta i guzików
function handleRequestOdrysujPost()
{
	// jeśli readyState = 4, jesteśmy gotowi do odczytu serverResponse
	if (xmlHttp.readyState == 4)
	{
		// continue only if HTTP status is "OK"
		if (xmlHttp.status == 200)
		{
			try
			{
				// jest ok więc obsługujemy odpowiedź z serwera w osobnej funkcji
				responseOdrysujPost();
			}
			catch(e)
			{
				// komunikat o błędzie
				//alert("Error reading the response: " + e.toString());
				alert("Error reading the response. Please try again or contact administrator.");
			}
		}
		else
		{
			// wyświetlenie komunikatu o statusie 
			//alert("There was a problem retrieving the data:\n" + xmlHttp.statusText);
			alert("There was a problem retrieving the data. Please try again or contact administrator");
		}
	}
}

function responseOdrysujPost()
{
	// read the message from the server
	var xmlResponse = xmlHttp.responseXML;
	
	// wyłapywanie błędów xml'a w IE i Operze
	if (!xmlResponse || !xmlResponse.documentElement)
		throw("Nieprawidłowa struktura XML:\n" + xmlHttp.responseText);
	
	// wyłapywanie ewentualnych błędów w Firefoksie
	var rootNodeName = xmlResponse.documentElement.nodeName;
	if (rootNodeName == "parsererror") throw("Nieprawidłowa struktura XML.");
	
	// tworzymy referencje do dokumentu xml
	xmlRoot = xmlResponse.documentElement;

	// wyszukujemy wezly kolejnych sekcji strony i pakujemy do tablicy
	sekcjaNodes = xmlRoot.getElementsByTagName("sekcja");
		
	// generujemy odpowiednie HTML'e z kolejnych elementów tablicy
	var podgladHtml = sekcjaNodes[0].firstChild.data;
	var buttonsHtml = sekcjaNodes[1].firstChild.data;
		
	podgladDiv = document.getElementById("podglad");
	buttonsDiv = document.getElementById("buttons");

	podgladDiv.innerHTML = podgladHtml;
	buttonsDiv.innerHTML = buttonsHtml;
}
