// =================================================================================================================================================
// * Opis:  Klasa clsPrzetwarzanieStan realizuje funkcje semafora i zasobnika danych dla głównej gałezi decyzyjnej JavaScript
// * Param: ID: 			identyfikator bieżącego stanu (zmienna decyzyjna case)
// *        AjaxOdpowiedz:	bufor odpowiedzi AJAX (w przypadku korzystania z AJAXa) lub zmienna nieważna
// =================================================================================================================================================
		function clsPrzetwarzanieStan() {
			this.ID=null;				//identyfikator przetwarzania
			this.aapAjaxOdpowiedz=null;	//odpowiedź AJAX lub zmienna nieważna
			}

// =================================================================================================================================================
// * Opis:  Klasa clsDialogBox realizuje funcje okna dialogowego
// * Wykorzystanie:
// * var objStan = new clsPrzetwarzanieStan()
// * var a=new clsDialogBox("Tytuł", "Treść", [ ["Klawisz1-tekst", "Klawisz1-tooltip", "Klawisz1-wartość"], 
// *											["Klawisz2-tekst", "Klawisz2-tooltip", "Klawisz2-wartość"],
// *											...
// *										  ], strIkona, objStan)
// * gdzie: strIkona określa nazwę ikony (None, Info, Warning, Error)
// * Po zamknięcie okna dialogowego obiekt objStan.ID ma wartość naciśniętego klawisza w oknie dialogowym
// ================================================================================================================================================	
		var idsDialogBox_ImgSciezka="sys/komponenty/dialogbox";		//ścieżka do foldera z grafiką dla obiektu

		// ****************************************************************************************************************************************
		// * Opis:  obsługa OnMouseDown
		// ****************************************************************************************************************************************	
		function aafDialogBox_OnMouseDown(e){
			if (e == null) {
				e = window.event; //obsługa IE
				}
			var objDialogBox=achDialogBox_Stos[aafDialogBox_GetID()];	//obiekt clsDialogBox
			var objOkno=document.getElementById('clsDialogBox' + objDialogBox.aafID()).childNodes.item(0);
			objDialogBox.strDragKlawisz="down";
			objDialogBox.intDragMouseOffsetX=e.clientX-objOkno.offsetLeft;
			objDialogBox.intDragMouseOffsetY=e.clientY-objOkno.offsetTop;
			}
		
		// ****************************************************************************************************************************************
		// * Opis:  obsługa OnMouseUp
		// ****************************************************************************************************************************************	
		function aafDialogBox_OnMouseUp(e){
			if (e == null) {
				e = window.event; //obsługa IE
				}
			var objDialogBox=achDialogBox_Stos[aafDialogBox_GetID()];	//obiekt clsDialogBox
			if(objDialogBox!=null) {
				objDialogBox.strDragKlawisz="up";
				document.body.style.cursor='default';
				}
			}
			
		// ****************************************************************************************************************************************
		// * Opis:  obsługa OnMouseMove
		// ****************************************************************************************************************************************	
		function aafDialogBox_OnMouseMove(e){
			if (achDialogBox_Stos.length>0) {
				if (e == null)  {
					e = window.event; //obsługa IE
					}
				var objDialogBox=achDialogBox_Stos[aafDialogBox_GetID()];	//obiekt clsDialogBox
				if (objDialogBox.strDragKlawisz=="down") {
					var objTlo=document.getElementById('clsDialogBox' + objDialogBox.aafID());
					var objOkno=objTlo.childNodes.item(0);
					objOkno.style.position="absolute";
					
					objOkno.style.left=Math.max(0, Math.min(e.clientX-objDialogBox.intDragMouseOffsetX, objTlo.offsetWidth-objOkno.offsetWidth))+"px";;
					objOkno.style.top=Math.max(0,Math.min(e.clientY-objDialogBox.intDragMouseOffsetY, objTlo.offsetHeight-objOkno.offsetHeight))+"px";
					document.body.style.cursor='move';
					}
				}
			}
						
		// ****************************************************************************************************************************************
		// * Opis:  Funkcja generuje pojedynczy klawisz w oknie obiektu clsDialogBox
		// * Param: achKlawsz: definicja klawisza (tabela z 3-ma komórkami): ["Text", "Tooltip", Wartość])
		// ****************************************************************************************************************************************	
		function aafDialogBoxKlawisz(achKlawisz) {
			var objWynik =null;
			var objKlawisz=document.createElement('table');
			objKlawisz.setAttribute("border", "0");
			objKlawisz.setAttribute("cellSpacing", "0px");
			objKlawisz.setAttribute("cellPadding", "0");
								
			var objKlawiszBody = document.createElement('tbody');
			objKlawisz.appendChild(objKlawiszBody);
			
			var objKlawiszBodyTr = document.createElement('tr');
			objKlawiszBodyTr.setAttribute("height", "23px");
			objKlawiszBody.appendChild(objKlawiszBodyTr);
			
			var objKlawiszL = document.createElement('td');
			objKlawiszL.setAttribute("width", "3px");
			objKlawiszL.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_KlawiszL.png");
			objKlawiszBodyTr.appendChild(objKlawiszL);
			
			var objKlawiszS = document.createElement('td');
			objKlawiszS.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_KlawiszS.png");
			objKlawiszS.setAttribute("title", achKlawisz[1]);
			objKlawiszS.setAttribute("style", "vertical-align: middle;");
			
			objKlawiszS.innerHTML=achKlawisz[0];
			objKlawiszBodyTr.appendChild(objKlawiszS);
						
			var objKlawiszP = document.createElement('td');
			objKlawiszP.setAttribute("width", "3px");
			objKlawiszP.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_KlawiszP.png");
			objKlawiszBodyTr.appendChild(objKlawiszP);
			
			objWynik=objKlawisz;
			
			return objWynik;
			}
			
		// ****************************************************************************************************************************************
		// * Opis:  Funkcja zwraca index najmłodszego elementu ze stosu achDialogBox_Stos, w którym poamiętane są obiekty clsDialogBox 
		// *        (kolejne okienka dialogowe)
		// ****************************************************************************************************************************************
		var achDialogBox_Stos=new Array();		//stos okien dialogowych	
		function aafDialogBox_GetID() {
			return achDialogBox_Stos.length-1;
			}
			
		// ****************************************************************************************************************************************
		// * Opis:  Klasa clsDialogBox realizująca funkcje DialogBox
		// * Param: strTytul: tytył okna
		// * 		strTresc: treść komunikatu
		// *		achKlawisze:	kolekcja klawiszy [ [tekst, tooltip, wartosc]
		// *											[tekst, tooltip, wartosc]
		// *											... 
		// *										  ]
		// *		strIkona: 		typ ikony (Info, Question, Warning, Error, None)
		// * 		objStan: Klasa, do której zaostanie zapisany wynik (parametr przycisku)
		// * 		objFunkcjaOnClick: funkcja anonimowa, która przetworzy wynik formularza przed jego zamknięciem
		// ****************************************************************************************************************************************
		function clsDialogBox(strTytul, strTresc, achKlawisze, strIkona, objStan, objFunkcjaOnClick) {
			achDialogBox_Stos[achDialogBox_Stos.length]=this;
					
			this.strDragKlawisz='up';						//stan lewego klawisza myszy ('up' lub 'down')
			this.intDragMouseOffsetX=0;						//offset X wskaźnika myszy względem lewego górnego rogu okna
			this.intDragMouseOffsetY=0;						//offset Y wskaźnika myszy względem lewego górnego rogu okna
			this.objStan=objStan;
			this.objFunkcjaOnClick=objFunkcjaOnClick;
			
			this.aafID=aafDialogBox_GetID;					//identyfikator okna dialogowego
			this.aafHide=aafDialogBox_ButtonClick;			//usuniecie okna dialogowego
			this.aafOnMouseDown=aafDialogBox_OnMouseDown;	//funkcja prywatna: obsluga mouseDown
			this.aafOnMouseUp=aafDialogBox_OnMouseUp;		//funkcja prywatna: obsluga mouseUp
			this.aafOnMouseMove=aafDialogBox_OnMouseMove;	//funkcja prywatna: obsluga mouseMove
			
			//obsługa BEEP
/*			var objBeep=document.getElementById('clsDialogBox_Beep');
			// niszczymy objBeep żeby ponownie załadować dźwięk
			if(objBeep){
				try {
					document.body.removeChild(objBeep);
					} 
				catch (e) {
					// pusta obsługa
					}
				}
			if (objBeep==null) {
				var objBeep = document.createElement('embed');
				objBeep.id="clsDialogBox_Beep";
				objBeep.setAttribute("src",idsDialogBox_ImgSciezka+"/DialogBox_Ding.wav");
				objBeep.setAttribute("autostart","false");
				objBeep.setAttribute("enablejavascript","true");
				objBeep.style.width="0px";
				objBeep.style.height="0px";
				document.body.appendChild(objBeep);
				}
*/
						
			//tło na całą stronę
			var int_IndexBase=500;	//bazowy z-index
			var objDialogBox = document.createElement('div');
			objDialogBox.id = 'clsDialogBox' + this.aafID();
			objDialogBox.className = "clsDialogBox";
			objDialogBox.setAttribute("z-index", int_IndexBase+2*this.aafID());
			objDialogBox.style.display="block";
			objDialogBox.style.position="absolute";
			objDialogBox.style.border="0px none #000000";
			objDialogBox.style.margin="0 0 0 0";
			objDialogBox.style.padding="0px";
			objDialogBox.style.left= "0";
			objDialogBox.style.top="0";
			objDialogBox.style.width="100%";
			//objDialogBox.style.height="100%";
			objDialogBox.style.height=document.body.clientHeight;
			objDialogBox.style.backgroundImage= "url('"+idsDialogBox_ImgSciezka+"/DialogBox_Pusty.png')";
//			objDialogBox.onclick=aafDialogBox_Beep;
			document.body.appendChild(objDialogBox);
			
			//okno dialogowe
			var objDialogBoxOkno = document.createElement('div');
			objDialogBoxOkno.className = "clsDialogBoxOkno";
			objDialogBoxOkno.setAttribute("z-index", int_IndexBase+2*this.aafID()+1);
			objDialogBoxOkno.style.display="block";
			objDialogBoxOkno.style.position="absolute";
			objDialogBoxOkno.style.border="0px none #E0E0E0";
			objDialogBoxOkno.style.margin="0 auto 0 auto";
			objDialogBoxOkno.style.padding="0px";
			objDialogBoxOkno.style.width="33%";
			objDialogBoxOkno.style.fontFamily="arial";
			objDialogBoxOkno.style.fontWeight="normal";
			objDialogBoxOkno.style.color="black";
					
			objDialogBox.appendChild(objDialogBoxOkno);
			
			//tabela w oknie z poszczególnymi elementami
			var objTabela = document.createElement('table');
			objTabela.setAttribute("border", "0");
			objTabela.setAttribute("cellSpacing", "0");
			objTabela.setAttribute("cellPadding", "0");
			objDialogBoxOkno.appendChild(objTabela);
			var objTabelaBody = document.createElement('tbody');
			objTabela.appendChild(objTabelaBody);
						
			var intW=0;		// licznik wierszy
			var intK=0;		// licznik kolumn
			for (intW=1;intW<=4;intW++) {
				var intObrazekWiersz=intW;
				var objTr = document.createElement('tr');
				switch (intW) {
					case 1: objTr.setAttribute("height", "36px");
							break;
					case 2:	objTr.setAttribute("height", "50px");
							break;
					case 3:	objTr.setAttribute("height", "55px");
							intObrazekWiersz=intW-1;
							break;
					case 4:	objTr.setAttribute("height", "14px");
							intObrazekWiersz=intW-1;
							break;
					}
				objTabelaBody.appendChild(objTr);
				
				for (intK = 1; intK <= 3; intK++) {
					var objTd = document.createElement('td');
					if ((intW == 2) || (intW == 2) & (intK==2)) {
						objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + "a.png");
						}
					else {
						objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + ".png");
						}
					switch(intW) {
						case 1:		//górna ramka okna
							objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + ".png");
						    switch (intK) {
								case 2:	objTd.style.fontWeight="bold";
										objTd.setAttribute("valign", "center");
										objTd.style.paddingTop="7px";
										// Wyrównanie tekstu w pionie w nagłówku komunikatu 
										objTd.style.verticalAlign="middle";
										objTd.onmousedown=this.aafOnMouseDown;
										objTd.innerHTML=strTytul;
										break;
								}	
							break;
						case 2:		//treść + obramowania boczne
							switch (intK) {
								case 1:
									objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + ".png");
									objTd.setAttribute("width", "14px");
									break;
								case 2:
									objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + "a.png");
									objTd.style.padding = "5px";
									
									var objTrescTable = document.createElement('table');
									objTrescTable.setAttribute("border", "0");
									objTrescTable.setAttribute("cellSpacing", "0px");
									objTrescTable.setAttribute("cellPadding", "0");
									objTd.appendChild(objTrescTable);
									
									var objTrescTableBody = document.createElement('tbody');
									objTrescTable.appendChild(objTrescTableBody);
									
									var objTrescTableBodyTr = document.createElement('tr');
									objTrescTableBody.appendChild(objTrescTableBodyTr);
									
									var strIkonaPlik = "";
									switch (strIkona) {
										case "", "None":
											break;
										case "Info":
											strIkonaPlik=idsDialogBox_ImgSciezka+"/DialogBox_IkonaInfo.png";
											break;
										case "Question":
											strIkonaPlik=idsDialogBox_ImgSciezka+"/DialogBox_IkonaQuestion.png";
											break;
										case "Warning":
											strIkonaPlik=idsDialogBox_ImgSciezka+"/DialogBox_IkonaWarning.png";
											break;
										case "Error":
											strIkonaPlik=idsDialogBox_ImgSciezka+"/DialogBox_IkonaError.png";
											break;
										}
									if (strIkonaPlik.length > 0) {
										var objTrescTableTdLeft = document.createElement('td');
										objTrescTableTdLeft.width = "64px";
										objTrescTableTdLeft.align="center";
										objTrescTableBodyTr.appendChild(objTrescTableTdLeft);
										
										var objTrescTableTdLeftIkona=document.createElement('img');
										objTrescTableTdLeftIkona.src=strIkonaPlik;
										objTrescTableTdLeft.appendChild(objTrescTableTdLeftIkona);
										}
							
									var objTrescTableTdRight = document.createElement('td');
									objTrescTableTdRight.innerHTML=strTresc;
									objTrescTableBodyTr.appendChild(objTrescTableTdRight);
									
									break;
								case 3:	objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + ".png");
										objTd.setAttribute("width","14px");
										break;
								}
							break;
						case 3:		//klawisze + obramowania boczne
							objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + "a.png"); 
							switch (intK) {
								case 2:	objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + "a.png");
										var objKlawiszeTable = document.createElement('table');
										objKlawiszeTable.setAttribute("align", "right");
										objKlawiszeTable.setAttribute("border", "0px");
										objKlawiszeTable.setAttribute("cellSpacing", "5px");
										objKlawiszeTable.setAttribute("cellPadding", "0");
										objTd.appendChild(objKlawiszeTable);
										var objKlawiszeBody = document.createElement('tbody');
										objKlawiszeTable.appendChild(objKlawiszeBody);
										var objKlawiszeBodyTr = document.createElement('tr');
										objKlawiszeBody.appendChild(objKlawiszeBodyTr);
										for (k = 0; k < achKlawisze.length; k++) {
											var objKlawiszeBodyTd = document.createElement('td');
											objKlawiszeBodyTr.appendChild(objKlawiszeBodyTd);
											objKlawiszeBodyTd.appendChild(aafDialogBoxKlawisz(achKlawisze[k]));
											objKlawiszeBodyTd.onclick =new Function("aafDialogBox_ButtonClick('" + achKlawisze[k][2] + "')");
											objKlawiszeBodyTd.style.cursor="pointer";
											objKlawiszeBodyTd.setAttribute("class","clsDialogBox_Button");
											}
									break;
								default:
									objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + ".png");
									break;
								}
							break;
						case 4:	//dolna ramka okna
							objTd.setAttribute("background", idsDialogBox_ImgSciezka+"/DialogBox_" + intObrazekWiersz + intK + ".png");
							break;
						}
					objTr.appendChild(objTd);	
					}	
				}
			
			//wyśrodkowanie okna	
			objDialogBoxOkno.style.left=Math.floor((parseInt(objDialogBox.clientWidth)-parseInt(objDialogBoxOkno.clientWidth))/2) + 'px';
			//objDialogBoxOkno.style.top=Math.floor((objDialogBox.clientHeight-objDialogBoxOkno.clientHeight)*0.4);
			objDialogBoxOkno.style.top=Math.floor((document.documentElement.clientHeight-objDialogBoxOkno.clientHeight)*0.4) + 'px';
						 
			document.onmouseup = this.aafOnMouseUp;
			document.onmousemove = this.aafOnMouseMove;
			}
		
		// ****************************************************************************************************************************************
		// * Opis:  Obsługa klawiszy okna dialogowego clsDialogBox
		// * Param: Wartość klawisza (zwracana do funcji nadrzędnej)
		// ****************************************************************************************************************************************
		function aafDialogBox_ButtonClick(objKlawiszWartosc) {
			var objDialogBox=achDialogBox_Stos[aafDialogBox_GetID()];	//obiekt clsDialogBox
			objDialogBox.objStan.ID=objKlawiszWartosc;
			// Jeśli podano objFunkcjaOnClick, to wywołujemy ją
			if(objDialogBox.objFunkcjaOnClick!=null && objDialogBox.objFunkcjaOnClick!='undefined'){
				objDialogBox.objFunkcjaOnClick(objKlawiszWartosc);
				}
			var objOkno=document.getElementById('clsDialogBox' + objDialogBox.aafID());
			objOkno.parentNode.removeChild(objOkno);
			achDialogBox_Stos.pop();
			}

		function aafDialogBox_Beep() {
			var objBeep = document.getElementById('clsDialogBox_Beep'); 
//			objBeep.Play(); 
			}

		// ****************************************************************************************************************************************
		// * Opis:  Zamyka aktualnie wyświetlany komunikat
		// * @return nic
		// ****************************************************************************************************************************************
		function aafDiaglogBox_Close(){
			try{
				var objDialogBox=achDialogBox_Stos[aafDialogBox_GetID()];	//obiekt clsDialogBox
				var objOkno=document.getElementById('clsDialogBox' + objDialogBox.aafID());
				objOkno.parentNode.removeChild(objOkno);
				achDialogBox_Stos.pop();
				objStanTmp.ID=null;
				}
			catch(err){}
			}
