   /**
     * Obiekt odpowiedzialny za tworzenie XML. 
     * @param strAplikacja - aplikacja
     * @param strKlasa - klasa
     * @param strTyp - typ
     * @param strWersjaXml - wersja XML
     * @method aafAddElement - Dodaje element do XML
     * @method aafToXmlString - zwraca wygenerowany string XML
     * @return 
     */
	function clsXml(strAplikacja, strKlasa, strTyp, strWersjaXml){
		this.xmlString="";
		this.strAplikacja=strAplikacja;
		this.strKlasa=strKlasa;
		this.strTyp=strTyp;
		this.strWersjaXml=strWersjaXml;
		this.xmlString='<?xml version="1.0"?>\n';
		this.xmlString+='<DOKUMENT>\n';
		this.xmlString+='\t<INFO APLIKACJA="'+strAplikacja+'" KLASA="'+strKlasa+'" TYP="'+strTyp+'" WERSJA_XML="'+strWersjaXml+'"/>\n';
		}
	
	/**
	 * Wczytanie XML ze stringa
	 * @param string $strXmlString string zawierający XML
	 * @param boolean $blnUseBase64 czy string jest zakodowany w base64
	 * @return nic
	 */
	function aafLoadFromString(strXmlString,blnUseBase64){
		if(blnUseBase64){
			try{
				strXmlString = base64_decode(strXmlString);
				}
			catch(err){
				alert("Błędna składnia XML - Dane nie były zakodowane w base64. " + strXmlString);
				}
			}
		this.xmlString = strXmlString;
		try{
			if($.browser.msie){ // Jeśli przeglądarką jest IE, musimy odpowiednio wczytać XML
				this.objXml=new ActiveXObject("Microsoft.XMLDOM");
				this.objXml.async="false";
				this.objXml.loadXML(strXmlString);
				}
			else{
				parser=new DOMParser();
				this.objXml=parser.parseFromString(strXmlString,"text/xml");
				}
			}
		catch(err){
			alert("Błędna składnia XML!");
			return false;
			}
		return this.objXml;
		}
	
	/**
	 * Dodaje element (wiersz) do XML
	 * @param {Object} strElementNazwa - nazwa elementu
	 * @param {Array} arAtrybuty - tabela zawierająca atrybuty. Tabela musi być wygenerowana w następujący sposób (inaczej nie będzie możliwości odczytania nazwy parametru - trzeba by ją wcześniej znać)
	 * var ar = new Array(); // tworzymy tabelę
	 * ar.push(Array("jeden","raz")); // dodajemy nową zawierającą elementy
	 * @param {boolean} blnUseBase64 czy wynik ma być zakodowany w base64
	 */
	function aafAddElement(strElementNazwa, arAtrybuty, blnUseBase64) {
		this.xmlString += '\t<' + strElementNazwa.toUpperCase() + ' ';
		for(var i=0; i<arAtrybuty.length; i++){
			var attr = arAtrybuty[i];
			if(blnUseBase64 == true){
				this.xmlString+=' ' + attr[0].toUpperCase() + '="' + base64_encode(attr[1]) + '"';
				}
			else{
				this.xmlString+=' ' + attr[0].toUpperCase() + '="' + attr[1] + '"';
				}
			}
		this.xmlString += ' />\n';
		}
	/**
	 * Dodaje element (wiersz) do XML
	 * @param {Object} strElementNazwa - nazwa elementu
	 * @param {Array} arAtrybuty - tabela zawierająca atrybuty. Tabela musi być wygenerowana w następujący sposób (inaczej nie będzie możliwości odczytania nazwy parametru - trzeba by ją wcześniej znać)
	 * var ar = new Array(); // tworzymy tabelę
	 * ar.push(Array("jeden","raz")); // dodajemy nową zawierającą elementy
	 * @param {boolean} blnUseBase64 czy wynik ma być zakodowany w base64
	 */
	function aafAddElementMale(strElementNazwa, arAtrybuty, blnUseBase64) {
		this.xmlString += '\t<' + strElementNazwa.toUpperCase() + ' ';
		for(var i=0; i<arAtrybuty.length; i++){
			var attr = arAtrybuty[i];
			if(blnUseBase64 == true){
				this.xmlString+=' ' + attr[0] + '="' + base64_encode(attr[1]) + '"';
				}
			else{
				this.xmlString+=' ' + attr[0] + '="' + attr[1] + '"';
				}
			}
		this.xmlString += ' />\n';
		}	
	/**
	 * Usunięcie elementu z XML
	 * @param objElement - element do usunięcia
	 * @return nic
	 */
	function aafRemoveElement(objElement){
		objElement.parentNode.removeChild(objElement);
		}	

	/**
	 * Zwraca wskaźnik do elementu głównego (ROOT) obiektu XML
	 */
	function aafGetRoot(){
		var objWynik = false;
		if(this.objXml){
			objWynik=this.objXml;
			}
		return objWynik;
		}
	
	/**
	 * Pobiera atrybuty konkretnego elementu z XML i zwraca je jako listę
	 * @param $xmlParent wskaźnik do elentu nadrzędnego
	 * @param $intElement numer elementu, który chcemy odczytać
	 * @param $strElementNazwa nazwa elementu, który chcemy odczytać
	 * @return tabela atrybutów
	 */
	function aafGetElement(xmlParent, intElement, strElementNazwa){
		var arWynik = new Array();
		var i = 0;
		var tmp = "";
		var a = xmlParent.getElementsByTagName(strElementNazwa)[intElement].attributes;
		for(i;i<a.length;i++){
			arWynik.push(Array(a[i].name,a[i].value));
			}
		return arWynik;
		}
	
	/**
	 * Pobiera obiekt konkretnego elementu z XML
	 * @param $xmlParent wskaźnik do elentu nadrzędnego
	 * @param $intElement numer elementu, który chcemy odczytać
	 * @param $strElementNazwa nazwa elementu, który chcemy odczytać
	 * @return obiekt typu xml zawierający podany element
	 */
	function aafGetElementObj(xmlParent, intElement, strElementNazwa){
		var objWynik = false;
		var i = 0;
		var tmp = "";
		objWynik = xmlParent.getElementsByTagName(strElementNazwa)[intElement];
		return objWynik;
		}
	
	
	
	/**
	 * Zwraca ilość elementów podanego typu w podanym rodzicu
	 * @param xmlParent - rodzic, w którym będziemy liczyli
	 * @param strElementNazwa - typ elementu, który chcemy policzyć lub pusty, jeśli chcemy policzyć wszystkie
	 * @return integer - ilość elementów
	 */
	function aafCount(xmlParent,strElementNazwa){
		return xmlParent.getElementsByTagName(strElementNazwa).length;
		}
	
	
	/**
	 * Zwraca wartość pojedyńczego atrybutu
 	 * @param $xmlParent wskaźnik do elentu nadrzędnego
	 * @param $intElement numer elementu, który chcemy odczytać
	 * @param $strElementNazwa nazwa elementu, który chcemy odczytać
	 * @param strAtrybutNazwa nazwa atrybutu
	 * @param blnUseBase64 czy wynik ma być rozkodowany z base64 -true / pozostawiony w oryginale (zakodowany w base64) - false
	 * @return
	 */
	function aafGetAtrybut(xmlParent, intElement, strElementNazwa,strAtrybutNazwa, blnUseBase64){
		var strWynik = "";
		var arAtrybuty = aafGetElement(xmlParent, intElement, strElementNazwa);
		for(var i=0;i<arAtrybuty.length;i++){
			var arDane = arAtrybuty[i]; 
			if(arDane[0] == strAtrybutNazwa){
				strWynik=arDane[1];
				}
			}
		if(blnUseBase64){
			strWynik = base64_decode(strWynik);
			}
		return strWynik;
		}

	
	/**
	 * Zwraca wynik działania klasy
	 * @return string xml
	 */
	function aafToXmlString(){
		return this.xmlString + '</DOKUMENT>';
		}
	clsXml.prototype.aafAddElement = aafAddElement;
	clsXml.prototype.aafAddElementMale = aafAddElementMale;
	clsXml.prototype.aafToXmlString = aafToXmlString;
	clsXml.prototype.aafLoadFromString = aafLoadFromString;
	clsXml.prototype.aafGetElement = aafGetElement;
	clsXml.prototype.aafGetAtrybut = aafGetAtrybut;
	clsXml.prototype.aafGetRoot = aafGetRoot;
	clsXml.prototype.aafGetElementObj = aafGetElementObj;
	clsXml.prototype.aafCount = aafCount;
	clsXml.prototype.aafRemoveElement = aafRemoveElement;
	
	
