/**
 * Funktionen zur Navigation in der Schlaflabor Karte
 *
 * @author Stephan Lucas <sl@not-only-pixel.de>
 * @version 1.1 - 08.07.2008
 * @package dgsm
 */
	var map;
	var action = null;
	var ani;
	var detailimage;

	/**
	 * clientX und clientY Position während traceDetailCoords() läuft
	 */
	var mouseX;
	var mouseY;

	var xmlHttp = null;
	var coords_xy = new Array();
	var hover_content;

	var infoBox;
	var hoverBox;
	var zoomoutBox;

	/**
	 * init the map functions
	 * @param {Object} mapimg
	 */
	function initmap(mapimg) {
		map = new Map(mapimg);
		if (!action) {
			map.event().onmouseup = zoom2detail;
			map.event().onmousemove = null;
			action = "zoom";
		}
	}



	/**
	 * Regelt die Übermittlung der Koordinaten an die Skipte
	 * um dann das Detailbild darzustellen und die Koordinaten
	 * zu laden.
	 *
	 * @param {Object} evt
	 */
	function zoom2detail (evt) {
		var mousex, mousey;
		if (!evt) {
			evt = window.event;
		}
		mouseXMap = map.getMouseX (evt.clientX)
		mouseYMap = map.getMouseY (evt.clientY);
		mouseXMapRel = Math.round(mouseXMap / map.width * 100);
		mouseYMapRel = Math.round(mouseYMap / map.height * 100);

		initxml();



		var params = 'xpos=' + encodeURIComponent(mouseXMapRel) + '&ypos=' + encodeURIComponent(mouseYMapRel);
		/** Koordinaten holen */
		fetchCoords(params);
		/** Bild vorladen */
		detailimage = new Image();
		detailimage.src = map_detailimage + "?" + params;
		map.event().onmouseup = null;
		/** Wenn das Bild geladen ist, dann die Animation stoppen und das neue Bild einsetzen */
		detailimage.onload = function() {
			if (ani['counter'] < (ani['steps'] - 1)) {
				window.setTimeout("detailimage.onload()", 100);
			}
			if (ani['counter'] >= (ani['steps'] - 1)) {
				stopZoomAni();
				map.changeImage(this.src);
				map.setPosition(0, 0);
				map.setDimension(this.width, this.height);
				// und damit der ie es auch richtig anzeigt, sagen wir es ihm nach 0,1 sec nocheimal..
				window.setTimeout('map.changeImage("'+this.src +'"); map.setPosition(0, 0); map.setDimension('+ this.width+','+ this.height+');', 100);
				map.event().onmouseup = traceDetailCoords;
				map.event().onmousemove =  traceDetailCoords;
				action = "scroll";
			}
		}
		/** Animation vorbereiten */
		ani = new Array(11);
		ani['counter'] = 0;
		ani['steps'] = 10;	// in wie vielen Schritten
		ani['pointer'] = window.setInterval("zoomAni()", 100);	// Ein Schritt hat 50ms
		ani['xpos'] = mouseXMap;
		ani['ypos'] = mouseYMap;
		ani['width'] = map.width;
		ani['height'] = map.height;
		ani['marginLeft'] = 0;
		ani['marginTop'] = 0;
		ani['targetWidth'] = 2329; // Größe des Originalbildes, also die größe auf die gezoomt wird
		ani['targetHeight'] = 3152; // Größe des Originalbildes, also die größe auf die gezoomt wird
	}

	/**
	 * Animation für das Zoomen, wird per setInterval aus zoom2detail() aufgerufen
	 * und von detailimage.onload() beendet
	 */
	function zoomAni() {
		ani['counter']++;
		// for safety only
		if (ani['counter'] > (ani['steps']+2)) {
			stopZoomAni();
		}

		var steps = ani['steps'];
		var xscalefactor = ani['targetWidth'] / ani['width'];
		var yscalefactor = ani['targetHeight'] / ani['height'];
		var width_per_step = (ani['targetWidth'] - ani['width']) / steps;
		var height_per_step = (ani['targetHeight'] - ani['height']) / steps;
		var xentfernung = (ani['targetWidth'] / 8) - (ani['xpos'] * xscalefactor);
		var yentfernung = (ani['targetHeight'] / 8) - (ani['ypos'] * yscalefactor);

		ani['marginLeft'] += (xentfernung / steps);
		ani['marginTop'] += (yentfernung / steps);;

		map.setPosition(ani['marginLeft'], ani['marginTop']);
		map.setDimension(ani['width'] + width_per_step * ani['counter'], ani['height'] + height_per_step * ani['counter']);
	}
	/**
	 * Stoppt die Zoom-Animation
	 */
	function stopZoomAni() {
		window.clearInterval(ani['pointer']);
	}

	/**
	 * Ändert das Bild der Karte auf die Übersichtskarte
	 * @param {Object} evt
	 */
	function zoomOut() {
		map.changeImage(mapimage_file);
		infoBox.hide();
		hoverBox.hide();
		zoomoutBox.hide();
		action = false;
		map.event().onmouseup = zoom2detail;
		map.event().onmousemove = null;

	}
	/**
	 * Reagiert auf die Mausbaktionen in der Detailansicht
	 * etwa mit der Darstellung des Infofensters.
	 *
	 * @param {Object} evt
	 */
	function traceDetailCoords (evt) {
		if (!evt) {
			evt = window.event;
		}
		mouseX = evt.clientX;
		mouseY = evt.clientY;
		mouseXMap = map.getMouseX (evt.clientX)
		mouseYMap = map.getMouseY (evt.clientY);
		/**
		 * IDs per Koordinaten bestimmen
		 */
		ids = new Array();
		ids_index = 0;
		for (var i = 0; i < coords_xy.length; i++) {
			if ((coords_xy[i]['x'] == mouseXMap ||
				coords_xy[i]['x'] == mouseXMap-1 ||
				coords_xy[i]['x'] == mouseXMap-2 ||
				coords_xy[i]['x'] == mouseXMap-3 ||
				coords_xy[i]['x'] == mouseXMap-4 ||
				coords_xy[i]['x'] == mouseXMap-5 ||
				coords_xy[i]['x'] == mouseXMap-6 ||
				coords_xy[i]['x'] == mouseXMap+1 ||
				coords_xy[i]['x'] == mouseXMap+2 ||
				coords_xy[i]['x'] == mouseXMap+3 ||
				coords_xy[i]['x'] == mouseXMap+4 ||
				coords_xy[i]['x'] == mouseXMap+5 ||
				coords_xy[i]['x'] == mouseXMap+6)
				&&
				(coords_xy[i]['y'] == mouseYMap ||
				coords_xy[i]['y'] == mouseYMap - 1 ||
				coords_xy[i]['y'] == mouseYMap - 2 ||
				coords_xy[i]['y'] == mouseYMap - 3 ||
				coords_xy[i]['y'] == mouseYMap - 4 ||
				coords_xy[i]['y'] == mouseYMap - 5 ||
				coords_xy[i]['y'] == mouseYMap - 6 ||
				coords_xy[i]['y'] == mouseYMap + 1 ||
				coords_xy[i]['y'] == mouseYMap + 2 ||
				coords_xy[i]['y'] == mouseYMap + 3 ||
				coords_xy[i]['y'] == mouseYMap + 4 ||
				coords_xy[i]['y'] == mouseYMap + 5 ||
				coords_xy[i]['y'] == mouseYMap + 6) ) {
				id = coords_xy[i]['id'];
				ids[ids_index] = id;
				ids_index++;
			}
		}
		/**
		 * Wenn auf den aktuellen Koordinaten Punkte liegen (ids vorhanden sind)
		 * info- oder hoverbox anzeigen, je nachdem ob die maustaste gedückt war
		 * oder die maus nur bewegt wurde.
		 */
		if (ids.length > 0) {
			map.setCursor('pointer');
			idstring = "";
			for (i = 0; i < ids_index; i++) {
				idstring += ids[i] + ";";
			}

			if (evt.type == "mouseup") {
				hoverBox.hide();
				infoBox.setText('');
				fetchinfoBoxContent(idstring);
				infoBox.hide();
				infoBox.setPosition(getScrollWidth() + evt.clientX, getScrollHeight() + evt.clientY);
				infoBox.show();
			}
			else {
				if (!infoBox.enabled) {
					hoverBox.setText('');
					hoverBox.hide();
					hoverBox.setPosition(getScrollWidth() + evt.clientX, getScrollHeight() + evt.clientY);
					var hovertxt = new Array();
					for (i = 0; i < ids_index; i++) {
						hovertxt[i] = hover_content[ids[i]];
					}
					hoverBox.setText(hovertxt);
					hoverBox.show();
				}
			}
		} else {
			map.setCursor('auto');
			hoverBox.hide();
		}
	}

	/**
	 * Klasse Box -
	 * wird für divs verwendet um Informationen anzuzeigen<br>
	 *
	 * Wenn die Box eine Überschrift haben soll, dann muss headline auf true gesetzt werden<br>
	 * Wenn die Box auf der x ebene immer versoben sein soll, dann muss xoffset gesetzt werden (praktisch für Mausgeführte boxen).
	 *
	 * @param {Object} id
	 * @param {Boolean} headline
	 * @param {Number} xoffset
	 */
	function Box(id, headline, xoffset ) {
		this.id = id;
		this.headline = headline;
		boxelement = document.createElement("div");
		boxelement.id = id;
		document.getElementsByTagName("body")[0].appendChild(boxelement);
		this.box = document.getElementById(id);

		this.xoffset = xoffset;
		this.xpos = 100;
		this.ypos = 100;
		this.box.style.position = "absolute";
		this.box.style.left = this.xpos + this.xoffset + "px";
		this.box.style.top =  this.ypos + this.xoffset + "px";

		if (headline) {
			h = document.createElement("div");
			h.setAttribute("class", this.id+"-headline");
			h.setAttribute("className", this.id+"-headline");	// ie style
			h_close = document.createElement("span");
			h_close.style.cursor = "pointer";
			h_close.onclick = function(){infoBox.hide();};
			h_close.appendChild(document.createTextNode("[x]"));
			h.appendChild(h_close);
			this.box.appendChild(h);
		}
		this.hide();
	}
	/**
	 * Versteckt die Box
	 */
	Box.prototype.hide = function() {
		this.box.style.display = "none";
		this.enabled = false;
	}
	/**
	 * Macht die Box sichtbar
	 */
	Box.prototype.show = function() {
		this.box.style.display = "block";
		this.enabled = true;
	}
	/**
	 * Ändert den Inhalt der Box
	 * @param {Object} txt
	 */
	Box.prototype.setText = function(txt) {
		/**
		 * Eventuell vorhandene <div> Bereiche entfernen
		 */

		if (this.headline) {
			tagstart = 1;
		} else {
			tagstart = 0;
		}

		var Wurzel = document.getElementById(this.id);
		var Knoten = Wurzel.firstChild;
		if (this.headline) {
			Knoten = Knoten.nextSibling;
		}
		var i = 0;
		var nodestoremove = Array();
		while (Knoten != null) {
			nodestoremove[i] = Knoten;
			i++;
			Knoten = Knoten.nextSibling;
		}

		for (i=0; i < nodestoremove.length; i++) {
			Wurzel.removeChild(nodestoremove[i]);
		}

		/**
		 * Und wieder anlegen um sie mit Text zu füllen
		 */
		switch (typeof(txt)) {
			case "string":
				text = document.createElement("div");
				text.setAttribute("class", this.id+"-text");
				text.setAttribute("className", this.id+"-text");	// ie style
				this.box.appendChild(text);
				BetterInnerHTML(this.box.lastChild, txt);
				break;
			case "object":
				for (var i = 0; i < txt.length; i++) {
					var text = document.createElement("div");
					text.setAttribute("class", this.id+"-text");
					text.setAttribute("className", this.id+"-text");	// ie style
					this.box.appendChild(text);
					BetterInnerHTML(this.box.lastChild, txt[i]);
				}
				break;
			default:
				break;
		}
	}
	/**
	 * Positioniert die Box<br>
	 *
	 * fixme: So positionieren, dass sie nicht aus dem sichtbaren Bereich verschwindet
	 *
	 * @param {Object} x
	 * @param {Object} y
	 */
	Box.prototype.setPosition = function(x, y) {
		this.xpos = x ;
		this.ypos = y;

		this.box.style.left = this.xpos + this.xoffset + "px";
		this.box.style.top = this.ypos + "px";
	}
	/**
	 * Ändert die Größe der Box
	 * @param {Object} width
	 * @param {Object} height
	 */
	Box.prototype.setDimension = function (width, height) {
		this.box.style.width = width + "px";
		this.box.style.height = height + "px";
	}
	/**
	 * Richtet die Box neu aus, abhängig davon wieviel platz nach unten ist.
	 * Wenn zu wenig Platz nach unten ist wird sie nach oben gedreht.<br>
	 *
	 * Kann erst aufgerufen werden, wenn setText() benutzt wurde, weil erst
	 * dann klar ist wie groß die box ist.<br>
	 *
	 * fixme: wenn nach unten mehr Platz vorhanden ist ist als nach unten, dann
	 * nach unten nicht nach oben
	 */
	Box.prototype.arrange = function() {
		var boxbreite = this.box.offsetWidth;
		var boxhoehe = this.box.offsetHeight;
		var platz_in_breite = getScrollWidth() + getInnerWidth();
		var platz_in_hoehe = getScrollHeight() + getInnerHeight();
		var neue_xpos = this.xpos;
		var neue_ypos = this.ypos;

		if (this.xpos + boxbreite < platz_in_breite)  {
			neue_xpos = this.xpos;
		} else {
			/**
			 * ! 20px scollleistenbreite
			 */
			neue_xpos = this.xpos - (boxbreite + this.xoffset + 20);
		}
		if (this.ypos + boxhoehe < platz_in_hoehe)  {
			neue_ypos = this.ypos;
		} else {
			neue_ypos = this.ypos - boxhoehe;
		}
		this.setPosition(neue_xpos, neue_ypos);
	}

	/**
	 * Klasse Map
	 * Stellt Funktionen und Infomation über die Kartengrafik zur Verfügung.
	 *
	 * @param {Object} id
	 */
	function Map(id) {
		switch (typeof(id)) {
			case "object":
				this.map = id;
				break;
			case "string":
				this.map = document.getElementById(id);
				break;
			default:
				document.getElementById("errorBox").innerHTML = "map id nicht zuordbar";
				this.map = null;
				break;
		}
		if (this.map != null) {
			this.x = this.getX();	// vorsicht: ändert sich währen der laufzeit aus irgend einem grund im ie
			this.y = this.getY();	// vorsicht: ändert sich währen der laufzeit aus irgend einem grund im ie
			this.width = this.getWidth();
			this.height = this.getHeight();
		}
		this.setCursor('pointer');
	}
	/**
	 * Gibt die x Postion der Karte zurück<br />
	 * Vorsicht: kann im ie teilweise falsche  werte geben, wenn z.b. gerade ein bild geladen wird
	 *
	 * @return {Number}
	 */
	Map.prototype.getX = function() {
		var obj = this.map;
		var left = 0;
		/**
		 *  MS Javascript, aber von den meisten Browsern unterstüzt,
		 *  Die Abfrage im ie fehl obwohl er es kann.
		 */
//		if (obj.offsetLeft) {
			while (obj) {
				left += parseInt(obj.offsetLeft);
				obj = obj.offsetParent;
			}
//		}
		return left;
	}
	/**
	 * Gibt die y Postion der Karte zurück<br />
	 * Vorsicht: kann im ie teilweise falsche  werte geben, wenn z.b. gerade ein bild geladen wird
	 *
	 * @return {Number}
	 */
	Map.prototype.getY = function() {
		var obj = this.map;
		var top = 0;
		/**
		 *  MS Javascript, aber von den meisten Browsern unterstüzt,
		 *  Die Abfrage im ie fehl obwohl er es kann.
		 */
//		if (obj.offsetLeft) {
			while (obj) {
				top += parseInt(obj.offsetTop);
				obj = obj.offsetParent;
			}
//		}
		return top;
	}
	/**
	 * Gibt die Breite der Karte in Pixel zurück
	 * @return {Number}
	 */
	Map.prototype.getWidth = function() {
		return this.map.offsetWidth;
	}
	/**
	 * Gibt Höhe der Karte in pixel zurück
	 * @return {Number}
	 */
	Map.prototype.getHeight = function() {
		return this.map.offsetHeight;
	}
	/**
	 * Gibt die x Position der Maus innerhalb der Karte zurück
	 */
	Map.prototype.getMouseX = function (mouseX) {
		mouseXAbs = getScrollWidth() + mouseX
		mouseXMap = mouseXAbs - this.getX();
		return mouseXMap;

	}
	/**
	 * Gibt die y Position der Maus innerhalb der Karte zurück
	 */
	Map.prototype.getMouseY = function (mouseY) {
		mouseYAbs = getScrollHeight() + mouseY
		mouseYMap = mouseYAbs - this.getY();
		return mouseYMap;
	}
	/**
	 * Tauscht das Bild aus
	 * @param {Object} src
	 */
	Map.prototype.changeImage = function (src) {
		this.map.src = src;
	}
	/**
	 * Ändert die größe des Bilds
	 * @param {Object} newwidth
	 * @param {Object} newheight
	 */
	Map.prototype.setDimension = function (newwidth, newheight) {
		this.map.width = newwidth;
		this.map.height = newheight;
	}
	/**
	 * Setzt das Bild an eine neue Position
	 * @param {Object} x
	 * @param {Object} y
	 */
	Map.prototype.setPosition = function (x, y) {
		this.map.style.marginLeft = x + "px";
		this.map.style.marginTop = y + "px";
	}
	/**
	 * Ändert den Mauscursor
	 * @param {Object} cur
	 */
	Map.prototype.setCursor = function (cur) {
		// fixme: if IE 5.5 && cur='pointer' -> 'hand'
		this.map.style.cursor = cur;
	}
	/**
	 * Liefert das Objekt der Karte. Solle möglicht nur für
	 * onmousemove, onemousedown,... verwendet werden, da es damit
	 * möglich ist das Objekt direkt anzusprechen.
	 */
	Map.prototype.event = function () {
		return this.map;
	}



