var start_lng = 19.43811021745205;
var start_lat = 52.36486669375249;
var default_zoom = 6;
var markerSELF = null;

var GROUP_MARKERS_IN_RADIUS = 25;
var PAGER_LIMIT_FOR_ENTRY_URL = 5;

var eventIconSet = [
   			[],
   			[2, cjrtGoogleMaps.createIcon("/images/marker/wydarzenie_group.png", new GSize(23, 30), "/images/marker/shadow.png", new GSize(34, 30), new GPoint(0, 30), new GPoint(0, 31))]
   		];
   		
var placeIconSet = [
   		    [],
   		    [2, cjrtGoogleMaps.createIcon("/images/marker/miejsce_group.png", new GSize(23, 30), "/images/marker/shadow.png", new GSize(34, 30), new GPoint(0, 30), new GPoint(0, 31))]
   		 ];

var guideIconSet = [
		    [],
		    [2, cjrtGoogleMaps.createIcon("/images/marker/guide_group.png", new GSize(23, 30), "/images/marker/shadow.png", new GSize(34, 30), new GPoint(0, 30), new GPoint(0, 31))]
		 ];

function map_onload(ev) {

    if (gmapExistingOnload) {
        gmapExistingOnload(ev);
    }

    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById('map_canvas'));

       
        // stworzenie pagera
        var pager = new selfPager([], PAGER_LIMIT_FOR_ENTRY_URL);
        
        // tresc strony
        function renderPage(page, entry){
        	
        	pager.setPage(page);
        	
	   		var result = pager.getResults();
	   		var txt = "<p>" + entry +" w okolicy "+ pager.getNBResults() + ":</p>";
	   		txt += "<ul>";
	   		
	   		for (var i = 0 ; i < result.length; ++i) {
	   			txt += "<li><a class='navigatorLink' href='" + result[i].url + "' >" + result[i].name + "</a></li>";
	   		}
	   		
	   		txt += "</ul>";
	   		
	   		return txt;
        }
        
        
        function pageNavigation() {
        	
	        if (pager.getLastPage() > 1) {	
	        	var txt = '<div class="pageNav">';
	        	
	        	if (pager.getPage() != pager.getFirstPage()) {
	        		txt += '<a href="" class="first">&lt;&lt;</a>';
	        		txt += ' <a href="" class="prev">&lt;</a> ';
	        	}
	        	
	        	txt += 'strona ' +  pager.getPage() + ' z ' + pager.getLastPage();
	        	
	        	if (pager.getPage() != pager.getLastPage()) {
	        		txt += ' <a href="" class="next">&gt;</a>';
	        		txt += ' <a href="" class="last">&gt;&gt;</a>';
	        	}
		        
	        	
	        	txt += '</div>';
	        	return txt;
        	}
	        else {
	        	return '';
	        }
        }
        
        function openInfoWindow(marker, page, entry) {
        	var txt = jQuery('<div class="navigatorPoint">' + renderPage(page, entry) + '<br />' + pageNavigation() + '</div>');
        	
        	jQuery('.pageNav .first', txt).click( function()
	                {
        			  openInfoWindow(marker, pager.getFirstPage(), entry);
	                  
	                  return false;
	                } );
        	
        	jQuery('.pageNav .last', txt).click( function()
	                {
        			  openInfoWindow(marker, pager.getLastPage(), entry);
	                  
	                  return false;
	                } );
        	
        	jQuery('.pageNav .prev', txt).click( function()
	                {
        			  openInfoWindow(marker, pager.getPreviousPage(), entry);
	                  
	                  return false;
	                } );
        	
        	jQuery('.pageNav .next', txt).click( function()
	                {
        			  openInfoWindow(marker, pager.getNextPage(), entry);
	                  
	                  return false;
	                } );
        	
        	marker.openInfoWindow(txt.get(0));
        }
        
        infoWnd = function(entry){
        	return function(marker, markers, selfPoints) {
        		pager.setContent(selfPoints);
        		
        		openInfoWindow(marker, 1, entry);

		   		
        	}
        }
        // ustawienia menagera markerow
        var gma = new cjrtGoogleMaps(map);
        placeMarkerManager = new cjrtMarkerManager(gma, {groupInRadius: GROUP_MARKERS_IN_RADIUS}, placeIconSet);
        eventMarkerManager = new cjrtMarkerManager(gma, {groupInRadius: GROUP_MARKERS_IN_RADIUS}, eventIconSet);
        guideMarkerManager = new cjrtMarkerManager(gma, {groupInRadius: GROUP_MARKERS_IN_RADIUS}, guideIconSet);
        placeMarkerManager.setClickFunctionForGroupedMarkers(infoWnd("Miejsc"));
        eventMarkerManager.setClickFunctionForGroupedMarkers(infoWnd("Wydarzeń"));
        guideMarkerManager.setClickFunctionForGroupedMarkers(infoWnd("Przewodników"));
        
        // ustawienia mapy
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        map.addMapType(G_PHYSICAL_MAP);
        // domyslnie mapa teren
        map.setMapType(G_PHYSICAL_MAP);
        map.disableDoubleClickZoom();
        
        setStartValues();

        createMarkerSELFNavigator(new GLatLng(start_lat, start_lng));
        
        GEvent.addListener(map, "dblclick", function(newmarker, point, last) {
            markerSELF.setLatLng(point);
            map.setCenter(point, map.getZoom());
            getMapsCords();
        });

        GEvent.addListener(markerSELF, "dragend", function(point) {
            markerSELF.setLatLng(point);
            map.setCenter(point, map.getZoom());
            getMapsCords();
        });

        GEvent.addListener(map, "moveend", function( point) {
            getMapsCords();
        });
        
        GEvent.addListener(map, "dragend", function(point) {
        	placeMarkerManager.groupMarkers();
        	guideMarkerManager.groupMarkers();
        	eventMarkerManager.groupMarkers();
        });

        GEvent.addListener(map, "zoomend", function( point) {
            default_zoom = map.getZoom();
            getMapsCords();
            placeMarkerManager.groupMarkers();
        	guideMarkerManager.groupMarkers();
        	eventMarkerManager.groupMarkers();
        });

        getMapsCords();
        if (collapsed == true)
        {
        	toggleNavigator();
        }
    }
    
    
}

