    // Translation variables:
    //     var txt_Training_has_been_added_to_your_download_cart = '<%=locbu.getString("Training_has_been_added_to_your_download_cart")%>';
    //     var txt_You_must_be_logged_in_to_use_this_function = '<%=locbu.getString("You_must_be_logged_in_to_use_this_function")%>';


    var map = null;
    var mapTypeCM = null;
    var mapTypeMapnik = null;

    function createMarker(latitude, longitude, text, iconName) {
        var marker = new GMarker(new GLatLng(latitude, longitude), getIcon(iconName));
        if( text != null ) {
            GEvent.addListener(marker, "click", function() {
                marker.openInfoWindowHtml(text);
            });
        }
        return marker;
    }

     function createSportMarker(latitude, longitude, text, sport) {
        var marker = new GMarker(new GLatLng(latitude, longitude), getSportIcon(sport));
        GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(text);
        });
        return marker;
    }

    // public
    function putTrainingToCart(trainingID, userName)
    {
        if( userName == null || userName.length == 0 || userName == 'null' ) {
            alert(txt_You_must_be_logged_in_to_use_this_function);
            return;
        }

        var url = "/routePlanner/services/putItemToCart.jsp?r=" + Math.random() + "&itemType=trainingGPX&linkedObjectID=" + trainingID + "&userName=" + userName;
        GDownloadUrl(url, function(data, responseCode) {
              var xml = GXml.parse(data);
              var messages = xml.documentElement.getElementsByTagName("message");
              var message = messages[0].getAttribute("content");
              if( message.indexOf("Error:") >= 0 ) {
                alert(message);
              }
              else alert(txt_Training_has_been_added_to_your_download_cart);
        });
        
    }

    function writeCookie(name,value,expiresMin)
    {
            var a = new Date();
            a = new Date(a.getTime() + (expiresMin * 1000 * 60));
            document.cookie = name + '=' + value + '; expires=' + a.toGMTString() + ';';
    }

    function trim(s) { 
        while (s.substring(0,1) == ' ') {
            s = s.substring(1,s.length);
        }
        while (s.substring(s.length-1,s.length) == ' ') {
            s = s.substring(0,s.length-1);
        }
        return s;
    }

    function readCookie(n)
    {
        a = document.cookie;
        res = '';
        while(a != '')
        {
            cookiename = trim(a.substring(0,a.search('=')));
            var p = a.search(';');
            if( p > 0 ) 
                cookiewert = trim(a.substring(a.search('=')+1, p));
            else
                cookiewert = trim(a.substring(a.search('=')+1, a.length));
            if(n == cookiename)
                res = cookiewert;

            i = a.search(';')+1;
            if(i == 0){i = a.length}
            a = a.substring(i,a.length);
        }
        return(res)
    }
    
    function getGMapTypeFromShortName(sn) {
        if( mapTypeCM != null && mapTypeCM.getName(true) == sn ) return mapTypeCM;
        if( mapTypeMapnik != null && mapTypeMapnik.getName(true) == sn ) return mapTypeMapnik;
        if( G_NORMAL_MAP.getName(true) == sn ) return G_NORMAL_MAP;
        if( G_SATELLITE_MAP.getName(true) == sn ) return G_SATELLITE_MAP;
        if( G_HYBRID_MAP.getName(true) == sn ) return G_HYBRID_MAP;
        if( G_PHYSICAL_MAP.getName(true) == sn ) return G_PHYSICAL_MAP;
        if( G_SATELLITE_3D_MAP.getName(true) == sn ) return G_SATELLITE_3D_MAP;
        return G_SATELLITE_MAP;
    }

    function load(centerLatitude, centerLongitude, minLatitude, maxLatitude, minLongitude, maxLongitude, 
                encodedPoints, encodedLevels, trackColor) {
        if (GBrowserIsCompatible()) {
            createIcons();
            map = new GMap2(document.getElementById("map"));
            map.addMapType(G_PHYSICAL_MAP);
            map.addMapType(G_SATELLITE_3D_MAP);
            map.addControl(new GLargeMapControl());
            var bounds = new GLatLngBounds(new GLatLng(minLatitude, minLongitude),
                new GLatLng(maxLatitude, maxLongitude));
            var zoom = map.getBoundsZoomLevel(bounds);
            map.enableDoubleClickZoom();
            map.enableContinuousZoom();
            map.enableScrollWheelZoom();
            map.setCenter(new GLatLng(centerLatitude, centerLongitude), zoom);
            
            var copyOSM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>");  
            copyOSM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));  
            var tilesMapnik = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png'});  
            mapTypeMapnik = new GMapType([tilesMapnik], G_NORMAL_MAP.getProjection(), "OSM", {alt: 'OpenStreetMap'});  
            map.addMapType(mapTypeMapnik); 

            var copyCM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a> <a href=\"http://www.opencyclemap.org\">Cycle Map</a>");
            copyCM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));  
            var tilesCM = new GTileLayer(copyCM, 1, 17, {tileUrlTemplate: 'http://andy.sandbox.cloudmade.com/tiles/cycle{Z}/{X}/{Y}.png'});
            mapTypeCM = new GMapType([tilesCM], G_NORMAL_MAP.getProjection(), "Cycle", {alt: 'OpenStreetMap Cycle Map'});  
            map.addMapType(mapTypeCM); 

            map.setMapType(getGMapTypeFromShortName(readCookie("mapTypeTrainings")));
            var encodedPolyline = new GPolyline.fromEncoded({
                color: trackColor,
                weight: 5,
		points: encodedPoints, 
		levels: encodedLevels,
                zoomFactor: 32,
                numLevels: 4 
            });
            
            map.addOverlay(encodedPolyline);       
            loadMarkers(map);
            
            GEvent.addListener(map, "maptypechanged", function() {
                writeCookie("mapTypeTrainings", "" + map.getCurrentMapType().getName(true), 300);
            });
           GEvent.addListener(map, "dragend", function() {
               reloadTracks(map);
           });

           GEvent.addListener(map, "zoomend", function() {
               reloadTracks(map);
           });

           reloadTracks(map);
        }
    }
    
    function loadPhotoPage(centerLatitude, centerLongitude, minLatitude, maxLatitude, minLongitude, maxLongitude, 
                encodedPoints, encodedLevels, trackColor) {
        if (GBrowserIsCompatible()) {
            createIcons();
            map = new GMap2(document.getElementById("map"));
            map.addMapType(G_PHYSICAL_MAP);
            map.addControl(new GSmallMapControl());
            map.enableDoubleClickZoom();
            map.enableContinuousZoom();
            map.enableScrollWheelZoom();
            map.setCenter(new GLatLng(centerLatitude, centerLongitude), 13);
            
            var copyOSM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>");  
            copyOSM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));  
            var tilesMapnik = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png'});  
            mapTypeMapnik = new GMapType([tilesMapnik], G_NORMAL_MAP.getProjection(), "OSM", {alt: 'OpenStreetMap'});  
            map.addMapType(mapTypeMapnik); 

            var copyCM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a> <a href=\"http://www.opencyclemap.org\">Cycle Map</a>");
            copyCM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));  
            var tilesCM = new GTileLayer(copyCM, 1, 17, {tileUrlTemplate: 'http://andy.sandbox.cloudmade.com/tiles/cycle/{Z}/{X}/{Y}.png'});
            mapTypeCM = new GMapType([tilesCM], G_NORMAL_MAP.getProjection(), "Cycle", {alt: 'OpenStreetMap Cycle Map'});  
            map.addMapType(mapTypeCM); 

            map.setMapType(getGMapTypeFromShortName(readCookie("mapTypeTrainings")));
            
            var encodedPolyline = new GPolyline.fromEncoded({
                color: trackColor,
                weight: 5,
		points: encodedPoints, 
		levels: encodedLevels,
                zoomFactor: 32,
                numLevels: 4 
            });
            map.addOverlay(encodedPolyline);       
            loadMarkers(map);
            
            GEvent.addListener(map, "maptypechanged", function() {
                writeCookie("mapTypeTrainings", "" + map.getCurrentMapType().getName(true), 300);
            });

           GEvent.addListener(map, "dragend", function() {
               reloadTracks(map);
           });

           GEvent.addListener(map, "zoomend", function() {
               reloadTracks(map);
           });

           reloadTracks(map);
        }
    }
    
    function loadPhotoPage2(centerLatitude, centerLongitude, minLatitude, maxLatitude, minLongitude, maxLongitude, 
                encodedPoints, encodedLevels, trackColor) {
        if (GBrowserIsCompatible()) {
            createIcons();
            map = new GMap2(document.getElementById("map"));
            map.addMapType(G_PHYSICAL_MAP);
            map.addControl(new GSmallMapControl());
            var bounds = new GLatLngBounds(new GLatLng(minLatitude, minLongitude),
                new GLatLng(maxLatitude, maxLongitude));
            var zoom = map.getBoundsZoomLevel(bounds);
            map.enableDoubleClickZoom();
            map.enableContinuousZoom();
            map.enableScrollWheelZoom();
            map.setCenter(new GLatLng(centerLatitude, centerLongitude), zoom);
            
            var copyOSM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a>");  
            copyOSM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));  
            var tilesMapnik = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png'});  
            mapTypeMapnik = new GMapType([tilesMapnik], G_NORMAL_MAP.getProjection(), "OSM", {alt: 'OpenStreetMap'});  
            map.addMapType(mapTypeMapnik); 

            var copyCM = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a> <a href=\"http://www.opencyclemap.org\">Cycle Map</a>");
            copyCM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " "));  
            var tilesCM = new GTileLayer(copyCM, 1, 17, {tileUrlTemplate: 'http://andy.sandbox.cloudmade.com/tiles/cycle/{Z}/{X}/{Y}.png'});
            mapTypeCM = new GMapType([tilesCM], G_NORMAL_MAP.getProjection(), "Cycle", {alt: 'OpenStreetMap Cycle Map'});  
            map.addMapType(mapTypeCM); 

            map.setMapType(getGMapTypeFromShortName(readCookie("mapTypeTrainings")));
            
            var encodedPolyline = new GPolyline.fromEncoded({
                color: trackColor,
                weight: 5,
		points: encodedPoints, 
		levels: encodedLevels,
                zoomFactor: 32,
                numLevels: 4 
            });
            map.addOverlay(encodedPolyline);       
            loadMarkers(map);
            
            GEvent.addListener(map, "maptypechanged", function() {
                writeCookie("mapTypeTrainings", "" + map.getCurrentMapType().getName(true), 300);
            });

           GEvent.addListener(map, "dragend", function() {
               reloadTracks(map);
           });

           GEvent.addListener(map, "zoomend", function() {
               reloadTracks(map);
           });

           reloadTracks(map);
        }
        
    }
    
