﻿function MapCtrl(options, htmlContainer)
{
    var addressCount = 0;
    var mapBound = new google.maps.LatLngBounds();
    var autoExpandBounds = options.autoExpandBounds != undefined ? options.autoExpandBounds : true;
    var map = new google.maps.Map(document.getElementById("mapLocation"), { zoom: 14, center: new google.maps.LatLng(45.814, 15.978), mapTypeId: google.maps.MapTypeId.ROADMAP });
    var activeInfoWindow = null;
    var points = new Array();

    var GetPointByAddress = function(address)
    {
        var pt = null;
        for (var i = 0; i < points.length; i++)
        {
            if (points[i].address != undefined && points[i].mapMarker != undefined)
            {
                if (points[i].address == address)
                {
                    pt = points[i];
                    break;
                }
            }
        }
        return pt;
    };
    
    var NewPoint = function(address, lat, lng, centerTitle, centerUrl)
    {
        var position = new google.maps.LatLng(lat, lng);
        var pt = {address:address, lat:lat, lng:lng, centerTitle:null, centerURL:null, stores:null};
        if(centerTitle != undefined)
        {
            if(centerTitle.length > 0) pt.centerTitle = centerTitle;
        }
        if(centerUrl != undefined)
        {
            if(centerUrl.length > 0) pt.centerURL = centerUrl;
        }
        pt.mapMarker = new google.maps.Marker({map:map, title:address, position: position});
        google.maps.event.addListener(pt.mapMarker, "click", function()
        {
        	OpenPoint(pt);
            });
       addressCount++;
        if (autoExpandBounds == true)
        {
            mapBound.extend(position);
            addressCount > 1 ? map.fitBounds(mapBound) : map.setCenter(position);
        }
        
        points.push(pt);
        return pt;
    };

    var OpenPoint = function(pt)
    {
        if (activeInfoWindow != null) activeInfoWindow.close();
        var winHtml = document.createElement("div");
        var eAddress = $(document.createElement("p")).html(pt.address).addClass("gmapDesc");
        $(winHtml).append(eAddress);
        if(pt.centerTitle != null)
        {
            var eCenter = $(document.createElement("a")).html(pt.centerTitle).attr("href", pt.centerURL).addClass("gmapDesc");
            $(winHtml).append(eCenter);
        }
        var eStoresLbl = $(document.createElement("div")).html("Dućani:").css("margin", "20px 0 10px 0").addClass("gmapDesc");
        var eImgContainer = $(document.createElement("div")).css("height", "80px").css("width", "280px").css("overflow", "hidden").attr("id", "mapImgContainer");
        
        $(winHtml).append(eStoresLbl);
        for(var i = 0; i < pt.stores.length; i++)
        {
            var eStore = $(document.createElement("a")).html(pt.stores[i].title).attr("href", pt.stores[i].url).addClass("gmapDesc");
            if(pt.stores.length > 1)
            {
                $(eStore).attr("onmouseover", "$(document).data('mapCtrl').ShowStoreThumb(this, $('#mapImgContainer'), '" + pt.stores[i].img + "'); return false;");
            }
            else
            {
                $(document).data("mapCtrl").ShowStoreThumb(eStore, eImgContainer, pt.stores[i].img);
            }
            $(winHtml).append($(document.createElement("p")).append(eStore).addClass("gmapDesc"));
        }
        
        $(winHtml).append(eImgContainer);
        var mapInfoWindow = new google.maps.InfoWindow({ content: $(winHtml).html() });
        mapInfoWindow.open(map, pt.mapMarker);
        activeInfoWindow = mapInfoWindow;
    };
    this.ShowStoreThumb = function(sender, container, thumb)
    {
        var link = $(document.createElement("a")).attr("href", $(sender).attr("href"));
        var img = $(document.createElement("img")).attr("src", thumb).attr("alt", $(sender).html());
        $(link).append(img);
        $(container).html("").append(link);
    };

    this.Add = function(title, address, thumbUrl, storeUrl, centerTitle, centerUrl, lat, lng)
    {
        if (title != undefined && address != undefined && lat != undefined && lng != undefined && map != undefined)
        {
            var pt = GetPointByAddress(address);
            if (pt == null) pt = NewPoint(address, lat, lng, centerTitle, centerUrl);
            if (pt.stores == null) pt.stores = new Array();
            pt.stores.push({ title: title, url: storeUrl, img: thumbUrl });
        }
    };
    this.CenterMap = function(lat, lng, zoom)
    {
        map.setCenter(new google.maps.LatLng(lat, lng));
        map.setZoom(zoom);
    };
    this.ShowMarkerByTitle = function(title)
    {
        var count = 0;
        var cBounds = new google.maps.LatLngBounds();
        var activePt = null;
        if (activeInfoWindow != null) activeInfoWindow.close();
        for (var i = 0; i < points.length; i++)
        {
            var show = false;
            for (var j = 0; j < points[i].stores.length; j++)
            {
                if (points[i].stores[j].title == title)
                {
                    activePt = points[i];
                    show = true;
                    break;
                }
            }
            points[i].mapMarker.setVisible(show);
            if(show == true)
            {
                cBounds.extend(points[i].mapMarker.position);
                count++;
            }
        }
        count > 1 ?  map.fitBounds(cBounds) : OpenPoint(activePt);
    };
}

(function($) {
    $.fn.extend(
    {
        mapCtrl: function(options)
        {
            return this.each(function() { $(this).data("mapCtrl", new MapCtrl(options, this)); });
        }
    });
})(jQuery);
