﻿var _currentTraffic = null;
var TrafficLocations = Class.create();
TrafficLocations.prototype = {
    _CENTER:0,
    _SEGMENTS:1,
    
    initialize : function(map)
    {
        _currentTraffic = this;
        this.internalMap = map;
        this.locationsRoutes = [];
        this.marker = [];
        this.routeId = "";
        this.points = [];
        this.index = [];
        this.centerPoint = null;
        this.centerMarker = null;
        this.action = null;
        
        GEvent.addListener(this.internalMap, "click", this.managePoints );
        
        this.baseIcon = new GIcon();
        this.baseIcon.iconSize = new GSize(12, 20);
        this.baseIcon.shadowSize = new GSize(22, 20);
        this.baseIcon.iconAnchor = new GPoint(6, 20);
        this.baseIcon.infoWindowAnchor = new GPoint(5, 1);           
        this.baseIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
        
    },
    managePoints  : function(overlay,point)
    {
        if (point) 
        {
            if (_currentTraffic.action == _currentTraffic._CENTER) _currentTraffic.setCenterPoint(point);
            if (_currentTraffic.action == _currentTraffic._SEGMENTS) _currentTraffic.setPoint(point);
        }
    },
    
    setAction : function(action)
    {
        if (action == _currentTraffic._CENTER || action == _currentTraffic._SEGMENTS)
            _currentTraffic.action = action;
        else
            alert("Action Errada.")
    },
    getAction : function()
    {
        return _currentTraffic.action;
    },     
      
    setPoints  : function(points)
    {
        for (var i = 0; i < points.length; i++) 
            _currentTraffic.setPoint(new GLatLng(points[i].y, points[i].x),true)

        _currentTraffic.showPoints(true)
    },
    
    // point = GLatLng
    setPoint : function(point, wait)
    {
        _currentTraffic.points[_currentTraffic.points.length] = point;
        _currentTraffic.index[_currentTraffic.index.length] = _currentTraffic.index.length;
        if (!wait) _currentTraffic.showPoints(true);
    },
    
    getCenterPoint : function()
    {
        var pt = new MPoint();
        pt.x = _currentTraffic.centerPoint.lng();
        pt.y = _currentTraffic.centerPoint.lat();
        return pt;
    },
    // point = MPoint
    setCenter : function(point)
    {
        _currentTraffic.setCenterPoint(new GLatLng(point.y, point.x))
    }, 
    
    // point = GLatLng
    setCenterPoint : function(point)
    {
        _currentTraffic.centerPoint = point;
        _currentTraffic.showPoints(false);
    },        
    
    getRouteId : function()
    {
        if (_currentTraffic.routeId==""){ alert('Sem Pontos!'); return "no roteId" }
        return _currentTraffic.routeId;
    },        
    
    showPoints : function(getRoute)
    {
        if (!getRoute) getRoute = false;
        _currentTraffic.clearMap();
        for (var i = 0; i < _currentTraffic.index.length; i++) 
        {
            if (_currentTraffic.points[_currentTraffic.index[i]]!= null){
                _currentTraffic.marker[i] = new GMarker(_currentTraffic.points[_currentTraffic.index[i]], _currentTraffic.getPosition(_currentTraffic.index[i],_currentTraffic.index.length));
                _currentTraffic.marker[i].index = i;
                _currentTraffic.createMarker(_currentTraffic.marker[i]);
            }
        }
        if (_currentTraffic.centerPoint) 
        {
            _currentTraffic.centerMarker = new GMarker(_currentTraffic.centerPoint, { draggable:true });
            _currentTraffic.createCenterMarker(_currentTraffic.centerMarker);
        }
        
        if (getRoute && _currentTraffic.index.length>1) _currentTraffic.getCoordsMap();
    },  
    
    removePoint : function(index)
    {
        _currentTraffic.points[_currentTraffic.index[index]] = null;
        _currentTraffic.arrangePoints();
        _currentTraffic.showPoints(true);
    },         
    
    arrangePoints : function()
    {
        var points = [];
        var index = [];
        for (var i = 0; i < _currentTraffic.index.length; i++) 
        {
            if (_currentTraffic.points[_currentTraffic.index[i]]!= null)
            {
                points[points.length] =  _currentTraffic.points[_currentTraffic.index[i]];
                index[index.length] =  index.length;
            }
        }
        _currentTraffic.index = index;
        _currentTraffic.points = points;
    }, 
    clearMap : function()
    {
        for (var i = 0; i < _currentTraffic.marker.length; i++) 
            _currentTraffic.internalMap.removeOverlay(_currentTraffic.marker[i]);
        if (_currentTraffic.centerMarker!=null) _currentTraffic.internalMap.removeOverlay(_currentTraffic.centerMarker);
    }, 

    createMarker : function(marker)
    {
        GEvent.addListener(marker, "click", function() 
        {    
            marker.openInfoWindowHtml(_currentTraffic.getInfo(marker.index,_currentTraffic.index.length));  
        });  
        GEvent.addListener(marker, "dragend", function() 
        {  
            _currentTraffic.points[_currentTraffic.index[marker.index]] = marker.getLatLng();
            _currentTraffic.showPoints(true);
        });  
        _currentTraffic.internalMap.addOverlay(marker);
    },                
    createCenterMarker : function(marker)
    {
        GEvent.addListener(marker, "click", function() 
        {    
            marker.openInfoWindowHtml("Centro");  
        });  
        GEvent.addListener(marker, "dragend", function() 
        {  
            _currentTraffic.centerPoint = marker.getLatLng();
        });  
        _currentTraffic.internalMap.addOverlay(marker);
    },         
    getInfo : function(index, total)
    {
        var info = "<div style='font-family:Arial;font-size:10px'><a href='javascript:_currentTraffic.removePoint("+index+")'>remove point</div>"
        return info;
    },        
    getPosition : function(index, total)
    {
        var newIcon = _currentTraffic.baseIcon;
        newIcon.image = null;
        if (index==0) newIcon.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
        if (index==total-1 && newIcon.image == null) 
            newIcon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
        else
            if (newIcon.image == null) newIcon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
        
        return { icon:newIcon, draggable:true };
    },
             
    getCoordsMap : function()
    {
        for (var i = 0; i < _currentTraffic.index.length; i++) 
        {
            if (_currentTraffic.points[_currentTraffic.index[i]]!= null){
                _currentTraffic.locationsRoutes[i] = new MPOILocation();
                _currentTraffic.locationsRoutes[i].name = "Location : " + i;
                _currentTraffic.locationsRoutes[i].point = new MPoint();
                _currentTraffic.locationsRoutes[i].point.x = _currentTraffic.points[_currentTraffic.index[i]].lng();
                _currentTraffic.locationsRoutes[i].point.y = _currentTraffic.points[_currentTraffic.index[i]].lat();
            }
        }
       var ro= new MRouteOptions();
       var rd= new MRouteDetails();
       var ve= new MVehicle();
       
       rd.optimizeRoute=true; // otimizada
       rd.routeType= 2;       // a pé
       ve.tankCapacity = 60;		//capacidade do tanque
       ve.averageConsumption=12;	//consumo mdio		
       ve.fuelPrice = 2.5;			//preo do combustvel
       ve.averageSpeed = 80;		//velocidade mdia
       ve.tollFeeCat = 0;			//no calcular pedgio.
       ro.vehicle = ve;             
       ro.routeDetails = rd;
    	
       var rMann= new MRouteMannager(null,new MRouteConfig('map'),ro);
       rMann.createRoute(_currentTraffic.locationsRoutes, 
       function(a){ 
            if(a == M_STAT_ROUTE){
                var ri = rMann.getRouteInfo();
                _currentTraffic.routeId = ri.routeId;
                _currentTraffic.showPoints(false); 
            }
       });
    }
 };
 
