1var mapApp; 2( function( $ ) { 3 'use strict'; 4 mapApp = { 5 z: 1, 6 view: false, 7 created: false, 8 interactive: false, 9 maps: {}, 10 toggle: function( id ) { 11 if( ! this.view ) { 12 this.view = true; 13 $( '.map' ).removeClass( 'hide' ); 14 $( '.map-key' ).removeClass( 'hide' ); 15 $( '.map-view-button' ).text( 'Close Map' ); 16 if( ! this.created ) { 17 this.interactive = true; 18 this.setup(); 19 } 20 this.updateMarkers( id ); 21 } else { 22 this.view = false; 23 $( '.map' ).addClass( 'hide' ); 24 $( '.map-key' ).addClass( 'hide' ); 25 $( '.map-view-button' ).text( 'View on Map' ); 26 } 27 return false; 28 }, 29 setup: function() { 30 this.view = true; 31 $( '.map' ).each( function() { 32 var id = $( this ).attr( 'id' ); 33 mapApp.maps[id] = { 34 map: {}, 35 markers: [], 36 drawings: [] 37 } 38 mapApp.create( id ); 39 } ); 40 $( '.map-hover' ).on( 'mouseover.mapapp, mouseout.mapapp', function( e ) { 41 var id = $( this ).attr( 'data-map' ); 42 var h = $( this ).attr( 'data-maphover' ); 43 mapApp.mouseeffect( id, h, e.type ); 44 } ); 45 }, 46 create: function( id ) { 47 var obj = $( '#' + id ); 48 var markers = obj.find( '.marker' ); 49 var draw = obj.find( '.map-draw' ); 50 var args = mapApp.mapArgs(); 51 this.created = true; 52 this.maps[id].map = new google.maps.Map( obj[0], args ); 53 draw.each( function() { 54 mapApp.draw( id, $( this ) ); 55 } ); 56 markers.each( function() { 57 var mid = $( this ).attr( 'data-id' ); 58 var label = $( this ).attr( 'data-label' ); 59 var color = $( this ).attr( 'data-color' ); 60 var colorover = $( this ).attr( 'data-colorover' ); 61 mapApp.maps[id].markers['m' + mid] = { 62 lat: $( this ).attr( 'data-lat' ), 63 lng: $( this ).attr( 'data-lng' ), 64 html: $( this ).html() 65 }; 66 mapApp.marker( id, mid, label, color, colorover ); 67 } ); 68 if( ! mapApp.interactive ) { 69 this.center( id ); 70 } 71 }, 72 draw: function( id, item ) { 73 var type = item.attr( 'data-type' ); 74 var draw; 75 var drawing_html = item.html(); 76 var drawing = JSON.parse( drawing_html ); 77 switch( type ) { 78 case 'polyline' : { 79 var stroke = '#' + item.attr( 'data-stroke' ); 80 this.drawingPoints( id, drawing ); 81 draw = new google.maps.Polyline( { 82 path: drawing, 83 geodesic: true, 84 strokeColor: stroke, 85 strokeWeight: 3, 86 map: this.maps[id].map 87 } ); 88 break; 89 } 90 case 'circle' : { 91 var color = '#' + item.attr( 'data-color' ); 92 var center = { lat: drawing[0]['lat'], lng: drawing[0]['lng'] }; 93 var radius = drawing[0]['radius'] * 1609.34; 94 draw = new google.maps.Circle( { 95 strokeColor: color, 96 strokeOpacity: 0.5, 97 strokeWeight: 2, 98 fillColor: color, 99 fillOpacity: 0.1, 100 map: this.maps[id].map, 101 center: center, 102 radius: radius 103 } ); 104 break; 105 } 106 } 107 }, 108 drawingPoints: function( id, points ) { 109 var p, lat, lng; 110 for( var p = 0; p < points.length; p++ ) { 111 lat = points[p]['lat']; 112 lng = points[p]['lng']; 113 this.maps[id].drawings[this.maps[id].drawings.length] = [ lat, lng ]; 114 } 115 }, 116 marker: function( id, mid, label, color, colorover ) { 117 var info = this.maps[id].markers['m' + mid]; 118 var latlng = new google.maps.LatLng( info.lat, info.lng ); 119 var marker = new google.maps.Marker({ 120 map: this.maps[id].map, 121 position: latlng, 122 icon: mapApp.geticon( color, label ) 123 }); 124 marker.setValues( { 125 id: id, 126 mid: mid, 127 text: label, 128 color: color, 129 colorover: colorover 130 } ); 131 this.maps[id].markers.push( marker ); 132 if( info.html ) { 133 var infowindow = new google.maps.InfoWindow( { 134 content: info.html 135 } ); 136 google.maps.event.addListener( marker, 'click', function() { 137 var id = marker.get( 'id' ); 138 infowindow.open( mapApp.maps[id].map, marker ); 139 } ); 140 google.maps.event.addListener( marker, 'mouseover', function() { 141 marker.setZIndex( google.maps.Marker.MAX_ZINDEX + mapApp.z++ ); 142 marker.setIcon( mapApp.geticon( marker.get( 'colorover' ), marker.get( 'text' ) ) ); 143 } ); 144 google.maps.event.addListener( marker, 'mouseout', function() { 145 marker.setIcon( mapApp.geticon( marker.get( 'color' ), marker.get( 'text' ) ) ); 146 } ); 147 } 148 if( mid == 0 ) { 149 marker.setZIndex( google.maps.Marker.MAX_ZINDEX + mapApp.z++ ); 150 } 151 }, 152 updateMarkers: function( id ) { 153 if( mapApp.view ) { 154 var show = $.map( $( '.map-item.s' ), function( el ) { return Number( $( el ).attr( 'data-mapid' ) ); } ); 155 var hide = $.map( $( '.map-item.h' ), function( el ) { return Number( $( el ).attr( 'data-mapid' ) ); } ); 156 mapApp.displayMarkers( id, show, hide ); 157 } 158 }, 159 displayMarkers: function( id, s, h ) { 160 var i, n; 161 for( i = 0; i < s.length; i++ ) { 162 n = s[i] - 1; 163 this.toggleMarker( id, n, true ); 164 } 165 for( i = 0; i < h.length; i++ ) { 166 n = h[i] - 1; 167 this.toggleMarker( id, n, false ); 168 } 169 if( s.length ) { 170 this.center( id ); 171 } 172 }, 173 toggleMarker: function( id, i, s ) { 174 var m = this.maps[id].markers[i];
175 switch( s ) { 176 case true : { 177 if( ! m.visible ) { 178 m.setMap( this.maps[id].map ); 179 m.visible = true; 180 } 181 break; 182 } 183 case false : { 184 if( m.visible ) { 185 m.setMap( null ); 186 m.visible = false; 187 } 188 break; 189 } 190 } 191 }, 192 center: function( id ) { 193 var bounds = new google.maps.LatLngBounds(); 194 var z = 0; 195 $.each( this.maps[id].markers, function( i, marker ) { 196 if( marker.visible ) { 197 var latlng = new google.maps.LatLng( marker.position.lat(), marker.position.lng() ); 198 bounds.extend( latlng ); 199 z += 1; 200 } 201 } ); 202 $.each( this.maps[id].drawings, function( i, point ) { 203 var latlng = new google.maps.LatLng( point[0], point[1] ); 204 bounds.extend( latlng ); 205 z += 1; 206 } ); 207 if( z == 1 ) { 208 this.maps[id].map.setCenter( bounds.getCenter() ); 209 this.maps[id].map.setZoom( 15 ); 210 } else { 211 this.maps[id].map.fitBounds( bounds ); 212 } 213 }, 214 mouseeffect: function( id, p, c ) { 215 if( this.view ) { 216 google.maps.event.trigger( this.maps[id].markers[p], c ); 217 } 218 }, 219 geticon: function( c, id ) { 220 var url = this.svgmarker; 221 url[1] = c; 222 url[3] = id; 223 url = 'data:image/svg+xml;charset=UTF-8,' + url.join(""); 224 return { 225 url: url, 226 size: new google.maps.Size(24, 30), 227 scaledSize: new google.maps.Size(24, 30), 228 anchor: new google.maps.Point(12, 30) 229 }; 230 }, 231 mapArgs: function() { 232 var args = { 233 zoom: 13, 234 center: new google.maps.LatLng( 0, 0 ), 235 mapTypeId: 'terrain', 236 styles: [ 237 { 238 "elementType": "labels", 239 "stylers": [ 240 { 241 "visibility": "off" 242 } 243 ] 244 }, 245 { 246 "featureType": "administrative", 247 "elementType": "geometry", 248 "stylers": [ 249 { 250 "visibility": "off" 251 } 252 ] 253 }, 254 { 255 "featureType": "administrative.locality", 256 "stylers": [ 257 { 258 "visibility": "simplified" 259 } 260 ] 261 }, 262 { 263 "featureType": "road.highway", 264 "elementType": "labels.icon", 265 "stylers": [ 266 { 267 "visibility": "simplified" 268 } 269 ] 270 }, 271 { 272 "featureType": "transit", 273 "stylers": [ 274 { 275 "visibility": "off" 276 } 277 ] 278 } 279 ] 280 }; 281 return args; 282 }, 283 svgmarker: [ 284 "%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 24 30' xml:space='preserve'%3E%3Cstyle type='text/css'%3E.m%7Bfill:%23", 285 "", 286 ";%7D.t%7Bfill:%23fff;font-family:'Arial';font-weight:bold;font-size:12px;%7D%3C/style%3E%3Cpath class='m' d='M24,12c0,6.6-12,18-12,18S0,18.6,0,12C0,5.4,5.4,0,12,0S24,5.4,24,12z'/%3E%3Ctext transform='matrix(1 0 0 1 12 16)' text-anchor='middle' class='t'%3E", 287 "", 288 "%3C/text%3E%3C/svg%3E" 289 ] 290 }; 291} )(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.