﻿	xmlToJson={
		parser:function(xmlcode,ignoretags,debug){
			if(!ignoretags){ignoretags=""};
			xmlcode=xmlcode.replace(/\s*\/>/g,'/>');
			xmlcode=xmlcode.replace(/<\?[^>]*>/g,"").replace(/<\![^>]*>/g,"");
			if (!ignoretags.sort){ignoretags=ignoretags.split(",")};
			var x=this.no_fast_endings(xmlcode);
			x=this.attris_to_tags(x);
			x=escape(x);
			x=x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join("\"");
			for (var i=0;i<ignoretags.length;i++){
				x=x.replace(new RegExp("<"+ignoretags[i]+">","g"),"*$**"+ignoretags[i]+"**$*");
				x=x.replace(new RegExp("</"+ignoretags[i]+">","g"),"*$***"+ignoretags[i]+"**$*")
			};
			x='<JSONTAGWRAPPER>'+x+'</JSONTAGWRAPPER>';
			this.xmlobject={};
			var y=this.xml_to_object(x).jsontagwrapper;
			if(debug){y=this.show_json_structure(y,debug)};
			return y
		},
		xml_to_object:function(xmlcode){
			var x=xmlcode.replace(/<\//g,"§");
			x=x.split("<");
			var y=[];
			var level=0;
			var opentags=[];
			for (var i=1;i<x.length;i++){
				var tagname=x[i].split(">")[0];
				opentags.push(tagname);
				level++
				y.push(level+"<"+x[i].split("§")[0]);
				while(x[i].indexOf("§"+opentags[opentags.length-1]+">")>=0){level--;opentags.pop()}
			};
			var oldniva=-1;
			var objname="this.xmlobject";
			for (var i=0;i<y.length;i++){
				var preeval="";
				var niva=y[i].split("<")[0];
				var tagnamn=y[i].split("<")[1].split(">")[0];
				tagnamn=tagnamn.toLowerCase();
				var rest=y[i].split(">")[1];
				if(niva<=oldniva){
					var tabort=oldniva-niva+1;
					for (var j=0;j<tabort;j++){objname=objname.substring(0,objname.lastIndexOf("."))}
				};
				objname+="."+tagnamn;
				var pobject=objname.substring(0,objname.lastIndexOf("."));
				if (eval("typeof "+pobject) != "object"){preeval+=pobject+"={value:"+pobject+"};\n"};
				var objlast=objname.substring(objname.lastIndexOf(".")+1);
				var already=false;
				for (k in eval(pobject)){if(k==objlast){already=true}};
				var onlywhites=true;
				for(var s=0;s<rest.length;s+=3){
					if(rest.charAt(s)!="%"){onlywhites=false}
				};
				if (rest!="" && !onlywhites){
					if(rest/1!=rest){
						rest="'"+rest.replace(/\'/g,"\\'")+"'";
						rest=rest.replace(/\*\$\*\*\*/g,"</");
						rest=rest.replace(/\*\$\*\*/g,"<");
						rest=rest.replace(/\*\*\$\*/g,">")
					}
				} 
				else {rest="{}"};
				if(rest.charAt(0)=="'"){rest='unescape('+rest+')'};
				if (already && !eval(objname+".sort")){preeval+=objname+"=["+objname+"];\n"};
				var before="=";after="";
				if (already){before=".push(";after=")"};
				var toeval=preeval+objname+before+rest+after;
				eval(toeval);
				if(eval(objname+".sort")){objname+="["+eval(objname+".length-1")+"]"};
				oldniva=niva
			};
			return this.xmlobject
		},
		show_json_structure:function(obj,debug,l){
			var x='';
			if (obj.sort){x+="[\n"} else {x+="{\n"};
			for (var i in obj){
				if (!obj.sort){x+=i+":"};
				if (typeof obj[i] == "object"){
					x+=this.show_json_structure(obj[i],false,1)
				}
				else {
					if(typeof obj[i]=="function"){
						var v=obj[i]+"";
						//v=v.replace(/\t/g,"");
						x+=v
					}
					else if(typeof obj[i]!="string"){x+=obj[i]+",\n"}
					else {x+="'"+obj[i].replace(/\'/g,"\\'").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")+"',\n"}
				}
			};
			if (obj.sort){x+="],\n"} else {x+="},\n"};
			if (!l){
				x=x.substring(0,x.lastIndexOf(","));
				x=x.replace(new RegExp(",\n}","g"),"\n}");
				x=x.replace(new RegExp(",\n]","g"),"\n]");
				var y=x.split("\n");x="";
				var lvl=0;
				for (var i=0;i<y.length;i++){
					if(y[i].indexOf("}")>=0 || y[i].indexOf("]")>=0){lvl--};
					tabs="";for(var j=0;j<lvl;j++){tabs+="\t"};
					x+=tabs+y[i]+"\n";
					if(y[i].indexOf("{")>=0 || y[i].indexOf("[")>=0){lvl++}
				};
				if(debug=="html"){
					x=x.replace(/</g,"&lt;").replace(/>/g,"&gt;");
					x=x.replace(/\n/g,"<BR>").replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;")
				};
				if (debug=="compact"){x=x.replace(/\n/g,"").replace(/\t/g,"")}
			};
			return x
		},
		no_fast_endings:function(x){
			x=x.split("/>");
			for (var i=1;i<x.length;i++){
				var t=x[i-1].substring(x[i-1].lastIndexOf("<")+1).split(" ")[0];
				x[i]="></"+t+">"+x[i]
			}	;
			x=x.join("");
			return x
		},
		attris_to_tags: function(x){
			var d=' ="\''.split("");
			x=x.split(">");
			for (var i=0;i<x.length;i++){
				var temp=x[i].split("<");
				for (var r=0;r<4;r++){temp[0]=temp[0].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")};
				if(temp[1]){
					temp[1]=temp[1].replace(/'/g,'"');
					temp[1]=temp[1].split('"');
					for (var j=1;j<temp[1].length;j+=2){
						for (var r=0;r<4;r++){temp[1][j]=temp[1][j].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")}
					};
					temp[1]=temp[1].join('"')
				};
				x[i]=temp.join("<")
			};
			x=x.join(">");
			x=x.replace(/ ([^=]*)=([^ |>]*)/g,"><$1>$2</$1");
			x=x.replace(/>"/g,">").replace(/"</g,"<");
			for (var r=0;r<4;r++){x=x.replace(new RegExp("_jsonconvtemp"+r+"_","g"),d[r])}	;
			return x
		}
	};


	if(!Array.prototype.push){
		Array.prototype.push=function(x){
			this[this.length]=x;
			return true
		}
	};

	if (!Array.prototype.pop){
		Array.prototype.pop=function(){
			var response = this[this.length-1];
			this.length--;
			return response
		}
	};