/* ************************************************************************************ */
	/**
	 * Erstellt ein Objekt für Ajax Verbindungen
	 */
	function initxml() {
		if (xmlHttp == null) {
			try {
				xmlHttp = new XMLHttpRequest();
			}
			catch (e) {
				try {
					xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch (e) {
					try {
						xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
					}
					catch (e) {
						xmlHttp = null;
					}
				}
			}
		}
	}
	/**
	 * Holt die Koordinaten auf denen sich Schlaflabore befinden.
	 * @param {Object} paramvars
	 */
	function fetchCoords(paramvars) {
		if (xmlHttp != null) {
			xmlHttp.open('GET', coords_file +"?"+ paramvars, true); // [, true]
		    xmlHttp.onreadystatechange = function() {
				/**
				 * readyState
				 * 0 - uninitialized
				 * 1 - loading
				 * 2 - loaded
				 * 3 - interactice
				 * 4 - complete
				 */
                switch(xmlHttp.readyState) {
                    case 4:
	                    if (xmlHttp.status == 200) {
							coords_xy = eval('(' + xmlHttp.responseText + ')');
							var ids = "";
							for (var i = 0; i < coords_xy.length; i++) {
								ids = ids + coords_xy[i]['id'] + ";";

							}
							fetchHoverContent(ids);
							zoomoutBox = new Box("backInfo", false, 0);
							zoomoutBox.setText('<a href="#" onclick="zoomOut();">&gt;&gt; Zurück zur Kartenübersicht</a>');

							zoomoutBox.setPosition(map.x, map.y+20);
							zoomoutBox.setDimension(map.width-20, 20);	// -20, da padding-left: 20px;
							zoomoutBox.box.style.backgroundColor = "#ffffff";
							zoomoutBox.show();
							infoBox = new Box("laborInfo", true, 15);
							hoverBox = new Box("laborHoverInfo", false, 15);

	                    } else {
	                        document.getElementById('errorBox').innerHTML = "Fehler: "+xmlHttp.status;
	                    }
	                    break;
                    default:
                        return false;
    	                break;
				}
			}
			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		    xmlHttp.send(null);
		}
	}
	/**
	 * Hold die Beschreibungstexte für die einzelnen Einträge
	 * @param {Object} id
	 */
	function fetchinfoBoxContent(ids) {
		if (xmlHttp != null) {
			xmlHttp.open('GET', infobox_content_file+'?ids='+ids, true);
		    xmlHttp.onreadystatechange = function() {
				/**
				 * readyState
				 * 0 - uninitialized
				 * 1 - loading
				 * 2 - loaded
				 * 3 - interactice
				 * 4 - complete
				 */
                switch(xmlHttp.readyState) {
                    case 4:
	                    if (xmlHttp.status == 200) {
							xmlresults = eval('(' + xmlHttp.responseText + ')');
							/*
							infotxt = '';
							for (var i=0; i<xmlresults.length; i++) {
								if (i > 0) {
									infotxt += "<hr />";
								}
								infotxt += xmlresults[i];
							}
							infoBox.setText(infotxt);
							*/
							infoBox.setText(xmlresults);
							infoBox.arrange();
	                    } else {
	                        document.getElementById('errorBox').innerHTML = "Fehler: "+xmlHttp.status;
	                    }
	                    break;
                    default:
                        return false;
    	                break;
				}
			}
			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		    xmlHttp.send(null);
		}

	}

	/**
	 * Hold die Kurzbeschreibung für einen einzelnen Einträge
	 * @param {Object} id
	 */
	function fetchHoverContent(ids) {
		if (xmlHttp != null) {
			xmlHttp.open('GET', 'schlaflabore_hover_content.php?ids='+ids, true);
		    xmlHttp.onreadystatechange = function() {
				/**
				 * readyState
				 * 0 - uninitialized
				 * 1 - loading
				 * 2 - loaded
				 * 3 - interactice
				 * 4 - complete
				 */
                switch(xmlHttp.readyState) {
                    case 4:
	                    if (xmlHttp.status == 200) {
							
							hover_content = eval('(' + xmlHttp.responseText + ')');
	                    } else {
	                        document.getElementById('errorBox').innerHTML = "Fehler: "+xmlHttp.status;
	                    }
	                    break;
                    default:
                        return false;
    	                break;
				}
			}
			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		    xmlHttp.send(null);
		}

	}


/* ***************************************************************************** */
 /**
  * DOMLIB
  */
	/**
	 * returns how width you scolled right
	 */
	function getScrollWidth() {
		if (self.pageYOffset) // (JS 1.1) Netscape 3, Firefox, Safari, Konqueror 3.3, Opera 5.12
			return self.pageXOffset;
		else if (document.documentElement && document.documentElement.scrollTop) // IE 6 Strict
			return document.documentElement.scrollLeft;
		else if (document.body) // IE 5
			return document.body.scrollLeft;
	}
	/**
	 * returns how much you scolled down
	 */
	function getScrollHeight() {
		if (self.pageYOffset) // (JS 1.1) Netscape 3, Firefox, Safari, Konqueror 3.3, Opera 5.12
			return self.pageYOffset;
		else if (document.documentElement && document.documentElement.scrollTop) // IE 6 Strict
			return document.documentElement.scrollTop;
		else if (document.body) // IE 5
			return document.body.scrollTop;
	}
	/**
	 * returns the viewable window width.
	 */
	function getInnerWidth() {
		if (self.innerHeight) // (JS 1.2) Netscape 4, Firefox, Safari, Konqueror 3.3, Opera 5.12
			return self.innerWidth;
		else if (document.documentElement && document.documentElement.clientHeight) // IE 6 Strict Mode
			return document.documentElement.clientWidth;
		else if (document.body) // IE 5
			return document.body.clientWidth;
	}
	/**
	 * returns the viewable window height.
	 */
	function getInnerHeight() {
		if (self.innerHeight) // (JS 1.2) Netscape 4, Firefox, Safari, Konqueror 3.3, Opera 5.12
			return self.innerHeight;
		else if (document.documentElement && document.documentElement.clientHeight) // IE 6 Strict Mode
			return document.documentElement.clientHeight;
		else if (document.body) // IE 5
			return document.body.clientHeight;
	}







    // BetterInnerHTML v1.15 - by Craig Buckler, http://www.optimalworks.net/
    function BetterInnerHTML(_1, _2, _3){
        function Load(_4){
            var _5;
            if (typeof DOMParser != "undefined") {
                _5 = (new DOMParser()).parseFromString(_4, "application/xml");
            }
            else {
                var _6 = ["MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];
                for (var i = 0; i < _6.length && !_5; i++) {
                    try {
                        _5 = new ActiveXObject(_6[i]);
                        _5.loadXML(_4);
                    }
                    catch (e) {
                    }
                }
            }
            return _5;
        }
        function Copy(_8, _9, _a){
            if (typeof _a == "undefined") {
                _a = 1;
            }
            if (_a > 1) {
                if (_9.nodeType == 1) {
                    var _b = document.createElement(_9.nodeName);
                    for (var a = 0, attr = _9.attributes.length; a < attr; a++) {
                        var _d = _9.attributes[a].name, aValue = _9.attributes[a].value, evt = (_d.substr(0, 2) == "on");
                        if (!evt) {
                            switch (_d) {
                                case "class":
                                    _b.className = aValue;
                                    break;
                                case "for":
                                    _b.htmlFor = aValue;
                                    break;
                                default:
                                    _b.setAttribute(_d, aValue);
                            }
                        }
                    }
                    _8 = _8.appendChild(_b);
                    if (evt) {
                        _8[_d] = function(){
                            eval(aValue);
                        };
                    }
                }
                else {
                    if (_9.nodeType == 3) {
                        var _e = (_9.nodeValue ? _9.nodeValue : "");
                        var _f = _e.replace(/^\s*|\s*$/g, "");
                        if (_f.length < 7 || (_f.indexOf("<!--") != 0 && _f.indexOf("-->") != (_f.length - 3))) {
                            _8.appendChild(document.createTextNode(_e));
                        }
                    }
                }
            }
            for (var i = 0, j = _9.childNodes.length; i < j; i++) {
                Copy(_8, _9.childNodes[i], _a + 1);
            }
        }
        _2 = "<root>" + _2 + "</root>";
        var _11 = Load(_2);
        if (_1 && _11) {
            if (_3 != false) {
                while (_1.lastChild) {
                    _1.removeChild(_1.lastChild);
                }
            }
            Copy(_1, _11.documentElement);
        }
    }
