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

var map = null;
var mapTypeCM = null;
var mapTypeMapnik = null;
var points = [];
var routeID = -1;
var trackPointMarkers = [];
var route = null; // route GPolyline
var baseTrackPolyline = null;
var routeLength = 0.0; // m
var isReadOnly = true;

// *********************************************************************
// Icons
// *********************************************************************

//var icons = new Object();

// *********************************************************************
// Haversine    
// *********************************************************************

var EARTH_RADIUS = 6371007.0;

function deg2Rad(deg) {
    return deg / 180.0 * Math.PI;
}
    
// Haversine
function calculateDistance(lat1, lon1, lat2, lon2) {
    lat1 = deg2Rad(lat1);
    lon1 = deg2Rad(lon1);
    lat2 = deg2Rad(lat2);
    lon2 = deg2Rad(lon2);
        
    var dLat = lat2 - lat1;
    var dLong = lon2 - lon1;
    if (dLat == 0 && dLong == 0) return 0.0;
        
    var slat = Math.sin(dLat / 2);
    var slong = Math.sin(dLong / 2);
    var a = slat * slat + Math.cos(lat1) * Math.cos(lat2) * slong * slong;
    var c = 2 * Math.asin(Math.min(1, Math.sqrt(a)));
    return EARTH_RADIUS * c;
}
    



// *********************************************************************
// Main
// *********************************************************************
    


function getMinZoom(index)
{
    var minZoom = TRACK_PT_MIN_ZOOM;
    if( index == 0 || index == points.length - 1 ) minZoom = START_END_PT_MIN_ZOOM;
    return minZoom;
}


// public
function showFullRoute()
{
    if( points.length == 0 ) return;

    var minLat = 90.0;
    var maxLat = -90.0;
    var minLng = 180.0;
    var maxLng = -180.0;

    for (var i = 0; i < points.length; i++)
    {
        var p = points[i];
        var lat = p.lat();
        var lng = p.lng();
        if( (typeof lat) == 'number' && (typeof lng) == 'number' ) {
            if( p.lat() > maxLat ) maxLat = p.lat();
            if( p.lat() < minLat ) minLat = p.lat();
            if( p.lng() > maxLng ) maxLng = p.lng();
            if( p.lng() < minLng ) minLng = p.lng();
        }
    }

    var centerLat = ( maxLat + minLat ) / 2;
    var centerLng = ( maxLng + minLng ) / 2;

    var bounds = new GLatLngBounds(new GLatLng(minLat, minLng),
        new GLatLng(maxLat, maxLng));
    var zoom = map.getBoundsZoomLevel(bounds);
    map.setCenter(new GLatLng(centerLat, centerLng), zoom);
}





function formatDistance(distance)
{
    distance = distance / 1000.0;
    distance = Math.round(distance * 100.0) / 100.0;
    return distance.toString();
}

// public
function putRouteToCart(routeID, 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/putRouteToCart.jsp?r=" + Math.random() + "&routeID=" + routeID + "&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_Route_has_been_added_to_your_download_cart);
    });
        
}

// 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 computeRouteLength() {
    var routeLength = 0.0;

    for (var i = 0; i < points.length - 1; i++)
    {
        routeLength += computeSegmentLength(points[i], points[i + 1]);
    }

    return routeLength;
}

function computeSegmentLength(p1, p2) {
    if( p1 == null || p2 == null ) return 0.0;
    return calculateDistance(p1.lat(), p1.lng(), p2.lat(), p2.lng());
}
    
function updateRouteInfo(recompute)
{
    var infoText = "" + points.length + " points";
    if( recompute )
        routeLength = computeRouteLength();
    infoText += ", " + formatDistance(routeLength) + " km";
    infoText += ", " + formatDistance(routeLength / 1.61) + " mi";
    var riDiv = document.getElementById("routeInfo");
    if( riDiv != null ) riDiv.innerHTML = infoText;
}


function openRouteDo(selRouteID) {
    points = [];
    if( route != null ) map.removeOverlay(route);

    var url = "/routePlanner/dlServices/gpx.jsp?r=" + Math.random() + "&routeID=" + selRouteID;
    GDownloadUrl(url, function(data, responseCode) {
        var xml = GXml.parse(data);
              
        var trkpts = xml.documentElement.getElementsByTagName("trkpt");
        for( var i = 0; i < trkpts.length; i++ ) {
            var trkptNode = trkpts[i];
            var lng = parseFloat(trkptNode.getAttribute("lon"));
            var lat = parseFloat(trkptNode.getAttribute("lat"));
            points.push(new GLatLng(lat, lng));
        }
        route = new GPolyline(points);
        map.addOverlay(route);
        var startMarker = createTrackPointMarker(0);
        map.addOverlay(startMarker);
        var endMarker = createTrackPointMarker(points.length - 1);
        map.addOverlay(endMarker);
              
        routeID = selRouteID;
        showFullRoute();
        //updateRouteInfo(true);
        reloadTracks(map);
    });
}

