if(typeof Tunisia == 'undefined' || !Tunisia) var Tunisia = {};

/**
 * Google map for Tunisia
 * @author Tsuyoshi Saito <tsuyoshi@on-idle.com>
 * @version 1.0
 */
Tunisia.Map = (function(){
    // Private variables
    var _data;
    var _currentMarker = {};
    var _infoWindow;
    var showAllData = false;
    var initialized = false;
    
    // Private methods
    
    /**
     * Pan _map to region's geocode
     * @param {Object} id
     */
    var panToRegion = function(id){
        var data = _data.regions;
        if (!data[id]) return Map.google.resetMap();
        return Map.google.gotoPoint(data[id].lat, data[id].lng, data[id].zoom);
    }
    
    /**
     * Place markers from json data
     * @param {Object} data
     */
    var placeMarkers = function(){
        Map.google.clearMarkers();
        var markers = [];
        // Activities
        var activities = _data.activities;
        $.each(activities, function(i, item){
            var point = Map.google.getPoint(item.lat, item.lng);
            var options = {
                active: false
            }
            $.extend(item, options);
            var addtoMarker = false;
            $.each(item.category, function(i, category){
                if (_data.categories.activity.id[category] && _data.categories.activity.id[category].active) 
                    addtoMarker = true;
            });
            if (addtoMarker) {
                var marker = Map.google.createMarker(point, item, icon({
                    src: item.icon.src
                }));
                setMarkerEvents(marker);
                markers.push(marker);
            }
        });
        // Accommodations
        var accommodations = _data.accommodations;
        $.each(accommodations, function(i, item){
            var point = Map.google.getPoint(item.lat, item.lng);
            var options = {
                active: false
            }
            $.extend(item, options);
            var addtoMarker = (_data.categories.accommodation.id[item.category] && _data.categories.accommodation.id[item.category].active) ? true : false
            if (addtoMarker) {
                var marker = Map.google.createMarker(point, item, icon({
                    src: item.icon.src
                }));
                setMarkerEvents(marker);
                markers.push(marker);
            }
        });
        // Events
        var events = _data.events;
        $.each(events, function(i, item){
            var point = Map.google.getPoint(item.lat, item.lng);
            var options = {
                active: false
            }
            $.extend(item, options);
            var addtoMarker = false;
            $.each(item.months, function(i, month){
                if (typeof(_data.categories.events.month[month]) != 'undefined') {
                    if (_data.categories.events.month['all'].active) 
                        addtoMarker = true;
                }
            });
            if (addtoMarker) {
                var marker = Map.google.createMarker(point, item, icon({
                    src: item.icon.src
                }));
                setMarkerEvents(marker);
                markers.push(marker);
            }
        });
        Map.google.addMarkers(markers);
    }
    
    /**
     * Set marker events
     * @param {Object} marker
     */
    var setMarkerEvents = function(marker){
        GEvent.addListener(marker, 'mouseover', function(){
            onMarkerMouseover(this);
        });
        GEvent.addListener(marker, 'mouseout', function(){
            onMarkerMouseout(this);
        });
        GEvent.addListener(marker, 'click', function(){
            onMarkerClick(this);
        });
    }
    
    /**
     * Callback for marker clicked
     * @param {Object} marker
     */
    var onMarkerClick = function(marker){
        $(Map.google.markers()).each(function(i, item){
            item.active = false;
        });
        marker.active = true;
        Map.google.panTo(marker.lat, marker.lng);
        var infoWindow = _infoWindow.open(marker, infoWindowAddClick);
    }
    
    /**
     * Add button for infor window
     * @param {Object} object
     */
    var infoWindowAddClick = function(object, clicked){
        var o = object;
        var url = Map.Config.read('url.addToMyMap');
        $.ajax({
            url: url,
            data: {
                'data[ItineraryItem][object_id]': o.object_id,
                'data[ItineraryItem][object]': o.object
            },
            type: 'post',
            dataType: 'json',
            cache: false,
            beforeSend: function(){
                $('#loading').vCenter().fadeIn();
            },
            error: function(){
                $('#loading').fadeOut();
                alert('Please create a profile in My Tunisia to create, save and send itineraries.');
            },
            success: function(data){
                $('#loading').fadeOut();
                $('.my-tunisia-itinerary-item-counter').html(data.total);
                $(clicked).addClass('added').html('Added to my map').unbind('click').css({'cursor':'default'});
            }
        });
    }
    
    var onMarkerMouseover = function(marker){
        $('#gmarker-label').remove();
        var id = '#mtgt_' + marker.id;
        _currentMarker.zindex = GOverlay.getZIndex(marker.getPoint().lat());
        $(id).css('z-index', 500003);
        var pos = $(id).position();
        var label = $('<span id="gmarker-label" class="' + marker.type + '"></span>').css({
            'position': 'absolute',
            'z-index': 500001,
            'top': (pos.top - 10) + 'px',
            'left': pos.left + 11 + 'px'
        }).html(marker.title);
        $(id).parent().append(label);
    }
    
    var onMarkerMouseout = function(marker){
        $('#gmarker-label').remove();
        var id = '#mtgt_' + marker.id;
        $(id).css('z-index', _currentMarker.zindex);
    }
    
    // Public method
    
    /**
     * Load requested data from various URL parameters
     */
    var loadQueryData = function(){
        var path = $.getURLParam('activity-group', '?');
        if (path) {
            $('a#activity-group-' + path).click();
        }
        var id = $.getURLParam('activity', '?');
        if (id) {
            var target = $('.category-check[rel=activity:' + id + ']');
            if (target) {
                var parent = $(target).parent().parent().parent();
                $(target).click();
                $(parent).find('ul').slideDown('fast');
                $(parent).find('a.parent').addClass('open');
            }
        }
        var path = $.getURLParam('activity', '?');
        if (path) {
            var data = _data.categories.activity.path;
            if (typeof(data[path]) != 'undefined') {
                var target = $('.category-check[rel=activity:' + data[path].id + ']');
                if (target) {
                    var parent = $(target).parent().parent().parent();
                    $(target).click();
                    $(parent).find('ul').slideDown('fast');
                    $(parent).find('a.parent').addClass('open');
                }
            }
        }
        var path = $.getURLParam('accommodation', '?');
        if (path) {
            if (path == 'all') {
                $('.accordion-content.places-to-stay .category-check').click();
            }
            else {
                var data = _data.categories.accommodation.path;
                if (typeof(data[path]) != 'undefined') {
                    var target = $('.category-check[rel=accommodation:' + data[path].id + ']');
                    if (target) {
                        $(target).click();
                    }
                }
            }
        }
        var path = $.getURLParam('event', '?');
        if (path) {
            if (path == 'all') {
                $('.accordion-content.events .category-check').click();
            } else {
                var data = _data.categories.events.month;
                if (typeof(data[path]) != 'undefined') {
                    var target = $('.category-check[rel=event:' + data[path].id + ']');
                    if (target) {
                        $(target).click();
                    }
                }
            }
        }
    }
    
    var onDataLoaded = function(data) {
        // Store data
        _data = data;
		
        // Set initialized true;
        initialized = true;
        
        // Observe map region dropdown
        $('#map-region').change(function(event){
            event.preventDefault();
            return panToRegion($(this).val());
        }).change();
        
        // Observe accordion menu        
        $('.accordion-content ul li a.parent').click(function(event){
            event.preventDefault();
            if ($(this).hasClass('open')) {
                $(this).removeClass('open');
                $(this).parent('li').find('ul').slideUp('fast');
                $(this).parent().find('a.category-check').removeClass('checked').trigger('checked');
            } else {
                $(this).addClass('open');
                $(this).parent('li').find('ul').slideDown('fast');
                $(this).parent().find('a.category-check').addClass('checked').trigger('checked');
            }
			if (initialized) placeMarkers();
        });
        
        // Observe category check button
        $('a.category-check').bind('checked', function(event, data){
			var target = event.target;
            var id = $(target).attr('rel').split(':');
            var status = $(target).hasClass('checked') ? true : false;
            if (id[0] == 'activity') {
                var data = _data.categories.activity.id;
                data[id[1]].active = status;
            }
            if (id[0] == 'accommodation') {
                var data = _data.categories.accommodation.id;
                data[id[1]].active = status;
            }
            if (id[0] == 'event') {
                var data = _data.categories.events.month;
                data[id[1]].active = status;
            }
        }).click(function(event){
            event.preventDefault();
            $(this).toggleClass('checked');
            $(this).trigger('checked', this);
			if (initialized) placeMarkers();
        });
        
        // If set to load all at this stage
        if (showAllData) {
            $('.accordion-content ul li a.parent').click();
            $('.category-check').click();
            placeMarkers();
        }
		
		// Map instruction overlay
		$('.map-instruction').click(function(event){
			if ($(this).hasClass('open')) {
				$(this).removeClass('open');
			} else {
				$(this).addClass('open');
			}
			$('.map-instruction-overlay').toggle('normal');
		}).fadeIn().trigger('click');
        
        loadQueryData();
    }
    
    return {
        init: function(options) {
            Map.Config.store(options);
               
            var map = Map.google;
            map.setup();
            
            // Setting up info window class
            _infoWindow = new Map.InfoWindow();
            
			var $preloader = $('#tunisia-map-data-preloader').css({
				'z-index' : 1000000 
			}).vCenter();
			
            var url = Map.Config.read('url.data');
            if(url) {
                // Loading json data for map markers
                $.ajax({
                    url: url,
                    type: 'get',
                    dataType: 'json',
                    cache: false,
                    beforeSend: function(){
                        $preloader.vCenter().fadeIn();
                    },
                    error: function(){
                        $preloader.fadeOut();
                        alert('Error loading data.....');
                    },
                    success: function(data){
                        $preloader.fadeOut();
                        onDataLoaded(data);
                    }
                });
            }
        }
    }
}());