//styles
//Main Baloon Style
var IconStyle = new YMaps.Style("default#carIcon");
IconStyle.iconStyle = new YMaps.IconStyle();
IconStyle.iconStyle.size = new YMaps.Point(30,30);
IconStyle.iconStyle.offset = new YMaps.Point(-8,-8);
IconStyle.balloonContentStyle = {
    template: new YMaps.LayoutTemplate(TrackPointLayout)
};
//end Main Baloon Style
//stop style
var stopStyle = new YMaps.Style();
stopStyle.iconStyle = new YMaps.IconStyle();
stopStyle.iconStyle.size = new YMaps.Point(15, 25);
stopStyle.iconStyle.offset = new YMaps.Point(0, -25);
stopStyle.balloonContentStyle = {
    template: new YMaps.LayoutTemplate(TrackPointLayout)
};
stopStyle.iconStyle.href = "./images/flag1.png";
//end stop style
var template = new YMaps.Template("<div><span class=\"ui-icon ui-icon-alert\"></div>");
var alertPointStyle = new YMaps.Style();
alertPointStyle.balloonContentStyle = {
    template: new YMaps.LayoutTemplate(TrackPointLayout)
};
alertPointStyle.iconStyle = new YMaps.IconStyle(template);
alertPointStyle.iconStyle.offset = new YMaps.Point(-5, -5);
var style = new YMaps.Style("default#greenPoint");
style.polygonStyle = new YMaps.PolygonStyle();
style.polygonStyle.fillColor = "ff0000ff";
style.lineStyle = new YMaps.LineStyle();
style.lineStyle.strokeColor = "ff0000ff";
style.lineStyle.strokeWidth = 2;
YMaps.Styles.add("style#Example", style);
var style2 = new YMaps.Style("default#greenPoint");
style2.polygonStyle = new YMaps.PolygonStyle();
style2.balloonContentStyle = {
    template: new YMaps.LayoutTemplate(TrackPointLayout)
};
style2.polygonStyle.strokeColor = "ff6600";
style2.polygonStyle.strokeWidth = 2;
style2.polygonStyle.fillColor = "ff6600";
style2.polygonStyle.fill = true;
style2.polygonStyle.outline = true;
style2.lineStyle = new YMaps.LineStyle();
style2.lineStyle.strokeColor = "ff6600";
style2.lineStyle.strokeWidth = 2;
YMaps.Styles.add("style#Example2", style2);