function getMapsCords() {
        
        bounds = map.getBounds();
        sw = bounds.getSouthWest();
        ne = bounds.getNorthEast();
        if (markerSELF.getLatLng()) {
            if (document.getElementById("point_lat")) {
                document.getElementById("point_lat").value = markerSELF.getLatLng().lat();
            }
            if (document.getElementById("point_lng")) {
                document.getElementById("point_lng").value = markerSELF.getLatLng().lng();
            }
        }
        if (document.getElementById("map_zoom")) {
            document.getElementById("map_zoom").value = map.getZoom();
        }
        if (document.getElementById("map_sw_lat")) {
            document.getElementById("map_sw_lat").value = sw.lat();
        }
        if (document.getElementById("map_sw_lng")) {
            document.getElementById("map_sw_lng").value = sw.lng();
        }
        if (document.getElementById("map_ne_lat")) {
            document.getElementById("map_ne_lat").value = ne.lat();
        }
        if (document.getElementById("map_ne_lng")) {
            document.getElementById("map_ne_lng").value = ne.lng();
        }
}

function setStartValues() {

        if (document.getElementById("point_lat") && document.getElementById("point_lat").value != "") {
            start_lat = document.getElementById("point_lat").value;
        }
        if (document.getElementById("point_lng") && document.getElementById("point_lng").value != "" ) {
            start_lng = document.getElementById("point_lng").value;
        }
        if (document.getElementById("map_zoom") && document.getElementById("map_zoom").value != "") {
            default_zoom = document.getElementById("map_zoom").value;
            default_zoom = parseInt(default_zoom, 10);
        }
        point = new GLatLng(start_lat, start_lng);
        map.setCenter(point, default_zoom);
}

function createMarkerSELFNavigator(point) {
    if (!markerSELF) {
        var iconSELF = new GIcon(true); 
        iconSELF.image = activeIcon;
        iconSELF.shadow = sctiveIconShadow;

        iconSELF.iconSize = new GSize(23, 30);
        iconSELF.shadowSize = new GSize(34, 30);
        iconSELF.iconAnchor = new GPoint(0, 30);
        iconSELF.infoWindowAnchor = new GPoint(0, 31);

        var options = { icon: iconSELF, draggable: true, bouncy: true};

        markerSELF = new GMarker(point, options);

        map.addOverlay(markerSELF);

    } else {
        markerSELF.setLatLng(point);
    }
}

