/* * GMapEZ -- Turn specially-marked HTML into Google Maps * Copyright (C) July 2005 - Oct 2006 by Chris Houser * * This code is licensed under the GNU General Public License (GPL) * * If you use this code on a web page, please include on that page a * link to http://n01se.net/gmapez/ -- this is a request, not * a requirement. Thanks. */ (function(){ var startdate = new Date(); // configuration -- if you're using your own copy of gmapez.js, you // may want to modify these: var overlaysPerStep = 25; var imgBase = 'http://gmapez.googlepages.com/'; var upperImgBase = 'http://gmapez.upper.googlepages.com/'; var shadowServer = 'http://n01se.net/shadow.cgi?src='; if( window.ez_preload ) { // we're already loaded return; } var _lastId = 0; function newId() { return 'ez_' + (++_lastId); } function loadfunc() { if( ! GBrowserIsCompatible() ) { if( document.getElementsByTagName ) { // Find all divs marked as GMapEZ var divs = document.getElementsByTagName( 'div' ); for( var i = 0; i < divs.length; ++i ) { var div = divs[ i ]; if( div.className.indexOf( 'GMapEZ' ) > -1 ) { div.innerHTML = [ "
This map cannot be displayed. The site's key may be ", "incorrect, or your browser may not compatible (see if ", "your browser is listed ", 'here).
', '
' ].join('\n'); div.style.visibility = 'visible'; div.style.padding = '0.3em'; div.style.background = '#eee'; div.style.overflow = 'auto'; } } } else { alert( [ 'Your browser is not capable of displaying', 'Google Maps on this page. Try using Firefox:', 'http://getfirefox.com/' ].join('\n') ); } return; } addOnUnload( GUnload ); function getTotalOffset( elem ) { point = new GPoint( 0, 0 ); while( elem ) { point.x += elem.offsetLeft; point.y += elem.offsetTop; //alert( elem.offsetTop + ' = ' + point.y ); elem = elem.offsetParent; } return point; } function GSmallMapTypeControl() { GMapTypeControl.call( this, true ); } GSmallMapTypeControl.prototype = new GMapTypeControl(); GSmallMapTypeControl.prototype.constructor = GSmallMapTypeControl; window.GSmallMapTypeControl = GSmallMapTypeControl; var CtrlTable = { 'GOverviewMapControl': true, 'GLargeMapControl': true, 'GSmallMapControl': true, 'GSmallZoomControl': true, 'GSmallMapTypeControl': true, 'GMapTypeControl': true, 'GMenuMapTypeControl': true, 'GHierarchicalMapTypeControl': true, 'GScaleControl': true }; var MapTypeTable = { 'G_NORMAL_MAP' : null, 'G_SATELLITE_MAP' : null, 'G_HYBRID_MAP' : null, 'G_PHYSICAL_MAP' : null, 'G_MAP_TYPE' : 'G_NORMAL_MAP', 'G_SATELLITE_TYPE' : 'G_SATELLITE_MAP', 'G_HYBRID_TYPE' : 'G_HYBRID_MAP' }; var idmarkers = {}; function markerForUrl( url ) { var matcha = /#(.*)/.exec( url ); if( matcha ) return idmarkers[ matcha[ 1 ] ]; else return null; } // For this event handler, "this" is the clicked anchor function anchorClick() { var marker = markerForUrl( this.href ); if( marker ) { if( /\bZOOM\b/.exec( this.className ) ) { var mapType = marker.mapType || marker.ezmap.map.getCurrentMapType(); var zoomLevel; if( marker.span ) { zoomLevel = mapType.getSpanZoomLevel( marker.point, marker.span, marker.ezmap.viewsize ); } else { zoomLevel = marker.ezmap.map.getZoom(); } marker.ezmap.map.setCenter( marker.point, zoomLevel, mapType ); } marker.doOpen(); return false; } else { return true; } } function wordMap( str ) { var wmap = {}; var list = str.split(' '); for( var j = 0; j < list.length; ++j ) { wmap[ list[ j ] ] = true; } return wmap; } function parseParams( str, params ) { var matchparam; for( var word in wordMap( str ) ) { matchparam = /^(\w+):(.*)$/.exec( word ); if( matchparam && matchparam[1] in params ) { params[ matchparam[1] ] = matchparam[2]; } } return params; } var markerOpener = { markers: [], addMarker: function( marker ) { this.markers.push( marker ); }, chainOpen: function( i ) { /* * This is a work-around for a Google Maps bug. If I try to open * all the info windows at once, only the last one succeeds. * * Otherwise, it is equivalent to: * for( i = 0; i < this.markers.length; ++i ) * this.markers[ i ].doOpen(); */ i = i || 0; if( i < this.markers.length ) { var onOpen = GEvent.bind( this.markers[ i ].ezmap.map, "infowindowopen", this, function(){ GEvent.removeListener( onOpen ); this.chainOpen( i + 1 ); }); this.markers[ i ].doOpen( true ); } else { //alert('GMapEZ loadtime: ' + ( new Date() - startdate ) ); } } }; var laterFuncs = []; var lastFunc = null; function doNow() { if( laterFuncs.length > 0 ) { laterFuncs.shift().call(); setTimeout( doNow, 1 ); } else { if( lastFunc ) { lastFunc.call(); } } } function doLater( obj, func ) { laterFuncs.push( function() { func.call( obj ); } ); } var MiniIcon = new GIcon(); MiniIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png"; MiniIcon.iconSize = new GSize(12, 20); MiniIcon.shadowSize = new GSize(22, 20); MiniIcon.iconAnchor = new GPoint(6, 20); MiniIcon.infoWindowAnchor = new GPoint(5, 1); G_DEFAULT_ICON.transparent = null; function EZInfoMarker( ezmap ) { this.ezmap = ezmap; this.icon = G_DEFAULT_ICON; this.point = null; this.title = null; this.blowup = false; this.tabs = []; this.infoZoomOffset = undefined; this.infoZoomLevel = undefined; this.infoMapType = null; } EZInfoMarker.prototype = new GMarker( new GLatLng( 0, 0 ) ); EZInfoMarker.prototype.constructor = EZInfoMarker; EZInfoMarker.prototype.initialize = function( map ) { GMarker.call( this, this.point, { icon: this.icon, clickable: ( this.tabs.length > 0 || this.blowup ), title: this.title }); GMarker.prototype.initialize.call( this, map ); }; EZInfoMarker.prototype.doOpen = function( autoopen ) { if( ! autoopen ) { var body = document.body || document.getElementsByTagName('body')[0]; if( 'scrollLeft' in body ) { // http://www.howtocreate.co.uk/tutorials/javascript/browserwindow var myWidth = 0, myHeight = 0; if( typeof( window.innerWidth ) == 'number' ) { //Non-IE myWidth = window.innerWidth; myHeight = window.innerHeight; } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { //IE 6+ in 'standards compliant mode' myWidth = document.documentElement.clientWidth; myHeight = document.documentElement.clientHeight; } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { //IE 4 compatible myWidth = document.body.clientWidth; myHeight = document.body.clientHeight; } var mapdiv = this.ezmap.div; var totalOffset = getTotalOffset( mapdiv ); if( totalOffset.x < body.scrollLeft || totalOffset.x + mapdiv.offsetWidth > body.scrollLeft+myWidth || totalOffset.y < body.scrollTop || totalOffset.y + mapdiv.offsetHeight > body.scrollTop+myHeight) { //alert( totalOffset.x + ', ' + totalOffset.y ); scrollTo( totalOffset.x, totalOffset.y ); } } } var zoom = null; if( this.tabs.length > 0 ) { var opts = { maxWidth: this.ezmap.div.offsetWidth - 100 }; if( this.icon ) { this.openInfoWindowTabs( this.tabs, opts ); } else { // "INVISIBLE" markers are never added as overlays -- GMap2 // knows nothing about them. this.ezmap.map.openInfoWindowTabs( this.point, this.tabs, opts ); } for( var i = 0; i < this.tabs.length; ++i ) { this.setupInfoForm( this.tabs[ i ] ); } } else if( this.blowup ) { if( this.infoZoomOffset != undefined ) zoom = this.ezmap.map.getZoom() + this.infoZoomOffset; else if( this.infoZoomLevel != undefined ) zoom = this.infoZoomLevel; if( zoom >= this.ezmap.map.getCurrentMapType().numZoomLevels ) zoom = this.ezmap.map.getCurrentMapType().numZoomLevels - 1; else if( zoom < 0 ) zoom = 0; this.showMapBlowup( { zoomLevel: zoom, mapType: this.infoMapType } ); } else { this.ezmap.map.closeInfoWindow(); } }; EZInfoMarker.prototype.setupInfoForm = function( tab ) { var div, a; var tabElem = tab.contentElem; var classes = tabElem.className ? wordMap( tabElem.className ) : {}; if( classes.DirectionsToHere || classes.DirectionsFromHere || classes.SearchNearby ) { if( tab.infoFormId ) { div = document.getElementById( tab.infoFormId ); div.innerHTML = ''; } else { div = document.createElement('div'); div.className = 'ez_infoForm'; tab.infoFormId = div.id = newId(); tabElem.appendChild( div ); } var _this = this; if( classes.DirectionsToHere || classes.DirectionsFromHere ) { div.appendChild( document.createTextNode( 'Get directions: ' ) ); if( classes.DirectionsToHere ) { a = document.createElement('a'); a.innerHTML = 'To here'; a.onclick = function() { _this.showForm( tab ); }; a.href = 'javascript:void(null)'; div.appendChild( a ); } if( classes.DirectionsToHere && classes.DirectionsFromHere ) { div.appendChild( document.createTextNode( ' - ' ) ); } if( classes.DirectionsFromHere ) { a = document.createElement('a'); a.innerHTML = 'From here'; a.onclick = function() {}; a.href = 'javascript:void(null)'; div.appendChild( a ); } div.appendChild( document.createElement('br') ); } if( classes.SearchNearby ) { a = document.createElement('a'); a.innerHTML = 'Search nearby'; a.onclick = function() {}; a.href = 'javascript:void(null)'; div.appendChild( a ); } } }; EZInfoMarker.prototype.showForm = function( tab ) { var div = document.getElementById( tab.infoFormId ); div.innerHTML = 'Get directions: To here - '; var a = document.createElement('a'); a.innerHTML = 'From here'; a.onclick = function() {}; a.href = 'javascript:void(null)'; div.appendChild( a ); var x = document.createElement('div'); x.innerHTML = 'Start address'; div.appendChild( x ); this.ezmap.map.getInfoWindow().reset(); }; function EZPolyline( color, weight, opacity ) { this.points = []; this.initialize = function( map ) { GPolyline.call( this, this.points, color, weight, opacity ); GPolyline.prototype.initialize.call( this, map ); }; }; EZPolyline.prototype = new GPolyline(); EZPolyline.prototype.constructor = EZPolyline; function EZMap( div, classes ) { this.div = div; this.classes = classes; this.divData = null; this.map = undefined; this.viewsize = null; this.extentMarker = null; this.overlayList = []; this.loading = null; this.bar = null; this.maxstep = 0; this.step = 0; this.oi = 0; this.initFrame(); } EZMap.prototype.logWarning = function( str ) { if( ! this.warningNode ) { this.warningVis = false; this.warningNode = document.createElement('ul'); this.warningNode.className = 'warnings'; this.div.appendChild( this.warningNode ); var warnBtn = document.createElement('button'); warnBtn.className = 'warnings'; warnBtn.innerHTML = 'Warnings...'; this.div.appendChild( warnBtn ); var ezmap = this; warnBtn.onclick = function() { ezmap.toggleWarnings(); }; } var li = document.createElement('li'); li.innerHTML = str; this.warningNode.appendChild( li ); }; EZMap.prototype.toggleWarnings = function() { this.warningVis = ! this.warningVis; this.warningNode.style.display = this.warningVis ? 'block' : 'none'; }; EZMap.prototype.processMarkers = function( parentNode, polyline ) { var lastOverlay, marker, textContent, imgs; var matchll, matchspn, matchtype; for( var node = parentNode.firstChild; node; node = node.nextSibling){ lastOverlay = this.overlayList[ this.overlayList.length - 1 ]; switch( node.nodeName ) { case 'A': matchll = /\Wll=([-.\d]*),([-.\d]*)/.exec( node.href ); if( matchll ) { marker = new EZInfoMarker( this ); marker.title = node.getAttribute('title'); this.overlayList.push( marker ); if( node.id || node.name ) idmarkers[ node.id || node.name ] = marker; textContent = node.innerHTML.replace( /<[^>]*>/g, '' ); if( /\bOPEN\b/.exec( textContent ) ) markerOpener.addMarker( marker ); if( /\bEXTENT\b/.exec( textContent ) ) { marker.icon = null; this.extentMarker = marker; } if( /\bINVISIBLE\b/.exec( textContent ) ) { marker.icon = null; } marker.point = new GLatLng( parseFloat( matchll[1] ), parseFloat( matchll[2] ) ); if( polyline ) { marker.icon = null; polyline.points.push( marker.point ); } matchspn = /\Wspn=([-.\d]*),([-.\d]*)/.exec( node.href ); if( matchspn ) { marker.span = new GLatLng( parseFloat( matchspn[1] ), parseFloat( matchspn[2] ) ); } matchtype = /\Wt=(.)/.exec( node.href ); if( matchtype ) { switch( matchtype[1] ) { case 'k': marker.mapType = G_SATELLITE_MAP; break; case 'h': marker.mapType = G_HYBRID_MAP; break; // XXX need a GMapType letter for use by ZOOM links } } // build icon imgs = node.getElementsByTagName('img') if( imgs.length < 1 ) { var matchcolor = /\b(ORANGE|PURPLE|YELLOW|GREEN|BLUE|RED|AQUA|WHITE|GRAY)\b/ .exec( textContent ); var matchsym = /\b([0-9A-Za-z]|BLANK|HASH|DOLLAR|DOT|START|END)\b/ .exec( textContent ); var matchmini = /\bMINI\b/.exec( textContent ); if( matchcolor || matchsym || matchmini ) { var upper = matchsym && matchsym[0].match(/^[A-Z]$/); marker.icon = new GIcon( matchmini ? MiniIcon : G_DEFAULT_ICON ); marker.icon.image = [ upper ? upperImgBase : imgBase, matchmini ? 'mini' : 'marker', '-', matchcolor ? matchcolor[0] : 'ORANGE', '-', matchmini ? 'BLANK' : ( matchsym ? matchsym[0] : 'DOT' ), upper ? '-UPPER' : '', '.png' ].join(''); marker.icon.printImage = marker.icon.image; marker.icon.mozPrintImage = marker.icon.image; } } else { marker.icon = new GIcon( G_DEFAULT_ICON, imgs[ 0 ].src ); marker.icon.printImage = imgs[ 0 ].src; marker.icon.mozPrintImage = imgs[ 0 ].src; marker.icon.transparent = null; marker.icon.iconAnchor = null; marker.icon.infoWindowAnchor = null; var params = parseParams( imgs[ 0 ].className, { width: null, height: null, iconAnchor: null, infoWindowAnchor: null, imageMap: null } ); var match; var width = parseInt( params.width ); var height = parseInt( params.height ); marker.icon.iconSize = new GSize( width, height ); if( params.iconAnchor ) { match = /(\d+),(\d+)/.exec( params.iconAnchor ); if( match ) { marker.icon.iconAnchor = new GPoint( parseInt( match[1] ), parseInt( match[2] ) ); } } if( marker.icon.iconAnchor === null ) { marker.icon.iconAnchor = new GPoint( Math.round( width / 2 ), Math.max( 1, height - 2 ) ); } if( params.infoWindowAnchor ) { match = /(\d+),(\d+)/.exec( params.infoWindowAnchor ); if( match ) { marker.icon.infoWindowAnchor = new GPoint( parseInt( match[1] ), parseInt( match[2] ) ); } } if( marker.icon.infoWindowAnchor === null ) { marker.icon.infoWindowAnchor = new GPoint( Math.round( width / 2 ), 0 ); } if( params.imageMap ) { marker.icon.imageMap = []; var parts = params.imageMap.split(/\s*,\s*/); for( var i = 0; i < parts.length; ++i ) { marker.icon.imageMap.push( parseInt( parts[ i ] ) ); } //alert( marker.icon.imageMap ); } if( imgs.length > 1 ) { marker.icon.shadow = imgs[ 1 ].src; params = parseParams( imgs[ 1 ].className, { width:0, height:0 }); marker.icon.shadowSize = new GSize( params.width, params.height); } else { marker.icon.shadow = shadowServer + imgs[ 0 ].src; marker.icon.shadowSize = new GSize( Math.floor( width + height * 0.55 ), height ); } if( imgs.length > 2 ) { marker.icon.transparent = imgs[ 2 ].src; } if( imgs.length > 3 ) { marker.icon.printImage = imgs[ 3 ].src; } if( imgs.length > 4 ) { marker.icon.printShadow = imgs[ 4 ].src; } if( imgs.length > 5 ) { marker.icon.mozPrintShadow = imgs[ 5 ].src; } } } else { this.logWarning( "No ll param for marker [" + node.innerHTML + ":" + (node.id || node.name) + "]" ); } break; case 'DIV': if( ! lastOverlay ) { this.logWarning( "div block given before any markers" ); continue; } else { var infoClasses = wordMap( node.className ); if( 'GMapEZ' in infoClasses ) { // infoWindow blowup // XXX replace this with a nested map to allow for use // in tabs? lastOverlay.blowup = true; var matchzoom = /ZOOMLEVEL([-+=]?)(\d+)/.exec( node.innerHTML ); if( matchzoom ) { var num = parseInt( matchzoom[ 2 ] ); if( matchzoom[ 1 ] == '-' ) lastOverlay.infoZoomOffset = num; else if( matchzoom[ 1 ] == '+' ) lastOverlay.infoZoomOffset = - num; else lastOverlay.infoZoomLevel = num; } for( typeName in MapTypeTable ) { if( typeName in infoClasses ) { if( MapTypeTable[ typeName ] ) { lastOverlay.infoMapType = window[ MapTypeTable[ typeName ] ]; } else { lastOverlay.infoMapType = window[ typeName ]; } break; } } } else { // XXX remove title attribute from div node? lastOverlay.tabs.push( new GInfoWindowTab( node.getAttribute('title'), node )); } } break; case 'LI': this.processMarkers( node, polyline ); break; case 'OL': var params = parseParams( node.className, { color: null, weight: null, opacity: null } ); if( params.color && ! /^#[0-9a-zA-Z]{6}$/.exec( params.color ) ) this.logWarning( 'Polyline color should be a 6-digit' + ' hex color like "#123abc", not "' + params.color + '"' ); if( params.weight != null ) { var w = parseInt( params.weight ); if( w < 1 || isNaN( w ) ) this.logWarning( 'Polyline weight should be an' + ' interger above 0, not "' + params.weight + '"' ); params.weight = w; } if( params.opacity ) { var o = parseFloat( params.opacity ); if( o < 0 || o > 1 || isNaN( o ) ) this.logWarning( 'Polyline opacity should be ' + ' between 0 and 1, not "' + params.opacity + '"' ); params.opacity = o; } var newline = new EZPolyline( params.color, params.weight, params.opacity ); this.overlayList.push( newline ); this.processMarkers( node, newline ); break; case '#text': case '#comment': // ignore text and comments break; default: this.logWarning( "Unknown or misplaced node " + node.nodeName ); break; } } }; EZMap.prototype.onClick = function( overlay, point ) { if( overlay && overlay.doOpen ) { overlay.doOpen(); } else if( point ) { this.map.closeInfoWindow(); } }; EZMap.prototype.nextStep = function( func ) { if( this.maxstep > 0 ) { this.bar.style.width = Math.round( this.step / this.maxstep * 100 ) + '%'; } this.step += 1; doLater( this, func ); }; EZMap.prototype.initFrame = function() { this.divData = this.div; this.div = this.div.cloneNode( false ); this.divData.parentNode.insertBefore( this.div, this.divData ); this.divData.parentNode.removeChild( this.divData ); this.div.style.visibility = 'visible'; this.loading = document.createElement('div'); this.loading.className = 'loadprogress'; this.loading.style.marginTop = ( this.div.offsetHeight / 3 ) + 'px'; this.loading.innerHTML = '
'; this.bar = this.loading.getElementsByTagName('div')[3]; this.div.appendChild( this.loading ); this.nextStep( this.initParse ); }; EZMap.prototype.initParse = function() { this.processMarkers( this.divData ); this.divData = null; this.map = new GMap2( this.div ); this.map.getContainer().appendChild( this.loading ); GEvent.bind( this.map, 'click', this, this.onClick ); if( 'ScrollWheelZoom' in this.classes ) { this.map.enableScrollWheelZoom(); } if( ! this.extentMarker && this.overlayList.length == 1 ) this.extentMarker = this.overlayList[ 0 ]; // map type var mapType = G_NORMAL_MAP; if( this.extentMarker && this.extentMarker.mapType ) { mapType = this.extentMarker.mapType; } for( typeName in MapTypeTable ) { if( typeName in this.classes ) { if( MapTypeTable[ typeName ] ) { mapType = window[ MapTypeTable[ typeName ] ]; } else { mapType = window[ typeName ]; } break; } } // center and zoom this.viewsize = new GSize( this.div.offsetWidth, this.div.offsetHeight ); var center, zoomLevel; if( this.extentMarker ) { center = this.extentMarker.point; if( this.extentMarker.span ) { zoomLevel = mapType.getSpanZoomLevel( center, this.extentMarker.span, this.viewsize ); } else { zoomLevel = 10; } } else if( this.overlayList.length > 1 ) { var autoBounds; for( var i = 0; i < this.overlayList.length; ++i ) { if( this.overlayList[ i ].point ) { if( ! autoBounds ) { autoBounds = new GLatLngBounds( this.overlayList[ i ].point, this.overlayList[ i ].point ); } else { autoBounds.extend( this.overlayList[ i ].point ); } } } var sw = autoBounds.getSouthWest(); var ne = autoBounds.getNorthEast(); center = new GLatLng( ( sw.lat() + ne.lat() ) / 2, ( sw.lng() + ne.lng() ) / 2 ); zoomLevel = mapType.getBoundsZoomLevel( autoBounds, this.viewsize); } else { center = new GLatLng( 41.075210, -85.130310 ); zoomLevel = 10; } // apply center, zoom, and map type this.map.setCenter( center, zoomLevel, mapType ); this.maxstep = Math.floor( this.overlayList.length / overlaysPerStep ) + 2; this.initOverlays(); }; EZMap.prototype.initOverlays = function() { var overlay; var steplimit = Math.min(this.overlayList.length, this.oi+overlaysPerStep); for( ; this.oi < steplimit; ++this.oi ) { overlay = this.overlayList[ this.oi ]; if( overlay.points || overlay.icon ) this.map.addOverlay( overlay ); this.overlayList[ this.oi ] = null; } if( this.oi < this.overlayList.length ) this.nextStep( this.initOverlays ); else this.nextStep( this.initControls ); }; EZMap.prototype.initControls = function() { for( var ctrl in CtrlTable ) { if( ctrl in this.classes ) { this.map.addControl( new window[ ctrl ]() ); } } this.nextStep( this.initLoading ); }; EZMap.prototype.initLoading = function() { this.loading.parentNode.removeChild( this.loading ); this.loading = null; }; // Find all anchor tags linking to GMapEZ markers var anchors = document.getElementsByTagName( 'a' ); for( var mi = 0; mi < anchors.length; ++mi ) { if( ! anchors[ mi ].onclick ) { anchors[ mi ].onclick = anchorClick; } } // Find all divs marked as GMapEZ var divs = document.getElementsByTagName( 'div' ); for( var i = 0; i < divs.length; ++i ) { var div = divs[ i ]; var classes = wordMap( div.className ); if( 'GMapEZ' in classes ) { new EZMap( div, classes ); } } lastFunc = function() { // Examine current page location for a reference to a GMapEZ marker var marker = markerForUrl( document.location ); if( marker ) markerOpener.addMarker( marker ); // Open all the markers we need to markerOpener.chainOpen(); }; doNow(); } function chainWindowFunc( funcname, newfunc ) { var oldfunc = window[ funcname ]; if( oldfunc ) { window[ funcname ] = function() { oldfunc(); newfunc(); }; } else { window[ funcname ] = newfunc; } } window.addOnLoad = function( func ) { chainWindowFunc( "onload", func );}; window.addOnUnload = function( func ) { chainWindowFunc( "onunload", func );}; window.ez_preload = function() { if( window.G_INCOMPAT ) { // If the key failed to validate, cause all keys to appear valid // and try again. window.G_INCOMPAT = false; window.GValidateKey = function(){ return true; } GLoad(); } addOnLoad( loadfunc ); } var key = ''; var gmapversion = '2'; (function(){ var metas = document.getElementsByTagName( 'meta' ); var match; for( var i = 0; i < metas.length; ++i ) { match = /gmapkey:?(.*)/.exec( metas[ i ].name ); if( match ) { if( ! match[ 1 ] ) { key = metas[ i ].content; } else if( (new RegExp( match[ 1 ] )).exec( window.location.href ) ) { key = metas[ i ].content; break; } } else if( metas[ i ].name == 'gmapversion' ) { gmapversion = metas[ i ].content; } } })(); if( ! window.GMap2 ) { document.write( [ '' ].join('\n') ); } document.write( [ '', '' ].join('\n')); })();