var _configData = null;
var _activePolyLine;
var _markerData = [];
var _map;
var _movingMarker;
var _poiMarker;
var _videoItemByRoute = [];
var _currentRoute;
var _currentVideoItemData;
var _videoDataById = [];
var _firstPlayback = true;
var _playerHtml = '<div id="map_canvas"></div><div id="draggable"><div id="handle"></div><div onclick="destroyPlayer()" id="close"></div><div id="videos"></div><div id="playlist"></div></div>';

$(window).unload(function() {
    GUnload();
});


$(function() {
    initOnStart();
})

function initOnStart() {
    injectPlayerHtml();
    if (initMap()) {
        $("#draggable").draggable({ handle: "#handle" });

    }
}

function injectPlayerHtml() {
    $("#video-passport").html(_playerHtml);
}

function initMap() {
    if (GBrowserIsCompatible()) {
		_firstPlayback = true;

        getConfigData();
        if (null == _configData) {
            return false;
        }

        var mapFromServerJSON = getConfigData().map;
        _map = new GMap2(document.getElementById("map_canvas"));

        var center = convertXyToLatLng(mapFromServerJSON);
        _map.setCenter(center, (mapFromServerJSON.zoom * 1));


        var image = getConfigData().map.image;
        if (image != null) {
            placeImage(image);
        }
        var draggingEnabled = (mapFromServerJSON.dragging == 1);
        if (draggingEnabled) {
            _map.setUIToDefault();
        } else {
            _map.disableDragging();

        }

        placeSearchField();
        initAndPlaceRoutesOnMap();
        initAndPlacePOIOnMap();

        return true;
    }
    else {
        return false;
    }
}



function getConfigData() {
    if (null == _configData) {
        getSync(KAKTUS_VP_CONFIG.MAP_CONFIG, function(data) {
            if (typeof data == 'object')
                _configData = data.config;
        });
    }

    return _configData;
}


function getSync(url, callback) {
    getSyncWithData(url, null, callback);
}

function getSyncWithData(url, data, callback) {
    $.ajax({
        url: url
        , async: false
        , dataType: 'json'
        , data: data
        , success: callback
        , typeString: 'GET'
        , timeOut: 10000
    });
}


function convertXyToLatLng(xy) {
    var longitude = xy["coord-y"];
    var latitude = xy["coord-x"];
    var latLng = new GLatLng(latitude, longitude);
    return latLng;
}

function placeImage(image) {
    try {
        var centerLatLng = convertXyToLatLng(image);
        var widthPx = parseFloat(image.width);
        var heightPx = parseFloat(image.height);
        var url = image.url;
        var zoom = _map.getZoom();
        var pointCenter = _map.getCurrentMapType().getProjection().fromLatLngToPixel(centerLatLng, zoom);

        var pointSW = new GPoint(pointCenter.x - widthPx / 2, pointCenter.y + heightPx / 2);
        var pointNE = new GPoint(pointCenter.x + widthPx / 2, pointCenter.y - heightPx / 2);
        var sw = _map.getCurrentMapType().getProjection().fromPixelToLatLng(pointSW, zoom);
        var ne = _map.getCurrentMapType().getProjection().fromPixelToLatLng(pointNE, zoom);

        var bounds = new GLatLngBounds(sw, ne)
        var image = new GGroundOverlay(url, bounds);
        _map.addOverlay(image);
    } catch (err) { }

}

function placeSearchField() {
    if (KAKTUS_VP_CONFIG.MAP_SEARCH != null) {
            _map.addControl(new searchControl());
    }
}

function initAndPlaceRoutesOnMap() {
    var routes = getConfigData().route;
    if (!isArray(routes)) {
        routes = convertObjectToArray(routes);
    }

    for (var i = 0; i < routes.length; i++) {
        var route = routes[i];

        if (!isArray(route.vitem)) {
            route.vitem = convertObjectToArray(route.vitem);
        }

        var latLng = createLatLngFromRoute(route);
        setMarkerDataByLatLng(latLng, route);
        placeRouteMarkerAndRegisterEvent(latLng, "click", destroyLastPlayerAndStartNew);
    }
}

function isArray(input) {
    return typeof (input) == 'object' && (input instanceof Array);
}

function convertObjectToArray(object) {
    var array = [object];
    return array;
}

function createLatLngFromRoute(route) {
    var latLng = convertXyToLatLng(route);
    return latLng;
}

function setMarkerDataByLatLng(latLng, value) {
    var markerKey = latLng.toString();
    _markerData[markerKey] = value;
}

function placeRouteMarkerAndRegisterEvent(latLng, eventType, onEventFunction) {
    var marker = placeRouteMarker(latLng);
    GEvent.addListener(marker, eventType, onEventFunction);
}

