1/* global $ */ 2/* global google */ 3var routeMap = function () { 4 var _map; 5 var _settings; 6 var _airports; 7 var _routes; 8 var _polylines = []; 9 var _markers = []; 10 var _infoWindow; 11 12function clearMap() { 13 // Clear all polylines 14 for (var i = 0; i < _polylines.length; i++) { 15 _polylines[i].setMap(null); 16 } 17 _polylines = []; 18 19 // Clear all markers 20 for (var i = 0; i < _markers.length; i++) { 21 _markers[i].setMap(null); 22 } 23 _markers = []; 24} 25 26function init(settings) { 27 _settings = settings; 28 _routes = _settings.routes; 29 _map = new google.maps.Map(document.getElementById(_settings.containerId), _settings.options); 30 _infoWindow = new google.maps.InfoWindow(); 31 32 // Set airports 33 _airports = getAirports(_routes); 34 35 // Populate 'from' destinations 36 initDropdowns(); 37 38 // Clear the map only if `showAllRoutesOnLoad` is false 39 if (!_settings.showAllRoutesOnLoad) { 40 clearMap(); 41 } else { 42 drawRoutes(_routes); // Ensure all routes are drawn if setting is true 43 } 44} 45 46 function initDropdowns() { 47 var options = ""; 48 if(typeof _settings.optGroupLabel != 'undefined' || _settings.optGroupLabel != null){ 49 options += '<optgroup label=' + _settings.optGroupLabel + '>'; 50 }else{ 51 options += "<option></option>"; 52 } 53 54 var sortedAirports = $.map(_airports, function(el) { return el }); 55 56 sortedAirports.sort(function(a,b) { 57 if(a.sortIndex == b.sortIndex){ 58 return (a.name.toUpperCase() > b.name.toUpperCase()) ? 1 : ((b.name.toUpperCase() > a.name.toUpperCase()) ? -1 : 0); 59 }else{ 60 return a.sortIndex - b.sortIndex; 61 } 62 }); 63 64 65 for(var i = 0; i < sortedAirports.length; i++){ 66 options += "<option>" + sortedAirports[i].name + "</option>"; 67 } 68 69 if(typeof _settings.optGroupLabel != 'undefined' || _settings.optGroupLabel != null){ 70 options +='</optgroup>' 71 } 72 73 $("#" + _settings.fromId).append(options); 74 75 $("#" + _settings.fromId).change(fromAirportChanged); 76 $("#" + _settings.toId).change(toAirportChanged); 77 } 78 79 function fromAirportChanged(){ 80 81 // Always clear the map first if `showAllRoutesOnLoad` is false 82 if (!_settings.showAllRoutesOnLoad) { 83 clearMap(); 84 } 85 86 // If no selection is made, stop here 87 if (this.value === "") { 88 return; 89 } 90 91 var routes = getRoutes(_airports[this.value]); 92 93 drawRoutes(routes); 94 95 $("#" + _settings.toId).find('option').remove(); 96 97 if(this.value == ""){ 98 return; 99 } 100 101 $("#" + _settings.toId).append("<option></option>"); 102 103 for(var i = 0; i < routes.length; i++){ 104 $("#" + _settings.toId).append("<option>
104" + routes[i].To + "</option>"); 105 } 106 107 _settings.toAirportsChanged(); 108 }; 109 110 function toAirportChanged(){ 111 //if value is blank show all from routes 112 if(this.value == ""){ 113 drawRoutes(getRoutes(_airports[$("#" + _settings.fromId).val()])); 114 }else{ 115 var fromAirport = _airports[$("#" + _settings.fromId).val()]; 116 var toAirport = _airports[$("#" + _settings.toId).val()]; 117 118 for(var i = 0; i < _routes.length; i++){ 119 if(_routes[i].From == fromAirport.name && _routes[i].To == toAirport.name){ 120 drawRoutes([_routes[i]]); 121 } 122 } 123 } 124 }; 125 126 function getAirports(routes){ 127 if(routes == null || typeof routes == "undefined"){ 128 routes = _routes; 129 }; 130 131 var airports = {}; 132 133 for(var i = 0; i < routes.length; i++){ 134 if(!(routes[i].From in airports)){ 135 airports[routes[i].From] = { 136 name: routes[i].From, 137 lat: parseFloat(routes[i].FromLat), 138 lng: parseFloat(routes[i].FromLon), 139 surface: routes[i].FromSurface, 140 sortIndex: (routes[i].FromSortOrder == "") ? 10000 : parseInt(routes[i].FromSortOrder) 141 } 142 } 143 144 if(!(routes[i].To in airports)){ 145 airports[routes[i].To] = { 146 name: routes[i].To, 147 lat: parseFloat(routes[i].ToLat), 148 lng: parseFloat(routes[i].ToLon), 149 surface: routes[i].ToSurface, 150 sortIndex: (routes[i].ToSortOrder == "") ? 10000 : parseInt(routes[i].ToSortOrder) 151 } 152 } 153 } 154 155 return airports; 156 }; 157 158 function getRoutes(airport){ 159 if(airport == null || typeof airport == "undefined"){ 160 return _routes; 161 }; 162 163 var routes = []; 164 165 for(var i = 0; i < _routes.length; i++){ 166 if(_routes[i].From == airport.name){ 167 routes.push(_routes[i]) 168 } 169 } 170 171 return routes; 172 } 173 174 function addMarkers(routes){ 175 //clear existing markers 176 for(var i = 0; i < _markers.length; i++){ 177 _markers[i].setMap(null); 178 } 179 180 _markers = []; 181 182 var airports = getAirports(routes); 183 var airport; 184 185 for(var key in airports){ 186 airport = airports[key]; 187 188 var icon; 189 190 if(airport.name == $("#" + _settings.fromId).val()){ 191 icon = _settings.fromMarkerIcon; 192 }else{ 193 icon = _settings.toMarkerIcon; 194 } 195 196 var marker = new google.maps.Marker({ 197 position: {lat: airport.lat, lng: airport.lng}, 198 map: _map, 199 icon: icon, 200 title: airport.name, 201 airport: airport 202 }); 203 204 google.maps.event.addListener(marker, "click", markerClicked); 205 206 _markers.push(marker); 207 208 209 } 210 211 fitBounds(); 212 } 213 214 function markerClicked(){ 215 _infoWindow.setContent(_settings.infoWindowHtml(this.airport)); 216 _infoWindow.open(_map, this); 217 } 218 219 function drawRoutes(routes){ 220 //clear existing lines 221 for(var i = 0; i < _polylines.length; i++){ 222 _polylines[i].setMap(null); 223 } 224 225 _polylines = []; 226 227 if(routes == null || typeof routes == "undefined"){ 228 addMarkers(_routes); 229 return; 230 } 231 232 addMarkers(routes); 233 234 if(!_settings.drawPolylines){ 235 return; 236 } 237 238 for(var i = 0; i < routes.length; i++){
239 var flightPath = new google.maps.Polyline({ 240 path: [ 241 {lat: _airports[routes[i].From].lat, lng: _airports[routes[i].From].lng}, 242 {lat: _airports[routes[i].To].lat, lng: _airports[routes[i].To].lng} 243 ], 244 geodesic: true, 245 strokeColor: _settings.strokeColor, 246 strokeOpacity: _settings.strokeOpacity, 247 strokeWeight: _settings.strokeWeight 248 }); 249 250 flightPath.setMap(_map); 251 252 _polylines.push(flightPath); 253 } 254 } 255 256 function fitBounds() { 257 if(!_settings.fitBounds){ 258 return; 259 } 260 261 var bounds = new google.maps.LatLngBounds(); 262 263 for (var i = 0; i < _markers.length; i++) { 264 bounds.extend(_markers[i].getPosition()); 265 } 266 267 // _map.fitBounds(bounds); 268 269 _map.panTo(bounds.getCenter()); 270 271 google.maps.event.addListenerOnce(_map, 'idle', function() { 272 _map.fitBounds(bounds); 273 }); 274 } 275 276 //Public methods/properties 277 return{ 278 init: init, 279 }; 280}();
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.