/*
 * ndMaps.js v1.7
 * ---------
 * Tomas Musiol, 2010
 * Generovani mapovych bodu, tras (KMZ) a navigacnich informaci
 *
 */

map				= null;
mapId			= 0;
geocoder		= null;
bounds			= null;	
baseIcon		= null;
directions		= null;
defaultPoint 	= new GLatLng(49.86720190801742, 18.290176391601562);	// ceska republika

markers			= new Array();
tracks			= new Array();

pathIcons		= "";	// cesta k ikonam
pathTracks		= "";	// cesta k gps trasam

defaultMapType	= G_NORMAL_MAP;
mapTypes		= [G_NORMAL_MAP, G_SATELLITE_MAP];

/*
	-----------------------------------------------
	nastaveni cest pro soubory a inicializace mapy
	-----------------------------------------------
	pElementId		- id elementu do ktereho se generuje mapa
	pPathIcons		- cesta k ulozenym ikonam, ikony se potom nacitaji zvlast k mistum
	pPathTracks		- cesta k ulozenym trasam (KML soubory)
	pZoomMin
	pZoomMax		- minimalni a maximalni uroven priblizeni pro mapu
	pDefaultMapType - typ mapy pro prvnotni zobrazeni. 
					  typy zobrezeni: G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, G_DEFAULT_MAP_TYPES, G_PHYSICAL_MAP
	pMapTypes		- pole typu map. [G_NORMAL_MAP, G_SATELLITE_MAP, ...]
	
*/

function ndMaps_init( pElementId, pPathIcons, pPathTracks, pZoomMin, pZoomMax, pDefaultMapType, pMapTypes ){
	pathIcons = pPathIcons;
	pathTracks = pPathTracks;
	
	pZoomMin = pZoomMin || 1;
	pZoomMax = pZoomMax || 19;
	
	pDefaultMapType = pDefaultMapType || G_NORMAL_MAP;
	pMapTypes = pMapTypes || [G_NORMAL_MAP, G_SATELLITE_MAP];
	
	var zoomMin = parseInt(pZoomMin);
	var zoomMax = parseInt(pZoomMax);
	
	if( zoomMin == 0 || zoomMin == '' ){ zoomMin = 1; }
	if( zoomMax == 0 || zoomMax == '' ){ zoomMax = 19; }	
	
	ndMaps_createMap( pElementId, zoomMin, zoomMax, pDefaultMapType, pMapTypes );
}

/* 
	--------------------------
	inicializace prazdne mapy
	--------------------------
		
*/

function ndMaps_createMap( pElementId, pZoomMin, pZoomMax, pDefaultMapType, pMapTypes ){
	if (GBrowserIsCompatible()){
		
		map = new GMap2(document.getElementById( pElementId ));
		geocoder = new GClientGeocoder();	
		bounds = new GLatLngBounds(); 
		
		// nastaveni standartni ikony		
		baseIcon = new GIcon(G_DEFAULT_ICON);
		baseIcon.shadow = "";
		baseIcon.iconSize = new GSize(34, 34);
		baseIcon.iconAnchor = new GPoint(17, 34);				
	
		// minimalni a maximalni odzoomovani
		if(pZoomMax!=0){
			var zoomMin = pZoomMin;
		
			G_PHYSICAL_MAP.getMinimumResolution = function () { return zoomMin }; 
			G_NORMAL_MAP.getMinimumResolution = function () { return zoomMin }; 
			G_SATELLITE_MAP.getMinimumResolution = function () { return zoomMin }; 
			G_HYBRID_MAP.getMinimumResolution = function () { return zoomMin };		
		}
	
		if(pZoomMax!=0){
			var zoomMax = 16;
		
			G_PHYSICAL_MAP.getMaximumResolution = function () { return zoomMax }; 
			G_NORMAL_MAP.getMaximumResolution = function () { return zoomMax }; 
			G_SATELLITE_MAP.getMaximumResolution = function () { return zoomMax }; 
			G_HYBRID_MAP.getMaximumResolution = function () { return zoomMax };		
		}													
					
		// vymazani a vycentrovani mapy		
		map.clearOverlays();
		map.setCenter(defaultPoint, 11); // defaultni zoom
		map.setUIToDefault();
		
		// G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, G_DEFAULT_MAP_TYPES, G_PHYSICAL_MAP
		
		map.removeMapType(G_NORMAL_MAP);
		map.removeMapType(G_SATELLITE_MAP);
		map.removeMapType(G_HYBRID_MAP);
		map.removeMapType(G_PHYSICAL_MAP);
		
		// urceni ovladacich prvku
		for(i=0; i<pMapTypes.length; i++){ map.addMapType( pMapTypes[i] ); }
		
		map.disableScrollWheelZoom();
		map.setMapType(pDefaultMapType);
	
	}				
}

// -------------------------