function placeRouteMarker(latLng) {
    var options = createRouteMarkerOptions();
    return placeMarkerWithOptions(latLng, options);
}


function createRouteMarkerOptions() {
    var markerOptions = { icon: createRouteMarkerIcon() };

    return markerOptions;
}

function createRouteMarkerIcon() {
    var baseIcon = new GIcon(G_DEFAULT_ICON);
    baseIcon.image = KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_SRC;
    baseIcon.shadow = "",
    baseIcon.iconSize = new GSize(KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_DIMENSIONS_WIDTH
                                      , KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_DIMENSIONS_HEIGHT);
    baseIcon.iconAnchor = new GPoint(KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_ANCHOR_X
                                        , KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_ANCHOR_Y);
    baseIcon.infoWindowAnchor = baseIcon.iconAnchor;
    baseIcon.imageMap = [0, 0
                        , KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_DIMENSIONS_WIDTH, 0
                        , 0, KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_DIMENSIONS_HEIGHT
                        , KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_DIMENSIONS_WIDTH, KAKTUS_VP_CONFIG.IMG_ROUTE_MARKER_DIMENSIONS_HEIGHT];
    return baseIcon;
}

function placeMarker(latLng, iconFile) {
    var blueIcon = new GIcon(G_DEFAULT_ICON);
    blueIcon.image = iconFile;

    markerOptions = { icon: blueIcon };
    return placeMarkerWithOptions(latLng, markerOptions);
}

function placeMarkerWithOptions(latLng, markerOptions) {
    var marker = new GMarker(latLng, markerOptions);
    _map.addOverlay(marker);
    return marker;

}

function destroyLastPlayerAndStartNew(latLng) {
    var route = getMarkerDataByLatLng(latLng);
    destroyPlayer();
    showPlaylistHandle();
    setPlaylistHandleText(route.title);
    placeRouteToPlaylist(route);
    startPlaybackByIndex(0);
}

function getMarkerDataByLatLng(latLng) {
    var markerKey = latLng.toString()
    var data = _markerData[markerKey];
    return data;
}

function destroyPlayer() {
    emptyVideosDiv();
    emptyPlaylist();
    hidePlayer();
    removeActivePolyLine();
    removeMovingMarker();
}

function emptyVideosDiv() {
    var videos = getVideosDiv();
    videos.empty();
}

function getVideosDiv() {
    return $("#videos");
}

function emptyPlaylist() {
    var playlist = getPlaylist();
    playlist.empty();
}

function getPlaylist() {
    return $("#playlist");
}

function hidePlayer() {
    $("#draggable").hide();
}


function removeActivePolyLine() {
    removeOverlay(_activePolyLine);
    _activePolyLine = null;
}

function removeOverlay(overlay) {
    var overlayVisible = (overlay != null);
    if (overlayVisible)
        _map.removeOverlay(overlay);
}

function removeMovingMarker() {
    removeOverlay(_movingMarker);
    setTimeout(function() { removeOverlay(_movingMarker); _movingMarker = null; }, 200);    //firefox hack - sometime did not disapper   
}

function showPlaylistHandle() {
    $("#handle").show();
}

function setPlaylistHandleText(text) {
    $("#handle").text(text);
}

function placeRouteToPlaylist(route) {
    _currentRoute = route;
    var vitem = route.vitem;
    _videoItemByRoute[route] = vitem;
    emptyPlaylist();
    populatePlaylist(vitem);
}

function populatePlaylist(vitem) {
    for (var i = 0; i < vitem.length; i++) {
        var videoItem = vitem[i];
        placeVideoItemToPlaylist(videoItem);

    }
}

function placeVideoItemToPlaylist(vitem) {
    var playlist = getPlaylist();
    playlist.append("<div onclick='startPlaybackFromPlaylistItem(this)' class='playlist-item'>" + vitem.title /*+ " (" + vitem.fileid + ")"*/ + "</div>");
}

function startPlaybackFromPlaylistItem(playlistItem) {
    var index = $(playlistItem).index();
    startPlaybackByIndex(index);
}

function startPlaybackByIndex(index) {
    getPlaylist().children().attr("class", "playlist-item");
    getPlaylist().children().eq(index).attr("class", "playlist-item-selected");
    var vitem = getVideoItemFromCurrentRouteByIndex(index);
    var videoItemData = getVideoItemDataById(vitem.fileid);
    drawPolyLine(videoItemData);
    //var videoFile = videoItemData["video-pasport"].videofile + ".flv";
    var videoPasPort = videoItemData["video-pasport"];
    playFile(videoPasPort)
    _currentVideoItemData = videoItemData;
}

