var Pfizer = Pfizer || {};
Pfizer.GMap.MarkerOverlay = (function($, google) {
    'use strict';

    var MarkerOverlay = function (marker_positions, marker_colors) {
        this.marker_positions = marker_positions;
        this.marker_colors = marker_colors;

        this.markers = this._create_markers();
        this.infos = this._create_infos();
    };

    MarkerOverlay.prototype.add_to_map = function (map) {
        this.map = map;
    };

    MarkerOverlay.prototype.show_category = function (category) {
        var markers = this.markers[category];

        for (var i in markers) {
            markers[i].setMap(this.map);
        }
    };

    MarkerOverlay.prototype.hide_category = function (category) {
        var markers = this.markers[category];
        var infos = this.infos[category];

        for (var i in markers) {
            markers[i].setMap(null);
            infos[i].close();
        }
    };

    MarkerOverlay.prototype._create_markers = function () {
        var markers = [];

        for (var i in this.marker_positions) {
            var marker_positions_for_category = this.marker_positions[i];
            var markers_for_category = [];

            for (var j in marker_positions_for_category) {
                var marker_pos = marker_positions_for_category[j];
                var marker = this._create_marker(marker_pos, i);
                markers_for_category.push(marker);
            }
            markers.push(markers_for_category);
        }

        return markers;
    };

    MarkerOverlay.prototype._create_marker = function (marker_pos, i) {
        var image = new google.maps.MarkerImage(
            ("/responsibility/global_health/img/marker" + i + ".png"),
            new google.maps.Size(37, 47),
            new google.maps.Point(0, 0),
            new google.maps.Point(1, 47)
        );
        var shape = {
            coord : [0, 0, 0, 21, 37, 21, 37, 0],
            type  : "poly"
        };
        // XXX shadow?
        return new google.maps.Marker({
            position : new google.maps.LatLng(marker_pos[0], marker_pos[1]),
            icon     : image,
            shape    : shape
        });
    };

    MarkerOverlay.prototype._create_infos = function () {	
		var thiscopy = this;
        var infos = [];
        for (var i in this.markers) {
            var infos_for_category = [];
            for (var j in this.markers[i]) {
                var info = this._create_info(i, j);
                var marker = this.markers[i][j];

                google.maps.event.addListener(
                    marker,
                    'click',
                    (function () {
						var overlay = thiscopy;
                        var to_open = info;
                        return function () {
							to_open.toggle(overlay.map);
                            if (overlay.currently_open != to_open
                             && overlay.currently_open != undefined) {
								overlay.currently_open.close();
                                document.getElementById("map_canvas_menu_control").style.display = 'none';
                            }
							else if (overlay.currently_open = to_open.opened) {
								document.getElementById("map_canvas_menu_control").style.display = 'none';
							}
							else
							{
								document.getElementById("map_canvas_menu_control").style.display = 'block';
							}
                            overlay.currently_open
                                = to_open.opened ? to_open : null;
                        };
                    })()
                );

                infos_for_category.push(info);
            }
            infos.push(infos_for_category);
        }

        return infos;
    };

    MarkerOverlay.prototype._create_info = function (i, j) {
        return new Pfizer.GMap.InfoWindow({
            content : $('.info_group' + i).eq(j),
            marker  : this.markers[i][j],
            color   : this.marker_colors[i]
        });
    };

    return MarkerOverlay;
})(jQuery, google);