//ens syles
//set center
function setCenterByPoints(map,leftBottom,rightTop){
    var bound = new YMaps.Bounds(leftBottom, rightTop);
    map.setCenter(new YMaps.GeoPoint(bound.getCenter().getX(), bound.getCenter().getY()),bound.getMapZoom(map));
}
//end set center
//map init
function createMap(elementName,geoPoint){
    window.yamap = new YMaps.Map($(elementName)[0]);
    yamap.setCenter(geoPoint, 8);
//    $(document).trigger('onMapRedraw');
    yamap.enableScrollZoom(true);
    yamap.addControl(new YMaps.Zoom());
    yamap.addControl(new YMaps.ToolBar());
    yamap.addControl(new YMaps.TypeControl());

}
function initMap(){
    createMap("#YMapsID", new YMaps.GeoPoint(37.64, 55.76));
    $('#YMapsID').trigger('mapCreated');
    window.yalines = new Array();
    window.yabaloons = new Array();
    window.nullPolyline = ({
        poline:new YMaps.Polyline([new YMaps.GeoPoint(0,0)]),
        pointsData:{},
        singleton: true
    });
    yalines.activeLine = nullPolyline;

    yamap.addOverlay(nullPolyline.poline);
    $('#YMapsID .trackInfo').css('top',$('#YMapsID .trackInfo').parent().innerHeight() - 155);

    YMaps.Events.observe(yamap, yamap.Events.MouseMove, function(map, mEvent){
        createPoint(mEvent,map,yalines.activeLine);
    });
    YMaps.Events.observe(yamap, yamap.Events.Click, function(map, mEvent){
        if(yalines.activePoint){
            var point1 = map.converter.coordinatesToLocalPixels(mEvent.getGeoPoint()),
            point2 = map.converter.coordinatesToLocalPixels(yalines.activePoint.getPoint(1));
            pDiff = point1.diff(point2);
            if(Math.sqrt(pDiff.getX()*pDiff.getX()+pDiff.getY()+pDiff.getY()) < 25){
                yalines.activePoint.openBalloon();
            }
        }
    });
    YMaps.Events.observe(yalines.activeLine.poline, yalines.activeLine.poline.Events.MouseMove, function(polyline, mEvent){
        createPoint(mEvent,yamap,yalines.activeLine);
    });
    YMaps.Events.observe(yalines.activeLine.poline, yalines.activeLine.poline.Events.MouseEnter, function(polyline, mEvent){
        createPoint(mEvent,yamap,yalines.activeLine);
    });
    $('#YMapsID .trackInfo').css('top',$('#YMapsID .trackInfo').parent().innerHeight() - 155);
}//end init map
//main baloon layout
function TrackPointLayout (context, map, owner) {
    var layout = YMaps.jQuery(
        '<b>' + (context.name || "") + '</b>\
        <div>\
            <a class="more" href="#">Показания датчиков</a>\
            <div class="description" style="display:none">' + (context.description || "") + '</div>\
        </div>'
        )
    .find(".more")
    .bind("click", function () {
        YMaps.jQuery(this).css("display", "none");
        layout.find(".description").css("display", "");
        context.getBalloon().update();
        return false;
    })
    .end();
    this.onAddToParent = function (parentNode) {
        layout.appendTo(parentNode);
    };
    this.onRemoveFromParent = function () {
        layout.remove();
    };
    this.update = function () {}
}
//end main baloon layout
//end syles
//map functions
function showTrackerById(tracker_id,map){
    if(yabaloons[tracker_id]){
        map.setCenter(yabaloons[tracker_id].point.getGeoPoint(),map.getMaxZoom());
        yabaloons[tracker_id].point.openBalloon();
    }else{
        showAlert('Трекер с серийным номером '+tracker_id+' не передавал координат.');
    }
}

