﻿


Route.prototype.m_updateMarker = function(p_travelled, p_length, p_yaw)
{
    
    var l_isMoving = true;
    if (p_travelled == gen.m_routeTime)
    {
        l_isMoving = false;
    }
    
    // don't update while dragging or when overlays are hidden
    if (gen.m_dragging || !gen.m_overlaysOn)
    {
        return;
    }
    
    gen.m_routeTime = p_travelled;

    if (this.m_segmentList == null)
    {
        this.m_initSegments();
    }
    
    if (!streetMarker)
    {
        // create new marker
        var l_icon = new GIcon();
        l_icon.image = "mk/panda-0.png";
        l_icon.iconSize = new GSize(49,52);

        l_icon.printImage = l_icon.image;
        l_icon.mozPrintImage = l_icon.image;
        l_icon.iconAnchor =  new GPoint(25,36);
        l_icon.infoWindowAnchor = new GPoint(25,6);        
        
        streetMarker = new GMarker(this.m_startPoint, {"icon":l_icon, "draggable":true});
        map.addOverlay(streetMarker);
            
        // draggable listener for gmap marker
        GEvent.addListener(streetMarker, "dragstart", function()
           {     
            PauseVideo();
            map.closeInfoWindow();
            gen.m_dragging = true;
           }
        ); 
                     
        // draggable listener for gmap marker
        GEvent.addListener(streetMarker, "dragend", function()
           {            
                gen.m_dragging = false;

                markerDragAndDrop();
           }
        );
    
    }
    else
    {
        if (p_travelled == 0)
        {
            streetMarker.setLatLng(this.m_startPoint);
        }
    }
    
    // Using marker time values    
    var l_segment = null;
    var l_newPoint = null;
    var l_facing = 0;

    
    if (l_isMoving)
    {
        if (!this.m_syncChecked)
        {
            this.m_syncSegments();
        }
    
    
        // first find current segment
        var i=0;
        var found = false; 
        while (i<this.m_segmentList.length && !found)
        {
            var l_endPoint = this.m_segmentList[i].m_endPoint;
            
            if (l_endPoint.time > p_travelled)
            {
                found = true;
            }    
            else
            {
                i++;
            }
        }     
        l_segment = this.m_segmentList[i];
        
        // now find point within the segment
        if (l_segment)
        {
            gen.m_currentSegment = l_segment;
        
            var l_segmentTotalDuration = l_segment.m_endPoint.time - l_segment.m_startPoint.time;
            var l_segmentCurrentTime = p_travelled - l_segment.m_startPoint.time;
            
            var l_segmentFraction = 0;
            
            if (l_segmentTotalDuration >= 1)
            {
                l_segmentFraction  = 1 - (l_segmentTotalDuration - l_segmentCurrentTime) / l_segmentTotalDuration;
            }
            
            var x = l_segment.m_startPoint.lng() * (1 - l_segmentFraction) + l_segment.m_endPoint.lng() * l_segmentFraction;
            var y = l_segment.m_startPoint.lat() * (1 - l_segmentFraction) + l_segment.m_endPoint.lat() * l_segmentFraction;

            l_newPoint = new GLatLng(y,x);   
            streetMarker.setPoint(l_newPoint);

            var l_bounds = map.getBounds();
            var l_southWest = l_bounds.getSouthWest();
            
            var l_swPixel = map.getCurrentMapType().getProjection().fromLatLngToPixel(l_southWest, map.getZoom());
            var l_markerPixel = map.getCurrentMapType().getProjection().fromLatLngToPixel(l_newPoint, map.getZoom());
            
            var x = l_markerPixel.x - l_swPixel.x;
            var y = l_swPixel.y - l_markerPixel.y;
            
            // re-centre when marker enters a 25px margin at map edge
            if (x < 25 || x > 495 || y < 25 || y > 335)
            {
                map.setCenter(l_newPoint);  
            }
        }        
        
    }

    // update marker image

    if (gen.m_currentSegment)
    {
        var l_yaw = (90 - p_yaw) - 180;    // adjust yaw ... (0=left  -90 = forward -180/180 = right 90 = behind)
        
        l_facing = gen.m_currentSegment.m_bearing  + l_yaw;
        
        if (l_facing > 360)
        {
            l_facing -= 360;
        }
        if (l_facing < 0)
        {
            l_facing += 360;
        }
        
        var n = Math.round(l_facing / 22.5) % 16;
        var l_imageUrl = "mk/panda-" + n + ".png";        
        
        streetMarker.setImage(l_imageUrl);
        
        /*eID("diagDiv").innerHTML =  
            // Facing: 
            l_facing + "&deg;";*/
        
    }
}

