/* TrackViewer API*** Copyright 2012, Helmut Karger* http://www.gpswandern.de**/
function TrackViewer () {var self = this;this.version = '2/0/1';this.url = '';this.mapDiv = '';this.mapType = 'hybrid';this.lineColor = ['#FF0000', '#0000FF', '#FF6000', '#FF1493', '#008000', '#8B008B', '#7FFF00', '#B22222', '#00FFFF', '#FFD700', '#8A2BE2'];this.overwriteGpxColor = false;this.lineArrows = true;this.scrollWheelZoom = true;this.eleLargeTabDiv = '';this.eleSmallTabDiv = '';this.eleProfDiv = '';this.eleProfWidth = 550;this.eleProfHeight = 170;this.eleProfRouteStyle = 'auto';this.eleProfXsections = 10;this.eleProfYsections = 5;this.eleProfMarginLeft = 50;this.eleProfMarginBottom = 20;this.eleProfMarginRight = 20;this.eleProfMarginTop = 20;this.eleProfAxisWidth = 2;this.eleProfAxisColor = '#000000';this.eleProfMarkerLength = 7;this.eleProfGridColor = "#eeeeee";this.eleDataUpDownThreshold = 5;this.cacheOff = false;this.local = new Object();
this.request = function() { $(document).ready(function() {if(window.userExit1) userExit1(self);self.backLink = aac(self);self.home = location.href;var aap = abn(self);delete aap.host;delete aap.data;delete aap.local;var aba = "http://tvapi.gpswandern.de/v/"+self.version+"/geturl.php?callback=?"+"&q="+encodeURIComponent(JSON.stringify(aap));$.getJSON(aba, function(abc) {self.host = abc.host;self.data = abc.data;if(window.userExit2) userExit2(self);if(self.host.status == '') {if(window.userExit3) userExit3(self);if(self.local.map) {self.aag();} else {self.initMap();}self.abb();self.abd();self.aah();self.aad();if(window.userExit4) userExit4(self);} else {fehlerAusgabe(self);}});});}
this.initMap = function() {if((!this.mapDiv) || ($("#"+this.mapDiv).length == 0)) return;var aak = new google.maps.ImageMapType({getTileUrl: function(abj, abq) {return "http://tile.openstreetmap.org/" +	abq + "/" + abj.x + "/" + abj.y + ".png";},tileSize: new google.maps.Size(256, 256),isPng: true,maxZoom: 18,name: "OSM",alt: "Open-Street-Map Karte anzeigen"});var aar = new google.maps.ImageMapType({getTileUrl: function(abj, abq) {return "http://c.tile.opencyclemap.org/cycle/" +	abq + "/" + abj.x + "/" + abj.y + ".png";},tileSize: new google.maps.Size(256, 256),isPng: true,maxZoom: 18,name: "OSM Cycle",alt: "OSM mit Radwegen anzeigen"});var aat = {zoom: 11,center: new google.maps.LatLng(48.1372283, 11.5755014),scaleControl: true,scrollwheel: this.scrollWheelZoom,mapTypeControlOptions: {mapTypeIds: [google.maps.MapTypeId.ROADMAP,google.maps.MapTypeId.SATELLITE,google.maps.MapTypeId.HYBRID,google.maps.MapTypeId.TERRAIN,'osm','osmc'],style: google.maps.MapTypeControlStyle.DEFAULT}};this.local.map = new google.maps.Map(document.getElementById(this.mapDiv),aat);this.local.map.mapTypes.set('osm', aak);this.local.map.mapTypes.set('osmc', aar);
if (this.local.map.getMapTypeId() != this.mapType) {self.local.map.setMapTypeId(self.mapType);}if (this.host) {this.local.map.fitBounds(new google.maps.LatLngBounds(new google.maps.LatLng(this.host.gpx.bounds.minlat,this.host.gpx.bounds.minlon),new google.maps.LatLng(this.host.gpx.bounds.maxlat,this.host.gpx.bounds.maxlon)));} else {this.local.map.fitBounds(new google.maps.LatLngBounds(new google.maps.LatLng(45.81, 6.04),new google.maps.LatLng(55.06, 17.14)));}var aaw = document.createElement("div");aaw.id = "osm-copyright";aaw.style.fontSize = "10px";aaw.style.lineHeight = "19px";aaw.style.fontFamily = "Arial, sans-serif";aaw.style.margin = "0 2px 0 2px";aaw.style.whiteSpace = "nowrap";this.local.map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(aaw);google.maps.event.addListener(this.local.map, 'maptypeid_changed', function() {aai(self);});
google.maps.event.addListenerOnce(this.local.map, 'idle', function () {setTimeout(function() {aai(self)},50);self.local.aax = new google.maps.OverlayView();self.local.aax.draw = function() {};self.local.aax.setMap(self.local.map);self.abg = function(abi) {var abr = self.local.aax.getProjection();return(abr.fromLatLngToContainerPixel(abi));}});
$("#"+this.mapDiv).css({position: "relative"});$("<div>", {id: "tooltip",css: {position: "absolute",backgroundImage: "url('http://tvapi.gpswandern.de/v/"+this.version+"/t70.png')",fontSize: "11px",fontFamily: "Arial, sans-serif",border: "1px solid red",padding: "1px 4px 1px 4px",display: "none"},html: ""}).prependTo("#"+this.mapDiv);}
this.aag = function() {if((!this.mapDiv) || ($("#"+this.mapDiv).length == 0)) return;if(self.local.aaf) self.local.aaf.close();this.local.map.fitBounds(new google.maps.LatLngBounds(new google.maps.LatLng(this.host.gpx.bounds.minlat,this.host.gpx.bounds.minlon),new google.maps.LatLng(this.host.gpx.bounds.maxlat,this.host.gpx.bounds.maxlon)));}
this.abb = function() {if((!this.mapDiv) || ($("#"+this.mapDiv).length == 0)) return;$.each(this.host.gpx.rte, function(abe, abz) {if(abz.gpx.length > 1 && abz.color !== '0') {var abs = new Array();$.each(abz.gpx, function(aan, abm) {abs.push(new google.maps.LatLng(abm.lat, abm.lon));});var abu = new google.maps.Polyline({path: abs,strokeColor: abz.color,strokeOpacity: 1.0,strokeWeight: 3,clickable: true,map: self.local.map});if(abz.name) {google.maps.event.addListener(abu, 'mouseover', function(abl) {aay(self, abl.latLng, abz.name);});}if (self.lineArrows) {aab(self, abe);}}});}
this.abd = function() {if((!this.mapDiv) || ($("#"+this.mapDiv).length == 0)) return;this.local.aaf = new google.maps.InfoWindow({maxWidth: 220});google.maps.event.addListener(self.local.map, 'click', function() {self.local.aaf.close();$("#tooltip").fadeOut(100);});$.each(this.host.gpx.poi, function(aan, abm) {var abh = new google.maps.Marker({position: new google.maps.LatLng(abm.lat, abm.lon),clickable: true,map: self.local.map});if(abm.name) {google.maps.event.addListener(abh, 'mouseover', function(abl) {aay(self, abl.latLng, abm.name);});google.maps.event.addListener(abh, 'click', function() { $("#tooltip").fadeOut(100);var abt = '<p id="infowindow" style="margin: 0; font: 14px arial, sans-serif; color: black; background-color: white;">';abt += "<b>" + abm.name + "</b>";if (abm.ele) {abt += "<br />H&ouml;he: " + abm.ele+"m"};if (abm.desc) {abt += "<br />" + abm.desc};if (abm.cmt) {abt += "<br />" + abm.cmt};abt += "</p>";self.local.aaf.setContent(abt);self.local.aaf.open(self.local.map, abh);});}});}
this.aah = function() {if (self.data) {if (self.eleLargeTabDiv && $("#"+self.eleLargeTabDiv).length != 0) { $("#"+self.eleLargeTabDiv).html(self.data.largeTab);}if (self.eleSmallTabDiv && $("#"+self.eleSmallTabDiv).length != 0) { $("#"+self.eleSmallTabDiv).html(self.data.smallTab);}}}
this.aad = function() {if (self.eleProfDiv && $("#"+self.eleProfDiv).length != 0) { $("#"+self.eleProfDiv).html('<img alt="" src="http://tvapi.gpswandern.de/v/'+self.version+'/loadimage.php?i='+self.host.pngFile+'"/>');}}}
function aai(abw) {abw.mapType = abw.local.map.getMapTypeId();aaw = document.getElementById("osm-copyright");switch (abw.mapType) {case "osm":$("#osm-copyright").html('&copy; <a target="_blank" href="http://www.openstreetmap.org/">OpenStreetMap</a> und Mitwirkende, <a target="_blank" href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>');break;case "osmc":$("#osm-copyright").html('&copy; <a target="_blank" href="http://www.opencyclemap.org">OpenCycleMap</a>, <a target="_blank" href="http://www.openstreetmap.org/">OpenStreetMap</a> und Mitwirkende, <a target="_blank" href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>');break;default: $("#osm-copyright").html('');}}
function aay(abw, abi, aca) {clearTimeout(abw.local.aam);var abg = abw.abg(abi);$("#tooltip").css({left: abg.x,top: abg.y,zIndex: 900}).text(aaj(aca)).fadeIn(200);abw.local.aam = setTimeout(function() { $("#tooltip").fadeOut(200);},2000);}
function aac(abw) {var abt = "<p style='margin:0; padding:0;'><b>Der Trackviewer wird bereitgestellt von "+"<a href='http://www.gpswandern.de'>www.gpswandern.de</a>.</b></p>"+"<p style='margin:0; padding: 8px 0 0 0; text-align:right; font-size:10px;'>"+"<a href='http://www.gpswandern.de/gpxviewer/nutzungsbedingungen.shtml#backlink'>"+"Diesen Hinweis entfernen.</a></p>";var abp = $('a').filter(function() {return /^http:\/\/www.gpswandern.de/i.test(this.href);});if (abp.length == 0) {setTimeout(function() {pos = getBestCopyDiv(abw);pos.parent.css({position: "relative"});$("<div>", {id: "tempo",html: "",css: {position: "absolute",zIndex: 1000,width: pos.width,backgroundImage: "url('http://tvapi.gpswandern.de/v/"+abw.version+"/t70.png')",fontSize: "12px",fontFamily: "Arial, sans-serif",border: "1px solid red",margin: "0px",padding: "24px 4px 3px 4px",right: pos.right,top: pos.top,display: "none"}}).prependTo(pos.parent);$("#tempo").html(abt).fadeIn(200).removeAttr("id");},3500);return "no_blink";}var abo = false;abp.each(function() {if (!$(this).attr("rel") || $(this).attr("rel") != "nofollow") {abo = true;return;}});if (!abo) {setTimeout(function() {pos = getBestCopyDiv(abw);pos.parent.css({position: "relative"});$("<div>", {id: "tempo",html: "",css: {position: "absolute",zIndex: 1000,width: pos.width,backgroundImage: "url('http://tvapi.gpswandern.de/v/"+abw.version+"/t70.png')",fontSize: "12px",fontFamily: "Arial, sans-serif",border: "1px solid red",margin: "0px",padding: "24px 4px 3px 4px",right: pos.right,top: pos.top,display: "none"}}).prependTo(pos.parent);$("#tempo").html(abt).fadeIn(200).removeAttr("id");},3500);return "nofollow";}return "blink_ok";}
function getBestCopyDiv(abw) {if(abw.mapDiv && $("#"+abw.mapDiv).length != 0) {pos = new Object({parent: $("#"+abw.mapDiv),right: 5,top: 5,width: "226px"});return pos;}if(abw.eleProfDiv && $("#"+abw.eleProfDiv).length != 0) {pos = new Object({parent: $("#"+abw.eleProfDiv),right: $("#"+abw.eleProfDiv).width() > 0 ? 0 : -abw.eleProfWidth,top: 0,width: "226px"});return pos;}pos = new Object({parent: $("body"),right: $("body").width()/2 - 117,top: 4,width: "226px"});return pos;}
function getBestErrorDiv(abw) {if(abw.mapDiv && $("#"+abw.mapDiv).length != 0) {pos = new Object({parent: $("#"+abw.mapDiv),left: 5,top: 5,width: "226px"});return pos;}if(abw.eleProfDiv && $("#"+abw.eleProfDiv).length != 0) {pos = new Object({parent: $("#"+abw.eleProfDiv),left: 0,top: 0,width: "226px"});return pos;}pos = new Object({parent: $("body"),left: $("body").width()/2 - 117,top: 100,width: "226px"});return pos;}
function fehlerAusgabe(abw, abv) {pos = getBestErrorDiv(abw);pos.parent.css({position: "relative"});if (abv) {var abt = "<p style='margin:0; padding:0;'>"+abv+"</p>";} else {var abt = "<p style='margin:0; padding:0;'>"+abw.host.status+"</p>";}$("<div>", {id: "error",html: "",css: {position: "absolute",zIndex: 1000,width: pos.width,overflow: "auto",backgroundImage: "url('http://tvapi.gpswandern.de/v/"+abw.version+"/t70.png')",fontSize: "12px",fontFamily: "Arial, sans-serif",border: "2px solid red",padding: "4px",left: pos.left,top: pos.top,display: "none"}}).prependTo(pos.parent);$("#error").html(abt).fadeIn(200);}
function aab(abw, abe) {var aal = abw.host.gpx.rte[abe].gpx;var aae = aal.length;var aaa = new Array();if (aae <= 1) return;if (aae > 1) aaa.push(0);if (aae > 2) aaa.push(aae-2);if (aae > 5) aaa.push(Math.floor((aae-1)/2));if (aae > 9) {aaa.push(Math.floor((aae-1)/4));aaa.push(Math.floor((aae-1)/4*3));}$.each(aaa, function(aao, abk) {var aby = aal[abk].lat + (aal[abk+1].lat - aal[abk].lat)*0.67;var abx = aal[abk].lon + (aal[abk+1].lon - aal[abk].lon)*0.67;
var aas = aal[abk].lat * Math.PI / 180;var aaz = aal[abk+1].lat * Math.PI / 180;var aav = aal[abk].lon * Math.PI / 180;var aau = aal[abk+1].lon * Math.PI / 180;var acb = Math.sin(aau- aav) * Math.cos(aaz);var acc = Math.cos(aas)*Math.sin(aaz) - Math.sin(aas)*Math.cos(aaz)*Math.cos(aau-aav);var aaq = Math.atan2(acb, acc);aaq = Math.round((aaq * 180 / Math.PI + 360) % 360);
new google.maps.Marker({position: new google.maps.LatLng(aby, abx),map: abw.local.map,icon: new google.maps.MarkerImage('http://tvapi.gpswandern.de/v/'+abw.version+'/pfeil.php?d='+aaq+'&c='+encodeURIComponent(abw.host.gpx.rte[abe].color),new google.maps.Size(21, 21),new google.maps.Point(0,0),new google.maps.Point(10, 10)),clickable: false});});}
function aaj(str){var tmp = str.replace(/(<.*['"])([^'"]*)(['"]>)/g,function(x, p1, p2, p3) { return  p1 + p3;});return tmp.replace(/<\/?[^>]+>/gi, '');}
function abn(abf) {if (abf instanceof Array) {return jQuery.extend(true, [], abf);} else {return jQuery.extend(true, {}, abf);}}
/****** JSON Implementierung **************************************************http://www.JSON.org/json2.js2010-11-17Public Domain.NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.*/
if (!this.JSON) {this.JSON = {};}
(function () {"use strict";
function f(n) {
return n < 10 ? '0' + n : n;}
if (typeof Date.prototype.toJSON !== 'function') {
Date.prototype.toJSON = function (key) {
return isFinite(this.valueOf()) ?this.getUTCFullYear() + '-' +f(this.getUTCMonth() + 1) + '-' +f(this.getUTCDate()) + 'T' +f(this.getUTCHours()) + ':' +f(this.getUTCMinutes()) + ':' +f(this.getUTCSeconds()) + 'Z' : null;};
String.prototype.toJSON =Number.prototype.toJSON =Boolean.prototype.toJSON = function (key) {return this.valueOf();};}
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta = {'\b': '\\b','\t': '\\t','\n': '\\n','\f': '\\f','\r': '\\r','"' : '\\"','\\': '\\\\'},rep;
function quote(string) {
escapable.lastIndex = 0;return escapable.test(string) ?'"' + string.replace(escapable, function (a) {var c = meta[a];return typeof c === 'string' ? c :'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);}) + '"' :'"' + string + '"';}
function str(key, holder) {
var i,k,v,length,mind = gap,partial,value = holder[key];
if (value && typeof value === 'object' &&typeof value.toJSON === 'function') {value = value.toJSON(key);}
if (typeof rep === 'function') {value = rep.call(holder, key, value);}
switch (typeof value) {case 'string':return quote(value);
case 'number':
return isFinite(value) ? String(value) : 'null';
case 'boolean':case 'null':
return String(value);
case 'object':
if (!value) {return 'null';}
gap += indent;partial = [];
if (Object.prototype.toString.apply(value) === '[object Array]') {
length = value.length;for (i = 0; i < length; i += 1) {partial[i] = str(i, value) || 'null';}
v = partial.length === 0 ? '[]' :gap ? '[\n' + gap +partial.join(',\n' + gap) + '\n' +mind + ']' :'[' + partial.join(',') + ']';gap = mind;return v;}
if (rep && typeof rep === 'object') {length = rep.length;for (i = 0; i < length; i += 1) {k = rep[i];if (typeof k === 'string') {v = str(k, value);if (v) {partial.push(quote(k) + (gap ? ': ' : ':') + v);}}}} else {
for (k in value) {if (Object.hasOwnProperty.call(value, k)) {v = str(k, value);if (v) {partial.push(quote(k) + (gap ? ': ' : ':') + v);}}}}
v = partial.length === 0 ? '{}' :gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +mind + '}' : '{' + partial.join(',') + '}';gap = mind;return v;}}
if (typeof JSON.stringify !== 'function') {JSON.stringify = function (value, replacer, space) {
var i;gap = '';indent = '';
if (typeof space === 'number') {for (i = 0; i < space; i += 1) {indent += ' ';}
} else if (typeof space === 'string') {indent = space;}
rep = replacer;if (replacer && typeof replacer !== 'function' &&(typeof replacer !== 'object' ||typeof replacer.length !== 'number')) {throw new Error('JSON.stringify');}
return str('', {'': value});};}
if (typeof JSON.parse !== 'function') {JSON.parse = function (text, reviver) {
var j;
function walk(holder, key) {
var k, v, value = holder[key];if (value && typeof value === 'object') {for (k in value) {if (Object.hasOwnProperty.call(value, k)) {v = walk(value, k);if (v !== undefined) {value[k] = v;} else {delete value[k];}}}}return reviver.call(holder, key, value);}
text = String(text);cx.lastIndex = 0;if (cx.test(text)) {text = text.replace(cx, function (a) {return '\\u' +('0000' + a.charCodeAt(0).toString(16)).slice(-4);});}
if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
j = eval('(' + text + ')');
return typeof reviver === 'function' ?walk({'': j}, '') : j;}
throw new SyntaxError('JSON.parse');};}}());