var _trafficUpdate = null;
var TrafficUpdate = Class.create();
TrafficUpdate.prototype = {
    initialize: function(map)
    {
        _trafficUpdate = this;
        this.file = "";
        this.xmlParse = "";
        this.map = map;
        this.polyLines = new Array();
        this.color = "#FF0000";
    },
    updateTraffic: function(min)
    {
        if (_trafficUpdate.file != "traffic\/tr-"+(min-(min%5)+5)+".xml") {
            _trafficUpdate.file = "traffic\/tr-"+(min-(min%5)+5)+".xml";
            GDownloadUrl(_trafficUpdate.file, function(d, r) 
            {
                  _trafficUpdate.xmlParse = GXml.parse(d);
                  _trafficUpdate.showTraffic();
            }); 
        } 
    },
    showTraffic: function()
    {
        _trafficUpdate.clearTraffic();
        var m = _trafficUpdate.xmlParse.documentElement.getElementsByTagName("p");
        _trafficUpdate.polyLines = new Array();
        for (var i = 0; i < m.length; i++) 
        {
            var pl = [],p = m[i].firstChild.data, pA = p.split(';'), t; 
            for (var w = 0; w < pA.length; w++){t = pA[w].split(' ');pl[pl.length] = new GLatLng(t[1], t[0]);}

            _trafficUpdate.polyLines[_trafficUpdate.polyLines.length] = new GPolyline(pl,_trafficUpdate.color, 5); 
            _trafficUpdate.map.addOverlay(_trafficUpdate.polyLines[_trafficUpdate.polyLines.length - 1]);
        }
    },
    clearTraffic: function()
    {
          for (var i = 0; i < _trafficUpdate.polyLines.length; i++) 
            _trafficUpdate.map.removeOverlay(_trafficUpdate.polyLines[i]);
    }        
}
