function xmlparser(getArray,xmlString,nobreak){
	this.getArray=(typeof getArray!="undefined") ? getArray : new Array();
	this.xmlString=(typeof xmlString!="undefined") ? xmlString : "";
	this.nobreak=(typeof nobreak!="undefined") ? nobreak : false;
	function replaceKL(thisData) {
		for (var xkey in thisData)
		{
		    if (typeof thisData[xkey] == "object")
		      thisData[xkey]=replaceKL(thisData[xkey]);
		    else
		    {
		    	if(typeof thisData[xkey]!="undefined")
		    	{
			    	if(isNaN(thisData[xkey]))
			    	{
				    	thisData[xkey]=thisData[xkey].replace(/</g,"<");
				    	thisData[xkey]=thisData[xkey].replace(/>/g,">");
				    }
				  }
		    	//thisData[xkey]=thisData[xkey].replace(/\//g,"bkslash");
		    }
		}
	    return thisData;
	}
	function restoreKL(thisData) {
		for (var xkey in thisData)
		{
		    if (typeof thisData[xkey] == "object")
		      thisData[xkey]=restoreKL(thisData[xkey]);
		    else
		    {
		    	if(thisData[xkey].replace)
		    	{
			    	thisData[xkey]=thisData[xkey].replace(/</g,"<");
			    	thisData[xkey]=thisData[xkey].replace(/>/g,">");
			    }
		    	//thisData[xkey]=thisData[xkey].replace(/bkslash/g,"/");
		    }
		}
		return thisData;
	}
	function in_array(element,data){
		for(var x in data)
		{
			if(data[x]==element)
			{
				return true;
			}
		}
		return false;
	}	
	
	function n_getTagContent(tag){
		//alert(tag);
		var erg=new Array();
		if(tag.indexOf(" ")<0)
		{
			//alert(tag);
			erg['name']=tag;
			erg['attributes']=new Array();
			return erg;
		}
		while(tag.indexOf("  ")>-1)
			tag=tag.replace(/  /," ");
		var elements=tag.split(" ");
		var ergA;
		var xkey;
		var val;
		erg['name']=elements[0];
		erg['attributes']=new Array();
		for(var e=1;e<elements.length;e++)
		{
			ergA=elements[e].split("=");
			xkey=ergA[0];
			val=ergA[1].replace(/"/,'',ergA[1]);
			erg['attributes'][xkey]=val;
		}
		return erg;
	}
	function n_findLastTagPos(xml,key,start){
		var path=new Array();
		path.push(key);	
		var currentPos=isNaN(start) ? 0 : start;
		var erg=0;
		var xnext=0;
		var tagEnde=0;
		var currentTag="";
		var die;
		while(path.length > 0 && xml.indexOf("<",currentPos+1)>-1)
		{
			xnext=xml.indexOf("<",currentPos+1);
			tagEnde=xml.indexOf(">",xnext);
			if(xml.substr(xnext,2)=="</")
			{
				currentTag=xml.substr(xnext+2,tagEnde-xnext-2);
				//alert(currentTag);
				if(currentTag!="" && !in_array(currentTag,path))
					currentPos=tagEnde;
				else
				{
					if(currentTag==key && path.length==1)
					{
						erg=xnext;
						path=new Array();
						break;	
					}
					else
					{
						die=path.pop();
						currentPos=tagEnde;				
					}
				}
				
			}
			else
			{
				currentTag=xml.substr(xnext+1,tagEnde-xnext-1);		
				if(currentTag.indexOf("<")>-1)
					alert("last:"+xnext);
				tagName=n_getTagContent(currentTag);
				path.push(tagName['name']);
				currentPos=tagEnde;
			}
		}
		return erg;
	}
	function n_getTagArray(xml){
		var erg=new Array();
		var index="";
		var thisXml=xml;
		var start=0;
		var tagEnde=0;
		var currentTag="";
		var tagCont;
		var key;
		var tagFinal;
		var tagCont;
		var thisKey;
		var tagContent;
		while(thisXml.indexOf("<")>-1)
		{
			start=thisXml.indexOf("<");
			tagEnde=thisXml.indexOf(">",start);
			currentTag=thisXml.substr(start+1,tagEnde-start-1);
			//alert(currentTag);
			if(currentTag.substr(0,1)=="/")
			{
				thisXml=thisXml.substr(tagEnde);
			}
			else
			{
				tagCont=n_getTagContent(currentTag);			
				key=tagCont['name'];			
				tagFinal=n_findLastTagPos(thisXml,key,start);			
				tagContent=thisXml.substr(tagEnde+1,tagFinal-tagEnde-1);
				if(typeof tagCont['attributes']!="undefined" && typeof tagCont['attributes']['index']!="undefined")
				{
					if(tagContent.indexOf("<") > -1)
						erg.push(n_getTagArray(tagContent));
					else
						erg.push(tagContent);
				}
				else
				{
					//alert(currentTag);
					thisKey=(key.indexOf("aaa")==0) ? key.replace(/aaa/,"") : key;
					if(tagContent.indexOf("<")>-1)
						erg[thisKey]=n_getTagArray(tagContent);
					else
						erg[thisKey]=tagContent;
				}			
				thisXml=thisXml.substr(tagFinal+("</"+key+">").length);
			}
		}
		return erg;
	}
	
	
	this.n_getArrayFromXML=function(){
		var erg=new Array();
		if(this.xmlString!="")
		{
			var posData=this.xmlString.indexOf("<data");
			var nextEnd=this.xmlString.indexOf(">",posData);
			var endData=this.xmlString.lastIndexOf("</data>");
			var xmlKern=this.xmlString.substr(nextEnd+1,endData-nextEnd-1);
			//debug(xmlKern);
			erg=restoreKL(n_getTagArray(xmlKern));		
			
			return erg;
		}	
	}
	function n_getTag(xkey,attribs,startTag){
		var startTag=(typeof startTag == "undefined") ? true : false;
		var attResult=new Array();
		var erg="";
		for(var key in attribs)
		{
			attResult.push(key+'="'+attribs[key]+'"');
		}
		var firstDist=(attResult.length==0) ? "" : " ";
		if(!isNaN(xkey.substr(0,1)))
			xkey="aaa"+xkey;
		if(startTag==true)
			erg='<'+xkey+firstDist+attResult.join(" ")+'>';
		else
			erg='</'+xkey+'>';
		return erg;
	}
	function n_createXMLObject(xdata,xkey,xindex,ebene,nobreak){
		var xindex=(typeof xindex == "undefined") ? -1 : xindex;
		var ebene=(typeof ebene == "undefined") ? 1 : ebene;
		var nobreak=(typeof nobreak == "undefined") ? false : nobreak;
		var xdata=(typeof xdata == "undefined") ? new Array() : xdata;
		var thisCR="\n";
		var tagAttribs=new Array();
		var dist="";
		var erg="";
		var i,index,key,tempAttribs,subErg;
		for(i=1;i<ebene;i++)
			dist+="    ";
		if(nobreak)
		{
			dist="";
			thisCR="";
		}
		erg= (ebene==1) ? '<?xml version="1.0" encoding="UTF-8" ?>'+thisCR+thisCR : "";
		if(xindex>-1)
			tagAttribs["index"]=""+xindex;
		
		subErg="";
		for(key in xdata)
		{
			index=-1;		
			if (typeof xdata[key] == "object")
			{	
				subErg+=n_createXMLObject(xdata[key],key,index,ebene+1,nobreak);
			}
			else
			{
				//if(xdata[key]!="")
				//{				
					if(key=="array")
						key="0";				
					tempAttribs=(index>-1) ? new Array(""+index) : new Array();
					if(nobreak)
						subErg+=n_getTag(key,tempAttribs);
					else
						subErg+=dist+"    "+n_getTag(key,tempAttribs);
					subErg+=xdata[key];
					subErg+=n_getTag(key,new Array(),false)+thisCR;
				//}
			}
		}
		if(subErg=="")
		{
			erg+=dist+n_getTag(xkey,tagAttribs);
			return erg+n_getTag(xkey,new Array(),false)+thisCR;
		}
		else
		{
			erg+=dist+n_getTag(xkey,tagAttribs)+thisCR+subErg;
			return erg+dist+n_getTag(xkey,new Array(),false)+thisCR;
		}
		
	}
	this.n_makeXMLFromArray=function(){
		this.getArray=replaceKL(this.getArray);
		var xmldata2 = n_createXMLObject(replaceKL(this.getArray),"data",-1,1,this.nobreak);
		return xmldata2;
	}
}