Route.prototype.m_getBearing = function(p1, p2)
{
    var angle = null;
    if (p1 != null && p2 != null && !p1.equals(p2))
    {
        var y1 = p1.latRadians();
        var x1 = p1.lngRadians();
        var y2 = p2.latRadians();
        var x2 = p2.lngRadians();
        
        var a = Math.sin(x1-x2) * Math.cos(y2);
        var b = Math.cos(y1)*Math.sin(y2) - Math.sin(y1)*Math.cos(y2)*Math.cos(x1-x2);
        
        angle = -(Math.atan2(a,b));
        if (angle < 0.0)
        {
            angle += Math.PI*2.0;
        }        
    }
    return parseInt(angle * 180.0 / Math.PI);
}


function markerDragAndDrop()
{
    // stage 1
    // find nearest route
    var latlng = streetMarker.getPoint();

    var l_bestRoute = null;
    var l_minDistance = 1000000;
    
    for (var i=0; i<gen.m_visibleRoutes.length; i++)
    {
        var l_route = gen.m_visibleRoutes[i];
        for (var j=0; j<l_route.m_points.length; j++)
        {
            var l_point = l_route.m_points[j];
            var l_distance = latlng.distanceFrom(l_point);
            if (l_distance < l_minDistance)
            {
                l_bestRoute = l_route;
                l_minDistance = l_distance;
            }
        }
    }

                
    if (l_bestRoute)
    {
        // found the nearest route ...
        routeClick(l_bestRoute.m_routeID);
        
        // centre at the route start
        var l_newpt = l_bestRoute.m_points[0];
        map.setCenter(l_newpt);
    }

/*
    // var l_markerPoint = streetMarker.getPoint();

    // stage 2
    // find closest point route 
       
    var l_lowestDistance = null;
    var l_closestPoint = null;
    var l_closestPointIndex = null;
    for (var i=0; i<gen.m_currentRoute.m_points.length; i++)
    {
        var l_point = gen.m_currentRoute.m_points[i];
        var l_distance = latlng.distanceFrom(l_point);
        
        if (!l_lowestDistance || l_distance < l_lowestDistance)
        {
            l_lowestDistance = l_distance;
            l_closestPoint = l_point;
            
            l_closestPointIndex = i;
        }
        
    }

    // get total video duration
    initialize();    
    var l_panStatus = flashPanoramaPlayer.get_status();        
    var l_videoDuration = l_panStatus[0];
    
    
    var l_travelDistance = 0;
    if (l_closestPointIndex != null)
    {
        for (var i=0; i<l_closestPointIndex; i++)
        {
            var l_segment = gen.m_currentRoute.m_segmentList[i];
            
            l_travelDistance += l_segment.m_distance;
        }    
        
        var l_fraction = 0;
        if (gen.m_currentRoute.m_distance)
        {
            l_fraction = l_travelDistance / gen.m_currentRoute.m_distance;
        }
    
    }
    
    // set video position
    var l_time = Math.round(l_fraction * l_videoDuration);     
    flashPanoramaPlayer.set_videopos(l_time); 
    
    // set map location (current segment start)
     
*/
}


function autoCentreClick(a)
{
    gen.m_autoCentre = a.checked;
}






    // map click listener - find and display nearest route
    /* GEvent.addListener(map, "click", function(overlay, latlng) 
    {
        if (!gen.m_gridOn && !overlay)
        {
            var l_bestRoute = null;
            var l_minDistance = 1000000;
            
            for (var i=0; i<gen.m_visibleRoutes.length; i++)
            {
                var l_route = gen.m_visibleRoutes[i];
                for (var j=0; j<l_route.m_points.length; j++)
                {
                    var l_point = l_route.m_points[j];
                    var l_distance = latlng.distanceFrom(l_point);
                    if (l_distance < l_minDistance)
                    {
                        l_bestRoute = l_route;
                        l_minDistance = l_distance;
                    }
                }
            }

            /// 
        }
    });   */  