function createTrackPointMarker(i) {
    var type = "middle";
    if( i == 0 ) type = "start";
    if( i == points.length - 1 ) type = "stop";
    var marker = new GMarker(points[i], {
        icon: getIcon(type),
        draggable: false
    } );
    return marker;
}
        
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_PHYSICAL_MAP;
}


// *********************************************************************
// Placemarks
// *********************************************************************

// public
function putPlacemarkToCart(placemarkID)
{
    if( userName == null || userName.length == 0 || userName == 'null' ) {
        alert(rptxt_5);
        return;
    }

    var url = "/routePlanner/services/putItemToCart.jsp?r=" + Math.random() + "&linkedObjectID=" + placemarkID + "&userName=" + userName + "&itemType=placemark";
    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(rptxt_33);
    });

}

function updatePlacemarksPhotosVideos()
{
    var bounds = map.getBounds();
    var minLat = bounds.getSouthWest().lat();
    var maxLat = bounds.getNorthEast().lat();
    var minLng = bounds.getSouthWest().lng();
    var maxLng = bounds.getNorthEast().lng();

    var url = "/services/findPlacemarksPhotosVideosByArea.jsp?r=" + Math.random() +
    "&minLat=" + minLat +
    "&maxLat=" + maxLat +
    "&minLng=" + minLng +
    "&maxLng=" + maxLng;
    //alert(url);
    GDownloadUrl(url, function(data, responseCode) {

        for(;;) {

            if( data == null || data.length == 0 ) break;
            var line = "";

            var p = data.indexOf("\n");
            if( p < 0 )
                p = data.indexOf("\r");
            if( p >= 0 ) {
                line = data.substring(0, p);
                data = data.substring(p + 1);
            }
            else {
                line = data;
                data = "";
            }

            line = trim(line);
            if( line.length == 0 ) continue;

            var f = line.split("|");
            if( f.length < 9 ) continue;

            var type = f[0];
            if( type == "W" )
                map.addOverlay(createPlacemarkMarker(f));
            if( type == "P" )
                map.addOverlay(createPhotoMarker(f));
            if( type == "V" )
                map.addOverlay(createVideoMarker(f));
        }
    });
}

function createPlacemarkMarker(f) {
    var placemarkSubType = f[1];
    var lat = f[2];
    var lng = f[3];
    var placemarkID = f[4];
    var title = f[5];
    var ownerName = f[6];
    var url = f[7];
    var description = f[8];

    var isOwner = (ownerName == userName);

    var point = new GLatLng(lat, lng);
    var pmMarker = new GMarker(point, getIcon("wp_" + placemarkSubType) );

    var text = "<b>" + title + "</b><br/>" + description + "<br/>";
    if( url != null && url.length != 0 ) {
        text += "<a target=\"_blank\" href=\"" + url + "\">" + url + "</a><br/>";
    }
    text += "<br/>";
    if( userName != null && userName.length > 0 && userName != 'null' && userName != 'anonymous' )
    {
        text +=
        "<a href=\"javascript:putPlacemarkToCart(" + placemarkID + ");\">" + rptxt_34 + "</a><br/>";
    }
    text +=
    "<a href=\"/routePlanner/dlServices/placemarkGPX.jsp?placemarkID=" + placemarkID + "\">" + rptxt_39 + "</a><br/>";
    text +=
    "<a href=\"/routePlanner/dlServices/placemarkKML.jsp?placemarkID=" + placemarkID + "\">" + rptxt_40 + "</a><br/>";
    GEvent.addListener(pmMarker, "click", function() {
        pmMarker.openInfoWindowHtml(text);
    });
    return pmMarker;
}

function createPhotoMarker(f) {

    var lat = f[1];
    var lng = f[2];
    var point = new GLatLng(lat, lng);
    var trainingID = f[3];
    var trainingObjectID = f[4];
    var userName = f[5];
    var trainingMonthDir = f[6];
    var trainingDir = f[7];
    var index = f[8];

    var marker = new GMarker(point, getIcon("photo_small"));

    var image = "/home/" + userName + "/" + trainingMonthDir + "/" +
    trainingDir + "/thumb_" + index + ".jpg";

    var text = "<table height=80><tr><td width=80 height=80>" +
    "<a href='#' onclick='openViewer(" + trainingObjectID + ", false);return false;'>" +
    "<img src='" + image + "'/></a></td>" +
    "<td>" +
    "<a href='#' onclick='openViewer(" + trainingObjectID + ", false);return false;'>" +
    rptxt_42 +  "</a><br/>" +
    "<a href='/detail.jsp?trainingID=" + trainingID + "'>" +
    rptxt_43 + "</a>";
    "</td></tr></table>";
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(text);
    });
    return marker;
}

