﻿(function () {
    var t = Tegud,
        b = t.Base,
        m = b.registerNS('Tegud.Mapping');

    m.GetMap = function (defaultPos) {
        var mapDiv = $("#BlogMap");

        if (mapDiv.length) {
            return mapDiv;
        }

        mapDiv = $("<div id=\"BlogMap\"></div>")
                    .appendTo($("#BlogContainer"))
                    .css({
                        width: "300px",
                        height: "190px",
                        position: "absolute",
                        border: "solid 1px black"
                    });

        var map = new google.maps.Map(mapDiv[0], {
            zoom: 4,
            center: new google.maps.LatLng(defaultPos['lat'], defaultPos['long']),
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControl: true,
            navigationControlOptions: { style: google.maps.NavigationControlStyle.SMALL },
            mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU }
        });

        mapDiv.data("GMap", map);

        return mapDiv;
    }

    m.CenterOn = function (position, showMarker, zoom, mapDiv) {
        if (showMarker == undefined)
            showMarker = true;

        if (zoom == undefined)
            zoom = 15;

        var currentPosition = mapDiv.data("MapMarkerPoint");
        if (currentPosition)
            currentPosition.setMap(null);

        if (showMarker == undefined)
            showMarker = true;

        if (zoom == undefined)
            zoom = 15;

        var map = mapDiv.data("GMap");

        var currentPosition = mapDiv.data("MapMarkerPoint");
        if (currentPosition)
            currentPosition.setMap(null);

        var markerPoint = new google.maps.LatLng(position['lat'], position['long']);
        var mapMarker;
        if (showMarker)
            mapMarker = new google.maps.Marker({ position: markerPoint, map: map });

        map.setCenter(markerPoint);
        map.setZoom(zoom);

        if (showMarker)
            mapDiv.data("MapMarkerPoint", mapMarker);
    }

    m.Show = function (marker) {
        var blogItem = marker.closest(".BlogItem");
        var locationData = {
            long: marker.attr("data-Tegud-Mapping-Longitude"),
            lat: marker.attr("data-Tegud-Mapping-Latitude"),
            Name: marker.attr("data-Tegud-Mapping-LocationName")
        };

        if (!locationData)
            return;

        var mapDiv = Tegud.Mapping.GetMap(locationData).css({
            left: marker.position().left - 3,
            top: marker.position().top - 200
        });

        Tegud.Mapping.CenterOn(locationData, true, undefined, mapDiv);

        if (mapDiv.length && mapDiv.data("CurrentBlogItem") && blogItem.attr("ID") == mapDiv.data("CurrentBlogItem")) {
            Tegud.Mapping.Hide();
            return;
        }

        mapDiv.data("CurrentBlogItem", blogItem.attr("ID"));

        $("body").bind("click.HideMap", function (e) {
            var clickTarget = $(e.target);
            if (clickTarget.closest("#BlogMap").length || clickTarget.hasClass("LocationMarker"))
                return;
            Tegud.Mapping.Hide();
        });
    }

    m.Hide = function () {
        $("body").unbind("click.HideMap");
        $("#BlogMap").remove();
    }
})();
