(function($){
	
	$.extend({
        openMap: function(parameters, mapUrl){
			if( !mapUrl )
				mapUrl = cmsPoiKartUrl;
			if( typeof parameters.mapDataUrl != "undefined" ) {
				parameters.mapDataUrl = encodeURIComponent(parameters.mapDataUrl);
			}
			var url = mapUrl + "#/?";
 			for (var key in parameters) {
				url +=  key + "=" + parameters[key] + "&";
			}
			url = url.substring( 0, url.length - 1 );
			var windowName = "poiKartMapa";
			if( typeof serwisKod != "undefined" ) windowName += serwisKod;
			window.open(url, windowName);
		}
    });
	
	
    $.fn.cmsPubMap = function(options){

        
        var defaults = {
            showSearch: true,
			showSearchText: false,
            showCategories: true,
            defaultMode: "list",
			tobiekt2IdVal: false,
            lang: "pl",
            poiPubUrl: "/poi/PoiPub",
            poiKartUrl: "/pl/map/",
            tooltipPosition: "center left"
        
        };

        var options = $.extend(defaults, options);
        var _this = this;
        this.regional = {
            en: {
                "Szukaj obiektu lub szlaku:": "Search attraction or track:",
                "Szukaj": "search",
                "Kategorie:": "Categories:",
                "wszystkie kategorie": "all categories",
                "wczytywanie...": "loading...",
                "zobacz na mapie": "show on map",
                "zobacz na liście": "show on list"
            
            },
            de: {}
        }[options.lang];
        _this._ = $.i18n;
        
        
        
        
        var container = $(this);
        var tklas1Id = 0;
        var selectedCategory = $("<p class='ui-widget-content ui-corner-all' id='cmsPubMap-categories-selected' />");
        var tooltip = $("<div/>");
        
        /* Wyszukiwanie */
        if (options.showSearch == true) {
            var searchContainer = $("<div class='cmsPubMap-search-container' />");
            
            var searchInput = $('<input type="text" class="ui-corner-all ui-widget-content" id="cmsPubMap-search-input" name="cmsPubMap-search-input" />').keyup(function(e){
                if (e.keyCode == 13 && $("#cmsPubMap-search-input").val().length > 2) {
                    search();
                }
            });
            
            var searchButton = $('<button id="cmsPubMap-search-button">' + _this._("Szukaj") + '</button>').button({
                icons: {
                    primary: "ui-icon-search"
                },
                text: options.showSearchText
            }).click(function(){
                search();
            });
            
            searchContainer.append($("<label for='cmsPubMap-search-input'>" + _this._("Szukaj obiektu lub szlaku:") + "</label>"), searchInput, searchButton, $("<div style='clear: both' />"));
            container.append(searchContainer);
            
            $(searchInput).autocomplete({
                source: function(request, response){
                    $.ajax({
                        url: options.poiPubUrl + '?q=kartSzukaj&lang=' + options.lang,
                        dataType: "jsonp",
                        jsonp: "jsonpCallback",
                        jsonpCallback: "autocompleterCallback",
                        data: {
                            term: extractLast(request.term)
                        },
                        success: function(data){
                            response($.ui.autocomplete.filter(data, extractLast(request.term)));
                        }
                    });
                },
                select: function(event, ui){
                    var terms = split(this.value);
                    // remove the current input
                    terms.pop();
                    // add the selected item
                    terms.push(ui.item.value);
                    // add placeholder to get the comma-and-space at the end
                    terms.push("");
                    this.value = terms.join(", ");
                    return false;
                },
                
                focus: function(){
                    // prevent value inserted on focus
                    return false;
                },
                minLength: 2
            });
            
        }
        
        var categoriesContainer = $("<div class='cmsPubMap-categories-container' />");
        categoriesContainer.append("<p>" + _this._("Kategorie:") + "</p>");
        
        selectedCategory.html(_this._("wszystkie kategorie"));
        selectedCategory.css("cursor", "pointer");
        categoriesContainer.append(selectedCategory);
        
        container.append(categoriesContainer);
        
        selectedCategory.click(function(){
        
            var tmpTxt = selectedCategory.html();
            selectedCategory.html(_this._("wczytywanie..."));
            $.ajax({
                dataType: 'jsonp',
                jsonp: "jsonpCallback",
                success: function(data){
                
                    categories = makeCategoriesTree(data);
                    
                    
                    var categoriesList = $("<div class='tooltip' />").hide();
                    
                    categoriesList.append(categories, $("<div style='clear: both;' />'"));
                    categoriesContainer.append(categoriesList);
                    
                    selectedCategory.tooltip({
                        events: {
                            def: "click,mouseout"
                        },
                        position: options.tooltipPosition,
                        effect: "fade",
						relative: true,
                        delay: 150
                    });
                    
                    var api = $(selectedCategory).data("tooltip");
                    api.show();
                    selectedCategory.html(tmpTxt);
                    
                    
                    
                    
                },
                url: options.poiPubUrl + '?q=kartKlas&lang=' + options.lang
            });
            
            
        });
        
        
        /*
         */
        container.append($('<a class="cmsPubMap-open" name="map" id="cmsPubMap-open-map">' + _this._("zobacz na mapie") + '</a>'), $('<a class="cmsPubMap-open" name="list" id="cmsPubMap-open-list">' + _this._("zobacz na liście") + '</a>'));
        
		if (typeof resize == 'function') {
			resize();
		}
        
        $(".cmsPubMap-open", container).click( function(event){
			var tklas1IdVal = tklas1Id;
			
			
            var modeVal = $(this).attr("name");
            var szukajVal = $("#cmsPubMap-search-input").val();
			var mapOptions = {
				mode: modeVal,
				szukaj: szukajVal,
				'tklas1Id': tklas1IdVal
			};
			if( options.tobiekt2IdVal )
				mapOptions.tobiekt2Id = options.tobiekt2IdVal;
				
			
				
			$.openMap(mapOptions, options.poiKartUrl);

            return false;
        });
        
        
        
        function split(val){
            return val.split(/,\s*/);
        }
        
        function extractLast(term){
            return split(term).pop();
        }
        
        
        function makeCategoriesTree(data){
        
            var list = $("<div />");
            
            $(data.tklas1).each(function(index){
            
                if (this.ile <= 1) 
                    return true;
                
                if (this.rodzicId == 0) 
                    var ikona = '<img width="16" height="16" src="' + data.tklas1Ikona16Uri + this.ikona + '" alt="" />';
                else 
                    var ikona = '';
                //Element listy kategorii
                var element = $('<div id="' + this.tklas1Id + '"><p>' + ikona + '<span><a href="#">' + this.nazwa + '</a> (' + this.ile + ')' + '</span></p></div>');
                
                element.click(function(event){
                    selectedCategory.text($("span:first", this).text());
					
                    tklas1Id = $(this).attr("id");
                    tooltip.fadeOut();
                    //event.stopPropagation();
                    return false;
                })
                
                if (this.rodzicId == 0) {
                    list.addClass("cmsPubMap-list");
                    element.addClass("cmsPubMap-level1");
                }
                else {
                    element.addClass("cmsPubMap-level2");
                }
                
                if (this.dzieci) {
                    var sublist = $("<ul></ul>");
                    $(this.tklas1).each(function(){
                    
                        if (this.ile <= 1) 
                            return true;
                        
                        var sublistElement = $('<li id="' + this.tklas1Id + '"><p><span><a href="#">' + this.nazwa + '</a> (' + this.ile + ')' + '</span></p></li>');
                        sublistElement.addClass("cmsPubMap-level2");
                        sublist.append(sublistElement);
                        
                        sublistElement.click(function(event){
                            selectedCategory.text($("span:first", this).text());
                            tklas1Id = $(this).attr("id");
                            tooltip.fadeOut();
                            event.stopPropagation();
                            return false;
                        })
                    });
                    
                    
                    
                    
                    element.append(sublist, $("<div style='clear: both;' />"));
                }
                
                list.append(element);
                
            });
            
            
            
            return list;
        }
        
        function search(){
            var queryString = $("#cmsPubMap-search-input").val();
            window.open(options.poiKartUrl + "#?tklas1Id=" + tklas1Id + "&mode=" + options.defaultMode + "&szukaj=" + queryString);
            
        }
        
    }
})(jQuery);