function getVideoItemFromCurrentRouteByIndex(index) {
    var videoItem = _currentRoute.vitem[index];
    return videoItem;
}

function getVideoItemDataById(id) {
    var videoItem = _videoDataById[id];
    var videoItemFound = (videoItem != null);
    if (videoItemFound) {
        return videoItem;
    } else {
        getSyncWithData(KAKTUS_VP_CONFIG.SERVICE_XML2JSON, ({ cid: id }), function(data) {
            _videoDataById[id] = data
        });

        return _videoDataById[id];
    }
}


function drawPolyLine(xyArray) {
    removeActivePolyLine();
    var latLngArray = convertXyArrayToLatLngArray(xyArray["video-pasport"].track.position);
    _activePolyLine = new GPolyline(latLngArray, KAKTUS_VP_CONFIG.COLOR_ROUTE, 5);
    _map.addOverlay(_activePolyLine);
}

function convertXyArrayToLatLngArray(xyArray) {
    var latLngArray = new Array();

    for (var i = 0; i < xyArray.length; i++) {
        var latLng = convertXyToLatLng(xyArray[i])
        latLngArray.push(latLng);
    }

    return latLngArray;
}

function playFile(videoPasPort) {
    emptyVideosDiv();
    var videoId = insertVideoDivToVideosDiv();
    createPlayer(videoPasPort, videoId);
    if (_firstPlayback) {
        positionVideo()
        _firstPlayback = false;
    }
}

function insertVideoDivToVideosDiv() {
    $("#draggable").show();
    var videos = getVideosDiv();
    var videoId = "singlevideo"
    videos.append("<div id='" + videoId + "' ></div>");

    return videoId;
}

function createPlayer(videoPasPort, placeholder) {
    var flashvars = {
        autostart: "true",
        icons: "false"
    }

    setFileAndStreamerFromVideoPasPort(flashvars, videoPasPort);
    var params = {
        allowfullscreen: "true",
        allowscriptaccess: "always"
    }

    var playerId = placeholder + "player";
    var attributes = {
        id: playerId,
        name: playerId
    }

    swfobject.embedSWF(KAKTUS_VP_CONFIG.SERVICE_PLAYER, placeholder, "512", "288", "9.0.115", KAKTUS_VP_CONFIG.SERVICE_FLASHEXPRESSINSTALL, flashvars, params, attributes);

    return playerId;
}

function setFileAndStreamerFromVideoPasPort(flashvars, videoPasPort) {
    var streamed = (KAKTUS_VP_CONFIG.SERVICE_STREAMER != null);
    if (streamed) {
        flashvars.file = videoPasPort.videofile + ".flv";
        flashvars.streamer = KAKTUS_VP_CONFIG.SERVICE_STREAMER;
    } else {
        var file = KAKTUS_VP_CONFIG.DIR_VIDEO + videoPasPort.videofile + ".flv";
        flashvars.file = file;
    }
}

function positionVideo() {
    var mapWidth = getElementWidth("#map_canvas");
    var mapHeight = getElementHeight("#map_canvas");
    var draggableWidth = getElementWidth("#draggable");
    var sideOffset = 20;
    var left = mapWidth - draggableWidth + sideOffset;
    var top = -mapHeight + sideOffset;
    $("#draggable").css("left", +left + "px");
    $("#draggable").css("top", top + "px");
}

function getElementWidth(selector) {
    return jQuery(selector).width();
}

function getElementTop(selector) {
    return jQuery(selector).position().top;
}
function getElementLeft(selector) {
    return jQuery(selector).position().left;
}

function getElementHeight(selector) {
    return jQuery(selector).height();
}

function getElementCssPropertyInPxAndExtractNumber(selector, property) {
    var property = $(selector).css(property);
    property = property.substring(0, property.indexOf("px", 0));
    property = parseFloat(property);
    return property;

}

function initAndPlacePOIOnMap() {
    var poi = getPOI();

    for (var i = 0; i < poi.length; i++) {
        var currentPoi = poi[i];
        placePOIMarker(currentPoi);
    }
}

function getPOI() {
    var poi;

    getSync(KAKTUS_VP_CONFIG.MAP_POI, function(poidata) {
        poi = poidata["poi-data"].poi;
        _poiMarker = ((poidata["poi-data"].icon != null) && (typeof poidata["poi-data"].icon == 'object')) ? poidata["poi-data"].icon : null;
    });

    if (!isArray(poi)) {
        poi = [poi];
    }

    return poi;
}

