function KMLObj(title, desc, op, fid) {
	this.title = title;
	this.description = escape(desc);
	this.marks = [];
	this.folders = [];
	this.groundOverlays = [];
	this.open = op;
	this.folderid = fid;
};
function Lance$(mid) {
	return document.getElementById(mid);
};
var topwin = self;
function GeoXml(myvar, map, url, opts) {
	this.myvar = myvar;
	this.opts = opts || {};
	this.mb = new MessageBox(map, this, "mb", this.opts.messagebox);
	this.map = map;
	this.url = url;
	if (typeof url == "string") {
		this.urls = [ url ];
	} else {
		this.urls = url;
	}
	;
	this.zoomHere = 15;
	this.mb.style = this.opts.messagestyle || {
		backgroundColor : "white"
	};
	this.alwayspop = this.opts.alwaysinfopop || false;
	this.quiet = this.opts.quiet || false;
	this.titlestyle = this.opts.titlestyle || 'style = "font-family: arial, sans-serif;font-size: medium;font-weight:bold;font-size: 100%;"';
	this.descstyle = this.opts.descstyle || 'style = "font-family: arial, sans-serif;font-size: small;padding-bottom:.7em;"';
	if (this.opts.directionstyle
			&& typeof this.opts.directionstyle != "undefined") {
		this.directionstyle = this.opts.directionstyle;
	} else {
		this.directionstyle = 'style="font-family: arial, sans-serif;font-size: small;padding-left: 1px;padding-top: 1px;padding-right: 4px;"';
	}
	;
	this.sidebarfn = this.opts.sidebarfn || GeoXml.addSidebar;
	this.pointlabelopacity = this.opts.pointlabelopacity || 100;
	this.polylabelopacity = this.opts.polylabelopacity || 100;
	this.hilite = this.opts.hilite || {
		color : "#aaffff",
		opacity : 0.6,
		textcolor : "#000000"
	};
	this.latestsidebar = "";
	this.forcefoldersopen = false;
	if (typeof this.opts.allfoldersopen != "undefined") {
		this.forcefoldersopen = this.opts.allfoldersopen;
	}
	;
	this.clickablepolys = true;
	if (typeof this.opts.zoomhere == "number") {
		this.zoomHere = this.opts.zoomhere;
	}
	;
	if (typeof this.opts.clickablepolys == "boolean") {
		this.clickablepolys = this.opts.clickablepolys;
	}
	;
	this.clickablemarkers = true;
	if (typeof this.opts.clickablemarkers == "boolean") {
		this.clickablemarkers = this.opts.clickablemarkers;
	}
	;
	this.clickablelines = true;
	if (typeof this.opts.clickablelines == "boolean") {
		this.clickablelines = this.opts.clickablelines;
	}
	;
	if (typeof this.opts.nolegend != "undefined") {
		this.nolegend = true;
	}
	;
	if (typeof this.opts.preloadHTML == "undefined") {
		this.opts.preloadHTML = true;
	}
	;
	this.sidebariconheight = 16;
	if (typeof this.opts.sidebariconheight == "number") {
		this.sidebariconheight = this.opts.sidebariconheight;
	}
	;
	this.sidebarsnippet = false;
	if (typeof this.opts.sidebarsnippet == "boolean") {
		this.sidebarsnippet = this.opts.sidebarsnippet;
	}
	;
	this.hideall = false;
	if (typeof proxy != "undefined") {
		this.proxy = proxy;
	}
	;
	if (!this.proxy && typeof getcapproxy != "undefined") {
		if (fixUrlEnd) {
			getcapproxy = fixUrlEnd(getcapproxy);
		}
	}
	;
	if (this.opts.hideall) {
		this.hideall = this.opts.hideall;
	}
	;
	this.publishdirectory = "http://www.dyasdesigns.com/tntmap/";
	topwin = top;
	try {
		topname = top.title;
	} catch (err) {
		topwin = self;
	}
	;
	if (topwin.publishdirectory) {
		this.publishdirectory = topwin.publishdirectory;
	}
	;
	if (topwin.standalone) {
		this.publishdirectory = "";
	}
	;
	this.kmlicon = this.publishdirectory + "images/ge.png";
	this.docicon = this.publishdirectory + "images/ge.png";
	this.docclosedicon = this.publishdirectory + "images/geclosed.png";
	this.foldericon = this.publishdirectory + "images/folder.png";
	this.folderclosedicon = this.publishdirectory + "images/folderclosed.png";
	this.gmlicon = this.publishdirectory + "images/geo.gif";
	this.rssicon = this.publishdirectory + "images/rssb.png";
	this.globalicon = this.publishdirectory + "images/geo.gif";
	this.WMSICON = "<img src=\"" + this.publishdirectory
			+ "images/geo.gif\" style=\"border:none\" />";
	GeoXml.WMSICON = this.WMSICON;
	this.baseLayers = [];
	this.bounds = new GLatLngBounds();
	this.style = {
		width : 2,
		opacity : 0.75,
		fillopacity : 0.4
	};
	this.style.color = this.randomColor();
	this.style.fillcolor = this.randomColor();
	this.iwwidth = this.opts.iwwidth || 400;
	this.maxiwwidth = this.opts.maxiwwidth || 0;
	this.iwheight = this.opts.iwheight || 250;
	this.lastmarker = {};
	this.verySmall = 0.0000001;
	this.progress = 0;
	this.ZoomFactor = 2;
	this.NumLevels = 18;
	this.maxtitlewidth = 0;
	this.styles = [];
	this.jsdocs = [];
	this.jsonmarks = [];
	this.polyset = [];
	this.polygons = [];
	this.polylines = [];
	this.multibounds = [];
	this.overlayman = new Clusterer(map, this);
	this.overlayman.rowHeight = 20;
	if (this.opts.sidebarid) {
		this.basesidebar = this.opts.sidebarid;
	}
	;
	this.kml = [ new KMLObj("GeoXML", "", true, 0) ];
	this.overlayman.folders.push( []);
	this.overlayman.subfolders.push( []);
	this.overlayman.folderhtml.push( []);
	this.overlayman.folderhtmlast.push(0);
	this.overlayman.folderBounds.push(new GLatLngBounds());
	this.wmscount = 0;
	this.labels = new GTileLayerOverlay(G_HYBRID_MAP.getTileLayers()[1]);
	this.unnamedpath = "un-named path";
	this.unnamedplace = "un-named place";
	this.unnamedarea = "un-named area";
};
GeoXml.stripHTML = function(s) {
	return (s.replace(/(<([^>]+)>)/ig, ""));
};
GeoXml.prototype.showIt = function(str, h, w) {
	var features = "status=yes,resizable=yes,toolbar=0,height=" + h + ",width="
			+ h + ",scrollbars=yes";
	var myWin;
	if (topwin.widget) {
		alert(str);
		this.mb.showMess(str);
	} else {
		myWin = window.open("", "_blank", features);
		myWin.document.open("text/xml");
		myWin.document.write(str);
		myWin.document.close();
	}
};
GeoXml.prototype.clear = function(idx) {
	for ( var m = 0; m < this.overlayman.markers.length; m++) {
		this.overlayman.RemoveMarker(this.overlayman.markers[m]);
	}
	this.kml = [ new KMLObj("GeoXML", "", true, 0) ];
	this.maxtitlewidth = 0;
	this.styles = [];
	this.jsdocs = [];
	this.jsonmarks = [];
	this.polyset = [];
	this.polylines = [];
	this.multibounds = [];
	this.bounds = new GLatLngBounds();
	this.overlayman = new Clusterer(this.map, this);
	this.overlayman.rowHeight = 20;
	if (typeof this.basesidebar != "undefined" && this.basesidebar != "") {
		Lance$(this.basesidebar).innerHTML = "";
	}
	this.overlayman.folders.push( []);
	this.overlayman.subfolders.push( []);
	this.overlayman.folderhtml.push( []);
	this.overlayman.folderhtmlast.push(0);
	this.overlayman.byname = [];
	this.overlayman.byid = [];
	this.overlayman.folderBounds.push(new GLatLngBounds());
	this.wmscount = 0;
};
GeoXml.prototype.createMarkerJSON = function(item, idx) {
	var that = this;
	var style = that.makeIcon(style, item.href);
	var point = new GLatLng(item.y, item.x);
	that.overlayman.folderBounds[idx].extend(point);
	that.bounds.extend(point);
	if (item.shadow) {
		style.shadow = item.shadow;
	} else {
		style.shadow = null;
	}
	if (!!that.opts.createmarker) {
		that.opts.createmarker(point, item.title, unescape(item.description),
				null, idx, style, item.visibility, item.id, item.snip);
	} else {
		that.createMarker(point, item.title, unescape(item.description), null,
				idx, style, item.visibility, item.id, item.snip);
	}
};
GeoXml.prototype.createMarker = function(point, name, desc, style, idx,
		instyle, visible, kml_id, markerurl, snip) {
	var myvar = this.myvar;
	var icon;
	var bicon = new GIcon();
	if (this.opts.baseicon) {
		bicon.iconSize = this.opts.baseicon.iconSize;
		bicon.iconAnchor = this.opts.baseicon.iconAnchor;
		bicon.shadowSize = this.opts.baseicon.shadowSize;
		bicon.infoWindowAnchor = this.opts.baseicon.infoWindowAnchor;
	} else {
		bicon.infoWindowAnchor = new GPoint(16, 0);
		bicon.iconSize = new GSize(32, 32);
		bicon.shadowSize = new GSize(32, 32);
		bicon.iconAnchor = new GPoint(16, 32);
	}
	var shadow;
	var href;
	if (this.opts.iconFromDescription) {
		var text = desc;
		var pattern = new RegExp("<\\s*img", "ig");
		var result;
		var pattern2 = /src\s*=\s*[\'\"]/;
		var pattern3 = /[\'\"]/;
		while ((result = pattern.exec(text)) != null) {
			var stuff = text.substr(result.index);
			var result2 = pattern2.exec(stuff);
			if (result2 != null) {
				stuff = stuff.substr(result2.index + result2[0].length);
				var result3 = pattern3.exec(stuff);
				if (result3 != null) {
					var imageUrl = stuff.substr(0, result3.index);
					href = imageUrl;
				}
			}
		}
		shadow = null;
		if (!href) {
			href = "http://maps.google.com/mapfiles/kml/pal3/icon40.png";
		}
		icon = new GIcon(bicon, href, null, shadow);
	} else {
		href = "http://maps.google.com/mapfiles/kml/pal3/icon40";
		if (instyle == null || typeof instyle == "undefined") {
			shadow = href + "s.png";
			href += ".png";
			if (this.opts.baseicon) {
				href = this.opts.baseicon.image;
				shadow = this.opts.baseicon.shadow;
			}
		} else {
			if (instyle.href) {
				href = instyle.href;
			}
			if (instyle.shadow) {
				shadow = instyle.shadow;
			}
		}
		icon = new GIcon(bicon, href, null, shadow);
	}
	var iwoptions = this.opts.iwoptions || {};
	var markeroptions = this.opts.markeroptions || {};
	var icontype = this.opts.icontype || "style";
	if (icontype == "style") {
		if (!!this.styles[style]) {
			icon = new GIcon(bicon, this.styles[style].href, null,
					this.styles[style].shadow);
			icon.src = this.styles[style].href;
			href = this.styles[style].href;
		}
	}
	markeroptions.icon = icon;
	markeroptions.title = name;
	var m = new GMarker(point, markeroptions);
	m.title = name;
	m.id = kml_id;
	var obj = {
		"type" : "point",
		"title" : name,
		"description" : escape(desc),
		"href" : href,
		"shadow" : shadow,
		"visibility" : visible,
		"x" : point.x,
		"y" : point.y,
		"id" : m.id
	};
	this.kml[idx].marks.push(obj);
	if (this.opts.pointlabelclass) {
		var l = new ELabel(point, name, this.opts.pointlabelclass,
				this.opts.pointlabeloffset, this.pointlabelopacity, true);
		m.label = l;
		this.map.addOverlay(l);
	}
	var html, html1, html2, html3, html4;
	var awidth = this.iwwidth;
	if (desc.length * 8 < awidth) {
		awidth = desc.length * 8;
	}
	if (awidth < name.length * 10) {
		awidth = name.length * 10;
	}
	if (this.maxiwwidth && awidth > this.maxiwwidth) {
		awidth = this.maxiwwidth;
	}
	html = "<div style = 'width:" + awidth + "px'>" + "<h1 " + this.titlestyle
			+ ">" + name + "</h1>" + "<div " + this.descstyle + ">" + desc
			+ "</div>";
	var html1;
	if (this.opts.directions) {
		html1 = html
				+ '<div '
				+ this.directionstyle
				+ '>'
				+ 'Get Directions: <a href="#" onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click2\');return false;">To Here</a> - '
				+ '<a href="#" onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click3\');return false;">From Here</a><br>'
				+ '<a href="#" onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click4\');return false;">Search nearby</a> | <a href="#" onclick="'
				+ this.myvar + '.map.setCenter(new GLatLng(' + point.lat()
				+ ',' + point.lng() + '),' + this.zoomHere
				+ ');return false;">Zoom Here</a></div>';
		html2 = html
				+ '<div '
				+ this.directionstyle
				+ '>'
				+ 'Get Directions: To here - '
				+ '<a href="#" onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click3\');return false;">From Here</a><br>'
				+ 'Start address:<form action="http://maps.google.com/maps" method="get" target="_blank">'
				+ '<input type="text" SIZE=35 MAXLENGTH=80 name="saddr" id="saddr" value="" />'
				+ '<INPUT value="Go" TYPE="SUBMIT">'
				+ '<input type="hidden" name="daddr" value="'
				+ point.lat()
				+ ','
				+ point.lng()
				+ "("
				+ name
				+ ")"
				+ '"/>'
				+ '<br><a href="# onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click\');return false;">&#171; Back</a>| <a href="#" onclick="'
				+ this.myvar + '.map.setCenter(new GLatLng(' + point.lat()
				+ ',' + point.lng() + '),' + this.zoomHere
				+ ');return false;">Zoom Here</a></div>';
		html3 = html
				+ '<div '
				+ this.directionstyle
				+ '>'
				+ 'Get Directions: <a href="#" onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click2\');return false;">To Here</a> - '
				+ 'From Here<br>'
				+ 'End address:<form action="http://maps.google.com/maps" method="get"" target="_blank">'
				+ '<input type="text" SIZE=35 MAXLENGTH=80 name="daddr" id="daddr" value="" />'
				+ '<INPUT value="Go" TYPE="SUBMIT">'
				+ '<input type="hidden" name="saddr" value="'
				+ point.lat()
				+ ','
				+ point.lng()
				+ "("
				+ name
				+ ")"
				+ '"/>'
				+ '<br><a href="#" onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click\');return false;">&#171; Back</a> | <a href="#" onclick="'
				+ this.myvar + '.map.setCenter(new GLatLng(' + point.lat()
				+ ',' + point.lng() + '),' + this.zoomHere
				+ ');return false;">Zoom Here</a></div>';
		html4 = html
				+ '<div '
				+ this.directionstyle
				+ '>'
				+ 'Search nearby: e.g. "pizza"<br>'
				+ '<form action="http://maps.google.com/maps" method="get"" target="_blank">'
				+ '<input type="text" SIZE=35 MAXLENGTH=80 name="q" id="q" value="" />'
				+ '<INPUT value="Go" TYPE="SUBMIT">'
				+ '<input type="hidden" name="near" value="'
				+ name
				+ ' @'
				+ point.lat()
				+ ','
				+ point.lng()
				+ '"/>'
				+ '<br><a href="# onclick="GEvent.trigger('
				+ this.myvar
				+ '.lastmarker,\'click\');return false;">&#171; Back</a> | <a href="#" onclick="'
				+ this.myvar + '.map.setCenter(new GLatLng(' + point.lat()
				+ ',' + point.lng() + '),' + this.zoomHere
				+ ');return false;">Zoom Here</a></div>';
		GEvent.addListener(m, "click2", function() {
			m.openInfoWindowHtml(html2 + "</div>", iwoptions);
		});
		GEvent.addListener(m, "click3", function() {
			m.openInfoWindowHtml(html3 + "</div>", iwoptions);
		});
		GEvent.addListener(m, "click4", function() {
			m.openInfoWindowHtml(html4 + "</div>", iwoptions);
		});
	} else {
		html1 = html;
	}
	if (this.opts.markerfollowlinks) {
		if (markerurl && typeof markerurl == "string") {
			if (markerurl != '') {
				m.url = markerurl;
				GEvent.addListener(m, "click", function() {
					eval(myvar + ".lastmarker = m");
					window.open(m.url, '_blank');
				});
			}
		}
	} else {
		if (this.clickablemarkers) {
			GEvent.addListener(m, "click", function() {
				eval(myvar + ".lastmarker = m");
				m.openInfoWindowHtml(html1 + "</div>", iwoptions);
			});
		}
	}
	if (this.opts.domouseover) {
		m.mess = html1 + "</div>";
		m.geoxml = this;
		GEvent.addListener(m, "mouseover", function(point) {
			if (!point) {
				point = m.getPoint();
			}
			m.geoxml.mb.showMess(m.mess, 5000);
		});
	}
	var nhtml = "";
	var parm;
	if (this.opts.sidebarid) {
		var folderid = this.myvar + "_folder" + idx;
		var n = this.overlayman.markers.length;
		var blob = "&nbsp;<img style=\"vertical-align:text-top;padding:0;margin:0\" height=\""
				+ this.sidebariconheight
				+ "\" border=\"0\" src=\""
				+ href
				+ "\">&nbsp;";
		if (this.sidebarsnippet) {
			var desc2 = GeoXml.stripHTML(desc);
			desc2 = desc2.substring(0, 40);
		} else {
			desc2 = '';
		}
		parm = this.myvar + "$$$" + name + "$$$marker$$$" + n + "$$$" + blob
				+ "$$$" + visible + "$$$null$$$" + desc2;
		m.sidebarid = this.myvar + "sb" + n;
		m.hilite = this.hilite;
		m.geoxml = this;
		GEvent.addListener(m, "mouseover", function() {
			var bar = Lance$(this.sidebarid);
			if (bar && typeof bar != "undefined") {
				bar.style.backgroundColor = this.hilite.color;
				bar.style.color = this.hilite.textcolor;
			}
		});
		GEvent.addListener(m, "mouseout", function() {
			var bar = Lance$(this.sidebarid);
			if (bar && typeof bar != "undefined") {
				bar.style.background = "none";
				bar.style.color = "";
			}
		});
	}
	if (!!this.opts.addmarker) {
		this.opts.addmarker(m, name, idx, parm, visible);
	} else {
		this.overlayman.AddMarker(m, name, idx, parm, visible);
	}
};
GeoXml.getDescription = function(node) {
	var sub = "";
	var n = 0;
	var cn;
	if (document.all) {
		for (; n < node.childNodes.length; n++) {
			cn = node.childNodes.item(n);
			sub += cn.xml;
		}
	} else {
		var serializer = new XMLSerializer();
		for (; n < node.childNodes.length; n++) {
			cn = serializer.serializeToString(node.childNodes.item(n));
			sub += cn;
		}
	}
	var s = sub.replace("<![CDATA[", "");
	var u = s.replace("]]>", "");
	u = u.replace(/\&amp;/g, "&");
	u = u.replace(/\&lt;/g, "<");
	u = u.replace(/\&quot;/g, '"');
	u = u.replace(/\&apos;/g, "'");
	u = u.replace(/\&gt;/g, ">");
	return u;
};
GeoXml.prototype.processLine = function(pnum, lnum, idx) {
	var that = this;
	var op = this.polylines[pnum];
	var line = op.lines[lnum];
	var obj;
	var p;
	if (!line) {
		return;
	}
	var thismap = this.map;
	var iwoptions = this.opts.iwoptions || {};
	var polylineEncoder = new PolylineEncoder(this.NumLevels, this.ZoomFactor,
			this.verySmall, true);
	if (line.length > 2) {
		var result = polylineEncoder.dpEncode(line);
		obj = {
			points : result.encodedPoints,
			levels : result.encodedLevels,
			color : op.color,
			weight : op.width,
			opacity : op.opacity,
			clickable : op.clickablepolys,
			zoomFactor : this.ZoomFactor,
			numLevels : this.NumLevels,
			type : "polyline"
		};
		p = new GPolyline.fromEncoded(obj);
	} else {
		obj = {
			points : line,
			color : op.color,
			weight : op.width,
			opacity : op.opacity,
			type : "line",
			id : op.id
		};
		p = new GPolyline(line, op.color, op.width, op.opacity);
	}
	p.bounds = op.pbounds;
	p.id = op.id;
	var nhtml = "";
	var n = this.overlayman.markers.length;
	this.polylines[pnum].lineidx.push(n);
	var parm;
	var awidth = this.iwwidth;
	var desc = op.description;
	if (desc.length * 8 < awidth) {
		awidth = desc.length * 8;
	}
	if (awidth < op.name.length * 12) {
		awidth = op.name.length * 12;
	}
	var html = "<div style='font-weight: bold; font-size: medium; margin-bottom: 0em;'>"
			+ op.name;
	html += "</div>"
			+ "<div style='font-family: Arial, sans-serif;font-size: small;width:"
			+ awidth + "px;'>" + desc + "</div>";
	if (lnum == 0) {
		if (this.opts.sidebarid) {
			var blob = '&nbsp;&nbsp;<span style=";border-left:' + op.width
					+ 'px solid ' + op.color + ';">&nbsp;</span> ';
			if (this.sidebarsnippet) {
				var desc2 = GeoXml.stripHTML(desc);
				desc2 = desc2.substring(0, 20);
			} else {
				desc2 = '';
			}
			parm = this.myvar + "$$$" + op.name + "$$$polyline$$$" + n + "$$$"
					+ blob + "$$$" + op.visibility + "$$$" + pnum + "$$$"
					+ desc2;
			this.latestsidebar = this.myvar + "sb" + n;
		}
	}
	if (lnum < line.length) {
		setTimeout(this.myvar + ".processLine(" + pnum + "," + (lnum + 1)
				+ ",'" + idx + "');", 15);
		if (this.opts.sidebarid) {
			p.sidebar = this.latestsidebar;
		}
	}
	if (this.opts.domouseover) {
		p.mess = html;
	}
	p.title = op.name;
	p.geoxml = this;
	p.strokeColor = op.color;
	p.strokeWeight = op.width;
	p.strokeOpacity = op.opacity;
	p.hilite = this.hilite;
	p.mytitle = p.title;
	p.map = this.map;
	p.idx = pnum;
	p.onOver = function() {
		var pline = this.geoxml.polylines[this.idx];
		if (this.hidden != true) {
			for ( var l = 0; l < pline.lineidx.length; l++) {
				var mark = this.geoxml.overlayman.markers[pline.lineidx[l]];
				mark.realColor = mark.strokeColor;
				mark.setStrokeStyle( {
					color : this.hilite.color
				});
				mark.redraw(true);
			}
		}
		if (this.sidebar) {
			Lance$(this.sidebar).style.backgroundColor = this.hilite.color;
			Lance$(this.sidebar).style.color = this.hilite.textcolor;
		}
		if (this.mess) {
			this.geoxml.mb.showMess(this.mess, 5000);
		} else {
			this.title = "Click for more information about " + this.mytitle;
		}
	};
	p.onOut = function() {
		var pline = this.geoxml.polylines[this.idx];
		if (this.hidden != true) {
			for ( var l = 0; l < pline.lineidx.length; l++) {
				var mark = this.geoxml.overlayman.markers[pline.lineidx[l]];
				mark.setStrokeStyle( {
					color : this.realColor
				});
				mark.redraw(true);
			}
		}
		this.geoxml.mb.hideMess();
		if (this.sidebar) {
			Lance$(this.sidebar).style.background = "none";
			Lance$(this.sidebar).style.color = "";
		}
	};
	GEvent.addListener(p, "mouseout", p.onOut);
	GEvent.addListener(p, "mouseover", p.onOver);
	GEvent.addListener(p, "click", function(point) {
		var doit = false;
		if (!point) {
			point = this.getPoint();
			doit = true;
		}
		if (this.geoxml.clickablelines || doit) {
			this.map.openInfoWindowHtml(point, html, iwoptions);
		}
	});
	obj.name = op.name;
	obj.description = escape(op.description);
	if (that.hideall) {
		op.visibility = false;
	}
	obj.visibility = op.visibility;
	this.kml[idx].marks.push(obj);
	this.overlayman.AddMarker(p, op.name, idx, parm, op.visibility);
};
GeoXml.prototype.createPolyline = function(lines, color, width, opacity,
		pbounds, name, desc, idx, visible, kml_id) {
	var p = {};
	if (!color) {
		p.color = this.randomColor();
	} else {
		p.color = color;
	}
	if (!opacity) {
		p.opacity = 0.45;
	} else {
		p.opacity = opacity;
	}
	if (!width) {
		p.width = 2;
	} else {
		p.width = width;
	}
	p.idx = idx;
	p.visibility = visible;
	if (this.hideall) {
		p.visibility = false;
	}
	p.name = name;
	p.description = desc;
	p.lines = lines;
	p.lineidx = [];
	p.id = kml_id;
	this.polylines.push(p);
	setTimeout(this.myvar + ".processLine(" + (this.polylines.length - 1)
			+ ",0,'" + idx + "');", 15);
};
GeoXml.prototype.processPLine = function(pnum, linenum, idx) {
	var p = this.polyset[pnum];
	var line = p.lines[linenum];
	var obj = {};
	if (line && line.length) {
		var polylineEncoder = new PolylineEncoder(18, 2, 0.00001, true);
		var result = polylineEncoder.dpEncode(line);
		obj = {};
		obj.points = result.encodedPoints;
		obj.levels = result.encodedLevels;
		obj.color = p.color;
		obj.weight = p.weight;
		obj.numLevels = 18;
		obj.zoomFactor = 2;
		obj.opacity = p.opacity;
		p.obj.polylines.push(obj);
	}
	if (linenum == p.lines.length - 1) {
		this.finishPolygon(p.obj, idx);
	} else {
		setTimeout(this.myvar + ".processPLine(" + pnum + "," + (linenum + 1)
				+ ",'" + idx + "');", 5);
	}
};
GeoXml.prototype.finishPolygon = function(op, idx) {
	op.type = "polygon";
	this.finishPolygonJSON(op, idx, false);
};
GeoXml.prototype.finishPolygonJSON = function(op, idx, updatebound, lastpoly) {
	var that = this;
	var iwoptions = that.opts.iwoptions || {};
	if (typeof op.visibility == "undefined") {
		op.visibility = true;
	}
	if (that.hideall) {
		op.visibility = false;
	}
	var desc = unescape(op.description);
	op.opacity = op.fillOpacity;
	var p = new GPolygon.fromEncoded(op);
	var html = "<div style='font-weight: bold; font-size: medium; margin-bottom: 0em;'>"
			+ op.name
			+ "</div>"
			+ "<div style='font-family: Arial, sans-serif;font-size: small;width:"
			+ this.iwwidth + "px'>" + desc + "</div>";
	var newgeom = (lastpoly != "p_" + op.name);
	if (newgeom && this.opts.sidebarid) {
		this.latestsidebar = that.myvar + "sb" + this.overlayman.markers.length;
	} else {
		this.latestsidebar = "";
	}
	if (that.opts.domouseover) {
		p.mess = html;
	}
	p.strokeColor = op.polylines[0].color;
	p.mb = that.mb;
	p.hilite = that.hilite;
	p.strokeOpacity = op.polylines[0].opacity;
	p.fillOpacity = op.opacity;
	p.fillColor = op.color;
	if (!op.fill) {
		p.fillOpacity = 0.0;
	}
	if (that.domouseover) {
		p.mess = html;
	}
	p.geoxml = that;
	p.title = op.name;
	p.id = op.id;
	var n = this.overlayman.markers.length;
	if (newgeom) {
		that.multibounds.push(new GLatLngBounds());
		that.polygons.push( []);
	}
	var len = that.multibounds.length - 1;
	that.multibounds[len].extend(p.getBounds().getSouthWest());
	that.multibounds[len].extend(p.getBounds().getNorthEast());
	that.polygons[that.polygons.length - 1].push(n);
	p.polyindex = that.polygons.length - 1;
	p.geomindex = len;
	p.sidebarid = this.latestsidebar;
	p.onOver = function() {
		if (this.sidebarid) {
			var bar = Lance$(this.sidebarid);
			if (!!bar) {
				bar.style.backgroundColor = this.hilite.color;
				bar.style.color = this.hilite.textcolor;
			}
		}
		if (this.geoxml.clickablepolys) {
			var poly = this.geoxml.polygons[this.polyindex];
			if (poly && this.hidden != true) {
				for ( var pg = 0; pg < poly.length; pg++) {
					var mark = this.geoxml.overlayman.markers[poly[pg]];
					mark.realColor = mark.fillColor;
					mark.setFillStyle( {
						color : this.hilite.color
					});
					mark.redraw(true);
				}
			}
		}
		if (this.mess) {
			p.geoxml.mb.showMess(this.mess, 5000);
		}
	};
	p.onOut = function() {
		if (this.sidebarid) {
			var bar = Lance$(this.sidebarid);
			if (!!bar) {
				bar.style.background = "none";
				bar.style.color = "";
			}
		}
		var poly;
		if (this.geoxml.clickablepolys) {
			poly = this.geoxml.polygons[this.polyindex];
		}
		if (poly && this.hidden != true) {
			for ( var pg = 0; pg < poly.length; pg++) {
				var mark = this.geoxml.overlayman.markers[poly[pg]];
				mark.setFillStyle( {
					color : mark.realColor
				});
				mark.redraw(true);
			}
		}
	};
	GEvent.addListener(p, "mouseout", p.onOut);
	GEvent.addListener(p, "mouseover", p.onOver);
	op.description = escape(desc);
	this.kml[idx].marks.push(op);
	p.map = this.map;
	var bounds;
	GEvent.addListener(p, "click", function(point, overlay) {
		if (!point && this.geoxml.alwayspop) {
			bounds = this.geoxml.multibounds[this.geomindex];
			this.map.setCenter(bounds.getCenter(), this.map
					.getBoundsZoomLevel(bounds));
			point = bounds.getCenter();
		}
		if (!point) {
			this.geoxml.mb.showMess("Zooming to " + p.title, 3000);
			bounds = this.geoxml.multibounds[this.geomindex];
			this.map.setZoom(this.map.getBoundsZoomLevel(bounds));
			this.map.panTo(bounds.getCenter());
		} else {
			if (this.geoxml.clickablepolys) {
				this.map.openInfoWindowHtml(point, html, iwoptions);
			}
		}
	});
	if (this.opts.polylabelclass && newgeom) {
		var epoint = p.getBounds().getCenter();
		var off = this.opts.polylabeloffset;
		if (!off) {
			off = new GSize(0, 0);
		}
		off.x = -(op.name.length * 6);
		var l = new ELabel(epoint, " " + op.name + " ",
				this.opts.polylabelclass, off, this.polylabelopacity, true);
		p.label = l;
		this.map.addOverlay(l);
	}
	var nhtml = "";
	var parm;
	if (this.basesidebar && newgeom) {
		var folderid = this.myvar + "_folder" + idx;
		var blob = "<span style=\"background-color:" + op.color
				+ ";border:2px solid " + p.strokeColor
				+ ";\">&nbsp;&nbsp;&nbsp;&nbsp;</span> ";
		if (this.sidebarsnippet) {
			var desc2 = GeoXml.stripHTML(desc);
			desc2 = desc2.substring(0, 20);
		} else {
			desc2 = '';
		}
		parm = this.myvar + "$$$" + op.name + "$$$polygon$$$" + n + "$$$"
				+ blob + "$$$" + op.visibility + "$$$null$$$" + desc2;
	}
	if (updatebound) {
		var ne = p.getBounds().getNorthEast();
		var sw = p.getBounds().getSouthWest();
		this.bounds.extend(ne);
		this.bounds.extend(sw);
		this.overlayman.folderBounds[idx].extend(sw);
		this.overlayman.folderBounds[idx].extend(ne);
	}
	this.overlayman.AddMarker(p, op.name, idx, parm, op.visibility);
	return op.name;
};
GeoXml.prototype.finishLineJSON = function(po, idx, lastlinename) {
	var m;
	var that = this;
	var thismap = this.map;
	if (po.type == "line") {
		m = new GPolyline(po.points, po.color, po.weight, po.opacity);
	} else {
		m = new GPolyline.fromEncoded(po);
	}
	m.mytitle = po.name;
	m.title = po.name;
	m.geoxml = this;
	m.strokeColor = po.color;
	m.strokeWeight = po.weight;
	m.strokeOpacity = po.opacity;
	m.hilite = this.hilite;
	var n = that.overlayman.markers.length;
	var lineisnew = false;
	var pnum;
	if (("l_" + po.name) != lastlinename) {
		lineisnew = true;
		that.polylines.push(po);
		pnum = that.polylines.length - 1;
		that.polylines[pnum].lineidx = [];
		that.polylines[pnum].lineidx.push(n);
		that.latestsidebar = that.myvar + "sb" + n;
	} else {
		pnum = that.polylines.length - 1;
		that.polylines[pnum].lineidx.push(n);
	}
	if (this.opts.basesidebar) {
		m.sidebarid = that.latestsidebar;
	}
	m.onOver = function() {
		if (!!this.sidebarid) {
			var bar = Lance$(this.sidebarid);
			if (bar && typeof bar != "undefined") {
				bar.style.backgroundColor = this.hilite.color;
			}
		}
		this.realColor = this.strokeColor;
		if (m.hidden != true) {
			if (m && typeof m != "undefined") {
				m.setStrokeStyle( {
					color : this.hilite.color
				});
			}
			this.redraw(true);
		}
		if (this.mess) {
			this.geoxml.mb.showMess(this.mess, 5000);
		} else {
			this.title = "Click for more information about " + this.mytitle;
		}
	};
	m.onOut = function() {
		if (!!this.sidebarid) {
			var bar = Lance$(this.sidebarid);
			if (bar && typeof bar != "undefined") {
				bar.style.background = "none";
			}
		}
		if (m.hidden != true) {
			if (m && typeof m != "undefined") {
				m.setStrokeStyle( {
					color : this.realColor
				});
			}
			this.redraw(true);
		}
		if (this.mess) {
			this.geoxml.mb.hideMess();
		}
	};
	GEvent.addListener(m, "mouseover", m.onOver);
	GEvent.addListener(m, "mouseover", m.onOut);
	var parm = "";
	that.kml[idx].marks.push(po);
	var desc = unescape(po.description);
	var awidth = this.iwwidth;
	if (desc.length * 8 < awidth) {
		awidth = desc.length * 8;
	}
	if (awidth < po.name.length * 12) {
		awidth = po.name.length * 12;
	}
	var html = "<div style='font-weight: bold; font-size: medium; margin-bottom: 0em;'>"
			+ po.name;
	html += "</div><div style='font-family: Arial, sans-serif;font-size: small;width:"
			+ awidth + "px'>" + desc + "</div>";
	m.map = this.map;
	if (this.clickablelines) {
		GEvent.addListener(m, "click", function(point) {
			if (!point) {
				point = m.getPoint();
			}
			this.map.openInfoWindowHtml(point, html, that.opts.iwoptions);
		});
	}
	if (that.basesidebar && lineisnew) {
		var blob = '&nbsp;&nbsp;<span style=";border-left:' + po.weight
				+ 'px solid ' + po.color + ';">&nbsp;</span> ';
		if (typeof po.visibility == "undefined") {
			po.visibility = true;
		}
		if (this.sidebarsnippet) {
			var desc2 = GeoXml.stripHTML(desc);
			desc2 = desc2.substring(0, 20);
		} else {
			desc2 = '';
		}
		parm = that.myvar + "$$$" + po.name + "$$$polyline$$$" + n + "$$$"
				+ blob + "$$$" + po.visibility + "$$$"
				+ (that.polylines.length - 1) + "$$$" + desc2;
	}
	var ne = m.getBounds().getNorthEast();
	var sw = m.getBounds().getSouthWest();
	that.bounds.extend(ne);
	that.bounds.extend(sw);
	that.overlayman.folderBounds[idx].extend(sw);
	that.overlayman.folderBounds[idx].extend(ne);
	that.overlayman.AddMarker(m, po.name, idx, parm, po.visibility);
	return (po.name);
};
GeoXml.prototype.handlePlaceObj = function(num, max, idx, lastlinename, depth) {
	var that = this;
	var po = that.jsonmarks[num];
	var name = po.name;
	if (po.title) {
		name = po.title;
	}
	if (name.length + depth > that.maxtitlewidth) {
		that.maxtitlewidth = name.length + depth;
	}
	switch (po.type) {
	case "polygon":
		lastlinename = "p_"
				+ that.finishPolygonJSON(po, idx, true, lastlinename);
		break;
	case "line":
	case "polyline":
		lastlinename = "l_" + that.finishLineJSON(po, idx, lastlinename);
		break;
	case "point":
		that.createMarkerJSON(po, idx);
		lastlinename = "";
		break;
	}
	if (num < max - 1) {
		var act = that.myvar + ".handlePlaceObj(" + (num + 1) + "," + max + ","
				+ idx + ",\"" + lastlinename + "\"," + depth + ");";
		document.status = "processing " + name;
		setTimeout(act, 1);
	} else {
		lastlinename = "";
		if (num == that.jsonmarks.length - 1) {
			that.progress--;
			if (that.progress <= 0) {
				if (!that.opts.nozoom) {
					that.map.setZoom(that.map.getBoundsZoomLevel(that.bounds));
					that.map.setCenter(that.bounds.getCenter());
				}
				GEvent.trigger(that, "parsed");
				that.setFolders();
				if (!that.opts.sidebarid) {
					that.mb.showMess("Finished Parsing", 1000);
					that.ParseURL();
				}
			}
		}
	}
};
GeoXml.prototype.parseJSON = function(doc, title, latlon, desc, sbid) {
	var that = this;
	that.overlayman.miStart = new Date();
	that.jsdocs = eval('(' + doc + ')');
	var bar = Lance$(that.basesidebar);
	if (bar) {
		bar.style.display = "";
	}
	that.recurseJSON(that.jsdocs[0], title, desc, that.basesidebar, 0);
};
GeoXml.prototype.setFolders = function() {
	var that = this;
	var len = that.kml.length;
	for ( var i = 0; i < len; i++) {
		var fid = that.kml[i].folderid;
		var fidstr = new String(fid);
		var fb = fidstr.replace("_folder", "FB");
		var fi = Lance$(fb);
		var fob = Lance$(fid);
		if (fob !== null && fid != that.opts.sidebarid) {
			if (!!that.kml[i].open) {
				fob.style.display = 'block';
			} else {
				fob.style.display = 'none';
				if (fi.src == that.foldericon) {
					fi.src = that.folderclosedicon;
				}
				if (fi.src == that.docicon) {
					fi.src = that.docclosedicon;
				}
			}
		}
	}
};
GeoXml.prototype.recurseJSON = function(doc, title, desc, sbid, depth) {
	var that = this;
	var polys = doc.marks;
	var name = doc.title;
	if (!sbid) {
		sbid = 0;
	}
	var description = unescape(doc.description);
	if (!description && desc) {
		description = desc;
	}
	var keepopen = that.forcefoldersopen;
	if (doc.open) {
		keepopen = true;
	}
	var visible = true;
	if (typeof doc.visibility != "undefined" && doc.visibility) {
		visible = true;
	}
	if (that.hideall) {
		visible = false;
	}
	var snippet = doc.snippet;
	var idx = that.overlayman.folders.length;
	if (!description) {
		description = name;
	}
	var folderid;
	var icon;
	that.overlayman.folders.push( []);
	that.overlayman.subfolders.push( []);
	that.overlayman.folderhtml.push( []);
	that.overlayman.folderhtmlast.push(0);
	that.overlayman.folderBounds.push(new GLatLngBounds());
	that.kml.push(new KMLObj(title, description, keepopen));
	if ((!depth && (doc.folders && doc.folders.length > 1)) || doc.marks.length) {
		if (depth < 2 || doc.marks.length < 1) {
			icon = that.globalicon;
		} else {
			icon = that.foldericon;
		}
		folderid = that.createFolder(idx, name, sbid, icon, description,
				snippet, keepopen, visible);
	} else {
		folderid = sbid;
	}
	var parm, blob;
	var nhtml = "";
	var html;
	var m;
	var num = that.jsonmarks.length;
	var max = num + polys.length;
	for ( var p = 0; p < polys.length; p++) {
		var po = polys[p];
		that.jsonmarks.push(po);
		desc = unescape(po.description);
		m = null;
		if (that.opts.preloadHTML && desc && desc.match(/<(\s)*img/i)) {
			var preload = document.createElement("span");
			preload.style.visibility = "visible";
			preload.style.position = "absolute";
			preload.style.left = "-1200px";
			preload.style.top = "-1200px";
			preload.style.zIndex = this.overlayman.markers.length;
			document.body.appendChild(preload);
			preload.innerHTML = desc;
		}
	}
	if (that.groundOverlays) {
	}
	if (polys.length) {
		that.handlePlaceObj(num, max, idx, null, depth);
	}
	var fc = 0;
	var fid = 0;
	if (typeof doc.folders != "undefined") {
		fc = doc.folders.lenth;
		for ( var f = 0; f < doc.folders.length; ++f) {
			var nextdoc = that.jsdocs[doc.folders[f]];
			fid = that.recurseJSON(nextdoc, nextdoc.title, nextdoc.description,
					folderid, (depth + 1));
			that.overlayman.subfolders[idx].push(fid);
			that.overlayman.folderBounds[idx]
					.extend(that.overlayman.folderBounds[fid].getSouthWest());
			that.overlayman.folderBounds[idx]
					.extend(that.overlayman.folderBounds[fid].getNorthEast());
			if (fid != idx) {
				that.kml[idx].folders.push(fid);
			}
		}
	}
	if (fc || polys.length) {
		that.bounds.extend(that.overlayman.folderBounds[idx].getSouthWest());
		that.bounds.extend(that.overlayman.folderBounds[idx].getNorthEast());
	}
	return idx;
};
GeoXml.prototype.createPolygon = function(lines, color, width, opacity,
		fillcolor, fillOpacity, pbounds, name, desc, folderid, visible, fill,
		outline, kml_id) {
	var thismap = this.map;
	var p = {};
	p.obj = {
		"description" : desc,
		"name" : name
	};
	p.obj.polylines = [];
	p.obj.id = kml_id;
	p.obj.visibility = visible;
	p.obj.fill = fill;
	p.obj.outline = outline;
	p.fillcolor = fillcolor;
	p.obj.strokecolor = color;
	if (!color) {
		p.color = this.style.color;
	} else {
		p.color = color;
	}
	if (!fillcolor) {
		p.obj.color = this.randomColor();
	} else {
		p.obj.color = fillcolor;
	}
	if (!opacity) {
		p.obj.opacity = this.style.opacity;
	} else {
		p.obj.opacity = opacity;
	}
	if (typeof fillOpacity == "undefined") {
		p.obj.fillOpacity = this.style.fillOpacity;
	} else {
		p.obj.fillOpacity = fillOpacity;
	}
	if (!width) {
		p.weight = this.style.width;
	} else {
		p.weight = width;
	}
	p.bounds = pbounds;
	p.lines = lines;
	p.sidebarid = this.opts.sidebarid;
	this.polyset.push(p);
	document.status = "processing poly " + name;
	setTimeout(this.myvar + ".processPLine(" + (this.polyset.length - 1)
			+ ",0,'" + folderid + "')", 1);
};
GeoXml.prototype.toggleFolder = function(i) {
	var f = Lance$(this.myvar + "_folder" + i);
	var tb = Lance$(this.myvar + "TB" + i);
	var folderimg = Lance$(this.myvar + 'FB' + i);
	if (f.style.display == "none") {
		f.style.display = "";
		if (tb) {
			tb.style.fontWeight = "normal";
		}
		if (folderimg.src == this.folderclosedicon) {
			folderimg.src = this.foldericon;
		}
		if (folderimg.src == this.docclosedicon) {
			folderimg.src = this.docicon;
		}
	} else {
		f.style.display = "none";
		if (tb) {
			tb.style.fontWeight = "bold";
		}
		if (folderimg.src == this.foldericon) {
			folderimg.src = this.folderclosedicon;
		}
		if (folderimg.src == this.docicon) {
			folderimg.src = this.docclosedicon;
		}
	}
};
GeoXml.prototype.saveJSON = function() {
	if (topwin.standalone) {
		var fpath = browseForSave("Select a directory to place your json file",
				"JSON Data Files (*.js)|*.js|All Files (*.*)|*.*", "JSON-DATA");
		if (typeof fpath != "undefined") {
			var jsonstr = JSON.stringify(this.kml);
			saveLocalFile(fpath + ".js", jsonstr);
		}
		return;
	}
	if (typeof JSON != "undefined") {
		var jsonstr = JSON.stringify(this.kml);
		if (typeof serverBlessJSON != "undefined") {
			serverBlessJSON(escape(jsonstr), "MyKJSON");
		} else {
			this.showIt(jsonstr);
		}
	} else {
		alert("No JSON methods currently available");
	}
};
GeoXml.prototype.hide = function() {
	this.contentToggle(1, false);
	this.overlayman.currentZoomLevel = -1;
	Clusterer.Display(this.overlayman);
};
GeoXml.prototype.show = function() {
	this.contentToggle(1, true);
	this.overlayman.currentZoomLevel = -1;
	Clusterer.Display(this.overlayman);
};
GeoXml.prototype.toggleContents = function(i, show) {
	this.contentToggle(i, show);
	this.overlayman.currentZoomLevel = -1;
	Clusterer.Display(this.overlayman);
};
GeoXml.prototype.contentToggle = function(i, show) {
	var f = this.overlayman.folders[i];
	var cb;
	var j;
	var m;
	if (typeof f == "undefined") {
		this.mb.showMess("folder " + f + " not defined");
		return;
	}
	if (show) {
		for (j = 0; j < f.length; j++) {
			m = this.overlayman.markers[f[j]];
			m.hidden = false;
			if (this.basesidebar) {
				cb = Lance$(this.myvar + '' + f[j] + 'CB');
				if (cb && typeof cb != "undefined") {
					cb.checked = true;
				}
			}
			if (m.hide) {
				m.show();
			} else {
				this.map.addOverlay(m);
			}
			if (!!m.label) {
				m.label.show();
			}
		}
	} else {
		for (j = 0; j < f.length; j++) {
			m = this.overlayman.markers[f[j]];
			m.hidden = true;
			if (this.basesidebar) {
				cb = Lance$(this.myvar + '' + f[j] + 'CB');
				if (cb && typeof cb != "undefined") {
					cb.checked = false;
				}
			}
			if (m.hide) {
				m.hide();
			} else {
				this.map.removeOverlay(m);
			}
			if (!!m.label) {
				m.label.hide();
			}
		}
	}
	var sf = this.overlayman.subfolders[i];
	if (typeof sf != "undefined") {
		for (j = 0; j < sf.length; j++) {
			if (sf[j] != i) {
				if (this.basesidebar) {
					cb = Lance$(this.myvar + '' + sf[j] + 'FCB');
					if (cb && typeof cb != "undefined") {
						cb.checked = (!!show);
					}
				}
				this.contentToggle(sf[j], show);
			}
		}
	}
};
GeoXml.prototype.showHide = function(a, show, p) {
	var m, i;
	if (a != null) {
		if (show) {
			this.overlayman.markers[a].show();
			this.overlayman.markers[a].hidden = false;
			if (!!this.overlayman.markers[a].label) {
				this.overlayman.markers[a].label.show();
			}
		} else {
			this.overlayman.markers[a].hide();
			this.overlayman.markers[a].hidden = true;
			if (!!this.overlayman.markers[a].label) {
				this.overlayman.markers[a].label.hide();
			}
		}
	} else {
		var ms = this.polylines[p];
		if (show) {
			for (i = 0; i < ms.lineidx.length; i++) {
				m = this.overlayman.markers[ms.lineidx[i]];
				m.hidden = false;
				if (m.hide) {
					m.show();
				} else {
					this.map.addOverlay(m);
				}
				if (!!m.label) {
					m.show();
				}
			}
		} else {
			for (i = 0; i < ms.lineidx.length; i++) {
				m = this.overlayman.markers[ms.lineidx[i]];
				m.hidden = true;
				if (m.hide) {
					m.hide();
				} else {
					this.map.removeOverlay(m);
				}
				if (!!m.label) {
					m.hide();
				}
			}
		}
	}
	this.overlayman.currentZoomLevel = -1;
	Clusterer.Display(this.overlayman, true);
};
GeoXml.prototype.toggleOff = function(a, show) {
	if (show) {
		this.map.addOverlay(this.overlayman.markers[a]);
		this.overlayman.markers[a].hidden = false;
	} else {
		this.map.removeOverlay(this.overlayman.markers[a]);
		this.overlayman.markers[a].hidden = true;
	}
	if (this.labels.onMap) {
		this.map.removeOverlay(this.labels);
		this.map.addOverlay(this.labels);
	}
};
GeoXml.addSidebar = function(myvar, name, type, e, graphic, ckd, i, snippet) {
	var check = "checked";
	if (ckd == "false") {
		check = "";
	}
	var h = "";
	var mid = myvar + "sb" + e;
	if (snippet && snippet != "undefined") {
		snippet = "<br><span class='" + myvar + "snip'>" + snippet + "</span>";
	} else {
		snippet = "";
	}
	switch (type) {
	case "marker":
		h = '<li id="' + mid + '" onmouseout="GEvent.trigger(' + myvar
				+ '.overlayman.markers[' + e
				+ '],\'mouseout\');" onmouseover="GEvent.trigger(' + myvar
				+ '.overlayman.markers[' + e
				+ '],\'mouseover\');" ><input id="' + myvar + '' + e
				+ 'CB" type="checkbox" style="vertical-align:middle" ' + check
				+ ' onclick="' + myvar + '.showHide(' + e
				+ ',this.checked)"><a href="#" onclick="GEvent.trigger('
				+ myvar + '.overlayman.markers[' + e
				+ '],\'click\');return false;">' + graphic + name + '</a>'
				+ snippet + '</li>';
		break;
	case "polyline":
		h = '<li id="'
				+ mid
				+ '"  onmouseout="'
				+ myvar
				+ '.overlayman.markers['
				+ e
				+ '].onOut();" onmouseover="'
				+ myvar
				+ '.overlayman.markers['
				+ e
				+ '].onOver();" ><input id="'
				+ myvar
				+ ''
				+ e
				+ 'CB" type="checkbox" '
				+ check
				+ ' onclick="'
				+ myvar
				+ '.showHide(null,this.checked,'
				+ i
				+ ')"><span style="margin-top:6px;"><a href="#" onclick="GEvent.trigger('
				+ myvar + '.overlayman.markers[' + e
				+ '],\'click\');return false;">&nbsp;' + graphic + name
				+ '</a></span>' + snippet + '</li>';
		break;
	case "polygon":
		h = '<li id="'
				+ mid
				+ '"  onmouseout="'
				+ myvar
				+ '.overlayman.markers['
				+ e
				+ '].onOut();" onmouseover="'
				+ myvar
				+ '.overlayman.markers['
				+ e
				+ '].onOver();" ><input id="'
				+ myvar
				+ ''
				+ e
				+ 'CB" type="checkbox" '
				+ check
				+ ' onclick="'
				+ myvar
				+ '.showHide('
				+ e
				+ ',this.checked)"><span style="margin-top:6px;"><a href="#" onclick="GEvent.trigger('
				+ myvar + '.overlayman.markers[' + e
				+ '],\'click\');return false;">&nbsp;' + graphic + name
				+ '</a></span></nobr>' + snippet + '</li>';
		break;
	case "groundoverlay":
		h = '<li id="'
				+ mid
				+ '"><input id="'
				+ myvar
				+ ''
				+ e
				+ 'CB" type="checkbox" '
				+ check
				+ ' onclick="'
				+ myvar
				+ '.showHide('
				+ e
				+ ',this.checked)"><span style="margin-top:6px;"><a href="#" onclick="GEvent.trigger('
				+ myvar + '.overlayman.markers[' + e
				+ '],\'zoomto\');return false;">&nbsp;' + graphic + name
				+ '</a></span>' + snippet + '</li>';
		break;
	case "tiledoverlay":
		h = '<li id="'
				+ mid
				+ '"><nobr><input id="'
				+ myvar
				+ ''
				+ e
				+ 'CB" type="checkbox" '
				+ check
				+ ' onclick="'
				+ myvar
				+ '.toggleOff('
				+ e
				+ ',this.checked)"><span style="margin-top:6px;"><a href="#" oncontextMenu="'
				+ myvar + '.upgradeLayer(' + i
				+ ');return false;" onclick="GEvent.trigger(' + myvar
				+ '.overlayman.markers[' + e + '],\'zoomto\');return false;">'
				+ GeoXml.WMSICON + '&nbsp;' + name + '</a><br />' + graphic
				+ '</span>' + snippet + '</li>';
		break;
	}
	return h;
};
GeoXml.addDropdown = function(myvar, name, type, i, graphic) {
	return '<option value="' + i + '">' + name + '</option>';
};
GeoXml.prototype.parse = function(titles) {
	var that = this;
	var names = [];
	if (typeof titles != "undefined") {
		if (typeof titles != "string") {
			names = titles;
		} else {
			names = titles.split(",");
		}
	}
	that.progress += that.urls.length;
	for ( var u = 0; u < that.urls.length; u++) {
		var title = names[u];
		if (typeof title == "undefined" || !title || title == "null") {
			var segs = that.urls[u].split("/");
			title = segs[segs.length - 1];
		}
		that.mb.showMess("Loading " + title);
		var re = /\.js$/i;
		if (that.urls[u].search(re) != -1) {
			that.loadJSONUrl(this.urls[u], title);
		} else {
			that.loadXMLUrl(this.urls[u], title);
		}
	}
};
GeoXml.prototype.parseString = function(doc, titles, latlon) {
	var names = [];
	if (titles) {
		names = titles.split(",");
	}
	if (typeof doc == "string") {
		this.docs = [ doc ];
	} else {
		this.docs = doc;
	}
	this.progress += this.docs.length;
	for ( var u = 0; u < this.docs.length; u++) {
		this.mb.showMess("Processing " + names[u]);
		this.processing(GXml.parse(this.docs[u]), names[u], latlon);
	}
};
GeoXml.prototype.parseXML = function(doc, titles, latlon) {
	var names = [];
	if (typeof titles != "undefined") {
		if (typeof titles == "string") {
			names = titles.split(",");
		} else {
			names = titles;
		}
	}
	if (typeof doc == "array") {
		this.docs = doc;
	} else {
		this.docs = [ doc ];
	}
	this.progress += this.docs.length;
	for ( var u = 0; u < this.docs.length; u++) {
		this.mb.showMess("Processing " + names[u]);
		this.processing(this.docs[u], names[u], latlon);
	}
};
var currdeschead = "";
GeoXml.prototype.makeDescription = function(elem, title, depth) {
	var d = "";
	var len = elem.childNodes.length;
	var ln = 0;
	var val;
	while (len--) {
		var subelem = elem.childNodes.item(ln);
		var nn = subelem.nodeName;
		var sec = nn.split(":");
		var base = "";
		if (sec.length > 1) {
			base = sec[1];
		} else {
			base = nn;
		}
		if (base
				.match(/^(lat|long|visible|visibility|boundedBy|StyleMap|styleUrl|posList|coordinates|Style|Polygon|LineString|Point|LookAt|Envelope|Box|MultiPolygon|where|guid)/)) {
			currdeschead = "";
		} else {
			if (base
					.match(/#text|the_geom|SchemaData|ExtendedData|#cdata-section/)) {
			} else {
				if (base.match(/Snippet/i)) {
				} else {
					if (base.match(/SimpleData/)) {
						base = subelem.getAttribute("name");
					}
					currdeschead = "<b>&nbsp;" + base + "&nbsp;</b> :";
				}
			}
			val = subelem.nodeValue;
			if (nn == "link") {
				var href = subelem.getAttribute("href");
				if (href && href != 'null') {
					val = '<a target="_blank" title="' + href + '" href="'
							+ href + '">Link</a>';
				} else {
					if (val && val != "null") {
						val = '<a target="_blank" title="' + val + '" href="'
								+ val + '">Link</a>';
					}
				}
				currdeschead = "Link to Article";
			}
			if (base.match(/(\S)*(name|title)(\S)*/i)) {
				if (!val) {
					val = GXml.value(subelem);
				}
				title = val;
				if (val && typeof title != "undefined"
						&& title.length > this.maxtitlewidth) {
					this.maxtitlewidth = title.length;
				}
				currdeschead = "";
			} else {
				if (val && val.match(/(\S)+/)) {
					if (val.match(/^http:\/\/|^https:\/\//i)) {
						val = '<a target="_blank" " href="' + val + '">[go]</a>';
					} else {
						if (!title || title == "") {
							title = val;
							if (val && typeof title != "undefined"
									&& title.length > this.maxtitlewidth) {
								this.maxtitlewidth = title.length;
							}
						}
					}
				}
				if (val && val != "null" && val != '  ' && val != ' '
						&& (val.match(/(\s|\t|\n)*/) != true)) {
					if (currdeschead != '') {
						d += '<br />';
					}
					d += currdeschead + "" + val + "";
					currdeschead = "";
				}
				if (subelem.childNodes.length) {
					var con = this.makeDescription(subelem, title, depth + 1);
					if (con) {
						d += con.desc;
						if (typeof con.title != "undefined" && con.title) {
							title = con.title;
							if (title.length > this.maxtitlewidth) {
								this.maxtitlewidth = title.length + depth;
							}
						}
					}
				}
			}
		}
		ln++;
	}
	var dc = {};
	dc.desc = d;
	dc.title = title;
	return dc;
};
GeoXml.prototype.randomColor = function() {
	var color = "#";
	for ( var i = 0; i < 6; i++) {
		var idx = parseInt(Math.random() * 16, 10) + 1;
		color += idx.toString(16);
	}
	return color;
};
GeoXml.prototype.handleGeomark = function(mark, idx, trans) {
	var that = this;
	var desc, title, name, style;
	title = "";
	desc = "";
	var styleid = 0;
	var lat, lon;
	var visible = true;
	if (this.hideall) {
		visible = false;
	}
	var fill = true;
	var outline = true;
	var width, color, opacity, fillOpacity, fillColor;
	var cor = [];
	var node, nv, cm;
	var coords = "";
	var poslist = [];
	var point_count = 0;
	var box_count = 0;
	var line_count = 0;
	var poly_count = 0;
	var p;
	var points = [];
	var cc, l;
	var pbounds = new GLatLngBounds();
	var coordset = mark.getElementsByTagName("coordinates");
	if (coordset.length < 1) {
		coordset = mark.getElementsByTagName("gml:coordinates");
	}
	if (coordset.length < 1) {
		coordset = [];
		poslist = mark.getElementsByTagName("gml:posList");
		if (poslist.length < 1) {
			poslist = mark.getElementsByTagName("posList");
		}
		for (l = 0; l < poslist.length; l++) {
			coords = " ";
			cor = GXml.value(poslist.item(l)).split(' ');
			if (that.isWFS) {
				for (cc = 0; cc < (cor.length - 1); cc++) {
					if (cor[cc] && cor[cc] != " "
							&& !isNaN(parseFloat(cor[cc]))) {
						coords += "" + parseFloat(cor[cc]) + ","
								+ parseFloat(cor[cc + 1]);
						coords += " ";
						cc++;
					}
				}
			} else {
				for (cc = 0; cc < (cor.length - 1); cc++) {
					if (cor[cc] && cor[cc] != " "
							&& !isNaN(parseFloat(cor[cc]))) {
						coords += "" + parseFloat(cor[cc + 1]) + ","
								+ parseFloat(cor[cc]);
						coords += " ";
						cc++;
					}
				}
			}
			if (coords) {
				if (poslist.item(l).parentNode
						&& (poslist.item(l).parentNode.nodeName == "gml:LineString")) {
					line_count++;
				} else {
					poly_count++;
				}
				cm = "<coordinates>" + coords + "</coordinates>";
				node = GXml.parse(cm);
				if (coordset.push) {
					coordset.push(node);
				}
			}
		}
		var pos = mark.getElementsByTagName("gml:pos");
		if (pos.length < 1) {
			pos = mark.getElementsByTagName("gml:pos");
		}
		if (pos.length) {
			for (p = 0; p < pos.length; p++) {
				nv = GXml.value(pos.item(p));
				cor = nv.split(" ");
				if (!that.isWFS) {
					node = GXml.parse("<coordinates>" + cor[1] + "," + cor[0]
							+ "</coordinates>");
				} else {
					node = GXml.parse("<coordinates>" + cor[0] + "," + cor[1]
							+ "</coordinates>");
				}
				if (coordset.push) {
					coordset.push(node);
				}
			}
		}
	}
	var newcoords = false;
	point_count = 0;
	box_count = 0;
	line_count = 0;
	poly_count = 0;
	var dc = that.makeDescription(mark, "");
	desc = "<div id='currentwindow' style='overflow:auto;height:"
			+ this.iwheight + "px' >" + dc.desc + "</div> ";
	if (!name && dc.title) {
		name = dc.title;
		if (name.length > this.maxtitlewidth) {
			this.maxtitlewidth = name.length;
		}
	}
	if (newcoords && typeof lat != "undefined") {
		coordset.push("" + lon + "," + lat);
	}
	var lines = [];
	var point;
	var skiprender;
	var bits;
	for ( var c = 0; c < coordset.length; c++) {
		skiprender = false;
		if (coordset[c].parentNode
				&& (coordset[c].parentNode.nodeName == "gml:Box" || coordset[c].parentNode.nodeName == "gml:Envelope")) {
			skiprender = true;
		}
		coords = GXml.value(coordset[c]);
		coords += " ";
		coords = coords.replace(/\s+/g, " ");
		coords = coords.replace(/^ /, "");
		coords = coords.replace(/, /, ",");
		var path = coords.split(" ");
		if (path.length == 1 || path[1] == "") {
			bits = path[0].split(",");
			point = new GLatLng(parseFloat(bits[1]) / trans.ys - trans.y,
					parseFloat(bits[0]) / trans.xs - trans.x);
			that.bounds.extend(point);
			if (!skiprender) {
				if (typeof name == "undefined") {
					name = that.unnamedplace;
				}
				if (!!that.opts.createmarker) {
					that.opts.createmarker(point, name, desc, styleid, idx,
							null, visible);
				} else {
					that.createMarker(point, name, desc, styleid, idx, null,
							visible);
				}
			}
		} else {
			for (p = 0; p < path.length - 1; p++) {
				bits = path[p].split(",");
				point = new GLatLng(parseFloat(bits[1]) / trans.ys - trans.y,
						parseFloat(bits[0]) / trans.xs - trans.x);
				points.push(point);
				pbounds.extend(point);
			}
			that.bounds.extend(pbounds.getNorthEast());
			that.bounds.extend(pbounds.getSouthWest());
			if (!skiprender) {
				lines.push(points);
			}
		}
	}
	if (!lines || lines.length < 1) {
		return;
	}
	var linestring = mark.getElementsByTagName("LineString");
	if (linestring.length < 1) {
		linestring = mark.getElementsByTagName("gml:LineString");
	}
	if (linestring.length || line_count > 0) {
		if (!!style) {
			width = style.width;
			color = style.color;
			opacity = style.opacity;
		} else {
			width = this.style.width;
			color = this.style.color;
			opacity = this.style.opacity;
		}
		if (typeof name == "undefined") {
			name = that.unnamedpath;
		}
		if (!!that.opts.createpolyline) {
			that.opts.createpolyline(lines, color, width, opacity, pbounds,
					name, desc, idx, visible);
		} else {
			that.createPolyline(lines, color, width, opacity, pbounds, name,
					desc, idx, visible);
		}
	}
	var polygons = mark.getElementsByTagName("Polygon");
	if (polygons.length < 1) {
		polygons = mark.getElementsByTagName("gml:Polygon");
	}
	if (polygons.length || poly_count > 0) {
		if (!!style) {
			width = style.width;
			color = style.color;
			opacity = style.opacity;
			fillOpacity = style.fillOpacity;
			fillColor = style.fillColor;
			fill = style.file;
			outline = style.outline;
		}
		fillColor = this.randomColor();
		color = this.randomColor();
		fill = 1;
		outline = 1;
		if (typeof name == "undefined") {
			name = that.unnamedarea;
		}
		if (!!that.opts.createpolygon) {
			that.opts.createpolygon(lines, color, width, opacity, fillColor,
					fillOpacity, pbounds, name, desc, idx, visible, fill,
					outline);
		} else {
			that.createPolygon(lines, color, width, opacity, fillColor,
					fillOpacity, pbounds, name, desc, idx, visible, fill,
					outline);
		}
	}
};
GeoXml.prototype.handlePlacemark = function(mark, idx, depth, fullstyle) {
	var that = this;
	var desc, title, name, style;
	title = "";
	desc = "";
	var styleid = 0;
	var lat, lon;
	var visible = true;
	if (this.hideall) {
		visible = false;
	}
	var newcoords = false;
	var outline;
	var opacity;
	var fillcolor;
	var fillOpacity;
	var color;
	var width;
	var pbounds;
	var fill;
	var points = [];
	var lines = [];
	var bits = [];
	var point;
	var cor, node, cm, nv;
	var l, pos, p, j, k, cc;
	var kml_id = mark.getAttribute("id");
	var point_count = 0;
	var box_count = 0;
	var line_count = 0;
	var poly_count = 0;
	var coords = "";
	var markerurl = "";
	var snippet = "";
	l = mark.getAttribute("lat");
	if (typeof l != "undefined") {
		lat = l;
	}
	l = mark.getAttribute("lon");
	if (typeof l != "undefined") {
		newcoords = true;
		lon = l;
	}
	l = 0;
	var coordset = mark.getElementsByTagName("coordinates");
	if (coordset.length < 1) {
		coordset = mark.getElementsByTagName("gml:coordinates");
	}
	if (coordset.length < 1) {
		coordset = [];
		var poslist = mark.getElementsByTagName("gml:posList");
		if (!poslist.length) {
			poslist = mark.getElementsByTagName("posList");
		}
		for (l = 0; l < poslist.length; l++) {
			coords = " ";
			var plitem = GXml.value(poslist.item(l)) + " ";
			plitem = plitem.replace(/(\s)+/g, ' ');
			cor = plitem.split(' ');
			if (that.isWFS) {
				for (cc = 0; cc < (cor.length - 1); cc++) {
					if (!isNaN(parseFloat(cor[cc]))
							&& !isNaN(parseFloat(cor[cc + 1]))) {
						coords += "" + parseFloat(cor[cc]) + ","
								+ parseFloat(cor[cc + 1]);
						coords += " ";
						cc++;
					}
				}
			} else {
				for (cc = 0; cc < (cor.length - 1); cc++) {
					if (!isNaN(parseFloat(cor[cc]))
							&& !isNaN(parseFloat(cor[cc + 1]))) {
						coords += "" + parseFloat(cor[cc + 1]) + ","
								+ parseFloat(cor[cc]);
						coords += " ";
						cc++;
					}
				}
			}
			if (coords) {
				if (poslist.item(l).parentNode
						&& (poslist.item(l).parentNode.nodeName == "gml:LineString")) {
					line_count++;
				} else {
					poly_count++;
				}
				cm = "<coordinates>" + coords + "</coordinates>";
				node = GXml.parse(cm);
				if (coordset.push) {
					coordset.push(node);
				}
			}
		}
		pos = mark.getElementsByTagName("gml:pos");
		if (pos.length < 1) {
			pos = mark.getElementsByTagName("gml:pos");
		}
		if (pos.length) {
			for (p = 0; p < pos.length; p++) {
				nv = GXml.value(pos.item(p)) + " ";
				cor = nv.split(' ');
				if (!that.isWFS) {
					node = GXml.parse("<coordinates>" + cor[1] + "," + cor[0]
							+ "</coordinates>");
				} else {
					node = GXml.parse("<coordinates>" + cor[0] + "," + cor[1]
							+ "</coordinates>");
				}
				if (coordset.push) {
					coordset.push(node);
				}
			}
		}
	}
	for ( var ln = 0; ln < mark.childNodes.length; ln++) {
		var nn = mark.childNodes.item(ln).nodeName;
		nv = GXml.value(mark.childNodes.item(ln));
		var ns = nn.split(":");
		var base;
		if (ns.length > 1) {
			base = ns[1].toLowerCase();
		} else {
			base = ns[0].toLowerCase();
		}
		var processme = false;
		switch (base) {
		case "name":
			name = nv;
			if (name.length + depth > this.maxtitlewidth) {
				this.maxtitlewidth = name.length + depth;
			}
			break;
		case "title":
			title = nv;
			if (title.length + depth > this.maxtitlewidth) {
				this.maxtitlewidth = title.length + depth;
			}
			break;
		case "desc":
		case "description":
			desc = GeoXml.getDescription(mark.childNodes.item(ln));
			if (!desc) {
				desc = nv;
			}
			if (that.opts.preloadHTML && desc && desc.match(/<(\s)*img/i)) {
				var preload = document.createElement("span");
				preload.style.visibility = "visible";
				preload.style.position = "absolute";
				preload.style.left = "-1200px";
				preload.style.top = "-1200px";
				preload.style.zIndex = this.overlayman.markers.length;
				document.body.appendChild(preload);
				preload.innerHTML = desc;
			}
			if (desc.match(/^http:\/\//i)) {
				var flink = desc.split(/(\s)+/);
				if (flink.length > 1) {
					desc = "<a href=\"" + flink[0] + "\">" + flink[0] + "</a>";
					for ( var i = 1; i < flink.length; i++) {
						desc += flink[i];
					}
				} else {
					desc = "<a href=\"" + desc + "\">" + desc + "</a>";
				}
			}
			break;
		case "visibility":
			if (nv == "0") {
				visible = false;
			}
			break;
		case "Snippet":
		case "snippet":
			snippet = nv;
			break;
		case "href":
		case "link":
			if (nv) {
				desc += "<p><a target='_blank' href='" + nv + "'>link</a></p>";
				markerurl = nv;
			} else {
				var href = mark.childNodes.item(ln).getAttribute("href");
				if (href) {
					var imtype = mark.childNodes.item(ln).getAttribute("type");
					if (imtype && imtype.match(/image/)) {
						desc += "<img style=\"width:256px\" src='" + href
								+ "' />";
					}
					markerurl = href;
				}
			}
			break;
		case "author":
			desc += "<p><b>author:</b>" + nv + "</p>";
			break;
		case "time":
			desc += "<p><b>time:</b>" + nv + "</p>";
			break;
		case "lat":
			lat = nv;
			break;
		case "long":
			lon = nv;
			newcoords = true;
			break;
		case "point":
			point_count++;
			processme = true;
			break;
		case "line":
			line_count++;
			processme = true;
			break;
		case "box":
			box_count++;
			processme = true;
			break;
		case "polygon":
			poly_count++;
			processme = true;
			break;
		case "styleurl":
			styleid = nv;
			break;
		case "stylemap":
			var found = false;
			node = mark.childNodes.item(ln);
			for (j = 0; (j < node.childNodes.length && !found); j++) {
				var pair = node.childNodes[j];
				for (k = 0; (k < pair.childNodes.length && !found); k++) {
					var pn = pair.childNodes[k].nodeName;
					if (pn == "Style") {
						style = this.handleStyle(pair.childNodes[k]);
						found = true;
					}
				}
			}
			break;
		case "Style":
		case "style":
			style = this.handleStyle(mark.childNodes.item(ln));
			break;
		}
		if (processme) {
			cor = nv.split(' ');
			coords = "";
			for (cc = 0; cc < (cor.length - 1); cc++) {
				if (!isNaN(parseFloat(cor[cc]))
						&& !isNaN(parseFloat(cor[cc + 1]))) {
					coords += "" + parseFloat(cor[cc + 1]) + ","
							+ parseFloat(cor[cc]);
					coords += " ";
					cc++;
				}
			}
			if (coords != "") {
				node = GXml.parse("<coordinates>" + coords + "</coordinates>");
				if (coordset.push) {
					coordset.push(node);
				}
			}
		}
	}
	if (!name && title) {
		name = title;
	}
	if (fullstyle) {
		style = fullstyle;
	}
	if (styleid) {
		style = this.styles[styleid];
	}
	if (typeof desc == "undefined" || !desc || this.opts.makedescription) {
		var dc = that.makeDescription(mark, "");
		desc = "<div id='currentpopup' style='overflow:auto;height:"
				+ this.iwheight + "px' >" + dc.desc + "</div> ";
		if (!name && dc.title) {
			name = dc.title;
			if ((name.length + depth) > this.maxtitlewidth) {
				this.maxtitlewidth = name.length + depth;
			}
		}
	}
	if (newcoords && typeof lat != "undefined") {
		if (lat) {
			var cs = "" + lon + "," + lat + " ";
			node = GXml.parse("<coordinates>" + cs + "</coordinates>");
			coordset.push(node);
		}
	}
	for ( var c = 0; c < coordset.length; c++) {
		var skiprender = false;
		if (coordset[c].parentNode
				&& (coordset[c].parentNode.nodeName
						.match(/^(gml:Box|gml:Envelope)/i))) {
			skiprender = true;
		}
		coords = GXml.value(coordset[c]);
		coords += " ";
		coords = coords.replace(/(\s)+/g, " ");
		coords = coords.replace(/^ /, "");
		coords = coords.replace(/, /, ",");
		var path = coords.split(" ");
		if (path.length == 1 || path[1] == "") {
			bits = path[0].split(",");
			point = new GLatLng(parseFloat(bits[1]), parseFloat(bits[0]));
			this.overlayman.folderBounds[idx].extend(point);
			if (!skiprender) {
				if (typeof name == "undefined") {
					name = that.unnamedplace;
				}
				if (!!that.opts.createmarker) {
					that.opts.createmarker(point, name, desc, styleid, idx,
							style, visible, kml_id, markerurl, snippet);
				} else {
					that.createMarker(point, name, desc, styleid, idx, style,
							visible, kml_id, markerurl, snippet);
				}
			}
		} else {
			points = [];
			pbounds = new GLatLngBounds();
			for (p = 0; p < path.length - 1; p++) {
				bits = path[p].split(",");
				point = new GLatLng(parseFloat(bits[1]), parseFloat(bits[0]));
				points.push(point);
				pbounds.extend(point);
			}
			this.overlayman.folderBounds[idx].extend(pbounds.getSouthWest());
			this.overlayman.folderBounds[idx].extend(pbounds.getNorthEast());
			this.bounds.extend(pbounds.getSouthWest());
			this.bounds.extend(pbounds.getNorthEast());
			if (!skiprender) {
				lines.push(points);
			}
		}
	}
	if (!lines || lines.length < 1) {
		return;
	}
	var linestring = mark.getElementsByTagName("LineString");
	if (linestring.length < 1) {
		linestring = mark.getElementsByTagName("gml:LineString");
	}
	if (linestring.length || line_count > 0) {
		if (!!style) {
			width = style.width;
			color = style.color;
			opacity = style.opacity;
		} else {
			width = this.style.width;
			color = this.style.color;
			opacity = this.style.opacity;
		}
		if (typeof name == "undefined") {
			name = unnamedpath;
		}
		if (!!that.opts.createpolyline) {
			that.opts.createpolyline(lines, color, width, opacity, pbounds,
					name, desc, idx, visible, kml_id);
		} else {
			that.createPolyline(lines, color, width, opacity, pbounds, name,
					desc, idx, visible, kml_id);
		}
	}
	var polygons = mark.getElementsByTagName("Polygon");
	if (polygons.length < 1) {
		polygons = mark.getElementsByTagName("gml:Polygon");
	}
	if (polygons.length || poly_count > 0) {
		if (!!style) {
			width = style.width;
			color = style.color;
			opacity = style.opacity;
			fillOpacity = style.fillOpacity;
			fillcolor = style.fillcolor;
			fill = style.fill;
			outline = style.outline;
		}
		if (typeof fill == "undefined") {
			fill = 1;
		}
		if (typeof color == "undefined") {
			color = this.style.color;
		}
		if (typeof fillcolor == "undefined") {
			fillcolor = this.randomColor();
		}
		if (typeof name == "undefined") {
			name = that.unnamedarea;
		}
		if (!!that.opts.createpolygon) {
			that.opts.createpolygon(lines, color, width, opacity, fillcolor,
					fillOpacity, pbounds, name, desc, idx, visible, fill,
					outline, kml_id);
		} else {
			that.createPolygon(lines, color, width, opacity, fillcolor,
					fillOpacity, pbounds, name, desc, idx, visible, fill,
					outline, kml_id);
		}
	}
};
GeoXml.prototype.makeIcon = function(tempstyle, href) {
	if (!!href) {
		if (!!this.opts.baseicon) {
			tempstyle = new GIcon(this.opts.baseicon, href);
			tempstyle.href = href;
		} else {
			tempstyle = new GIcon(G_DEFAULT_ICON, href);
			tempstyle.iconSize = new GSize(32, 32);
			tempstyle.shadowSize = new GSize(59, 32);
			tempstyle.dragCrossAnchor = new GPoint(2, 8);
			tempstyle.iconAnchor = new GPoint(16, 32);
			tempstyle.href = href;
			if (this.opts.printgif) {
				var bits = href.split("/");
				var gif = bits[bits.length - 1];
				gif = this.opts.printgifpath + gif.replace(/.png/i, ".gif");
				tempstyle.printImage = gif;
				tempstyle.mozPrintImage = gif;
			}
			if (!!this.opts.noshadow) {
				tempstyle.shadow = "";
			} else {
				if (href.indexOf("/red.png") > -1
						|| href.indexOf("/blue.png") > -1
						|| href.indexOf("/green.png") > -1
						|| href.indexOf("/yellow.png") > -1
						|| href.indexOf("/lightblue.png") > -1
						|| href.indexOf("/purple.png") > -1
						|| href.indexOf("/orange.png") > -1
						|| href.indexOf("/pink.png") > -1
						|| href.indexOf("-dot.png") > -1) {
					tempstyle.shadow = "http://maps.google.com/mapfiles/ms/icons/msmarker.shadow.png";
				} else if (href.indexOf("-pushpin.png") > -1
						|| href.indexOf("/pause.png") > -1
						|| href.indexOf("/go.png") > -1
						|| href.indexOf("/stop.png") > -1) {
					tempstyle.shadow = "http://maps.google.com/mapfiles/ms/icons/pushpin_shadow.png";
				} else {
					var shadow = href.replace(".png", ".shadow.png");
					if (shadow.indexOf(".jpg")) {
						shadow = "";
					}
					tempstyle.shadow = shadow;
				}
			}
		}
	}
	if (this.opts.noshadow) {
		tempstyle.shadow = "";
	}
	return tempstyle;
};
GeoXml.prototype.handleStyle = function(style, sid) {
	var icons = style.getElementsByTagName("Icon");
	var tempstyle, opacity;
	var aa, bb, gg, rr;
	var fill, href, color, colormode, outline;
	if (icons.length > 0) {
		href = GXml.value(icons[0].getElementsByTagName("href")[0]);
		tempstyle = this.makeIcon(tempstyle, href);
	}
	var linestyles = style.getElementsByTagName("LineStyle");
	if (linestyles.length > 0) {
		var width = parseInt(GXml.value(linestyles[0]
				.getElementsByTagName("width")[0]), 10);
		if (width < 1) {
			width = 5;
		}
		color = GXml.value(linestyles[0].getElementsByTagName("color")[0]);
		aa = color.substr(0, 2);
		bb = color.substr(2, 2);
		gg = color.substr(4, 2);
		rr = color.substr(6, 2);
		color = "#" + rr + gg + bb;
		opacity = parseInt(aa, 16) / 256;
		if (!tempstyle) {
			tempstyle = {};
		}
		tempstyle.color = color;
		tempstyle.width = width;
		tempstyle.opacity = opacity;
	}
	var polystyles = style.getElementsByTagName("PolyStyle");
	if (polystyles.length > 0) {
		fill = parseInt(GXml
				.value(polystyles[0].getElementsByTagName("fill")[0]), 10);
		outline = parseInt(GXml.value(polystyles[0]
				.getElementsByTagName("outline")[0]), 10);
		color = GXml.value(polystyles[0].getElementsByTagName("color")[0]);
		colormode = GXml
				.value(polystyles[0].getElementsByTagName("colorMode")[0]);
		if (polystyles[0].getElementsByTagName("fill").length == 0) {
			fill = 1;
		}
		if (polystyles[0].getElementsByTagName("outline").length == 0) {
			outline = 1;
		}
		aa = color.substr(0, 2);
		bb = color.substr(2, 2);
		gg = color.substr(4, 2);
		rr = color.substr(6, 2);
		color = "#" + rr + gg + bb;
		opacity = parseInt(aa, 16) / 256;
		if (!tempstyle) {
			tempstyle = {};
		}
		tempstyle.fill = fill;
		tempstyle.outline = outline;
		if (colormode != "random") {
			tempstyle.fillcolor = color;
		} else {
			tempstyle.colortint = color;
		}
		tempstyle.fillOpacity = opacity;
		if (!fill) {
			tempstyle.fillOpacity = 0;
		}
		if (!outline) {
			tempstyle.opacity = 0;
		}
	}
	if (sid) {
		this.styles["#" + sid] = tempstyle;
	}
	return tempstyle;
};
GeoXml.prototype.processKML = function(node, marks, title, sbid, depth, paren) {
	var that = this;
	var thismap = this.map;
	var icon;
	var grouptitle;
	var keepopen = this.forcefoldersopen;
	if (node.nodeName == "kml") {
		icon = this.docicon;
	}
	if (node.nodeName == "Document") {
		icon = this.kmlicon;
	}
	if (node.nodeName == "Folder") {
		icon = this.foldericon;
		grouptitle = title;
	}
	var pm = [];
	var sf = [];
	var desc = "";
	var snippet = "";
	var i;
	var visible = false;
	if (!this.hideall) {
		visible = true;
	}
	var boundsmodified = false;
	var networklink = false;
	var url;
	var ground = null;
	var opacity = 1.0;
	var wmsbounds;
	var makewms = false;
	var wmslist = [];
	var mytitle;
	var color;
	var ol;
	var n, ne, sw, se;
	var html;
	var kml_id = node.getAttribute("id");
	for ( var ln = 0; ln < node.childNodes.length; ln++) {
		var nextn = node.childNodes.item(ln);
		var nn = nextn.nodeName;
		var nv = nextn.nodeValue;
		switch (nn) {
		case "name":
		case "title":
			title = GXml.value(nextn);
			if (title.length + depth > this.maxtitlewidth) {
				this.maxtitlewidth = title.length + depth;
			}
			break;
		case "Folder":
		case "Document":
			sf.push(nextn);
			break;
		case "GroundOverlay":
			url = GXml.value(nextn.getElementsByTagName("href")[0]);
			var north = parseFloat(GXml.value(nextn
					.getElementsByTagName("north")[0]));
			var south = parseFloat(GXml.value(nextn
					.getElementsByTagName("south")[0]));
			var east = parseFloat(GXml
					.value(nextn.getElementsByTagName("east")[0]));
			var west = parseFloat(GXml
					.value(nextn.getElementsByTagName("west")[0]));
			var attr = GXml.value(nextn.getElementsByTagName("attribution")[0]);
			sw = new GLatLng(south, west);
			ne = new GLatLng(north, east);
			this.bounds.extend(sw);
			this.bounds.extend(ne);
			color = GXml.value(nextn.getElementsByTagName("color")[0]);
			opacity = parseInt(color.substring(1, 3), 16) / 256;
			mytitle = GXml.value(nextn.getElementsByTagName("name")[0]);
			var arcims = /arcimsproxy/i;
			if (url.match(arcims)) {
				url += "&bbox=" + west + "," + south + "," + east + "," + north
						+ "&response=img";
				wmsbounds = new GLatLngBounds(sw, ne);
				makewms = true;
				ol = this.makeWMSTileLayer(url, visible, mytitle, opacity,
						attr, title, wmsbounds);
				if (ol) {
					ol.bounds = wmsbounds;
					ol.title = mytitle;
					ol.opacity = opacity;
					ol.visible = visible;
					ol.url = url;
					if (!this.quiet) {
						this.mb.showMess(
								"Adding Tiled ArcIms Overlay " + title, 1000);
					}
					wmslist.push(ol);
				}
			} else {
				var rs = /request=getmap/i;
				if (url.match(rs)) {
					url += "&bbox=" + west + "," + south + "," + east + ","
							+ north;
					wmsbounds = new GLatLngBounds(sw, ne);
					makewms = true;
					ol = this.makeWMSTileLayer(url, visible, mytitle, opacity,
							attr, title, wmsbounds);
					if (ol) {
						ol.bounds = wmsbounds;
						ol.title = mytitle;
						ol.opacity = opacity;
						ol.visible = visible;
						ol.url = url;
						if (!this.quiet) {
							this.mb.showMess("Adding Tiled WMS Overlay "
									+ title, 1000);
						}
						wmslist.push(ol);
					}
				} else {
					wmsbounds = new GLatLngBounds(sw, ne);
					ground = new GGroundOverlay(url, wmsbounds);
					ground.bounds = wmsbounds;
					ground.getBounds = function() {
						return this.bounds;
					};
					boundsmodified = true;
					makewms = false;
				}
			}
			break;
		case "NetworkLink":
			url = GXml.value(nextn.getElementsByTagName("href")[0]);
			networklink = true;
			break;
		case "description":
		case "Description":
			desc = GeoXml.getDescription(nextn);
			break;
		case "open":
			if (GXml.value(nextn) == "1") {
				keepopen = true;
			}
			if (GXml.value(nextn) == "0") {
				keepopen = this.forcefoldersopen;
			}
			break;
		case "visibility":
			if (GXml.value(nextn) == "0") {
				visible = false;
			}
			break;
		case "snippet":
		case "Snippet":
			snippet = GeoXml.stripHTML(GXml.value(nextn));
			snippet = snippet.replace(/\n/g, '');
			break;
		default:
			for ( var k = 0; k < marks.length; k++) {
				if (nn == marks[k]) {
					pm.push(nextn);
				}
			}
		}
	}
	var folderid;
	var idx = this.overlayman.folders.length;
	var me = paren;
	if (sf.length > 1 || pm.length || ground || makewms) {
		this.overlayman.folders.push( []);
		this.overlayman.subfolders.push( []);
		this.overlayman.folderhtml.push( []);
		this.overlayman.folderhtmlast.push(0);
		this.overlayman.folderBounds.push(new GLatLngBounds());
		this.kml.push(new KMLObj(title, desc, false, idx));
		me = this.kml.length - 1;
		folderid = this.createFolder(idx, title, sbid, icon, desc, snippet,
				true, visible);
	} else {
		folderid = sbid;
	}
	if (node.nodeName == "Folder" || node.nodeName == "Document") {
		this.kml[me].open = keepopen;
		this.kml[me].folderid = folderid;
	}
	if (ground || makewms) {
		this.kml[this.kml.length - 1].visibility = visible;
		this.kml[this.kml.length - 1].groundOverlays.push( {
			"url" : url,
			"bounds" : wmsbounds
		});
	}
	if (networklink) {
		var re = /&amp;/g;
		url = url.replace(re, "&");
		var nl = /\n/g;
		url = url.replace(nl, "");
		this.progress++;
		if (!topwin.standalone) {
			if (typeof this.proxy != "undefined") {
				url = this.proxy + escape(url);
			}
		}
		var comm = this.myvar + ".loadXMLUrl('" + url + "','" + title
				+ "',null,null,'" + sbid + "');";
		setTimeout(comm, 1000);
		return;
	}
	if (makewms && wmslist.length) {
		for ( var wo = 0; wo < wmslist.length; wo++) {
			var ol = wmslist[wo];
			var blob = "";
			if (this.basesidebar) {
				var n = this.overlayman.markers.length;
				if (!this.nolegend) {
					var myurl = ol.url.replace(/height=(\d)+/i, "height=100");
					myurl = myurl.replace(/width=(\d)+/i, "width=100");
					blob = '<img src="' + myurl + '" style="width:100px" />';
				}
			}
			if (this.sidebarsnippet && snippet == "") {
				snippet = GeoXml.stripHTML(desc);
				desc2 = desc2.substring(0, 40);
			}
			parm = this.myvar + "$$$" + ol.title + "$$$tiledoverlay$$$" + n
					+ "$$$" + blob + "$$$" + ol.visible + "$$$"
					+ (this.baseLayers.length - 1) + "$$$" + snippet;
			var html = ol.desc;
			var thismap = this.map;
			GEvent.addListener(ol, "zoomto", function() {
				thismap.setZoom(thismap.getBoundsZoomLevel(this.getBounds()));
				thismap.panTo(this.getBounds().getCenter());
			});
			this.overlayman.AddMarker(ol, title, idx, parm, true, true);
		}
	}
	if (ground) {
		if (this.basesidebar) {
			var n = this.overlayman.markers.length;
			var blob = '<span style="background-color:black;border:2px solid brown;">&nbsp;&nbsp;&nbsp;&nbsp;</span> ';
			if (this.sidebarsnippet && snippet == "") {
				snippet = GeoXml.stripHTML(desc);
				desc2 = desc2.substring(0, 40);
			}
			parm = this.myvar + "$$$" + title + "$$$polygon$$$" + n + "$$$"
					+ blob + "$$$" + visible + "$$$null$$$" + snippet;
			var html = desc;
			var thismap = this.map;
			GEvent.addListener(ground, "zoomto",
					function() {
						thismap.setZoom(thismap.getBoundsZoomLevel(ground
								.getBounds()));
						thismap.panTo(ground.getBounds().getCenter());
					});
			this.overlayman.folderBounds[idx].extend(ground.getBounds()
					.getSouthWest());
			this.overlayman.folderBounds[idx].extend(ground.getBounds()
					.getNorthEast());
			boundsmodified = true;
			this.overlayman.AddMarker(ground, title, idx, parm, visible);
		}
		this.map.addOverlay(ground);
	}
	for (i = 0; i < pm.length; i++) {
		this.handlePlacemark(pm[i], idx, depth + 1);
	}
	var fc = 0;
	for (i = 0; i < sf.length; i++) {
		var fid = this.processKML(sf[i], marks, title, folderid, depth + 1, me);
		if (typeof fid == "number" && fid != idx) {
			var sub = this.overlayman.folderBounds[fid];
			if (!sub) {
				this.overlayman.folderBounds[fid] = new GLatLngBounds();
			} else {
				var sw = this.overlayman.folderBounds[fid].getSouthWest();
				var ne = this.overlayman.folderBounds[fid].getNorthEast();
				this.overlayman.folderBounds[idx].extend(sw);
				this.overlayman.folderBounds[idx].extend(ne);
			}
			this.overlayman.subfolders[idx].push(fid);
			if (fid != idx) {
				this.kml[idx].folders.push(fid);
			}
			fc++;
		}
	}
	if (fc || pm.length || boundsmodified) {
		this.bounds.extend(this.overlayman.folderBounds[idx].getSouthWest());
		this.bounds.extend(this.overlayman.folderBounds[idx].getNorthEast());
	}
	if (sf.length == 0 && pm.length == 0 && !this.opts.basesidebar) {
		this.ParseURL();
	}
	return idx;
};
GeoXml.prototype.processGPX = function(node, title, sbid, depth) {
	var icon;
	if (node.nodeName == "gpx") {
		icon = this.gmlicon;
	}
	if (node.nodeName == "rte" || node.nodeName == "trk"
			|| node.nodeName == "trkseg") {
		icon = this.foldericon;
	}
	var pm = [];
	var sf = [];
	var desc = "";
	var snip = "";
	var i, lon, lat, l;
	var open = this.forcefoldersopen;
	var coords = "";
	var visible = true;
	for ( var ln = 0; ln < node.childNodes.length; ln++) {
		var nextn = node.childNodes.item(ln);
		var nn = nextn.nodeName;
		if (nn == "name" || nn == "title") {
			title = GXml.value(nextn);
			if (title.length + depth > this.maxtitlewidth) {
				this.maxtitlewidth = title.length + depth;
			}
		}
		if (nn == "rte") {
			sf.push(nextn);
		}
		if (nn == "trk") {
			sf.push(nextn);
		}
		if (nn == "trkseg") {
			sf.push(nextn);
		}
		if (nn == "trkpt") {
			pm.push(nextn);
			l = nextn.getAttribute("lat");
			if (typeof l != "undefined") {
				lat = l;
			}
			l = nextn.getAttribute("lon");
			if (typeof l != "undefined") {
				lon = l;
				coords += lon + "," + lat + " ";
			}
		}
		if (nn == "rtept") {
			pm.push(nextn);
			l = nextn.getAttribute("lat");
			if (typeof l != "undefined") {
				lat = l;
			}
			l = nextn.getAttribute("lon");
			if (typeof l != "undefined") {
				lon = l;
				coords += lon + "," + lat + " ";
			}
		}
		if (nn == "wpt") {
			pm.push(nextn);
		}
		if (nn == "description" || nn == "desc") {
			desc = GXml.value(nextn);
		}
	}
	if (coords.length) {
		var nc = "<?xml version=\"1.0\"?><Placemark><name>" + title
				+ "</name><description>" + desc
				+ "</description><LineString><coordinates>" + coords
				+ "</coordinates></LineString></Placemark>";
		var pathnode = GXml.parse(nc).documentElement;
		pm.push(pathnode);
	}
	var folderid;
	var idx = this.overlayman.folders.length;
	if (pm.length || node.nodeName == "gpx") {
		this.overlayman.folders.push( []);
		this.overlayman.subfolders.push( []);
		this.overlayman.folderhtml.push( []);
		this.overlayman.folderhtmlast.push(0);
		this.overlayman.folderBounds.push(new GLatLngBounds());
		this.kml.push(new KMLObj(title, desc, open, idx));
		folderid = this.createFolder(idx, title, sbid, icon, desc, snip, true,
				visible);
	} else {
		folderid = sbid;
	}
	for (i = 0; i < pm.length; i++) {
		this.handlePlacemark(pm[i], idx, depth + 1);
	}
	for (i = 0; i < sf.length; i++) {
		var fid = this.processGPX(sf[i], title, folderid, depth + 1);
		this.overlayman.subfolders[idx].push(fid);
		this.overlayman.folderBounds[idx]
				.extend(this.overlayman.folderBounds[fid].getSouthWest());
		this.overlayman.folderBounds[idx]
				.extend(this.overlayman.folderBounds[fid].getNorthEast());
	}
	if (this.overlayman.folderBounds[idx]) {
		this.bounds.extend(this.overlayman.folderBounds[idx].getSouthWest());
		this.bounds.extend(this.overlayman.folderBounds[idx].getNorthEast());
	}
	return idx;
};
GeoXml.prototype.ParseURL = function() {
	var query = topwin.location.search.substring(1);
	var pairs = query.split("&");
	var marks = this.overlayman.markers;
	for ( var i = 0; i < pairs.length; i++) {
		var pos = pairs[i].indexOf("=");
		var argname = pairs[i].substring(0, pos).toLowerCase();
		var val = unescape(pairs[i].substring(pos + 1));
		var m = 0;
		var nae;
		if (val) {
			switch (argname) {
			case "openbyid":
				for (m = 0; m < marks.length; m++) {
					nae = marks[m].id;
					if (nae == val) {
						this.overlayman.markers[m].show();
						this.overlayman.markers[m].hidden = false;
						GEvent.trigger(this.overlayman.markers[m], "click");
						break;
					}
				}
				break;
			case "kml":
			case "url":
			case "src":
			case "geoxml":
				this.urls.push(val);
				this.parse();
				break;
			case "openbyname":
				for (m = 0; m < marks.length; m++) {
					nae = marks[m].title;
					if (nae == val) {
						this.overlayman.markers[m].show();
						this.overlayman.markers[m].hidden = false;
						GEvent.trigger(this.overlayman.markers[m], "click");
						break;
					}
				}
				break;
			}
		}
	}
};
GeoXml.prototype.processing = function(xmlDoc, title, latlon, desc, sbid) {
	this.overlayman.miStart = new Date();
	if (!desc) {
		desc = title;
	}
	var that = this;
	if (!sbid) {
		sbid = 0;
	}
	var shadow;
	var idx;
	var root = xmlDoc.documentElement;
	if (!root) {
		alert("No document found");
		return 0;
	}
	var placemarks = [];
	var name;
	var pname;
	var styles;
	var basename = root.nodeName;
	var keepopen = that.forcefoldersopen;
	var bases = basename.split(":");
	if (bases.length > 1) {
		basename = bases[1];
	}
	var bar, sid, i;
	that.wfs = false;
	if (basename == "FeatureCollection") {
		bar = Lance$(that.basesidebar);
		if (!title) {
			title = name;
		}
		if (typeof title == "undefined") {
			title = "Un-named GML";
		}
		that.isWFS = true;
		if (title.length > that.maxtitlewidth) {
			that.maxtitlewidth = title.length;
		}
		if (bar) {
			bar.style.display = "";
		}
		idx = that.overlayman.folders.length;
		that.processGML(root, title, latlon, desc, (that.kml.length - 1));
		that.kml[0].folders.push(idx);
	}
	if (basename == "gpx") {
		if (!title) {
			title = name;
		}
		if (typeof title == "undefined") {
			title = "Un-named GPX";
		}
		that.title = title;
		if (title.length > that.maxtitlewidth) {
			that.maxtitlewidth = title.length;
		}
		bar = Lance$(that.basesidebar);
		if (bar) {
			bar.style.display = "";
		}
		idx = that.overlayman.folders.length;
		that.processGPX(root, title, that.basesidebar, sbid);
		that.kml[0].folders.push(idx);
	} else {
		if (basename == "kml") {
			styles = root.getElementsByTagName("Style");
			for (i = 0; i < styles.length; i++) {
				sid = styles[i].getAttribute("id");
				if (sid) {
					that.handleStyle(styles[i], sid);
				}
			}
			styles = root.getElementsByTagName("StyleMap");
			for (i = 0; i < styles.length; i++) {
				sid = styles[i].getAttribute("id");
				if (sid) {
					var found = false;
					var node = styles[i];
					for ( var j = 0; (j < node.childNodes.length && !found); j++) {
						var pair = node.childNodes[j];
						for ( var k = 0; (k < pair.childNodes.length && !found); k++) {
							var pn = pair.childNodes[k].nodeName;
							if (pn == "styleUrl") {
								var pid = GXml.value(pair.childNodes[k]);
								that.styles["#" + sid] = that.styles[pid];
								found = true;
							}
							if (pn == "Style") {
								that.handleStyle(pair.childNodes[k], sid);
								found = true;
							}
						}
					}
				}
			}
			if (!title) {
				title = name;
			}
			if (typeof title == "undefined") {
				title = "KML Document";
			}
			that.title = title;
			if (title.length > that.maxtitlewidth) {
				that.maxtitlewidth = title.length;
			}
			var marknames = [ "Placemark" ];
			var schema = root.getElementsByTagName("Schema");
			for ( var s = 0; s < schema.length; s++) {
				pname = schema[s].getAttribute("parent");
				if (pname == "Placemark") {
					pname = schema[s].getAttribute("name");
					marknames.push(pname);
				}
			}
			bar = Lance$(that.basesidebar);
			if (bar) {
				bar.style.display = "";
			}
			idx = that.overlayman.folders.length;
			var paren = that.kml.length - 1;
			var fid = that.processKML(root, marknames, title, that.basesidebar,
					idx, paren);
			that.kml[paren].folders.push(idx);
		} else {
			placemarks = root.getElementsByTagName("item");
			if (placemarks.length < 1) {
				placemarks = root.getElementsByTagName("atom");
			}
			if (placemarks.length < 1) {
				placemarks = root.getElementsByTagName("entry");
			}
			if (!title) {
				title = name;
			}
			if (typeof title == "undefined") {
				title = "News Feed";
			}
			that.title = title;
			if (title.length > that.maxtitlewidth) {
				that.maxtitlewidth = title.length;
			}
			var style;
			if (that.opts.baseicon) {
				style = that.opts.baseicon;
				style.href = style.image;
			} else {
				style = new GIcon(G_DEFAULT_ICON, that.rssicon);
				style.iconSize = new GSize(32, 32);
				style.shadowSize = new GSize(59, 32);
				style.dragCrossAnchor = new GPoint(2, 8);
				style.iconAnchor = new GPoint(16, 32);
				style.href = that.rssicon;
				shadow = that.rssicon.replace(".png", ".shadow.png");
				style.shadow = shadow + "_shadow.png";
			}
			style.color = "#00FFFF";
			style.width = "3";
			style.opacity = 0.50;
			if (!desc) {
				desc = "RSS feed";
			}
			that.kml[0].folders.push(that.overlayman.folders.length);
			if (placemarks.length) {
				bar = Lance$(that.basesidebar);
				if (bar) {
					bar.style.display = "";
				}
				that.overlayman.folders.push( []);
				that.overlayman.folderhtml.push( []);
				that.overlayman.folderhtmlast.push(0);
				that.overlayman.folderBounds.push(new GLatLngBounds());
				idx = that.overlayman.folders.length - 1;
				that.kml.push(new KMLObj(title, desc, keepopen, idx));
				that.kml[that.kml.length - 1].open = keepopen;
				if (that.basesidebar) {
					var visible = true;
					if (that.hideall) {
						visible = false;
					}
					var folderid = that.createFolder(idx, title,
							that.basesidebar, that.globalicon, desc, null,
							keepopen, visible);
				}
				for (i = 0; i < placemarks.length; i++) {
					that.handlePlacemark(placemarks[i], idx, sbid, style);
				}
			}
		}
	}
	that.progress--;
	if (that.progress == 0) {
		GEvent.trigger(that, "initialized");
		if (!that.opts.sidebarid) {
			that.mb.showMess("Finished Parsing", 1000);
		}
		if (!that.opts.nozoom && !that.basesidebar) {
			that.map.setZoom(that.map.getBoundsZoomLevel(that.bounds));
			that.map.setCenter(that.bounds.getCenter());
		}
	}
};
GeoXml.prototype.createFolder = function(idx, title, sbid, icon, desc, snippet,
		keepopen, visible) {
	var sb = Lance$(sbid);
	keepopen = true;
	var folderid = this.myvar + '_folder' + idx;
	var checked = "";
	if (visible) {
		checked = " checked ";
	}
	this.overlayman.folderhtml[folderid] = "";
	var disp = "display:block";
	var fw = "font-weight:normal";
	if (typeof keepopen == "undefined" || !keepopen) {
		disp = "display:none";
		fw = "font-weight:bold";
	}
	if (!desc || desc == "") {
		desc = title;
	}
	desc = escape(desc);
	var htm = '<ul><input type="checkbox" id="' + this.myvar + '' + idx
			+ 'FCB" style="vertical-align:middle" ';
	htm += checked;
	htm += 'onclick="' + this.myvar + '.toggleContents(' + idx
			+ ',this.checked)">';
	htm += '&nbsp;<span title="' + snippet + '" id="' + this.myvar + 'TB' + idx
			+ '" oncontextmenu=\"' + this.myvar + '.saveJSON(' + idx
			+ ');\" onclick="' + this.myvar + '.toggleFolder(' + idx
			+ ')" style=\"' + fw + '\">';
	htm += '<img id=\"'
			+ this.myvar
			+ 'FB'
			+ idx
			+ '\" style=\"vertical-align:text-top;padding:0;margin:0\" height=\"'
			+ this.sidebariconheight + '\" border=\"0\" src="' + icon
			+ '" /></span>&nbsp;';
	htm += '<a href="#" onclick="' + this.myvar + '.overlayman.zoomToFolder('
			+ idx + ');' + this.myvar + '.mb.showMess(\'' + desc
			+ '\',3000);return false;">' + title + '</a><br><div id=\"'
			+ folderid + '\" style="' + disp + '"></div></ul>';
	if (sb) {
		sb.innerHTML = sb.innerHTML + htm;
	}
	return folderid;
};
GeoXml.prototype.processGML = function(root, title, latlon, desc, me) {
	var that = this;
	var isWFS = false;
	var placemarks = [];
	var srsName;
	var isLatLon = false;
	var xmin = 0;
	var ymin = 0;
	var xscale = 1;
	var yscale = 1;
	var points, pt, pts;
	var coor, coorstr;
	var x, y, k, i;
	var name = title;
	var visible = true;
	if (this.hideall) {
		visible = false;
	}
	var keepopen = that.allfoldersopen;
	var pt1, pt2, box;
	for ( var ln = 0; ln < root.childNodes.length; ln++) {
		var kid = root.childNodes.item(ln).nodeName;
		var n = root.childNodes.item(ln);
		if (kid == "gml:boundedBy" || kid == "boundedBy") {
			for ( var j = 0; j < n.childNodes.length; j++) {
				var nn = n.childNodes.item(j).nodeName;
				var llre = /CRS:84|(4326|4269)$/i;
				if (nn == "Box" || nn == "gml:Box") {
					box = n.childNodes.item(j);
					srsName = n.childNodes.item(j).getAttribute("srsName");
					if (srsName.match(llre)) {
						isLatLon = true;
					} else {
						alert("SRSname =" + srsName
								+ "; attempting to create transform");
						for (k = 0; k < box.childNodes.length; k++) {
							coor = box.childNodes.item(k);
							if (coor.nodeName == "gml:coordinates"
									|| coor.nodeName == "coordinates") {
								coorstr = GXml.value(coor);
								pts = coorstr.split(" ");
								pt1 = pts[0].split(",");
								pt2 = pts[1].split(",");
								xscale = (parseFloat(pt2[0]) - parseFloat(pt1[0]))
										/ (latlon.xmax - latlon.xmin);
								yscale = (parseFloat(pt2[1]) - parseFloat(pt1[1]))
										/ (latlon.ymax - latlon.ymin);
								xmin = pt1[0] / xscale - latlon.xmin;
								ymin = pt1[1] / yscale - latlon.ymin;
							}
						}
					}
					break;
				}
				if (nn == "Envelope" || nn == "gml:Envelope") {
					box = n.childNodes.item(j);
					srsName = n.childNodes.item(j).getAttribute("srsName");
					if (srsName.match(llre)) {
						isLatLon = true;
					} else {
						alert("SRSname =" + srsName
								+ "; attempting to create transform");
						for (k = 0; k < box.childNodes.length; k++) {
							coor = box.childNodes.item(k);
							if (coor.nodeName == "gml:coordinates"
									|| coor.nodeName == "coordinates") {
								pts = coor.split(" ");
								var b = {
									"xmin" : 100000000,
									"ymin" : 100000000,
									"xmax" : -100000000,
									"ymax" : -100000000
								};
								for ( var m = 0; m < pts.length - 1; m++) {
									pt = pts[m].split(",");
									x = parseFloat(pt[0]);
									y = parseFloat(pt[1]);
									if (x < b.xmin) {
										b.xmin = x;
									}
									if (y < b.ymin) {
										b.ymin = y;
									}
									if (x > b.xmax) {
										b.xmax = x;
									}
									if (y > b.ymax) {
										b.ymax = y;
									}
								}
								xscale = (b.xmax - b.xmin)
										/ (latlon.xmax - latlon.xmin);
								yscale = (b.ymax - b.ymin)
										/ (latlon.ymax - latlon.ymin);
								xmin = b.xmin / xscale - latlon.xmin;
								ymin = b.ymin / yscale - latlon.ymin;
							}
						}
					}
				}
				break;
			}
		}
		if (kid == "gml:featureMember" || kid == "featureMember") {
			placemarks.push(n);
		}
	}
	var folderid;
	if (!title) {
		title = name;
	}
	this.title = title;
	if (placemarks.length < 1) {
		alert("No features found in " + title);
		this.mb.showMess("No features found in " + title, 3000);
	} else {
		this.mb.showMess("Adding " + placemarks.length + " features found in "
				+ title);
		this.overlayman.folders.push( []);
		this.overlayman.folderhtml.push( []);
		this.overlayman.folderhtmlast.push(0);
		this.overlayman.folderBounds.push(new GLatLngBounds());
		var idx = this.overlayman.folders.length - 1;
		if (this.basesidebar) {
			folderid = this.createFolder(idx, title, this.basesidebar,
					this.gmlicon, desc, null, keepopen, visible);
		}
		this.kml.push(new KMLObj(title, desc, true, idx));
		this.kml[me].open = that.opts.allfoldersopen;
		this.kml[me].folderid = folderid;
		if (isLatLon) {
			for (i = 0; i < placemarks.length; i++) {
				this.handlePlacemark(placemarks[i], idx, 0);
			}
		} else {
			var trans = {
				"xs" : xscale,
				"ys" : yscale,
				"x" : xmin,
				"y" : ymin
			};
			for (i = 0; i < placemarks.length; i++) {
				this.handleGeomark(placemarks[i], idx, trans, 0);
			}
		}
	}
};
PolylineEncoder = function(numLevels, zoomFactor, verySmall, forceEndpoints) {
	var i;
	if (!numLevels) {
		numLevels = 18;
	}
	if (!zoomFactor) {
		zoomFactor = 2;
	}
	if (!verySmall) {
		verySmall = 0.0000001;
	}
	if (!forceEndpoints) {
		forceEndpoints = true;
	}
	this.numLevels = numLevels;
	this.zoomFactor = zoomFactor;
	this.verySmall = verySmall;
	this.veryTiny = verySmall * verySmall;
	this.forceEndpoints = forceEndpoints;
	this.zoomLevelBreaks = [];
	for (i = 0; i < numLevels; i++) {
		this.zoomLevelBreaks[i] = verySmall
				* Math.pow(zoomFactor, numLevels - i - 1);
		this.zoomLevelBreaks[i] *= this.zoomLevelBreaks[i];
	}
};
PolylineEncoder.prototype.dpEncode = function(points) {
	var absMaxDist = 0;
	var stack = [];
	var dists = [];
	var maxDist, maxLoc, temp, first, last, current;
	var i, encodedPoints, encodedLevels;
	var segmentLength;
	stack.push( [ 0, points.length - 1 ]);
	while (stack.length > 0) {
		current = stack.pop();
		maxDist = 0;
		segmentLength = Math.pow(points[current[1]].lat()
				- points[current[0]].lat(), 2)
				+ Math.pow(points[current[1]].lng() - points[current[0]].lng(),
						2);
		for (i = current[0] + 1; i < current[1]; i++) {
			temp = this.distance(points[i], points[current[0]],
					points[current[1]], segmentLength);
			if (temp > maxDist) {
				maxDist = temp;
				maxLoc = i;
				if (maxDist > absMaxDist) {
					absMaxDist = maxDist;
				}
			}
		}
		if (maxDist > this.veryTiny) {
			dists[maxLoc] = maxDist;
			stack.push( [ current[0], maxLoc ]);
			stack.push( [ maxLoc, current[1] ]);
		}
	}
	encodedPoints = this.createEncodings(points, dists);
	encodedLevels = this.encodeLevels(points, dists, absMaxDist);
	return {
		encodedPoints : encodedPoints,
		encodedLevels : encodedLevels,
		encodedPointsLiteral : encodedPoints.replace(/\\/g, "\\\\")
	};
};
PolylineEncoder.prototype.dpEncodeToJSON = function(points, color, weight,
		opacity) {
	var result;
	result = this.dpEncode(points);
	return {
		color : color,
		weight : weight,
		opacity : opacity,
		points : result.encodedPoints,
		levels : result.encodedLevels,
		numLevels : this.numLevels,
		zoomFactor : this.zoomFactor,
		literals : result.encodePointsLiteral
	};
};
PolylineEncoder.prototype.dpEncodeToGPolyline = function(points, color, weight,
		opacity) {
	return new GPolyline.fromEncoded(this.dpEncodeToJSON(points, color, weight,
			opacity));
};
PolylineEncoder.prototype.dpEncodeToGPolygon = function(pointsArray,
		boundaryColor, boundaryWeight, boundaryOpacity, fillColor, fillOpacity,
		fill, outline) {
	var i, boundaries;
	boundaries = [];
	for (i = 0; i < pointsArray.length; i++) {
		boundaries.push(this.dpEncodeToJSON(pointsArray[i], boundaryColor,
				boundaryWeight, boundaryOpacity));
	}
	return new GPolygon.fromEncoded( {
		polylines : boundaries,
		color : fillColor,
		opacity : fillOpacity,
		fill : fill,
		outline : outline
	});
};
PolylineEncoder.prototype.distance = function(p0, p1, p2, segLength) {
	var u, out;
	var dlat2 = p2.lat() - p1.lat();
	var dlong1 = p2.lng() - p1.lng();
	if (dlat2 == 0 && dlong1 == 0) {
		out = Math.pow(p2.lat() - p0.lat(), 2)
				+ Math.pow(p2.lng() - p0.lng(), 2);
	} else {
		var dlat0 = p0.lat() - p1.lat();
		var dlong0 = p0.lng() - p1.lng();
		u = ((dlat0) * (dlat2) + (dlong0) * (dlong1)) / segLength;
		if (u <= 0) {
			out = Math.pow(dlat0, 2) + Math.pow(dlong0, 2);
		}
		if (u >= 1) {
			out = Math.pow(p0.lat() - p2.lat(), 2)
					+ Math.pow(p0.lng() - p2.lng(), 2);
		}
		if (0 < u && u < 1) {
			out = Math.pow(dlat0 - u * (dlat2), 2)
					+ Math.pow(dlong0 - u * (dlong1), 2);
		}
	}
	return out;
};
PolylineEncoder.prototype.createEncodings = function(points, dists) {
	var i;
	var j;
	var floor = Math.floor;
	var len = points.length - 2;
	var late5;
	var lnge5;
	var dlat = floor(points[0].lat() * 1e5);
	var dlng = floor(points[0].lng() * 1e5);
	var plat = dlat;
	var plng = dlng;
	var encoded_points = this.encodeSignedNumber(dlat)
			+ this.encodeSignedNumber(dlng);
	for (j = len; j > 0; j--) {
		i = len - j + 1;
		if (dists[i] != undefined) {
			late5 = floor(points[i].lat() * 1e5);
			lnge5 = floor(points[i].lng() * 1e5);
			dlat = late5 - plat;
			dlng = lnge5 - plng;
			plat = late5;
			plng = lnge5;
			encoded_points += this.encodeSignedNumber(dlat)
					+ this.encodeSignedNumber(dlng);
		}
	}
	dlat = floor(points[len + 1].lat() * 1e5) - plat;
	dlng = floor(points[len + 1].lng() * 1e5) - plng;
	encoded_points += this.encodeSignedNumber(dlat)
			+ this.encodeSignedNumber(dlng);
	return encoded_points;
};
PolylineEncoder.prototype.computeLevel = function(dd) {
	var lev;
	if (dd > this.veryTiny) {
		lev = 0;
		while (dd < this.zoomLevelBreaks[lev]) {
			lev++;
		}
		return lev;
	}
};
PolylineEncoder.prototype.encodeLevels = function(points, dists, absMaxDist) {
	var i;
	var encoded_levels = "";
	if (this.forceEndpoints) {
		encoded_levels += this.encodeNumber(this.numLevels - 1);
	} else {
		encoded_levels += this.encodeNumber(this.numLevels
				- this.computeLevel(absMaxDist) - 1);
	}
	for (i = 1; i < points.length - 1; i++) {
		if (dists[i] != undefined) {
			encoded_levels += this.encodeNumber(this.numLevels
					- this.computeLevel(dists[i]) - 1);
		}
	}
	if (this.forceEndpoints) {
		encoded_levels += this.encodeNumber(this.numLevels - 1);
	} else {
		encoded_levels += this.encodeNumber(this.numLevels
				- this.computeLevel(absMaxDist) - 1);
	}
	return encoded_levels;
};
PolylineEncoder.prototype.encodeNumber = function(num) {
	var encodeString = "";
	var nextValue, finalValue;
	while (num >= 0x20) {
		nextValue = (0x20 | (num & 0x1f)) + 63;
		encodeString += (String.fromCharCode(nextValue));
		num >>= 5;
	}
	finalValue = num + 63;
	encodeString += (String.fromCharCode(finalValue));
	return encodeString;
};
PolylineEncoder.prototype.encodeSignedNumber = function(num) {
	var sgn_num = num << 1;
	if (num < 0) {
		sgn_num = ~(sgn_num);
	}
	return (this.encodeNumber(sgn_num));
};
PolylineEncoder.latLng = function(y, x) {
	this.y = y;
	this.x = x;
};
PolylineEncoder.latLng.prototype.lat = function() {
	return this.y;
};
PolylineEncoder.latLng.prototype.lng = function() {
	return this.x;
};
PolylineEncoder.pointsToLatLngs = function(points) {
	var i, latLngs;
	latLngs = [];
	for (i = 0; i < points.length; i++) {
		latLngs.push(new PolylineEncoder.latLng(points[i][0], points[i][1]));
	}
	return latLngs;
};
PolylineEncoder.pointsToGLatLngs = function(points) {
	var i, gLatLngs;
	gLatLngs = [];
	for (i = 0; i < points.length; i++) {
		gLatLngs.push(new GLatLng(points[i][0], points[i][1]));
	}
	return gLatLngs;
};
GPolyline.prototype.getPoint = function() {
	return (this.getVertex(Math.round(this.getVertexCount() / 2)));
};
GPolyline.prototype.computeBounds = function() {
	var bounds = new GLatLngBounds();
	for ( var i = 0; i < this.getVertexCount(); i++) {
		var v = this.getVertex(i);
		if (v) {
			bounds.extend(v);
		}
	}
	this.bounds = bounds;
	return bounds;
};
GTileLayerOverlay.prototype.getBounds = function() {
	return this.bounds;
};
GPolyline.prototype.getBounds = function() {
	if (typeof this.bounds != "undefined") {
		return this.bounds;
	} else {
		return (this.computeBounds());
	}
};
GTileLayer.prototype.getBounds = function() {
	return this.bounds;
};
GPolygon.prototype.getPoint = function() {
	return (this.getBounds().getCenter());
};
Clusterer = function(map, paren) {
	this.myvar = paren.myvar;
	this.paren = paren;
	this.map = map;
	this.markers = [];
	this.byid = [];
	this.byname = [];
	this.clusters = [];
	this.timeout = null;
	this.folders = [];
	this.folderBounds = [];
	this.folderhtml = [];
	this.folderhtmlast = [];
	this.subfolders = [];
	this.currentZoomLevel = map.getZoom();
	this.isParsed = false;
	this.maxVisibleMarkers = Clusterer.defaultMaxVisibleMarkers;
	this.gridSize = Clusterer.defaultGridSize;
	this.minMarkersPerCluster = Clusterer.defaultMinMarkersPerCluster;
	this.maxLinesPerInfoBox = Clusterer.defaultMaxLinesPerInfoBox;
	this.icon = Clusterer.defaultIcon;
	GEvent.addListener(map, 'zoomend', Clusterer.MakeCaller(Clusterer.Display,
			this));
	GEvent.addListener(map, 'moveend', Clusterer.MakeCaller(Clusterer.Display,
			this));
	GEvent.addListener(map, 'infowindowclose', Clusterer.MakeCaller(
			Clusterer.PopDown, this));
};
Clusterer.defaultMaxVisibleMarkers = 650;
Clusterer.defaultGridSize = 15;
Clusterer.defaultMinMarkersPerCluster = 5;
Clusterer.defaultMaxLinesPerInfoBox = 15;
Clusterer.defaultIcon = new GIcon();
Clusterer.defaultIcon.image = 'http://www.acme.com/resources/images/markers/blue_large.PNG';
Clusterer.defaultIcon.shadow = 'http://www.acme.com/resources/images/markers/shadow_large.PNG';
Clusterer.defaultIcon.iconSize = new GSize(30, 51);
Clusterer.defaultIcon.shadowSize = new GSize(56, 51);
Clusterer.defaultIcon.iconAnchor = new GPoint(13, 34);
Clusterer.defaultIcon.infoWindowAnchor = new GPoint(13, 3);
Clusterer.defaultIcon.infoShadowAnchor = new GPoint(27, 37);
Clusterer.prototype.SetIcon = function(icon) {
	this.icon = icon;
};
Clusterer.prototype.SetMaxVisibleMarkers = function(n) {
	this.maxVisibleMarkers = n;
};
Clusterer.prototype.SetMinMarkersPerCluster = function(n) {
	this.minMarkersPerCluster = n;
};
Clusterer.prototype.SetMaxLinesPerInfoBox = function(n) {
	this.maxLinesPerInfoBox = n;
};
Clusterer.prototype.AddMarker = function(marker, title, idx, sidebar, visible,
		forcevisible) {
	if (marker.setMap != null) {
		marker.setMap(this.map);
	}
	marker.hidden = false;
	if (visible != true) {
		marker.hidden = true;
	}
	if (this.paren.hideall) {
		marker.hidden = true;
	}
	marker.title = title;
	this.folders[idx].push(this.markers.length);
	var bounds = this.map.getBounds();
	var vis = false;
	if (typeof marker.getBounds == "undefined") {
		if (bounds.contains(marker.getPoint())) {
			vis = true;
		}
	} else {
		var b = marker.getBounds();
		if (!b.isEmpty()) {
			if (bounds.intersects(b)) {
				vis = true;
			}
		}
	}
	if (forcevisible) {
		vis = true;
	}
	this.markers.push(marker);
	if (vis) {
		marker.onMap = true;
		this.map.addOverlay(marker);
		if (marker.hidden) {
			marker.hide();
			if (!!marker.label) {
				marker.label.hide();
			}
		}
	}
	this.DisplayLater();
	if (sidebar) {
		this.folderhtml[idx].push(sidebar);
	}
};
Clusterer.prototype.zoomToFolder = function(idx) {
	var bounds = this.folderBounds[idx];
	this.map.setZoom(this.map.getBoundsZoomLevel(bounds));
	this.map.panTo(bounds.getCenter());
};
Clusterer.prototype.RemoveMarker = function(marker) {
	for ( var i = 0; i < this.markers.length; ++i) {
		if (this.markers[i] == marker) {
			if (marker.onMap) {
				this.map.removeOverlay(marker);
			}
			if (!!marker.label) {
				this.map.removeOverlay(marker.label);
			}
			for ( var j = 0; j < this.clusters.length; ++j) {
				var cluster = this.clusters[j];
				if (cluster != null) {
					for ( var k = 0; k < cluster.markers.length; ++k) {
						if (cluster.markers[k] == marker) {
							cluster.markers[k] = null;
							--cluster.markerCount;
							break;
						}
					}
					if (cluster.markerCount == 0) {
						this.ClearCluster(cluster);
						this.clusters[j] = null;
					} else {
						if (cluster == this.poppedUpCluster) {
							Clusterer.RePop(this);
						}
					}
				}
			}
			this.markers[i] = null;
			break;
		}
	}
	this.DisplayLater();
};
Clusterer.prototype.DisplayLater = function() {
	if (this.timeout != null) {
		clearTimeout(this.timeout);
	}
	this.timeout = setTimeout(Clusterer.MakeCaller(Clusterer.Display, this), 50);
};
Clusterer.Display = function(clusterer) {
	var i, j, k, marker, cluster, l;
	clearTimeout(clusterer.timeout);
	var update_side = false;
	var count = 0;
	var clon, bits;
	var vis;
	var content;
	if (clusterer.paren.basesidebar) {
		for (k = 0; k < clusterer.folderhtml.length; k++) {
			var curlen = clusterer.folderhtml[k].length;
			var con = clusterer.folderhtmlast[k];
			if (con < curlen) {
				var destid = clusterer.paren.myvar + "_folder" + k;
				var dest = Lance$(destid);
				if (dest) {
					if (clusterer.paren.opts.sortbyname) {
						content = dest.innerHTML;
						clon = clusterer.folderhtml[k].sort();
						for (l = 0; l < curlen; l++) {
							bits = clon[l].split("$$$", 8);
							content += clusterer.paren.sidebarfn(bits[0],
									bits[1], bits[2], bits[3], bits[4],
									bits[5], bits[6], bits[7]);
						}
					} else {
						content = dest.innerHTML;
						clon = clusterer.folderhtml[k];
						for (l = con; l < curlen; l++) {
							bits = clon[l].split("$$$", 8);
							content += clusterer.paren.sidebarfn(bits[0],
									bits[1], bits[2], bits[3], bits[4],
									bits[5], bits[6], bits[7]);
						}
					}
					clusterer.folderhtmlast[k] = curlen;
					dest.innerHTML = content;
					if (clusterer.paren.forcefoldersopen) {
						dest.style.display = "block";
					}
					update_side = true;
					count = curlen;
				} else {
				}
			}
		}
	}
	if (update_side && count > 0) {
		if (clusterer.paren.progress == 0) {
			clusterer.paren.setFolders();
			GEvent.trigger(clusterer.paren, "parsed");
			if (!clusterer.paren.opts.sidebarid) {
				clusterer.paren.mb.showMess("Finished Parsing", 1000);
			}
			var mifinish = new Date();
			var sec = ((mifinish - clusterer.miStart) / 1000 + " seconds");
			clusterer.paren.mb.showMess("Loaded " + count
					+ "  GeoXML elements in " + sec, 5000);
			clusterer.paren.ParseURL();
			if (!clusterer.paren.opts.nozoom) {
				clusterer.paren.map.setZoom(clusterer.paren.map
						.getBoundsZoomLevel(clusterer.paren.bounds));
				clusterer.paren.map.setCenter(clusterer.paren.bounds
						.getCenter());
			}
		}
	}
	if (update_side && typeof resizeKML != "undefined") {
		resizeKML();
	}
	var bounds, sw, ne, dx, dy;
	var newZoomLevel = clusterer.map.getZoom();
	if (newZoomLevel != clusterer.currentZoomLevel) {
		for (i = 0; i < clusterer.clusters.length; ++i) {
			if (clusterer.clusters[i] != null) {
				clusterer.ClearCluster(clusterer.clusters[i]);
				clusterer.clusters[i] = null;
			}
		}
		clusterer.clusters.length = 0;
		clusterer.currentZoomLevel = newZoomLevel;
	}
	bounds = clusterer.map.getBounds();
	sw = bounds.getSouthWest();
	ne = bounds.getNorthEast();
	dx = ne.lng() - sw.lng();
	dy = ne.lat() - sw.lat();
	if (dx < 300 && dy < 150) {
		dx *= 0.05;
		dy *= 0.05;
		bounds = new GLatLngBounds(new GLatLng(sw.lat() - dy, sw.lng() - dx),
				new GLatLng(ne.lat() + dy, ne.lng() + dx));
	}
	var visibleMarkers = [];
	var nonvisibleMarkers = [];
	var viscount = 0;
	for (i = 0; i < clusterer.markers.length; ++i) {
		marker = clusterer.markers[i];
		vis = false;
		if (marker != null) {
			var mid = clusterer.paren.myvar + "sb" + i;
			if (typeof marker.getBounds == "undefined") {
				if (bounds.contains(marker.getPoint())) {
					vis = true;
					if (Lance$(mid)) {
						Lance$(mid).className = "inView";
					}
					viscount++;
				} else {
					if (Lance$(mid)) {
						Lance$(mid).className = "outView";
					}
				}
			} else {
				var b = marker.getBounds();
				if (Lance$(mid)) {
					if (bounds.intersects(b)) {
						Lance$(mid).className = "inView";
					} else {
						Lance$(mid).className = "outView";
					}
				}
				vis = true;
			}
			if (vis && (marker.hidden == false)) {
				visibleMarkers.push(i);
			} else {
				nonvisibleMarkers.push(i);
			}
		}
	}
	for (i = 0; i < nonvisibleMarkers.length; ++i) {
		marker = clusterer.markers[nonvisibleMarkers[i]];
		if (marker.onMap) {
			if (!!marker.label) {
				marker.label.hide();
			}
			clusterer.map.removeOverlay(marker);
			marker.onMap = false;
		}
	}
	for (i = 0; i < clusterer.clusters.length; ++i) {
		cluster = clusterer.clusters[i];
		if (cluster != null && cluster.marker) {
			vis = false;
			if (typeof cluster.marker.getBounds == "undefined") {
				if (bounds.contains(cluster.marker.getPoint())) {
					vis = true;
				}
			} else {
				vis = true;
			}
			if (!vis && cluster.onMap) {
				clusterer.map.removeOverlay(cluster.marker);
				cluster.onMap = false;
			}
		}
	}
	if (viscount > clusterer.maxVisibleMarkers) {
		if (!update_side) {
			clusterer.paren.mb.showMess("Clustering on " + viscount
					+ "  GeoXML elements");
		}
		var latRange = bounds.getNorthEast().lat()
				- bounds.getSouthWest().lat();
		var latInc = latRange / clusterer.gridSize;
		var lngInc = latInc
				/ Math.cos((bounds.getNorthEast().lat() + bounds.getSouthWest()
						.lat())
						/ 2.0 * Math.PI / 180.0);
		for ( var lat = bounds.getSouthWest().lat(); lat <= bounds
				.getNorthEast().lat(); lat += latInc) {
			for ( var lng = bounds.getSouthWest().lng(); lng <= bounds
					.getNorthEast().lng(); lng += lngInc) {
				cluster = {};
				cluster.clusterer = clusterer;
				cluster.bounds = new GLatLngBounds(new GLatLng(lat, lng),
						new GLatLng(lat + latInc, lng + lngInc));
				cluster.markers = [];
				cluster.markerCount = 0;
				cluster.onMap = false;
				cluster.marker = null;
				clusterer.clusters.push(cluster);
			}
		}
		for (i = 0; i < visibleMarkers.length; ++i) {
			marker = clusterer.markers[visibleMarkers[i]];
			if (marker != null && !marker.inCluster) {
				for (j = 0; j < clusterer.clusters.length; ++j) {
					cluster = clusterer.clusters[j];
					if (cluster != null) {
						vis = false;
						if (typeof marker.getBounds == "undefined") {
							if (cluster.bounds.contains(marker.getPoint())) {
								vis = true;
							}
						}
						if (vis) {
							marker.inCluster = true;
							clusterer.clusters[j].markers.push(marker);
							++clusterer.clusters[j].markerCount;
						}
					}
				}
			}
		}
		for (i = 0; i < clusterer.clusters.length; ++i) {
			if (clusterer.clusters[i] != null
					&& clusterer.clusters[i].markerCount < clusterer.minMarkersPerCluster) {
				clusterer.ClearCluster(clusterer.clusters[i]);
				clusterer.clusters[i] = null;
			}
		}
		for (i = clusterer.clusters.length - 1; i >= 0; --i) {
			if (clusterer.clusters[i] != null) {
				break;
			} else {
				--clusterer.clusters.length;
			}
		}
		for (i = 0; i < clusterer.clusters.length; ++i) {
			cluster = clusterer.clusters[i];
			if (cluster != null) {
				for (j = 0; j < cluster.markers.length; ++j) {
					marker = cluster.markers[j];
					if (marker != null && marker.onMap) {
						clusterer.map.removeOverlay(marker);
						marker.onMap = false;
						if (!!marker.label) {
							marker.label.hide();
						}
					}
				}
			}
		}
		for (i = 0; i < clusterer.clusters.length; ++i) {
			cluster = clusterer.clusters[i];
			if (cluster != null && cluster.marker == null) {
				var xTotal = 0.0;
				var yTotal = 0.0;
				for (j = 0; j < cluster.markers.length; ++j) {
					marker = cluster.markers[j];
					if (marker != null) {
						xTotal += (+marker.getPoint().lng());
						yTotal += (+marker.getPoint().lat());
					}
				}
				var location = new GLatLng(yTotal / cluster.markerCount, xTotal
						/ cluster.markerCount);
				marker = new GMarker(location, {
					icon : clusterer.icon
				});
				cluster.marker = marker;
				GEvent.addListener(marker, 'click', Clusterer.MakeCaller(
						Clusterer.PopUp, cluster));
			}
		}
	}
	if (!update_side && viscount && (clusterer.paren.quiet != true)) {
		clusterer.paren.mb.showMess(
				"Showing " + viscount + "  GeoXML elements", 500);
	}
	for (i = 0; i < visibleMarkers.length; ++i) {
		marker = clusterer.markers[visibleMarkers[i]];
		if (marker != null && !marker.onMap && !marker.inCluster) {
			if (marker.addedToMap != null) {
				marker.addedToMap();
			}
			if (marker.hidden) {
				if (marker.hide) {
					clusterer.map.addOverlay(marker);
					marker.hide();
					if (!!marker.label) {
						marker.label.hide();
					}
				}
			} else {
				clusterer.map.addOverlay(marker);
				if (!!marker.label) {
					marker.label.show();
				}
			}
			marker.onMap = true;
		}
	}
	for (i = 0; i < clusterer.clusters.length; ++i) {
		cluster = clusterer.clusters[i];
		if (cluster != null && cluster.marker) {
			vis = false;
			if (typeof marker.getPoint != "undefined") {
				if (bounds.contains(cluster.marker.getPoint())) {
					vis = true;
				}
			} else {
				if (bounds.intersects(cluster.marker.getBounds())) {
					vis = true;
				}
			}
			if (!cluster.onMap && vis) {
				clusterer.map.addOverlay(cluster.marker);
				cluster.onMap = true;
			}
		}
	}
	Clusterer.RePop(clusterer);
};
Clusterer.PopUp = function(cluster) {
	var clusterer = cluster.clusterer;
	var html = '<table width="300">';
	var n = 0;
	for ( var i = 0; i < cluster.markers.length; ++i) {
		var marker = cluster.markers[i];
		if (marker != null) {
			++n;
			html += '<tr><td>';
			if (typeof marker.getIcon != "undefined"
					&& marker.getIcon().smallImage != null) {
				html += '<img src="' + marker.getIcon().smallImage + '">';
			} else {
				html += '<img src="' + marker.getIcon().image + '" width="'
						+ (marker.getIcon().iconSize.width / 2) + '" height="'
						+ (marker.getIcon().iconSize.height / 2) + '">';
			}
			html += '</td><td>' + marker.title + '</td></tr>';
			if (n == clusterer.maxLinesPerInfoBox - 1
					&& cluster.markerCount > clusterer.maxLinesPerInfoBox) {
				html += '<tr><td colspan="2">...and ' + (cluster.markerCount - n) + ' more</td></tr>';
				break;
			}
		}
	}
	html += '</table>';
	clusterer.map.closeInfoWindow();
	cluster.marker.openInfoWindowHtml(html);
	clusterer.poppedUpCluster = cluster;
};
Clusterer.RePop = function(clusterer) {
	if (clusterer.poppedUpCluster != null) {
		Clusterer.PopUp(clusterer.poppedUpCluster);
	}
};
Clusterer.PopDown = function(clusterer) {
	clusterer.poppedUpCluster = null;
};
Clusterer.prototype.ClearCluster = function(cluster) {
	var i, marker;
	for (i = 0; i < cluster.markers.length; ++i) {
		if (cluster.markers[i] != null) {
			cluster.markers[i].inCluster = false;
			cluster.markers[i] = null;
		}
	}
	cluster.markers.length = 0;
	cluster.markerCount = 0;
	if (cluster == this.poppedUpCluster) {
		this.map.closeInfoWindow();
	}
	if (cluster.onMap) {
		this.map.removeOverlay(cluster.marker);
		cluster.onMap = false;
	}
};
Clusterer.MakeCaller = function(func, arg) {
	return function() {
		func(arg);
	};
};
GMarker.prototype.setMap = function(map) {
	this.map = map;
};
GMarker.prototype.addedToMap = function() {
	this.map = null;
};
GMarker.prototype.origOpenInfoWindow = GMarker.prototype.openInfoWindow;
GMarker.prototype.openInfoWindow = function(node, opts) {
	if (this.map != null) {
		return this.map.openInfoWindow(this.getPoint(), node, opts);
	} else {
		return this.origOpenInfoWindow(node, opts);
	}
};
GMarker.prototype.origOpenInfoWindowHtml = GMarker.prototype.openInfoWindowHtml;
GMarker.prototype.openInfoWindowHtml = function(html, opts) {
	if (this.map != null) {
		return this.map.openInfoWindowHtml(this.getPoint(), html, opts);
	} else {
		return this.origOpenInfoWindowHtml(html, opts);
	}
};
GMarker.prototype.origOpenInfoWindowTabs = GMarker.prototype.openInfoWindowTabs;
GMarker.prototype.openInfoWindowTabs = function(tabNodes, opts) {
	if (this.map != null) {
		return this.map.openInfoWindowTabs(this.getPoint(), tabNodes, opts);
	} else {
		return this.origOpenInfoWindowTabs(tabNodes, opts);
	}
};
GMarker.prototype.origOpenInfoWindowTabsHtml = GMarker.prototype.openInfoWindowTabsHtml;
GMarker.prototype.openInfoWindowTabsHtml = function(tabHtmls, opts) {
	if (this.map != null) {
		return this.map.openInfoWindowTabsHtml(this.getPoint(), tabHtmls, opts);
	} else {
		return this.origOpenInfoWindowTabsHtml(tabHtmls, opts);
	}
};
GMarker.prototype.origShowMapBlowup = GMarker.prototype.showMapBlowup;
GMarker.prototype.showMapBlowup = function(opts) {
	if (this.map != null) {
		return this.map.showMapBlowup(this.getPoint(), opts);
	} else {
		return this.origShowMapBlowup(opts);
	}
};
MessageBox = function(map, paren, myvar, mb) {
	this.map = map;
	this.paren = paren;
	this.myvar = paren.myvar + "." + myvar;
	this.eraseMess = null;
	this.centerMe = null;
	this.mb = null;
	if (mb) {
		this.mb = mb;
	}
	this.id = this.myvar + "_message";
};
MessageBox.prototype.hideMess = function() {
	this.mb.style.visiblity = "hidden";
	this.mb.style.left = "-1200px";
	this.mb.style.top = "-1200px";
};
MessageBox.prototype.centerThis = function() {
	var c = this.map.getObjCenter();
	if (!this.mb) {
		this.mb = Lance$(this.id);
	}
	if (this.centerMe) {
		clearTimeout(this.centerMe);
	}
	if (this.mb) {
		var nw = this.mb.clientWidth;
		if (nw > this.map.getSize().width) {
			nw = parseInt(2 * this.map.getSize().width / 3, 10);
			this.mb.style.width = nw + "px";
			this.centerMe = setTimeout(this.myvar + ".centerThis()", 20);
			return;
		}
		this.mb.style.left = (c.x - (nw / 2)) + "px";
		this.mb.style.top = (c.y - 20 - (this.mb.clientHeight / 2)) + "px";
	} else {
		this.centerMe = setTimeout(this.myvar + ".centerThis()", 20);
	}
};
MessageBox.prototype.showMess = function(val, temp) {
	val = unescape(val);
	if (this.eraseMess) {
		clearTimeout(this.eraseMess);
	}
	if (!this.mb) {
		this.mb = Lance$(this.id);
	}
	if (this.mb) {
		this.mb.innerHTML = "<span>" + val + "</span>";
		if (temp) {
			this.eraseMess = setTimeout(this.myvar + ".hideMess();", temp);
		}
		this.mb.style.left = "-1200px";
		this.mb.style.top = "-1200px";
		this.mb.style.width = "";
		this.mb.style.height = "";
		this.centerMe = setTimeout(this.myvar + ".centerThis()", 20);
		this.mb.style.visibility = "visible";
	} else {
		var d = document.createElement("div");
		d.innerHTML = val;
		d.id = this.myvar + "_message";
		d.style.position = "absolute";
		d.style.backgroundColor = this.style.backgroundColor || "white";
		d.style.opacity = this.style.opacity || 1.0;
		d.style.filter = "alpha(opacity=" + parseInt(d.style.opacity * 100, 10)
				+ ")";
		d.style.color = this.style.color || "black";
		d.style.padding = this.style.padding || "6px";
		d.style.borderWidth = this.style.borderWidth || "3px";
		d.style.borderColor = this.style.borderColor || "";
		d.style.backgroundImage = this.style.backgroundImage || "";
		d.style.borderStyle = this.style.borderStyle || "outset";
		d.style.visibility = "visible";
		d.style.left = "-1200px";
		d.style.top = "-1200px";
		d.elephant = "testing";
		this.centerMe = setTimeout(this.myvar + ".centerThis()", 20);
		d.style.zIndex = 1000;
		document.body.appendChild(d);
	}
};
GMap2.prototype.getObjCenter = function() {
	var obj = this.getContainer();
	var container = obj;
	var y = 0;
	var x = 0;
	if (obj.offsetParent) {
		x = obj.offsetLeft;
		y = obj.offsetTop;
		obj = obj.offsetParent;
		while (obj) {
			x += obj.offsetLeft;
			y += obj.offsetTop;
			obj = obj.offsetParent;
		}
		return new GPoint(x + parseInt(this.getSize().width, 10) / 2, y
				+ parseInt(this.getSize().height, 10) / 2);
	}
};
GeoXml.prototype.loadJSONUrl = function(url, title, latlon, desc, idx) {
	var that = this;
	GDownloadUrl(url, function(doc) {
		that.parseJSON(doc, title, latlon, desc, idx);
	});
};
GeoXml.prototype.loadXMLUrl = function(url, title, latlon, desc, idx) {
	var that = this;
	that.DownloadURL(url, function(doc) {
		that.processing(GXml.parse(doc), title, latlon, desc, idx)
	}, title);
};
GeoXml.prototype.upgradeLayer = function(n) {
	var mt = this.map.getMapTypes();
	var found = false;
	for ( var i = 0; i < mt.length; i++) {
		if (mt[i] == this.baseLayers[n]) {
			found = true;
			this.map.removeMapType(this.baseLayers[n]);
		}
	}
	if (!found) {
		this.map.addMapType(this.baseLayers[n]);
	}
};
GeoXml.prototype.makeWMSTileLayer = function(getmapstring, on, title, opac,
		attr, grouptitle, wmsbounds) {
	var that = this;
	gmapstring = new String(getmapstring);
	getmapstring = gmapstring.replace("&amp;", "&");
	var args = getmapstring.split("?");
	var baseurl = args[0] + "?";
	baseurl = baseurl.replace(/&request=getmap/i, "");
	baseurl = baseurl.replace(/&service=wms/i, "");
	var version = "1.1.0";
	var format = "image/png";
	var styles = "";
	var layers = "";
	var queryable = false;
	var opacity = 1.0;
	if (typeof opac != "undefined") {
		opacity = opac;
	}
	var bbox = "-180,-90,180,90";
	var pairs = args[1].split("&");
	var sld = "";
	var servicename = "";
	var atlasname = "";
	var gmcrs = "";
	var epsg;
	for ( var i = 0; i < pairs.length; i++) {
		var dstr = pairs[i];
		var duo = pairs[i].split("=");
		var dl = duo[0].toLowerCase();
		switch (dl) {
		case "version":
			version = duo[1];
			break;
		case "bbox":
			bbox = duo[1];
			break;
		case "width":
		case "height":
			break;
		case "service":
			break;
		case "servicename":
			servicename = duo[1];
			break;
		case "atlasname":
			atlasname = duo[1];
			break;
		case "styles":
			styles = duo[1];
			break;
		case "layers":
			layers = duo[1];
			break;
		case "format":
			format = duo[1];
			break;
		case "opacity":
			opacity = parseFloat(duo[1]);
			break;
		case "crs":
		case "srs":
			epsg = duo[1];
			break;
		case "gmcrs":
			gmcrs = duo[1];
			break;
		case "queryable":
			queryable = duo[1];
			break;
		case "getmap":
			break;
		case "service":
			break;
		default:
			if (duo[0]) {
				baseurl += "&" + pairs[i];
			}
			break;
		}
	}
	if (gmcrs) {
		epsg = gmcrs;
	}
	var bbn = bbox.split(",");
	var bb = {
		"w" : parseFloat(bbn[0]),
		"s" : parseFloat(bbn[1]),
		"e" : parseFloat(bbn[2]),
		"n" : parseFloat(bbn[3])
	};
	var lon = (bb.n - bb.s);
	var z = 0;
	var ex = 180;
	while (ex >= lon) {
		ex = ex / 2;
		z++;
	}
	z--;
	if (z < 1) {
		z = 1;
	}
	if (!attr) {
		attr = "Base Map from OGC WMS";
	}
	var cr0 = new GCopyright(1, new GLatLngBounds(new GLatLng(bb.s, bb.w),
			new GLatLng(bb.n, bb.e)), 0, attr);
	var cc0 = new GCopyrightCollection("");
	cc0.addCopyright(cr0);
	var twms = new GTileLayer(cc0, z, 19);
	twms.s = bb.s;
	twms.n = bb.n;
	twms.e = bb.e;
	twms.w = bb.w;
	twms.myBaseURL = baseurl;
	if (servicename) {
		twms.servicename = servicename;
	}
	if (atlasname) {
		twms.atlasname = atlasname;
	}
	twms.publishdirectory = this.publishdirectory;
	twms.epsg = epsg;
	twms.getTileUrl = function(a, b, c) {
		if (typeof (this.myStyles) == "undefined") {
			this.myStyles = "";
		}
		var lULP = new GPoint(a.x * 256, (a.y + 1) * 256);
		var lLRP = new GPoint((a.x + 1) * 256, a.y * 256);
		var lUL = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lULP, b, c);
		var lLR = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lLRP, b, c);
		var west = lUL.x;
		var east = lLR.x;
		var north = lUL.y;
		var south = lLR.y;
		var ge = east;
		var gw = west;
		var gs = south;
		var gn = north;
		if (gn < gs) {
			gs = gn;
			gn = south;
		}
		if (this.epsg != "EPSG:4326" && this.epsg != "CRS:84"
				&& this.epsg != "4326") {
			west = GeoXml.merc2Lon(west);
			north = GeoXml.merc2Lat(north);
			east = GeoXml.merc2Lon(east);
			south = GeoXml.merc2Lat(south);
		}
		var w = Math.abs(east - west);
		var h = Math.abs(north - south);
		var s = h / w;
		h = Math.round((256.0 * s) + 0.5);
		w = 256;
		var sud = south;
		if (north < south) {
			south = north;
			north = sud;
		}
		if (gs > (this.n) || ge < (this.w) || gn < (this.s) || gw > (this.e)) {
			var retstr = this.publishdirectory + "black.gif";
		}
		var lBbox = west + "," + south + "," + east + "," + north;
		var lSRS = "EPSG:41001";
		if (typeof this.epsg != "undefined" || this.srs == "4326") {
			lSRS = this.epsg;
		}
		var lURL = this.myBaseURL;
		if (typeof this.myVersion == "undefined") {
			this.myVersion = "1.1.1";
		}
		var ver = parseFloat(this.myVersion);
		var arcims = /arcimsproxy/i;
		if (!this.myBaseURL.match(arcims)) {
			lURL += "&SERVICE=WMS";
			if (this.myVersion != "1.0.0") {
				var gmap = /request=getmap/i;
				if (!lURL.match(gmap)) {
					lURL += "&REQUEST=GetMap";
				}
			} else {
				lURL += "&REQUEST=Map";
			}
		}
		if (this.servicename) {
			lURL += "?ServiceName=" + this.servicename;
		}
		if (this.atlasname) {
			lURL += "&AtlasName=" + this.servicename;
		}
		lURL += "&VERSION=" + this.myVersion;
		if (this.myLayers) {
			lURL += "&LAYERS=" + this.myLayers;
			lURL += "&STYLES=" + this.myStyles;
		}
		if (this.mySLD) {
			lURL += "&SLD=" + this.mySLD;
		}
		lURL += "&FORMAT=" + this.myFormat;
		lURL += "&BGCOLOR=0x000000";
		lURL += "&TRANSPARENT=TRUE";
		if (this.myVersion == "1.1.1" || ver < 1.3) {
			lURL += "&SRS=" + lSRS;
		} else {
			lURL += "&CRS=" + lSRS;
		}
		lURL += "&WIDTH=" + w;
		lURL += "&HEIGHT=" + h;
		lURL += "&BBOX=" + lBbox;
		this.requestCount++;
		return lURL;
	};
	twms.myFormat = format;
	twms.myVersion = version;
	twms.myExtents = bbox;
	twms.queryable = queryable;
	twms.opacity = opacity;
	twms.getOpacity = function() {
		return this.opacity;
	};
	if (sld) {
		twms.mySLD = sld;
	} else {
		twms.myLayers = layers;
		twms.myStyles = styles;
	}
	var ol = new GTileLayerOverlay(twms);
	ol.bounds = new GLatLngBounds();
	ol.bounds.extend(new GLatLng(bb.n, bb.e));
	ol.bounds.extend(new GLatLng(bb.s, bb.w));
	this.wmscount++;
	if (this.opts.doMapTypes) {
		var twms2 = new GTileLayer(cc0, z, 19);
		twms2.s = bb.s;
		twms2.n = bb.n;
		twms2.e = bb.e;
		twms2.w = bb.w;
		twms2.myBaseURL = baseurl;
		twms2.servicename = servicename;
		twms2.publishdirectory = this.publishdirectory;
		twms2.getTileUrl = twms.getTileUrl;
		twms2.myFormat = twms.myFormat;
		twms2.myVersion = version;
		twms2.opacity = 1.0;
		twms2.title = title;
		if (attr) {
			twms2.attribution = attr;
		}
		twms2.getOpacity = function() {
			return this.opacity;
		};
		if (sld) {
			twms2.mySLD = sld;
		} else {
			twms2.myLayers = layers;
			twms2.myStyles = styles;
		}
		twms2.epsg = epsg;
		var base = new GTileLayer(cc0, z, 19);
		base.s = bb.s;
		base.n = bb.n;
		base.e = bb.e;
		base.w = bb.w;
		base.dir = this.publishdirectory;
		base.getTileUrl = function() {
			return (this.dir + "black.gif");
		};
		base.opacity = 1.0;
		base.title = title;
		if (attr) {
			base.attribution = attr;
		}
		base.getOpacity = function() {
			return this.opacity;
		};
		var layer = [ twms2, G_HYBRID_MAP.getTileLayers()[1] ];
		var cmap = new GMapType(layer, G_HYBRID_MAP.getProjection(), "" + title
				+ "", G_HYBRID_MAP);
		cmap.bounds = new GLatLngBounds(new GLatLng(bb.s, bb.w), new GLatLng(
				bb.n, bb.e));
		if (grouptitle) {
			cmap.grouptitle = grouptitle;
		}
		that.baseLayers.push(cmap);
		that.map.addMapType(cmap);
		return null;
	} else {
		return ol;
	}
};
GeoXml.SEMI_MAJOR_AXIS = 6378137.0;
GeoXml.ECCENTRICITY = 0.0818191913108718138;
GeoXml.DEG2RAD = 180.0 / (Math.PI);
GeoXml.merc2Lon = function(lon) {
	return (lon * GeoXml.DEG2RAD) * GeoXml.SEMI_MAJOR_AXIS;
};
GeoXml.merc2Lat = function(lat) {
	var rad = lat * GeoXml.DEG2RAD;
	var sinrad = Math.sin(rad);
	return (GeoXml.SEMI_MAJOR_AXIS * Math
			.log(Math.tan((rad + Math.PI / 2) / 2)
					* Math
							.pow(
									((1 - GeoXml.ECCENTRICITY * sinrad) / (1 + GeoXml.ECCENTRICITY
											* sinrad)),
									(GeoXml.ECCENTRICITY / 2))));
};
GeoXml.prototype.toggleLabels = function(on) {
	if (!on) {
		this.removeLabels();
	} else {
		this.addLabels();
	}
};
GeoXml.prototype.addLabels = function() {
	this.labels.onMap = true;
	this.map.addOverlay(this.labels);
};
GeoXml.prototype.removeLabels = function() {
	this.labels.onMap = false;
	this.map.removeOverlay(this.labels);
};
var useLegacyLocalLoad = true;
GeoXml.prototype.DownloadURL = function(fpath, callback, title) {
	if (!fpath) {
		return;
	}
	var xmlDoc;
	var that = this;
	var cmlurl = fpath;
	if (!topwin.standalone && this.proxy) {
		cmlurl = this.proxy + "url=" + escape(cmlurl);
	}
	if (topwin.standalone || useLegacyLocalLoad) {
		if (cmlurl.substring(2, 3) == ":") {
			xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
			xmlDoc.validateOnParse = false;
			xmlDoc.async = true;
			xmlDoc.load(cmlurl);
			if (xmlDoc.parseError.errorCode != 0) {
				var myErr = xmlDoc.parseError;
				alert("GeoXml file appears incorrect\n" + myErr.reason
						+ " at line:" + myErr.line);
			} else {
				callback(xmlDoc.doc);
			}
			return;
		}
	}
	var cmlreq;/*@cc_on @*//*@if(@_jscript_version>=5)try{cmlreq=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{cmlreq=new ActiveXObject("Microsoft.XMLHTTP");}catch(E){alert("attempting xmlhttp");cmlreq=false;}}@end @*/
	if (!cmlreq && typeof XMLHttpRequest != 'undefined') {
		cmlreq = new XMLHttpRequest();
	} else {
		if (typeof ActiveXObject != "undefined") {
			cmlreq = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	var here = cmlurl;
	if (cmlreq.overrideMimeType) {
		cmlreq.overrideMimeType("text/xml");
	}
	cmlreq.open("GET", here, true);
	cmlreq.onreadystatechange = function() {
		switch (cmlreq.readyState) {
		case 4:
			that.mb.showMess(title + " received", 2000);
			if (typeof ActiveXObject != "undefined") {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async = "false";
				var response = cmlreq.responseText;
				callback(response);
			} else {
				if (cmlreq.responseXML) {
					that.mb.showMess(title + " received", 2000);
					callback(cmlreq.responseText);
				} else {
					if (cmlreq.status == 200) {
						var resp = cmlreq.responseText;
						var sresp = resp.substring(0, 400);
						var isXML = resp.substring(0, 5);
						if (isXML == "<?xml" && sresp.indexOf("kml") != -1) {
							that.mb
									.showMess(title + " response received",
											2000);
							callback(resp.responseText);
						} else {
							that.mb.showMess(
									"File does not appear to be a valid GeoData"
											+ resp, 6000);
						}
					}
				}
			}
			break;
		case 3:
			that.mb.showMess("Receiving " + title + "...");
			break;
		case 2:
			that.mb.showMess("Waiting for " + title, 2000);
			break;
		case 1:
			that.mb.showMess("Sent request for " + title, 2000);
			break;
		}
	};
	try {
		cmlreq.send(null);
	} catch (err) {
		if (cmlurl.substring(2, 3) == ":" && !useLegacyLocalLoad) {
			useLegacyLocalLoad = true;
			this.DownloadURL(cmlurl);
		}
	}
};