function getPolylineDistance (polyline) {
    var distance = 0;
    for (var i = 0, l = polyline.getNumPoints(), point; i < l; i++) {
        if (point) {
            distance += point.distance(polyline.getPoint(i));
        }
        point = polyline.getPoint(i);
    }

    return distance;
}
/*baloon functions*/
function drawBaloon(map, lon, lat, data, id,name){
    if(yabaloons[id]){
        map.removeOverlay(yabaloons[id].point);
        delete yabaloons[id].point;
    }else{
        yabaloons[id] = {
            point: {},
            defaultName: yabaloons[id]?yabaloons[id].defaultName:name
        };
    }
    data.id = id;data.lat = lat;data.lon = lon;data.name = yabaloons[id].defaultName;data.style = IconStyle;
    yabaloons[id].point = createBaloon(data);
    map.addOverlay(yabaloons[id].point);
}
function createBaloon(data){
    var Balloon = new YMaps.Placemark(new YMaps.GeoPoint(data.lon,data.lat),{
        style:data.style,
        hideIcon:false,
        hasHint:true
    });
    Balloon.name = 'Объект: "'+data.name+'" [S/N: '+data.id+']'
    +'<br/><a class=\'ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only\' href="#" onclick=\'initInformationWindow('+data.id+',"'+data.name
    +'");\'><span class="ui-button-text">Cостояние трекера</span></a><br/><div class="baloonInfo"><ul><li><b>v='+data.speed+"км/ч</b></li><li><b>"+UTCDateToString(data.time)+'</b></li>'
    +'</ul><ul><li><b>lon='+Number(data.lon).toFixed(5)+'</b></li><li><b>lat='+Number(data.lat).toFixed(5)
    +'</b></li></ul></div>';
    Balloon.description ='<div class="baloonInfo"><ul><li>di='+data.dimask+'</li><li> do='+data.domask+'</li><li>'+($.settings.ai0?$.settings.ai0:'AI0')+'='+data.ai0
    +'</li><li> '+($.settings.ai1?$.settings.ai1:'AI1')+'='+data.ai1+'</li><li> '+($.settings.ai2?$.settings.ai2:'AI2')+'='+data.ai2
    +'</li><li> '+($.settings.ai3?$.settings.ai3:'AI3')+'='+data.ai3+'</li><li>'+($.settings.ai12?$.settings.ai12:'AI12')+'='+data.ai12
    +'</li><li>'+($.settings.ai13?$.settings.ai13:'AI13')+'='+data.ai13+'</li><li> '+($.settings.ai14?$.settings.ai14:'AI14')+'='+data.ai14
    +'</li><li> '+($.settings.ai15?$.settings.ai15:'AI15')+'='+data.ai15+'</li><li>'+($.settings.c0?$.settings.c0:'c0')+'='+data.c0
    +'</li><li> '+($.settings.c1?$.settings.c1:'c1')+'='+data.c1+'</li><li> '+($.settings.c2?$.settings.c2:'c2')+'='+data.c2+'</li></ul></div>';
    Balloon.setHintContent(data.name+'[S/N'+data.id+']'+'</br>'+UTCDateToString(data.time));
    return Balloon;
}
/*end baloon functions*/
/*Polyline functions*/
function drawLine (map, params, trackerName, forseLoad){
    $('#YMapsID .trackInfo').css('top',$('#YMapsID .trackInfo').parent().innerHeight() - 155);
    showLoadMask(true);
    yalines.activeLine = nullPolyline;
    map.removeOverlay(yalines.activePoint);
    yalines.activePoint = null;
    $.each(yalines,function(i,val){
        if(val){
            map.removeOverlay(val['poline']);
            if(val.alertPoints)
                $.each(val.alertPoints,function(iter,value){
                    map.removeOverlay(val.alertPoints[iter]);
                });
        }
    });
    if(!forseLoad){
        if(yalines[params[0].value]){
            map.addOverlay(yalines[params[0].value]['poline']);
            if(yalines[params[0].value].alertPoints)
                $.each(yalines[params[0].value].alertPoints,function(i,val){
                    map.addOverlay(yalines[params[0].value].alertPoints[i]);
                });
        }else{
            $(".trackInfo").html( 'Объект: "'+trackerName+'" [S/N: '+params[0].value+']<br/>Трек не загружен');
            $(".trackInfo").show();
        }
    }else{
        if($.cookie("from"+params[0].value.toString())){
            params.push({
                name:'from',
                value:$.cookie("from"+params[0].value.toString())
            });
        }
        if($.cookie("to"+params[0].value.toString())){
            params.push({
                name:'to',
                value:$.cookie("to"+params[0].value.toString())
            });
        }
        $.ajax({
            type: "POST",
            url:"tracker/getTrackerPoints",
            dataType: 'json',
            data: params,
            async:false,
            success: function(data){
                $('#timeForm input:button').button('enable');
                drawLineByData(data, params,trackerName);
                map.addOverlay(yalines[params[0].value].poline);
            }
        })
    }
    if(yalines[params[0].value]){
        $(".trackInfo").html(yalines[params[0].value].statistics);
        $(".trackInfo").show("slow");
        $('.graph').button();
        $('.graph').bind('click',function(){
            drawGraph(params[0].value,trackerName);
        })
        showLoadMask();

        setCenterByPoints(map,yalines[params[0].value].leftBottom,yalines[params[0].value].rightTop);

        if(yalines[params[0].value].error)
            return;
        yalines.activeLine = yalines[params[0].value];
        yalines.activeLine.tracker_id = params[0].value;
    }
    showLoadMask();
}
function drawLineByData(data,params,trackerName){
    if(data == '' || data.error){
        yalines[params[0].value] = ({
            statistics: 'Объект: "'+trackerName+'" [S/N: '+params[0].value+']<br/><span style="color:red;">'+data.error+'</span>',
            error: data.error
        });
        $.cookie("from"+params[0].value, null);
        $.cookie("to"+params[0].value, null);
        showAlert(data.error);
        yalines[params[0].value].statistics.isError = true;
        showLoadMask();
        return;
    }else{
        var geoPoints = new Array();
        yalines[params[0].value]= {
            scope:this,
            poline:new YMaps.Polyline(),
            distants:0,
            alertPoints: new Array(),
            pointsData:new Array(),
            leftBottom:new YMaps.GeoPoint(),
            rightTop:new YMaps.GeoPoint()
        };
        var left = 0,top = 0,right = 0, bottom = 0;
        yalines[params[0].value].pointsData = data;
        $('#filterDialog').trigger('filterInitiolized',[data,params[0].value,stopStyle]);
        for(var i = 0; i < data.length; i ++){
            geoPoints.push(new YMaps.GeoPoint(data[i][1],data[i][2]));
            if(i == 0){
                left = data[i][1];top = data[i][2]; right = data[i][1];bottom = data[i][2];
            }
            if(data[i][1] < right)right = data[i][1];
            if(data[i][1] > left)left = data[i][1];
            if(data[i][2] < top)top = data[i][2];
            if(data[i][2] > bottom)bottom = data[i][2];
            if(new Number(data[i][4]) == 0){
                for(var iter = (i+1); iter < data.length;iter++){
                    geoPoints.push(new YMaps.GeoPoint(data[iter][1],data[iter][2]));
                    if((data[iter].length-1) == iter)break;
                    if(data[iter][4] > 0){
                        var stopTime = data[iter][0] - data[i][0];
                        if(stopTime > (Number($.settings.parking_limit)||60)){
                            var alertPoint = new YMaps.Placemark(new YMaps.GeoPoint(data[i][1],data[i][2]), {
                                style: stopStyle,
                                hasHint: true
                            });
                            var days = ((stopTime/(3600*24)) >= 1)?Math.floor(stopTime/(3600*24))+' дней ':'';
                            var hours = ((stopTime/3600) >= 1)?Math.floor(stopTime/(3600))+' часов ':'';
                            var minutes = (Math.floor(stopTime/60) >= 60)?(Math.floor(stopTime/60) - (Math.floor(stopTime/3600)*3600)/60):Math.floor(stopTime/60);
                            var seconds = (stopTime >= 60)?(stopTime - (Math.floor(stopTime/60)*60)):stopTime;
                            var stopString = days+' '+hours+' '+minutes+' минут '+seconds+' секунд';
                            
                            alertPoint.setHintContent('Стоянка: '+stopString+'<br/>'+UTCDateToString(data[i][0]));
                            alertPoint.name = 'Объект: "'+trackerName+'" [S/N: '+params[0].value+']'+'<div class="baloonInfo"><ul><li>v='+data[i][4]+"км/ч</li><li>"
                            +UTCDateToString(data[i][0])+'</li><li>Стоянка'+stopString
                            +'<li/></ul><ul><li>lon='+Number(data[i][1]).toFixed(5)+'</li><li>lat='+Number(data[i][2]).toFixed(5)
                            +'</li></ul></div>';
                            yalines[params[0].value].alertPoints.push(alertPoint);
                        }
                        i = iter;
                        break;
                    }
                }
            }
            if(i==0){
                top = data[i][2],bottom = data[i][2],left = data[i][1],right = data[i][1];
            }
            if(data[i][2] < top)top = data[i][2];
            if(data[i][2] > bottom)bottom = data[i][2];
            if(data[i][1] < right)right = data[i][1];
            if(data[i][1] > left)left = data[i][1];
        }
        yalines[params[0].value].leftBottom = new YMaps.Point(left, bottom);
        yalines[params[0].value].rightTop = new YMaps.Point(right,top);
        yalines[params[0].value].poline = new YMaps.Polyline(geoPoints,{
            style: "style#Example",
            hasHint: true
        });
        yalines[params[0].value].poline.setHintContent('Объект: "'+trackerName+'" [S/N: '+params[0].value+']');
        yalines[params[0].value].poline.name = 'Объект: "'+trackerName+'" [S/N: '+params[0].value+']';
        yalines[params[0].value].distants = getPolylineDistance(yalines[params[0].value].poline);
        yalines[params[0].value].poline.setStyle("style#Example");
        var timeData = new String();
        if(yalines[params[0].value].pointsData.length){
            timeData = '<br/>Дата начала: '+UTCDateToString(yalines[params[0].value].pointsData[0][0])+'<br/>Дата окончания: '
            +UTCDateToString(yalines[params[0].value].pointsData[(yalines[params[0].value].pointsData.length-1)][0]);
            $.cookie('from'+params[0].value,yalines[params[0].value].pointsData[0][0]);
            $.cookie('to'+params[0].value,yalines[params[0].value].pointsData[(yalines[params[0].value].pointsData.length-1)][0]);
        }
        yalines[params[0].value].statistics = 'Объект: "'+trackerName+'" [S/N: '+params[0].value+']<br/>Длина трека: '+yalines[params[0].value].distants.toFixed(0)/1000
        +' км<br/>Количество точек трека:'+yalines[params[0].value].poline.getPoints().length+timeData+"<br/><a class='graph' href='#'>Показать график</a>";
    }
}
function createPoint(event,map,poline){
    if(!poline)return;
    if(map.getBalloon())return;
    if(poline.singleton)return;
    var point = poline.poline.getClosestPoint(event.getGeoPoint());
    var point1 = poline.poline.getPoint(point.index);
    var point2 = poline.poline.getPoint(point.index + 1);
    var mousepix = map.converter.coordinatesToLocalPixels(event.getGeoPoint());
    var point1pix = mousepix.diff(map.converter.coordinatesToLocalPixels(point1));
    var point2pix = mousepix.diff(map.converter.coordinatesToLocalPixels(point2));
    point1pix = Math.sqrt(point1pix.getX()*point1pix.getX() + point1pix.getY()*point1pix.getY());
    point2pix = Math.sqrt(point2pix.getX()*point2pix.getX() + point2pix.getY()*point2pix.getY());
    var index;
    if(point1pix < point2pix){
        index = point.index;
        point = point1;
    }else{
        index = point.index + 1;
        point = point2;
        point1pix = point2pix;
    }
    var val = poline.pointsData[index];
    if(yalines.activePoint){
        if(point1pix > 100){
            map.removeOverlay(yalines.activePoint);
            yalines.activePoint = 0;
        }else{
            if(!point.equals(yalines.activePoint.getPoint(1))){
                map.removeOverlay(yalines.activePoint);
                createArrow (point,val,map,index);
            }
        }
    }else{
        if(point1pix < 100){
            createArrow (point,val,map,index);
        }
    }
}
function createArrow (point,val,map,index) {
    if(map.getBalloon()){
        return false;
    }
    if(index == 0)index = 1;
    var current = map.converter.coordinatesToLocalPixels(yalines.activeLine.poline.getPoint(index));
    var arrowWidth = 50;
    var prev = map.converter.coordinatesToLocalPixels(yalines.activeLine.poline.getPoint(index - 1));
    if(!current.diff(prev).getX()){
        prev = map.converter.coordinatesToLocalPixels(yalines.activeLine.poline.getPoint(index - 2));
    }
    var vector = current.diff(prev),
    length = Math.sqrt(vector.getX() * vector.getX() + vector.getY() * vector.getY()),
    normal = vector.scale(1 / length);

    var middle = current,
    offsetMiddle = normal.scale(-arrowWidth / 3),
    arrowPart1 = new YMaps.Point(0 - offsetMiddle.getY(), offsetMiddle.getX()).scale(0.25),
    arrowPart2 = new YMaps.Point(offsetMiddle.getY(), 0 - offsetMiddle.getX()).scale(0.25),
    arrowPoint1 = middle.diff(offsetMiddle).diff(arrowPart1.neg()),
    arrowPoint2 = middle.diff(offsetMiddle).diff(arrowPart2.neg());
    if(yalines.activePoint){
        map.removeOverlay(yalines.activePoint);
    }
    yalines.activePoint = new YMaps.Polygon([
        map.converter.localPixelsToCoordinates(arrowPoint2),
        map.converter.localPixelsToCoordinates(middle),
        map.converter.localPixelsToCoordinates(arrowPoint1)
        ],{
            style: "style#Example2",
            hasHint: true,
            zIndex:21
        })
    yalines.activePoint.name = '<div class="baloonInfo"><ul><li>v='+val[4]+"км/ч</li><li>"+UTCDateToString(val[0])+'</li><li>'+event_type[val[3]].full_name
    +'<li/></ul><ul><li>lon='+Number(val[1]).toFixed(5)+'</li><li>lat='+Number(val[2]).toFixed(5)
    +'</li></ul></div>';
    map.addOverlay(yalines.activePoint);
    return yalines.activePoint;
}
/*End polyline functions*/
//end map functions
