PageSourceSearch

https://www.sagenhafter-odenwald.de/wp-content/plugins/wp-gpx-maps/WP-GPX-Maps.js?ver=1.3.5

js sagenhafter-odenwald.de collected 2026-10-03 18:42:21 UTC 33,379 bytes, 1,281 lines download raw bytes

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.