function createVideoMarker(f) {
    var lat = f[1];
    var lng = f[2];
    var point = new GLatLng(lat, lng);

    var marker = new GMarker(point, getIcon("video"));

    var trainingID = f[3];
    var trainingObjectID = f[4];
    var userName = f[5];
    var trainingMonthDir = f[6];
    var trainingDir = f[7];
    var index = f[8];

    var file = "/home/" + userName + "/" + trainingMonthDir + "/" +
    trainingDir + "/_video_" + index + ".flv";

    var text =
    "<br/><embed  src='/scripts/mediaplayer/mediaplayer.swf'   " +
    "width='240'  height='200'  " +
    "allowscriptaccess='always'  allowfullscreen='true' wmode='transparent' " +
    "flashvars='wmode=transparent&file=" + file + "&backcolor=0xFFFFFF&autostart=true\'" +
    "/><br/>" +
    "<a href='#' onclick='openViewer(" + trainingObjectID + ", false);return false;'>" +
    rptxt_42 + "</a>" +
    "<img src='/images/spacer.gif' width='34' height='10'/>" +
    "<a href='/detail.jsp?trainingID=" + trainingID + "'>" +
    rptxt_43 + "</a>";
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(text);
    });
    return marker;
}

function updateRoutePhotos(routeID)
{
    if( routeID <= 0 ) return;   // delete placemarks?

    var url = "/routePlanner/services/findRoutePhotos.jsp?r=" + Math.random() +
        "&routeID=" + routeID;
    GDownloadUrl(url, function(data, responseCode) {

        for(;;) {

            if( data == null || data.length == 0 ) break;
            var line = "";

            var p = data.indexOf("\n");
            if( p < 0 )
                p = data.indexOf("\r");
            if( p >= 0 ) {
                line = data.substring(0, p);
                data = data.substring(p + 1);
            }
            else {
                line = data;
                data = "";
            }

            line = trim(line);
            if( line.length == 0 ) continue;

            var f = line.split("|");
            if( f.length < 8 ) continue;

            map.addOverlay(createRoutePhotoMarker(f, routeID));
        }
    });
}

function createRoutePhotoMarker(f, routeID) {
    var placemarkSubType = f[0];
    var lat = f[1];
    var lng = f[2];
    var placemarkID = f[3];
    var title = f[4];
    var ownerName = f[5];
    var url = f[6];
    var description = f[7];

    var isOwner = (ownerName == userName);

    var point = new GLatLng(lat, lng);
    var pmMarker = new GMarker(point, getIcon("photo_route") );

    var imgURL = "/home/" + ownerName + "/routeImgs" + routeID + "/thumb_" + placemarkID + ".jpg";
    var imgURL_m = "/home/" + ownerName + "/routeImgs" + routeID + "/medium_" + placemarkID + ".jpg";
    var text = "<table width='100%'><tr><td><img src='/images/spacer.gif' width='5' height='80'/></td><td align='center'>" +
        "<a href='#' onclick='openRoutePhotoViewer(" + placemarkID + ")'><img src='" + imgURL + "'/></a></td></tr></table><br/>";
    text += "<center><b>" + title + "</b></center><br/>";
    if( url != null && url.length != 0 ) {
        text += "<center><a href=\"#\" onclick=\"openRoutePhotoViewer(placemarkID)\">" + url + "</a></center><br/>";
    }
    GEvent.addListener(pmMarker, "click", function() {
        pmMarker.openInfoWindowHtml(text);
    });
    return pmMarker;
}



function openViewer(trainingObjectID, startShow) {
    var startShowParam = "";
    if(startShow) startShowParam = "&startShow=true";
    Dialog.info(
        "<a onclick='Dialog.closeInfo();return false;' href='#'>" +
        "<img class='rightFloatingImage' width='50' height='100' src='/images/close.png'/>" +
        "</a>" +
        "<table border='0' cellpadding='0' cellspacing='0'><tr><td valign='top' width='884'>" +
        "<img src='/images/spacer.gif' alt='" + rptxt_41 + "' title='" + rptxt_41 + "'  width='884' height='1'/><br/>" +
        "<iframe marginheight='0' marginwidth='0' frameborder='0' width='890' height='630' src='/viewer.jsp?trainingObjectID=" + trainingObjectID + startShowParam + "&allowRotate=false'/>" +
        "</td></tr></table>",
        {
            className: "alphacube",
            width:964
        });
}


// public
function load(routeID) {

    createIcons();

    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"), {
            draggableCursor: 'crosshair',
            draggingCursor: 'pointer'
        });
        map.addMapType(G_PHYSICAL_MAP);
        map.addMapType(G_SATELLITE_3D_MAP);
        map.setCenter(new GLatLng(40.77, -73.97), 16);
        map.addControl(new GLargeMapControl());
        map.addControl(new GScaleControl());
        map.enableContinuousZoom();
        map.enableScrollWheelZoom();

        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("mapTypeRoutes")));

        isReadOnly = true;
            
        if( routeID != -1 ) {
            openRouteDo(routeID);
            updateRoutePhotos(routeID);
        }

        GEvent.addListener(map, "maptypechanged", function() {
            writeCookie("mapTypeRoutes", "" + map.getCurrentMapType().getName(true), 300);
        });

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

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

    }
}
    