function placePOIMarker(poiMarkerData) {
    if ((poiMarkerData == null) || (typeof poiMarkerData != 'object'))
        return;

    var latLng = convertXyToLatLng(poiMarkerData);
    var poiMarker = placeMarkerWithOptions(latLng, createPOIMarkerOptions(
        ((poiMarkerData.icon != null) && (typeof poiMarkerData.icon == 'object')) ? poiMarkerData.icon : null
    ));
    setMarkerDataByLatLng(latLng, { html: poiMarkerData.html, marker: poiMarker });

    GEvent.addListener(poiMarker, "click", function() {
        var html = getMarkerDataByLatLng(this.getLatLng()).html;
        this.openInfoWindowHtml(html);
    });

    return poiMarker;
}

function createPOIMarkerOptions(iconOptions) {
    var markerOptions = { icon: createPOIMarkerIcon(iconOptions) };

    return markerOptions;
}

function createPOIMarkerIcon(iconOptions) {
    var baseIcon = new GIcon(G_DEFAULT_ICON);

    if ((iconOptions != null) && (typeof iconOptions == 'object')) {
        baseIcon.image = iconOptions.src;
        baseIcon.shadow = "",
        baseIcon.iconSize = new GSize(parseInt(iconOptions.width)
                                          , parseInt(iconOptions.height));
        baseIcon.iconAnchor = new GPoint(parseInt(iconOptions.anchorX)
                                            , parseInt(iconOptions.anchorY));
        baseIcon.infoWindowAnchor = baseIcon.iconAnchor;
        baseIcon.imageMap = [0, 0
                            , iconOptions.width, 0
                            , 0, iconOptions.height
                            , iconOptions.width, iconOptions.height];
    } else if ((_poiMarker != null) && (typeof _poiMarker == 'object')) {
        baseIcon.image = _poiMarker.src;
        baseIcon.shadow = "",
        baseIcon.iconSize = new GSize(parseInt(_poiMarker.width)
                                          , parseInt(_poiMarker.height));
        baseIcon.iconAnchor = new GPoint(parseInt(_poiMarker.anchorX)
                                            , parseInt(_poiMarker.anchorY));
        baseIcon.infoWindowAnchor = baseIcon.iconAnchor;
        baseIcon.imageMap = [0, 0
                            , parseInt(_poiMarker.width), 0
                            , 0, parseInt(_poiMarker.height)
                            , parseInt(_poiMarker.width), parseInt(_poiMarker.height)];
    }

    return baseIcon;
}


function playerReady(thePlayer) { // called by JW player when player is ready
    var player = getPlayerById(thePlayer.id);
    assignListnersToPlayer(player);
}

function getPlayerById(playerId) {
    var player = window.document[playerId];
    return player;
}

function assignListnersToPlayer(player) {
    player.addModelListener("TIME", "timeMonitor");
}

function timeMonitor(obj) {
    positionIndex = Math.floor(obj.position);
    var positionRaw = _currentVideoItemData["video-pasport"].track.position[positionIndex];
    var position = convertXyToLatLng(positionRaw);

    moveMovingMarker(position);

};

function moveMovingMarker(toLatLng) {
    if (_movingMarker != null) {
        _movingMarker.setLatLng(toLatLng);
    }
    else {
        placeMovingMarker(toLatLng);
    }

    ensureMovingMarkerIsOnMap();
}

function ensureMovingMarkerIsOnMap() {
    var mapsBounds = _map.getBounds();
    var movingMarkerLatLng = _movingMarker.getLatLng();

    if (!mapsBounds.containsLatLng(movingMarkerLatLng)) {
        _map.panTo(movingMarkerLatLng);
    }
}

function placeMovingMarker(latLng) {
    if (_movingMarker == null) {
        var markerOptions = createMovingMarkerOptions();
        var marker = placeMarkerWithOptions(latLng, markerOptions);
        _movingMarker = marker;
        return marker;
    } else {
        return _movingMarker;
    }
}

function createMovingMarkerOptions() {
    var markerOptions = { icon: createMovingMarkerIcon() };

    return markerOptions;
}

function createMovingMarkerIcon() {
    var baseIcon = new GIcon(G_DEFAULT_ICON);
    baseIcon.image = KAKTUS_VP_CONFIG.IMG_MOVING_MARKER_SRC;
    baseIcon.shadow = "",
    baseIcon.iconSize = new GSize(KAKTUS_VP_CONFIG.IMG_MOVING_MARKER_DIMENSIONS_WIDTH
                                      , KAKTUS_VP_CONFIG.IMG_MOVING_MARKER_DIMENSIONS_HEIGHT);
    baseIcon.iconAnchor = new GPoint(KAKTUS_VP_CONFIG.IMG_MOVING_MARKER_ANCHOR_X
                                        , KAKTUS_VP_CONFIG.IMG_MOVING_MARKER_ANCHOR_Y);
    return baseIcon;
}





















