var crm_polyline_dir = []; var crm_marker_dir = []; 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 : "silver" }; this.alwayspop = this.opts.alwaysinfopop || true; this.quiet = this.opts.quiet || false; this.titlestyle = this.opts.titlestyle || ''; /*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 || ''; /*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 = ''; /*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.3, textcolor : "#000000" }; this.latestsidebar = ""; this.forcefoldersopen = false; if (typeof this.opts.allfoldersopen != "undefined") { this.forcefoldersopen = this.opts.allfoldersopen; } ; this.clickablepolys = false; 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 = false; 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 : 1, opacity : 0.75, fillopacity : 0.4 }; this.style.color = this.randomColor(); this.style.fillcolor = this.randomColor(); this.iwwidth = this.opts.iwwidth || 0; this.maxiwwidth = this.opts.maxiwwidth || 0; this.iwheight = this.opts.iwheight || 0; 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 = ""; this.unnamedplace = ""; this.unnamedarea = ""; }; 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; markeroptions.draggable = true; var m = new GMarker(point, markeroptions); crm_marker_dir.push(m); 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>"; */ html = "<div>" + "<h3 " + ">" + name + "</h3>" + "<div>" + 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 (desc != "") if (this.clickablemarkers) { GEvent.addListener(m, "click", function(event) { eval(myvar + ".lastmarker = m"); /*m.openInfoWindowHtml(desc);*/ exwebMapModal(desc); }); } } if (this.opts.domouseover || this.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);*/ m.openInfoWindowHtml(point, m.mess); }); } 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); crm_polyline_dir.push(p); } 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.realOpacity = mark.fillOpacity; 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, opacity : this.realOpacity }); 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.realOpacity = mark.fillOpacity; mark.setFillStyle( { color : this.hilite.color, opacity : this.hilite.opacity }); 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, opacity : mark.realOpacity }); 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); crm_polyline_dir.push(m); } else { m = new GPolyline.fromEncoded(po); crm_polyline_dir.push(m); } 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 = opacity; } else { p.obj.opacity = this.style.opacity; } if (!!fillOpacity) { p.obj.fillOpacity = fillOpacity; } else { p.obj.fillOpacity = this.style.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|drawOrder|styleUrl|posList|coordinates|Style|Polygon|LineString|Point|LookAt|drawOrder|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": styleid = null; 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, ""); if (desc != "") 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 = "none"; } 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 = 1; } 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 = ""; } 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 = ""; } 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 = ""; } 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 = ""; } 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 = ""; } 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, draggable : true }); crm_marker_dir.push(marker); 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) { return; 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() { return; if (this.paren.quiet) { return; } this.mb.style.visiblity = "hidden"; this.mb.style.left = "-1200px"; this.mb.style.top = "-1200px"; }; MessageBox.prototype.centerThis = function() { return; 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()", 5); 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()", 10); } }; MessageBox.prototype.showMess = function(val, temp) { return; if (this.paren.quiet) { return; } 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()", 5); 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 || "silver"; d.style.opacity = this.style.opacity || 0.80; 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"; this.centerMe = setTimeout(this.myvar + ".centerThis()", 5); 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); } } }; $(document).ready(function() { $(' <style type="text/css"> .modal-overlay { position:fixed; top:0; right:0; bottom:0; left:0; height:100%; width:100%; margin:0; padding:0; z-index:101; } * html .modal-overlay { position: absolute; height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + \'px\'); } .modal-window { background-color: #fff; border: 1px solid #000; /* -webkit-box-shadow: #000 4px 4px 8px; -moz-box-shadow: 4px 4px 8px #000; border-top-left-radius: 0.5em 0.5em; border-top-right-radius: 0.5em 0.5em; border-bottom-left-radius: 0.5em 0.5em; border-bottom-right-radius: 0.5em 0.5em; -moz-border-radius: 0.5em 0.5em 0.5em 0.5em; */ padding: 10px; position:absolute; margin:0; z-index:999999999; } * html .modal-window { position:absolute; } .close-window { position:absolute; width:32px; height:32px; right:8px; top:8px; background:transparent url(\'http://www.explorersweb.com/img/map_modal/close-button5.png\') no-repeat scroll right top; text-indent:-99999px; overflow:hidden; cursor:pointer; opacity:.5; filter: alpha(opacity=50); -moz-opacity: 0.5; } .close-window:hover { opacity:.99; filter: alpha(opacity=99); -moz-opacity: 0.99; } </style>').appendTo("head"); }); var exwebMapModal = function(source) { modalWindow.windowId = "exwebModal"; modalWindow.content = source; modalWindow.open(); var dialogShim = $("<iframe />"); dialogShim.attr("id", "iframe-modal"); dialogShim.attr("frameborder", "0"); dialogShim.attr("scrolling", "no"); dialogShim.attr("width", $("#exwebModal").width() + 22 + "px"); dialogShim.attr("height", $("#exwebModal").height() + 22 + "px"); dialogShim.attr("style", "/*-moz-border-radius: 0.5em 0.5em 0.5em 0.5em; border-bottom-right-radius: 0.5em 0.5em; border-bottom-left-radius: 0.5em 0.5em; border-top-right-radius: 0.5em 0.5em; border-top-left-radius: 0.5em 0.5em;*/ -webkit-box-shadow: #000 4px 4px 8px; -moz-box-shadow: 4px 4px 8px #000; position: absolute; z-index: 999999998; top: " + $("#exwebModal").offset().top + "px; left: " + $("#exwebModal").offset().left + "px;"); dialogShim.attr("src", "http://www.explorersweb.com/img/map_modal"); dialogShim.appendTo("body"); }; var modalWindow = { parent:"body", windowId:null, content:null, width:null, height:null, close:function() { $(".modal-window").remove(); $("#iframe-modal").remove(); $(".modal-overlay").remove(); }, open:function() { if ($(".modal-window")) $(".modal-window").remove(); if ($("#iframe-modal")) $("#iframe-modal").remove(); if ($(".modal-overlay")) $(".modal-overlay").remove(); if ($("#exwebModal")) $("#exwebModal").remove(); var modal = ""; modal += "<div class=\"modal-overlay\"></div>"; modal += "<div id=\"" + this.windowId + "\" class=\"modal-window\" style=\"background-image:url('http://www.explorersweb.com/scripts/maps/drop.jpg'); background-repeat:repeat-x; background-color: #000; width:" + this.width + "px; height:" + this.height + "px; top:" + ($("#disp_e").offset().top + 100) + "px; left:" + ($("#disp_e").offset().left + 100)+ "px;\">"; modal += this.content; modal += "</div>"; $(this.parent).append(modal); $(".modal-window").append("<a class=\"close-window\"></a>"); $(".close-window").click(function(){modalWindow.close();}); $(".modal-overlay").click(function(){modalWindow.close();}); } }; 