// ================================================================================================================================================
// * Opis:  Klasa clsAjax realizuje funcje AJAX
// * Wykorzystanie:
// *    var objStan = new clsPrzetwarzanieStan()
// *    var ajx=new aapAjax();
// *	ajx.aafSend(strMetoda, strUrl, strDane, objWartosc, objStan)
// * gdzie: 
// *    strMetoda określa metodę przeslania danych (GET lub POST)
// *    strUrl określa adres serwera
// *	strDane zawiera dane do wysłania
// *	objWartosc zawiera wartość, która zostanie przypisana do objStan.ID po otrzymaniu odpowiedzi z serwera
// ================================================================================================================================================
		var aapAjax=null;
		
		// ****************************************************************************************************************************************
		// * Opis:  Konstruktor
		// ****************************************************************************************************************************************
		function clsAjax() {
			aapAjax=this;
			this.aapHttpRequest=null;		//obiekt httpRequest
			this.aapBuforSend=null;			//bufor wewn.: dane do wyslania na serwer
			this.aapBuforReceive=null;		//bufor wewn.: dane odebrane z serwera
			this.aapStan=null;				//obiekt
			this.aapStanIdWartosc=null;		//wartość do ustawienia w aapStan.ID gdy serwer zwróci odpowiedź
			
			this.aafSend=aafAjax_Send;
			this.aafReceive=aafAjax_Receive;
			
			if (aapAjax.aapHttpRequest==null) {
				try {
					aapAjax.aapHttpRequest=new XMLHttpRequest();
					}
				catch(e) {
					//IE6 lub starsze
					try {
						aapAjax.aapHttpRequest=new ActiveXObject("Microsoft.XMLHttp");
						}
					catch (e) {
						alert("Twoja przeglądarka internetowa nie obsługuje technologii AJAX. Dokonaj aktualizacji przeglądarki do najnowszej wesrji i spróbuj jeszcze raz.");
						}
					}
				}
			}

		// ****************************************************************************************************************************************
		// * Opis:  Wyslanie danych na serwer
		// * Param: strMetoda: 	metoda przesłania danych (POST lub GET)
		// * 		strUrl: 	adres serwera
		// *		strDane:	dane do wyslania
		// *		objStan:
		// *		objStanWartosc: wartość do ustawienia w objStan.ID gdy serwer zwróci odpowiedź
		// ****************************************************************************************************************************************
		function aafAjax_Send(strMetoda, strUrl, strDane, objStan, objStanIdWartosc ) {
			if (aapAjax.aapHttpRequest) {
				this.aapBuforSend=strDane;
				this.aapStan=objStan;
				this.aapStanIdWartosc=objStanIdWartosc;
				
				aapAjax.aapHttpRequest.open(strMetoda, strUrl, true);
				aapAjax.aapHttpRequest.onreadystatechange=aafAjax_Receive;
				switch (strMetoda) {
					case "POST":
						aapAjax.aapHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
						aapAjax.aapHttpRequest.send("AJAX="+encodeURIComponent(strDane));
						break;
					case "GET":
						aapAjax.aapHttpRequest.send(encodeURIComponent(strDane));
						break;
					default:
						alert ("AJAX: Podana metoda przesyłu danych ("+strMetoda+") nie jest obsługiwana !!!" );
						break;
					}
				}
			}
		
		// ****************************************************************************************************************************************
		// * Opis:  Odebranie danych
		// ****************************************************************************************************************************************
		function aafAjax_Receive() {
			switch (aapAjax.aapHttpRequest.readyState) {
				case 0:		//niezainicjalizowany
				case 4:		//zakończono
					switch (aapAjax.aapHttpRequest.status) {
						case 200: 	//OK
							switch (aapAjax.aapHttpRequest.getResponseHeader("Content-Type")) {
								case 'text/xml':
									var xmlOdpowiedz=aapAjax.aapHttpRequest.responseXML;
									aapAjax.aapStan.ID=aapAjax.aapStanIdWartosc;
									aapAjax.aapStan.aapAjaxOdpowiedz=xmlOdpowiedz.xml;
									break;
								default:
									alert("AJAX: Wystąpił błąd (nieobsługiwany typ danych).");
								}
							break;
						default:	//błąd
							alert("AJAX: Wystąpił błąd podczas komunikacji z serwerem: "+aapAjax.aapHttpRequest.statusText);
							break;
						}
					break;
				default:	//w trakcje przetwarzania - czekamy
					break;
				}
			}
		
