1/* 2Plugin Name: WP-GPX-Maps 3Plugin URI: http://www.devfarm.it/ 4Description: Draws a gpx track with altitude graph 5Version: 1.3.3 6Author: Bastianon Massimo 7Author URI: http://www.pedemontanadelgrappa.it/ 8*/ 9 10(function ( $ ) { 11 12 var infowindow; 13 var CustomMarker; 14 15 CustomMarker = function( map, latlng, src, img_w, img_h) { 16 this.latlng_ = latlng; 17 this.setMap(map); 18 this.src_ = src; 19 this.img_w_ = img_w; 20 this.img_h_ = img_h; 21 } 22 23 CustomMarker.prototype = new google.maps.OverlayView(); 24 25 CustomMarker.prototype.draw = function() { 26 27 var me = this; 28 29 // Check if the el has been created. 30 var el = this.img_; 31 if (!el) { 32 33 this.img_ = document.createElement('img'); 34 el = this.img_; 35 el.style.cssText = "width:"+(this.img_w_/3)+"px;height:"+(this.img_h_/3)+"px;"; 36 el.setAttribute("class", "myngimages"); 37 el.setAttribute("lat",this.latlng_.lat()); 38 el.setAttribute("lon",this.latlng_.lng()); 39 el.src=this.src_; 40 41 google.maps.event.addDomListener(el, "click", function(event) { 42 google.maps.event.trigger(me, "click", el); 43 }); 44 45 google.maps.event.addDomListener(el, "mouseover", function(event) { 46 var _t = el.style.top.replace('px',''); 47 var _l = el.style.left.replace('px',''); 48 jQuery(el).animate({ 49 height: me.img_h_, 50 width : me.img_w_, 51 top : _t - (me.img_h_ / 3), 52 left : _l - (me.img_w_ / 3), 53 'z-index' : 100 54 }, 100); 55 }); 56 57 google.maps.event.addDomListener(el, "mouseout", function(event) { 58 jQuery(el).animate({ 59 height: me.img_h_ / 3, 60 width: me.img_w_ / 3, 61 top : me.orig_top, 62 left : me.orig_left, 63 'z-index' : 1 64 }, 100); 65 }); 66 67 // Then add the overlay to the DOM 68 var panes = this.getPanes(); 69 panes.overlayImage.appendChild(el); 70 } 71 72 // Position the overlay 73 var point = this.getProjection().fromLatLngToDivPixel(this.latlng_); 74 if (point) { 75 el.style.left = point.x + 'px'; 76 el.style.top = point.y + 'px'; 77 this.orig_left = point.x; 78 this.orig_top = point.y; 79 } 80 }; 81 82 CustomMarker.prototype.remove = function() { 83 // Check if the overlay was on the map and needs to be removed. 84 if (this.img_) { 85 this.img_.parentNode.removeChild(this.img_); 86 this.img_ = null; 87 } 88 }; 89 90 $.fn.wpgpxmaps = function( params ) { 91 92 var targetId = params.targetId; 93 var mapType = params.mapType; 94 var mapData = params.mapData; 95 var graphDist = params.graphDist; 96 var graphEle = params.graphEle; 97 var graphSpeed = params.graphSpeed; 98 var graphHr = params.graphHr; 99 var graphAtemp = params.graphAtemp; 100 var graphCad = params.graphCad; 101 var graphGrade = params.graphGrade; 102 var waypoints = params.waypoints; 103 var unit = params.unit; 104 var unitspeed = params.unitspeed; 105 var color1 = params.color1; 106 var color2 = params.color2; 107 var color3 = params.color3; 108 var color4 = params.color4; 109 var color5 = params.color5; 110 var color6 = params.color6; 111 var color7 = params.color7; 112 var chartFrom1 = params.chartFrom1; 113 var chartTo1 = params.chartTo1; 114 var chartFrom2 = params.chartFrom2; 115 var chartTo2 = params.chartTo2; 116 var startIcon = params.startIcon; 117 var waypointIcon = params.waypointIcon; 118 var endIcon = params.endIcon; 119 var currentIcon = params.currentIcon; 120 var zoomOnScrollWheel = params.zoomOnScrollWheel; 121 var lng = params.langs; 122 var pluginUrl = params.pluginUrl; 123 var usegpsposition = params.usegpsposition; 124 var currentpositioncon= params.currentpositioncon; 125 126 // Unit of measure settings 127 var l_s; 128 var l_x; 129 var l_y; 130 var l_grade = { suf : "%", dec : 1 }; 131 var l_hr = { suf : "", dec : 0 }; 132 var l_cad = { suf : "", dec : 0 }; 133 134 var el = document.getElementById("wpgpxmaps_" + targetId); 135 var el_map = document.getElementById("map_" + targetId); 136 var el_chart = document.getElementById("chart_" + targetId); 137 var el_report = document.getElementById("report_" + targetId); 138 var el_osm_credits = document.getElementById("wpgpxmaps_" + targetId + "_osm_footer"); 139 140 var mapWidth = el_map.style.width; 141 142 var mapTypeIds = []; 143 for(var type in google.maps.MapTypeId) { 144 mapTypeIds.push(google.maps.MapTypeId[type]); 145 } 146 mapTypeIds.push("OSM1"); 147 mapTypeIds.push("OSM2"); 148 mapTypeIds.push("OSM3"); 149 mapTypeIds.push("OSM4"); 150 mapTypeIds.push("OSM5"); 151 mapTypeIds.push("OSM6"); 152 153 var ngImageMarkers = []; 154 155 switch (mapType) 156 { 157 case 'TERRAIN': { mapType = google.maps.MapTypeId.TERRAIN; break;} 158 case 'SATELLITE': { mapType = google.maps.MapTypeId.SATELLITE; break;} 159 case 'ROADMAP': { mapType = google.maps.MapTypeId.ROADMAP; break;} 160 case 'OSM1': { mapType = "OSM1"; break;} 161 case 'OSM2': { mapType = "OSM2"; break;} 162 case 'OSM3': { mapType = "OSM3"; break;} 163 case 'OSM4': { mapType = "OSM4"; break;} 164 case 'OSM5': { mapType = "OSM5"; break;} 165 case 'OSM6': { mapType = "OSM6"; break;} 166 default: { mapType = google.maps.MapTypeId.HYBRID; break;} 167 } 168 169 if ( mapType == "TERRAIN" || mapType == "SATELLITE" || mapType == "ROADMAP" ) 170 { 171 // google maps 172 } else { 173 // Show OpenStreetMaps credits 174 $(el_osm_credits).show(); 175 } 176 177 var map = new google.maps.Map(el_map, { 178 mapTypeId: mapType, 179 scrollwheel: (zoomOnScrollWheel == 'true'), 180 mapTypeControlOptions: { 181 style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
182 mapTypeIds: mapTypeIds 183 } 184 }); 185 186 map.mapTypes.set("OSM1", new google.maps.ImageMapType({ 187 getTileUrl: function(coord, zoom) { 188 return "http://tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; 189 }, 190 tileSize: new google.maps.Size(256, 256), 191 name: "OSM", 192 alt : "Open Street Map", 193 maxZoom: 18 194 })); 195 196 map.mapTypes.set("OSM2", new google.maps.ImageMapType({ 197 getTileUrl: function(coord, zoom) { 198 return "http://a.tile.opencyclemap.org/cycle/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; 199 }, 200 tileSize: new google.maps.Size(256, 256), 201 name: "OCM", 202 alt : "Open Cycle Map", 203 maxZoom: 18 204 })); 205 206 map.mapTypes.set("OSM4", new google.maps.ImageMapType({ 207 getTileUrl: function(coord, zoom) { 208 return "http://a.tile2.opencyclemap.org/transport/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; 209 }, 210 tileSize: new google.maps.Size(256, 256), 211 name: "OCM-Tran", 212 alt : "Open Cycle Map - Transport", 213 maxZoom: 18 214 })); 215 216 map.mapTypes.set("OSM5", new google.maps.ImageMapType({ 217 getTileUrl: function(coord, zoom) { 218 return "http://a.tile3.opencyclemap.org/landscape/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; 219 }, 220 tileSize: new google.maps.Size(256, 256), 221 name: "OCM-Land", 222 alt : "Open Cycle Map - Landscape", 223 maxZoom: 18 224 })); 225 226 map.mapTypes.set("OSM6", new google.maps.ImageMapType({ 227 getTileUrl: function(coord, zoom) { 228 return "http://tile2.maptoolkit.net/terrain/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; 229 }, 230 tileSize: new google.maps.Size(256, 256), 231 name: "MTK-Terr", 232 alt : "MapToolKit - Terrain", 233 maxZoom: 18 234 })); 235 236 // FULL SCREEN BUTTON 237 var controlDiv = document.createElement('div'); 238 controlDiv.style.padding = '5px'; 239 240 // Set CSS for the control border 241 var controlUI = document.createElement('img'); 242 controlUI.src = pluginUrl + "/wp-gpx-maps/img/goFullScreen.png"; 243 controlUI.style.cursor = 'pointer'; 244 controlUI.title = lng.goFullScreen; 245 controlDiv.appendChild(controlUI); 246 247 // Setup the click event listeners 248 google.maps.event.addDomListener(controlUI, 'click', function(event) { 249 var isFullScreen = (controlUI.isfullscreen == true); 250 var mapDiv = [ map.getDiv(), map.getDiv().parentNode ]; 251 var center = map.getCenter(); 252 253 if (isFullScreen) 254 { 255 map.setOptions( { scrollwheel : (zoomOnScrollWheel == 'true') } ); 256 jQuery(mapDiv).css("position", 'relative'). 257 css('top', 0). 258 css("width", controlUI.googleMapWidth). 259 css("height", controlUI.googleMapHeight). 260 css("z-index", ''); 261 google.maps.event.trigger(map, 'resize'); 262 map.setCenter(center); 263 controlUI.src = pluginUrl + "/wp-gpx-maps/img/goFullScreen.png"; 264 controlUI.title = lng.gofullscreen; 265 } 266 else 267 { 268 map.setOptions( { scrollwheel : true } ); 269 controlUI.googleMapWidth = jQuery(mapDiv).css('width'); 270 controlUI.googleMapHeight = jQuery(mapDiv).css('height'); 271 jQuery(mapDiv).css("position", 'fixed'). 272 css('top', 0). 273 css('left', 0). 274 css("width", '100%'). 275 css("height", '100%'). 276 css("z-index", '100'); 277 jQuery("#wpadminbar").each(function(){ 278 jQuery(mapDiv).css('top', jQuery(this).height()); 279 }); 280 google.maps.event.trigger(map, 'resize'); 281 map.setCenter(center); 282 controlUI.src = pluginUrl + "/wp-gpx-maps/img/exitFullFcreen.png"; 283 controlUI.title = lng.exitFullFcreen; 284 } 285 controlUI.isfullscreen = !isFullScreen; 286 return false; 287 }); 288 289 290 controlDiv.index = 1; 291 map.controls[google.maps.ControlPosition.TOP_RIGHT].push(controlDiv); 292 293 var bounds = new google.maps.LatLngBounds(); 294 295 var markerCurrentPosition = null; 296 297 if ( usegpsposition == "true" ) 298 { 299 300 // Try HTML5 geolocation 301 if(navigator.geolocation) { 302 303 navigator.geolocation.getCurrentPosition(function(position) { 304 305 // user position 306 var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 307 308 // draw current position marker 309 markerCurrentPosition = new google.maps.Marker({ 310 position: pos, 311 map: map, 312 title: "you", 313 animation: google.maps.Animation.DROP, 314 zIndex: 10 315 }); 316 317 if (currentpositioncon) 318 { 319 markerCurrentPosition.setIcon(currentpositioncon); 320 } 321 bounds.extend(pos); 322 323 map.setCenter(bounds.getCenter()); 324 map.fitBounds(bounds); 325 326 327 }, function() {}); 328 329 navigator.geolocation.watchPosition(function(position){ 330 // move current position marker 331 if (markerCurrentPosition != null) 332 { 333 markerCurrentPosition.setPosition(new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); 334 } 335 }, 336 function(e){
337 // some errors 338 }, 339 { 340 enableHighAccuracy: false, 341 timeout: 5000, 342 maximumAge: 0 343 }); 344 } 345 346 } 347 348 349 // Print WayPoints 350 if (waypoints != '') 351 { 352 353 var image = new google.maps.MarkerImage('http://maps.google.com/mapfiles/ms/micons/flag.png', 354 new google.maps.Size(32, 32), 355 new google.maps.Point(0,0), 356 new google.maps.Point(16, 32) 357 ); 358 var shadow = new google.maps.MarkerImage('http://maps.google.com/mapfiles/ms/micons/flag.shadow.png', 359 new google.maps.Size(59, 32), 360 new google.maps.Point(0,0), 361 new google.maps.Point(16, 32) 362 ); 363 364 if (waypointIcon!='') 365 { 366 image = new google.maps.MarkerImage(waypointIcon); 367 shadow = ''; 368 } 369 370 for (i=0; i < waypoints.length; i++) 371 { 372 var lat= waypoints[i][0]; 373 var lon= waypoints[i][1]; 374 addWayPoint(map, image, shadow, lat, lon, waypoints[i][2], waypoints[i][3]); 375 bounds.extend(new google.maps.LatLng(lat, lon)); 376 } 377 } 378 379 // Print Images 380 381 jQuery("#ngimages_" + targetId).attr("style","display:block;position:absolute;left:-50000px"); 382 jQuery("#ngimages_" + targetId + " span").each(function(){ 383 384 var imageLat = jQuery(this).attr("lat"); 385 var imageLon = jQuery(this).attr("lon"); 386 387 jQuery("img",this).each(function() { 388 389 jQuery(this).load(function(){ 390 391 var imageUrl = jQuery(this).attr("src"); 392 var img_w = jQuery(this).width(); 393 var img_h = jQuery(this).height(); 394 395 imageLat = imageLat.replace(",", "."); 396 imageLon = imageLon.replace(",", "."); 397 398 var p = new google.maps.LatLng(imageLat, imageLon); 399 bounds.extend(p); 400 401 var mc = new CustomMarker(map, p, imageUrl, img_w, img_h ); 402 403 ngImageMarkers.push(mc); 404 405 google.maps.event.addListener(mc, "click", function(div) { 406 var lat = div.getAttribute("lat"); 407 var lon = div.getAttribute("lon"); 408 var a = getClosestImage(lat,lon,targetId).childNodes[0]; 409 if (a) 410 { 411 a.click(); 412 } 413 }); 414 415 }); 416 417 if (jQuery(this).width() + jQuery(this).height() > 0) 418 { 419 jQuery(this).trigger("load"); 420 } 421 422 }); 423 424 }); 425 426 /* 427 428 // Nextgen Pro Lightbox FIX 429 var _xx = jQuery("#ngimages_" + targetId + " .nextgen_pro_lightbox"); 430 if (_xx.length > 0) 431 { 432 433 var rnd1 = Math.random().toString(36).substring(7); 434 var rnd2 = Math.random().toString(36).substring(7); 435 436 //get first gallery without images 437 for (var _temp in galleries) { 438 var _gal = galleries[_temp]; 439 440 if (_gal.source == "random_images" && _gal.wpgpxmaps != true ) 441 { 442 443 _gal.source == "galleries"; 444 _gal.wpgpxmaps = true; 445 _transient_id = _temp.replace("gallery_","") 446 _gal["entity_ids"] = []; 447 _gal["image_ids"] = []; 448 _gal["gallery_ids"] = [96]; 449 for (var i=0;i<_xx.length;i++) 450 { 451 var __xx = jQuery(_xx[i]); 452 __xx.attr("data-nplmodal-gallery-id", _transient_id); 453 _gal["image_ids"].push(__xx.attr("data-image-id")); 454 } 455 break; 456 } 457 } 458 } 459 */ 460 461 if ( jQuery("#ngimages_" + targetId + " span").length > 0 ) 462 { 463 464 // Set CSS for the control border 465 var controlUIhi = document.createElement('img'); 466 controlUIhi.src = pluginUrl + "/wp-gpx-maps/img/hideImages.png"; 467 controlUIhi.style.cursor = 'pointer'; 468 controlUIhi.title = lng.hideImages; 469 controlDiv.appendChild(controlUIhi); 470 471 // Setup the click event listeners 472 google.maps.event.addDomListener(controlUIhi, 'click', function(event) { 473 var isImagesHidden = (controlUIhi.isImagesHidden == true); 474 var mapDiv = map.getDiv(); 475 var center = map.getCenter(); 476 477 if (isImagesHidden) 478 { 479 for (var i=0; i<ngImageMarkers.length; i++) { 480 ngImageMarkers[i].setMap(map); 481 } 482 controlUIhi.src = pluginUrl + "/wp-gpx-maps/img/hideImages.png"; 483 controlUIhi.title = lng.hideImages; 484 } 485 else 486 { 487 for (var i=0; i<ngImageMarkers.length; i++) { 488 ngImageMarkers[i].setMap(null); 489 } 490 controlUIhi.src = pluginUrl + "/wp-gpx-maps/img/showImages.png"; 491 controlUIhi.title = lng.showImages; 492 } 493 controlUIhi.isImagesHidden = !isImagesHidden; 494 return false; 495 }); 496 497 } 498 499 500 // Print Track 501 if (mapData != '') 502 { 503 var points = []; 504 var lastCut=0; 505 var polylinenes = []; 506 var polyline_number=0; 507 var color=0; 508 for (i=0; i < mapData.length; i++) 509 { 510 if (mapData[i] == null) 511 { 512 513 514 color=color1[polyline_number % color1.length]; 515 516 517 var poly = new google.maps.Polyline({ 518 path: points.slice(lastCut,i), 519 strokeColor: color, 520 strokeOpacity: .7, 521 strokeWeight: 4, 522 map: map 523 });
524 polylinenes.push(poly); 525 lastCut=i; 526 polyline_number= polyline_number +1; 527 //var p = new google.maps.LatLng(mapData[i-1][0], mapData[i-1][1]); 528 //points.push(p); 529 //bounds.extend(p); 530 } 531 else 532 { 533 var p = new google.maps.LatLng(mapData[i][0], mapData[i][1]); 534 points.push(p); 535 bounds.extend(p); 536 } 537 } 538 539 if (points.length != lastCut) 540 { 541 if ( polyline_number < color1.length) 542 { 543 color=color1[polyline_number]; 544 } 545 else 546 { 547 color=color1[color1.length-1]; 548 } 549 var poly = new google.maps.Polyline({ 550 path: points.slice(lastCut), 551 strokeColor: color, 552 strokeOpacity: .7, 553 strokeWeight: 4, 554 map: map 555 }); 556 polylinenes.push(poly); 557 currentPoints = []; 558 polyline_number= polyline_number +1; 559 } 560 561 if (startIcon != '') 562 { 563 var startIconImage = new google.maps.MarkerImage(startIcon); 564 var startMarker = new google.maps.Marker({ 565 position: points[0], 566 map: map, 567 title: "Start", 568 animation: google.maps.Animation.DROP, 569 icon: startIconImage, 570 zIndex: 10 571 }); 572 573 } 574 575 if (endIcon != '') 576 { 577 var endIconImage = new google.maps.MarkerImage(endIcon); 578 var startMarker = new google.maps.Marker({ 579 position: points[ points.length -1 ], 580 map: map, 581 title: "Start", 582 animation: google.maps.Animation.DROP, 583 icon: endIconImage, 584 zIndex: 10 585 }); 586 587 } 588 589 var first = getItemFromArray(mapData,0) 590 591 if (currentIcon == '') 592 { 593 currentIcon = "http://maps.google.com/mapfiles/kml/pal4/icon25.png"; 594 } 595 596 var current = new google.maps.MarkerImage(currentIcon, 597 new google.maps.Size(32, 32), 598 new google.maps.Point(0,0), 599 new google.maps.Point(16, 16) 600 ); 601 602 var marker = new google.maps.Marker({ 603 position: new google.maps.LatLng(first[0], first[1]), 604 title:"Start", 605 icon: current, 606 map: map, 607 zIndex: 10 608 }); 609 610 for (i=0; i < polylinenes.length; i++) 611 { 612 613 google.maps.event.addListener(polylinenes[i],'mouseover',function(event){ 614 if (marker) 615 { 616 marker.setPosition(event.latLng); 617 marker.setTitle(lng.currentPosition); 618 if (hchart) 619 { 620 var tooltip = hchart.tooltip; 621 var l1 = event.latLng.lat(); 622 var l2 = event.latLng.lng(); 623 var ci = getClosestIndex(mapData,l1,l2); 624 var items = []; 625 var seriesLen = hchart.series.length; 626 for(var i=0; i<seriesLen;i++) 627 { 628 items.push(hchart.series[i].data[ci]); 629 } 630 if (items.length > 0) 631 tooltip.refresh(items); 632 } 633 } 634 }); 635 } 636 } 637 638 map.setCenter(bounds.getCenter()); 639 map.fitBounds(bounds); 640 641 // FIX post tabs 642 var $_tab = $(el).closest(".wordpress-post-tabs").eq(0); 643 if ($_tab) 644 { 645 $("div > ul > li > a", $_tab).click(function(e){ 646 setTimeout(function(e){ 647 google.maps.event.trigger(map, 'resize'); 648 //map.setCenter(bounds.getCenter()); 649 map.fitBounds(bounds); 650 tabResized = true; 651 },10); 652 }); 653 } 654 655 var controlUIcenter = null; 656 var idFirstCenterChanged = true; 657 658 google.maps.event.addListener(map, 'center_changed', function() { 659 660 if (idFirstCenterChanged == true) 661 { 662 idFirstCenterChanged = false; 663 return; 664 } 665 666 if (controlUIcenter == null) 667 { 668 // Set CSS for the control border 669 controlUIcenter = document.createElement('img'); 670 controlUIcenter.src = pluginUrl + "/wp-gpx-maps/img/backToCenter.png"; 671 controlUIcenter.style.cursor = 'pointer'; 672 controlUIcenter.title = lng.backToCenter; 673 controlDiv.appendChild(controlUIcenter); 674 675 // Setup the click event listeners 676 google.maps.event.addDomListener(controlUIcenter, 'click', function(event) { 677 map.setCenter(bounds.getCenter()); 678 map.fitBounds(bounds); 679 controlDiv.removeChild(controlUIcenter); 680 controlUIcenter = null; 681 return false; 682 }); 683 } 684 685 }); 686 687 var graphh = jQuery('#hchart_' + params.targetId).css("height"); 688 689 if (graphDist != '' && (graphEle != '' || graphSpeed != '' || graphHr != '' || graphAtemp != '' || graphCad != '') && graphh != "0px") 690 { 691 692 var valLen = graphDist.length; 693 694 var l_y_arr = []; 695 696 if (unit=="1") 697 { 698 l_x = { suf : "mi", dec : 1 }; 699 l_y = { suf : "ft", dec : 0 }; 700 } 701 else if (unit=="2") 702 { 703 l_x = { suf : "km", dec : 1 }; 704 l_y = { suf : "m", dec : 0 }; 705 } 706 else if (unit=="3") 707 { 708 l_x = { suf : "NM", dec : 1 }; 709 l_y = { suf : "m", dec : 0 }; 710 } 711 else if (unit=="4") 712 { 713 l_x = { suf : "mi", dec : 1 }; 714 l_y = { suf : "m", dec : 0 }; 715 } 716 else if (unit=="5") 717 { 718 l_x = { suf : "NM", dec : 1 }; 719 l_y = { suf : "ft", dec : 0 }; 720 } 721 else 722 { 723 l_x = { suf : "m", dec : 0 }; 724 l_y = { suf : "m", dec : 0 }; 725 } 726 727 var nn = 1111.1;
728 var _nn = nn.toLocaleString(); 729 var _nnLen = _nn.length; 730 var decPoint = _nn.substring(_nnLen - 2, _nnLen - 1); 731 var thousandsSep = _nn.substring(1, 2); 732 733 if (decPoint == "1") 734 decPoint = "."; 735 736 if (thousandsSep == "1") 737 thousandsSep = ""; 738 739 // define the options 740 var hoptions = { 741 chart: { 742 renderTo: 'hchart_' + params.targetId, 743 type: 'area', 744 events: { 745 selection: function(event) { 746 747 if (event.xAxis) { 748 749 el_report.innerHTML = 'Zoom: '+ (event.xAxis[0].min).toFixed(l_x.dec) + ' ' + l_x.suf + ' -> '+ (event.xAxis[0].max).toFixed(decPoint) + ' ' + l_x.suf + '<br />'; 750 751 var seriesLength = event.currentTarget.series.length; 752 753 for (var i = 0; i < seriesLength; i++) { 754 755 var dataX = {value: 0, count: 0}; 756 757 var serie = event.currentTarget.series[i]; 758 var points = serie.points; 759 var min = event.xAxis[0].min, max = event.xAxis[0].max; 760 761 for (var j = 0; j < points.length; j++) { 762 if (points[j].x >= min && points[j].x <= max) { 763 dataX.value += points[j].y; 764 dataX.count +=1; 765 } 766 } 767 768 var name = serie.name; 769 770 if (name == lng.altitude) { 771 el_report.innerHTML += name + ' avg: ' + (dataX.value / dataX.count).toFixed(l_y.dec) + " " + l_y.suf + "<br />"; 772 } else if (name == lng.speed) { 773 el_report.innerHTML += name + ' avg: ' + (dataX.value / dataX.count).toFixed(l_s.dec) + " " + l_s.suf + "<br />"; 774 } else if (name == lng.grade) { 775 el_report.innerHTML += name + ' avg: ' + (dataX.value / dataX.count).toFixed(l_grade.dec) + " " + l_grade.suf + "<br />"; 776 } else if (name == lng.cadence) { 777 el_report.innerHTML += name + ' avg: ' + (dataX.value / dataX.count).toFixed(l_cad.dec) + " " + l_cad.suf + "<br />"; 778 } else if (name == lng.heartRate) { 779 el_report.innerHTML += name + ' avg: ' + (dataX.value / dataX.count).toFixed(l_hr.dec) + " " + l_hr.suf + "<br />"; 780 } else 781 { 782 el_report.innerHTML += serie.name + ' avg: ' + dataX.value / dataX.count + "<br />"; 783 } 784 785 } 786 787 el_report.innerHTML += "<br />" 788 789 } else { 790 el_report.innerHTML = ''; 791 } 792 } 793 }, 794 zoomType: 'x' 795 }, 796 title: { 797 text: null 798 }, 799 xAxis: { 800 type: 'integer', 801 //gridLineWidth: 1, 802 //tickInterval: 1000, 803 labels: { 804 formatter: function() { 805 return Highcharts.numberFormat(this.value, l_x.dec,decPoint,thousandsSep) + l_x.suf; 806 } 807 } 808 }, 809 yAxis: [], 810 legend: { 811 align: 'center', 812 verticalAlign: 'top', 813 y: -5, 814 floating: true, 815 borderWidth: 0 816 }, 817 tooltip: { 818 shared: true, 819 crosshairs: true, 820 formatter: function() { 821 if (marker) 822 { 823 var hchart_xserie = hchart.xAxis[0].series[0].data; 824 for(var i=0; i<hchart_xserie.length;i++){ 825 var item = hchart_xserie[i]; 826 if(item.x == this.x) 827 { 828 var point = getItemFromArray(mapData,i) 829 if (point) 830 { 831 marker.setPosition(new google.maps.LatLng(point[0],point[1])); 832 } 833 marker.setTitle(lng.currentPosition); 834 i+=10000000; 835 } 836 } 837 } 838 var tooltip = "<b>" + Highcharts.numberFormat(this.x, l_x.dec,decPoint,thousandsSep) + l_x.suf + "</b><br />"; 839 for (i=0; i < this.points.length; i++) 840 { 841 tooltip += this.points[i].series.name + ": " + Highcharts.numberFormat(this.points[i].y, l_y_arr[i].dec,decPoint,thousandsSep) + l_y_arr[i].suf + "<br />"; 842 } 843 return tooltip; 844 } 845 }, 846 plotOptions: { 847 area: { 848 fillOpacity: 0.1, 849 connectNulls : true, 850 marker: { 851 enabled: false, 852 symbol: 'circle', 853 radius: 2, 854 states: { 855 hover: { 856 enabled: true 857 } 858 } 859 } 860 } 861 }, 862 credits: { 863 enabled: false 864 }, 865 series: [] 866 }; 867 868 if (graphEle != '') 869 { 870 871 var eleData = []; 872 var myelemin = 99999; 873 var myelemax = -99999; 874 875 for (i=0; i<valLen; i++) 876 { 877 if (graphDist[i] != null) 878 { 879 var _graphEle = graphEle[i]; 880 eleData.push([graphDist[i],_graphEle]); 881 if (_graphEle > myelemax) 882 myelemax = _graphEle; 883 if (_graphEle < myelemin) 884 myelemin = _graphEle; 885 } 886 } 887 888 var yaxe = { 889 title: { text: null }, 890 labels: { 891 align: 'left', 892 formatter: function() { 893 return Highcharts.numberFormat(this.value, l_y.dec,decPoint,thousandsSep) + l_y.suf; 894 } 895 } 896 } 897 898 if ( chartFrom1 != '' ) 899 { 900 yaxe.min = chartFrom1; 901 yaxe.startOnTick = false; 902 } 903 else { 904 yaxe.min = myelemin; 905 } 906 907 if ( chartTo1 != '' ) 908 { 909 yaxe.max = chartTo1; 910 yaxe.endOnTick = false; 911 } 912 else { 913 yaxe.max = myelemax; 914 } 915 916 hoptions.yAxis.push(yaxe); 917 hoptions.series.push({ 918 name: lng.altitude, 919 lineWidth: 1, 920 marker: { radius: 0 }, 921 data : eleData, 922 color: color2, 923 yAxis: hoptions.series.length 924 }); 925 926 l_y_arr.push(l_y); 927 } 928 929 if (graphSpeed != '') 930 { 931 932 if (unitspeed == '5') // knots 933 { 934 l_s = { suf : "knots", dec : 2 }; 935 } 936 else if (unitspeed == '4') // min/miles 937 { 938 l_s = { suf : "min/mi", dec : 2 }; 939 } 940 else if (unitspeed == '3') // min/km 941 { 942 l_s = { suf : "min/km", dec : 2 }; 943 } 944 else if (unitspeed == '2') // miles/h 945 { 946 l_s = { suf : "mi/h", dec : 0 }; 947 } 948 else if (unitspeed == '1') // km/h 949 { 950 l_s = { suf : "km/h", dec : 0 }; 951 } 952 else 953 { 954 l_s = { suf : "m/s", dec : 0 }; 955 } 956 957 var speedData = []; 958 959 for (i=0; i<valLen; i++) 960 { 961 if (graphDist[i] != null) 962 speedData.push([graphDist[i],graphSpeed[i]]); 963 } 964 965 var yaxe = { 966 title: { text: null }, 967 labels: { 968 //align: 'right', 969 formatter: function() { 970 return Highcharts.numberFormat(this.value, l_s.dec,decPoint,thousandsSep) + l_s.suf; 971 } 972 }, 973 opposite: true 974 } 975 976 if ( chartFrom2 != '' ) 977 { 978 yaxe.min = chartFrom2; 979 yaxe.startOnTick = false; 980 } 981 982 if ( chartTo2 != '' ) 983 { 984 yaxe.max = chartTo2; 985 yaxe.endOnTick = false; 986 } 987 988 hoptions.yAxis.push(yaxe); 989 hoptions.series.push({ 990 name: lng.speed, 991 lineWidth: 1, 992 marker: { radius: 0 }, 993 data : speedData, 994 color: color3, 995 yAxis: hoptions.series.length 996 }); 997 998 l_y_arr.push(l_s); 999 } 1000 1001 if (graphHr != '') 1002 { 1003 1004 var hrData = []; 1005 1006 for (i=0; i<valLen; i++) 1007 { 1008 if (graphDist[i] != null) 1009 { 1010 var c = graphHr[i]; 1011 if (c==0) 1012 c = null; 1013 hrData.push([graphDist[i],c]); 1014 } 1015 } 1016 1017 var yaxe = { 1018 title: { text: null }, 1019 labels: { 1020 //align: 'right', 1021 formatter: function() { 1022 return Highcharts.numberFormat(this.value, l_hr.dec,decPoint,thousandsSep) + l_hr.suf; 1023 } 1024 }, 1025 opposite: true 1026 } 1027 1028 hoptions.yAxis.push(yaxe); 1029 hoptions.series.push({ 1030 name: lng.heartRate, 1031 lineWidth: 1, 1032 marker: { radius: 0 }, 1033 data : hrData, 1034 color: color4, 1035 yAxis: hoptions.series.length 1036 }); 1037 1038 l_y_arr.push(l_hr); 1039 } 1040 1041 1042 if (graphAtemp != '') 1043 { 1044 1045 var atempData = []; 1046 1047 for (i=0; i<valLen; i++) 1048 { 1049 if (graphDist[i] != null) 1050 { 1051 var c = graphAtemp[i]; 1052 if (c==0) 1053 c = null; 1054 atempData.push([graphDist[i],c]); 1055 } 1056 } 1057 1058 var yaxe = { 1059 title: { text: null }, 1060 labels: { 1061 //align: 'right', 1062 formatter: function() { 1063 return Highcharts.numberFormat(this.value, 1, decPoint,thousandsSep) + " °C"; 1064 } 1065 }, 1066 opposite: true 1067 } 1068 1069 hoptions.yAxis.push(yaxe); 1070 hoptions.series.push({ 1071 name: lng.atemp, 1072 lineWidth: 1, 1073 marker: { radius: 0 }, 1074 data : atempData, 1075 color: color7, 1076 yAxis: hoptions.series.length 1077 }); 1078 1079 l_y_arr.push({ suf : "°C", dec : 1 }); 1080 } 1081 1082 1083 if (graphCad != '') 1084 { 1085 1086 var cadData = []; 1087 1088 for (i=0; i<valLen; i++) 1089 { 1090 if (graphDist[i] != null) 1091 { 1092 var c = graphCad[i];
1093 if (c==0) 1094 c = null; 1095 cadData.push([graphDist[i],c]); 1096 } 1097 } 1098 1099 var yaxe = { 1100 title: { text: null }, 1101 labels: { 1102 //align: 'right', 1103 formatter: function() { 1104 return Highcharts.numberFormat(this.value, l_cad.dec,decPoint,thousandsSep) + l_cad.suf; 1105 } 1106 }, 1107 opposite: true 1108 } 1109 1110 hoptions.yAxis.push(yaxe); 1111 hoptions.series.push({ 1112 name: lng.cadence, 1113 lineWidth: 1, 1114 marker: { radius: 0 }, 1115 data : cadData, 1116 color: color5, 1117 yAxis: hoptions.series.length 1118 }); 1119 1120 l_y_arr.push(l_cad); 1121 } 1122 1123 if (graphGrade != '') 1124 { 1125 1126 var cadData = []; 1127 1128 for (i=0; i<valLen; i++) 1129 { 1130 if (graphDist[i] != null) 1131 { 1132 var c = graphGrade[i]; 1133 if (c==0) 1134 c = null; 1135 cadData.push([graphDist[i],c]); 1136 } 1137 } 1138 1139 var yaxe = { 1140 title: { text: null }, 1141 labels: { 1142 //align: 'right', 1143 formatter: function() { 1144 return Highcharts.numberFormat(this.value, l_grade.dec,decPoint,thousandsSep) + l_grade.suf; 1145 } 1146 }, 1147 opposite: true 1148 } 1149 1150 hoptions.yAxis.push(yaxe); 1151 hoptions.series.push({ 1152 name: lng.grade, 1153 lineWidth: 1, 1154 marker: { radius: 0 }, 1155 data : cadData, 1156 color: color6, 1157 yAxis: hoptions.series.length 1158 }); 1159 1160 l_y_arr.push(l_grade); 1161 } 1162 1163 var hchart = new Highcharts.Chart(hoptions); 1164 1165 } 1166 else { 1167 jQuery("#hchart_" + params.targetId).css("display","none"); 1168 } 1169 1170 return this; 1171 }; 1172 1173 function addWayPoint(map, image, shadow, lat, lon, title, descr) 1174 { 1175 var p = new google.maps.LatLng(lat, lon); 1176 var m = new google.maps.Marker({ 1177 position: p, 1178 map: map, 1179 title: title, 1180 animation: google.maps.Animation.DROP, 1181 shadow: shadow, 1182 icon: image, 1183 zIndex: 5 1184 }); 1185 1186 google.maps.event.addListener(m, 'mouseover', function() { 1187 if (infowindow) 1188 { 1189 infowindow.close(); 1190 } 1191 var cnt = ''; 1192 if (title=='') 1193 { 1194 cnt = "<div style='text-align:center;'>" + unescape(descr) + "</div>"; 1195 } 1196 else 1197 { 1198 cnt = "<div style='font-size:0.8em; text-align:center;'><b>" + title + "</b><br />" + unescape(descr) + "</div>"; 1199 } 1200 infowindow = new google.maps.InfoWindow({ content: cnt}); 1201 infowindow.open(map,m); 1202 }); 1203 1204 google.maps.event.addListener(m, "mouseout", function () { 1205 if (infowindow) 1206 { 1207 infowindow.close(); 1208 } 1209 }); 1210 1211 } 1212 1213 function getItemFromArray(arr,index) 1214 { 1215 try 1216 { 1217 return arr[index]; 1218 } 1219 catch(e) 1220 { 1221 return [0,0]; 1222 } 1223 } 1224 1225 1226 function getClosestIndex(points,lat,lon) 1227 { 1228 var dd=10000; 1229 var ii=0; 1230 for (i=0; i < points.length; i++) 1231 { 1232 if (points[i]==null) 1233 continue; 1234 1235 var d = dist(points[i][0], points[i][1], lat, lon); 1236 if ( d < dd ) 1237 { 1238 ii = i; 1239 dd = d; 1240 } 1241 } 1242 return ii; 1243 } 1244 1245 function getClosestImage(lat,lon,targetId) 1246 { 1247 var dd=10000; 1248 var img; 1249 var divImages = document.getElementById("ngimages_"+targetId); 1250 var img_spans = divImages.getElementsByTagName("span"); 1251 for (var i = 0; i < img_spans.length; i++) { 1252 var imageLat = img_spans[i].getAttribute("lat"); 1253 var imageLon = img_spans[i].getAttribute("lon"); 1254 1255 imageLat = imageLat.replace(",", "."); 1256 imageLon = imageLon.replace(",", "."); 1257 1258 var d = dist(imageLat, imageLon, lat, lon); 1259 if ( d < dd ) 1260 { 1261 img = img_spans[i]; 1262 dd = d; 1263 } 1264 } 1265 return img; 1266 } 1267 1268 function isNumeric(input){ 1269 var RE = /^-{0,1}\d*\.{0,1}\d+$/; 1270 return (RE.test(input)); 1271 } 1272 1273 function dist(lat1,lon1,lat2,lon2) 1274 { 1275 // mathematically not correct but fast 1276 var dLat = (lat2-lat1); 1277 var dLon = (lon2-lon1); 1278 return Math.sqrt(dLat * dLat + dLon * dLon); 1279 } 1280 1281}( 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.