// vytvoreni mapoveho bodu podle zadane adresy - ziskani GPS souradnic z adresy
// pCenterType = "none","center","pan"
function ndMaps_createPoint( pName, pAddress, pIco, pIcoWidth, pIcoHeight, pUrl, pCenterType, pZoomLevel, pStartBubbleShow ){
	
	pZoomLevel = pZoomLevel || 11;
	pZoomLevel = parseInt( pZoomLevel );
	
	pStartBubbleShow = pStartBubbleShow || false;
	
	if (geocoder) {
		
		// vlastni ikona
		if (pIco!=""){
			var customIcon = null;
			var customIconImage = pathIcons + pIco;				
			customIcon = new GIcon(baseIcon);	
			customIcon.image = customIconImage;
			customIcon.iconSize = new GSize(pIcoWidth, pIcoHeight);
			customIcon.iconAnchor = new GPoint(pIcoWidth/2, pIcoHeight);			
		}
		
		// sestaveni cele adresy
		var address = pAddress;
		var addressType = typeof address;

		geocoder.getLatLng( address, function(point) {

			// adresa neexistuje
			if (!point){ alert("Adresa "+ address + " nebyla nenalezena!\nZadejte správnou adresu."); } 

			// adresa existuje, vytvor interaktivni znacku
			else{
				
				var marker;
				
				// custom ikona
				if (customIcon != null){ marker = new GMarker(point, {icon:customIcon}); }
				// standardni ikona
				else{ marker = new GMarker(point); }
				
				// ulozeni ID znacky
				mapId = mapId + 1;
				marker.id = pName;								
								
				var point = marker.getPoint();

				// pridani znacky do globalniho pole
				markers.push( marker );

				map.addOverlay( marker );			// pridani nove znacky na mapu
				if( pCenterType !="" && pCenterType != "none" ){
					if( pCenterType == "center" ){
						map.setCenter( point, pZoomLevel );			// vycentrovani mapy
					}
					if( pCenterType == "pan" ){
						map.panTo( point, 1000 );		// vycentrovani mapy
					}
				}

				// informacni bublina - zobrazeni ihned
				if( pStartBubbleShow == true ){ ndMaps_showAddress( pName, marker, pIco, pUrl ); }
				
				// klikani na ikonky - zobrazeni bubliny
				GEvent.addListener( marker, "click", function() { ndMaps_showAddress( pName, marker, pIco, pUrl ); });				
			}
			
		});				
	}
}

// -------------------------

// vytvoreni trasy
function ndMaps_createTrack( pKMLFile ){
	if (GBrowserIsCompatible()){
		
		// nacteni kml souboru
		var geoXml = new GGeoXml(pathTracks + pKMLFile);		
		map.addOverlay( geoXml );
				
		// pridani trasy do globalniho pole
		tracks.push( geoXml );
		
		// vycentrovani mapy na zvolenou trasu
		//geoXml.gotoDefaultViewport(map);
		//geoXml.getDefaultCenter();
				
	}
}

// -------------------------

// vypsani detailu pro mapovou znacku
function ndMaps_showAddress( pName, pMarker, pIco, pUrl ){
	if( geocoder ){

		var ico = pathIcons + "/" + pIco;

		point = pMarker.getPoint();
		geocoder.getLocations( point, function(address){

			if( address ){
				var newFullAddress = address.Placemark[0];
				var newAddress = newFullAddress.address;									
				var newAddressArray = newAddress.split(", ",2);

				var newStreet = newAddressArray[0];
				var newCity = newAddressArray[1];
			}

			// sestaveni adresy
			var addressString = "<p id='ndMaps_picture'><img src='"+ ico +"' /></p><h3 id='ndMaps_name'>"+ pName +"</h3><p id='ndMaps_address'>"+newStreet+"<br />"+ newCity +"</p>";
			// pridani URL
			if( pUrl != '' ){
				pUrl = pUrl.replace(/&lt;/g,"<");
				pUrl = pUrl.replace(/&gt;/g,">");			
				addressString += "<p id='ndMaps_url'>"+ pUrl +"</p>";
			}

			var addressBubble = "<div class='ndMaps_bubble'>"+ addressString +"</div>";

			// generovani informacni bubliny
			pMarker.openInfoWindowHtml( addressBubble );

		});

	}
}

// -------------------------

// vytvoreni navigacniho pruvodce - jak se k nam dostanete?
function ndMaps_createNavigation( pStartAddress, pEndAddress, pDirectionPanel ){
				
	// bude se vypisovat cesta?
	if( pDirectionPanel != null && pDirectionPanel != "" ){
						
		// vycisteni prostoru pro generovani navigacnich informaci
		$("#"+ pDirectionPanel ).children().remove();			
		
		// ziskani objektu pro vykresleni navigacnich informaci				
		var directionsPanel = document.getElementById( pDirectionPanel );
		directions = new GDirections(map, directionsPanel);
	}
	else{
		directions = new GDirections(map);
	}	
		
	// vykresleni cesty
	directions.load("from: "+ pStartAddress +" to: "+ pEndAddress );
	
}

// -------------------------

function ndMaps_setCenter( pAddress, pZoomLevel ){

	// sestaveni cele adresy
	var address = pAddress;
	var zoomLevel = parseInt(pZoomLevel);
	geocoder.getLatLng( address, function(point) {

		// adresa neexistuje
		if (!point){ alert("Adresa "+ address + " nebyla nenalezena!\nZadejte správnou adresu."); } 

		// adresa existuje, vytvor interaktivni znacku
		else{
			map.setCenter( point, zoomLevel );	// vycentrovani mapy
		}
		
	});
}

//TODO: ziskani adresy na zaklady umisteni znacky
function ndMaps_getAddress(){}

//TODO: zazoomovani vsech znackovych bodu
function ndMaps_allzoom(){ }

// -------------------------