function mapSearch() {
    var address = document.getElementById("search").value;
    
    geocoder = new GClientGeocoder();
    geocoder.getLocations(address, function(response) {
        if (response && response.Status.code == 200) {
            place = response.Placemark[0];
            point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0])
            if (!markerSELF) 
            {
                createMarkerSELFNavigator(point);
            }
            markerSELF.setLatLng(point);

            // This is, of course, temporary.
            switch (place.AddressDetails.Accuracy) {
                case 1: // Country level
                    zoom = 4;
                    break;
                case 2: // Region (state, province, prefecture, etc.) level
                    zoom = 8;
                    break;
                case 3: // Sub-region (county, municipality, etc.) level
                    zoom = 10;
                    break;
                case 4: // Town (city, village) level accuracy. (Since 2.59)
                case 5: // Post code (zip code) level accuracy. (Since 2.59)
                case 6: // Street level accuracy. (Since 2.59)
                case 7: // Intersection level accuracy. (Since 2.59)
                case 8: // Address level accuracy. (Since 2.59)
                    zoom = 15;
            }
            map.setCenter(point, zoom);
        }
    });
    return false;
}

function selfPoint() {
    this.Id = 0;
    this.name = "";
    this.lat = 0;
    this.lng = "";
    this.url = "";
    // 1 - places
    // 2 - events
    // 3 - guide
    this.type = 0;
}


function createMarkerSELFPoint(selfPoint) {
    var baseIcon = new GIcon();

        baseIcon.iconSize = new GSize(23, 30);
        baseIcon.shadowSize = new GSize(34, 30);
        baseIcon.iconAnchor=new GPoint(0, 30);
        baseIcon.infoWindowAnchor=new GPoint(0, 31);
        
    if (selfPoint.type == 1) {
        var ico = new GIcon(baseIcon, pointIco, null, pointShadow);
        placeIconSet[0][0] = ico;
    }
    else if (selfPoint.type == 2)
    {
	    var ico = new GIcon(baseIcon, eventIco, null, eventShadow);
	    eventIconSet[0][0] = ico;
    }
    else {
        var ico = new GIcon(baseIcon, '/images/marker/guide.png', null, eventShadow);
        guideIconSet[0][0] = ico;
    }

    var options = { icon: ico, draggable: false, bouncy: true};
    
    var marker = new GMarker(new GLatLng(selfPoint.lat, selfPoint.lng), options);

    GEvent.addListener(marker, "click", function(newmarker, point, last) {
        marker.openInfoWindowHtml("<div class='navigatorPoint'><a class='navigatorLink' href='" + selfPoint.url + "' >" + selfPoint.name + "</a> <a class='navigatorZobacz' href='" + selfPoint.url + "' >Zobacz</a></div>");
    });
    
    if (selfPoint.type == 1) {
    	placeMarkerManager.addMarkerWithSelfPoint(marker, selfPoint);
    }
    else if (selfPoint.type == 2) {
    	eventMarkerManager.addMarkerWithSelfPoint(marker, selfPoint);
    }
    else {
    	guideMarkerManager.addMarkerWithSelfPoint(marker, selfPoint);
    }
    
    //map.addOverlay(marker);
}

/* Moje funkcje
 * ----------------------------------------------
 */
function selfMarker() {
    this.Id = 0;
    this.Lat = "";
    this.Lng = "";
    this.Name = "";
    this.Description = "";
    this.Date = "";
}
 
function toggleNavigator()
{
  $('#zwin').toggleClass('enabled').toggleClass('disabled');
  $('#rozwin').toggleClass('enabled').toggleClass('disabled');
  $('#nav_content').toggleClass('enabled').toggleClass('disabled');
  $('#nav_nocontent').toggleClass('enabled').toggleClass('disabled');
  
  if (markerSELF.isHidden())
  {
    markerSELF.setLatLng(markerSELF.getLatLng());
    markerSELF.show();
  }
  else 
  {
    markerSELF.hide();
  }
}
