/*
=============================================================
						 COPY RIGHTS			
			-------------------------------------
			Przedsiebiorstwo Informatyczne WTSOFT
			-------------------------------------
=============================================================
*/

(function($){
	$.fn.googleMap = function(settings){
		var settings = jQuery.extend({
			// Opcje mapy
			width: null,
			height: null,
			markersList: false,
			// Centrowanie
			lat: 52.173931692568,
			lng: 18.8525390625,
			zoom: 6,
			// Kontrolki
			zoombar: false,
			overwiev: false,
			scale: false,
			// Teksty
			mapTypeMapaText: 'Mapa',
			mapTypeSatelitaText: 'Satelita',
			mapTypeHybrydaText: 'Hybryda',
			noTitle: 'brak nazwy',
			showAccessFrom: 'Pokaż trasę do tego miejsca z:',
			// Kontrola myszy
			dbcZoom: false,
			scrollZomm: false,
			// Elementy
			markersListElement: '.wts_btp_markerslist',
			accessInfoElement: '.wts_btp_access_info',
			// Obiekt mapy
			gMap: null,
			zoomArea: null,
			zoomAreaPoint: null,
			access: null,
			markers: {}
		},settings);
		
		// Przepisanie pasujacych elementow
		var jQueryMatchedObj = this;
		
		function initialize(){
			if(!GBrowserIsCompatible())
				return false;
			// Generowanie mapy dla wszysztkich elementow
			if(jQueryMatchedObj.length == 0)
				return false;
			jQueryMatchedObj.each(function(){
				setView($(this).get(0));
				generate($(this).get(0));
				// Generowanie listy markerow
				if(settings.markersList == true){
					generateMarkersList();
				}
			})
			
			// Obsluga dojazdu
			accessInfoElement = $(settings.accessInfoElement).get(0);
			settings.access = new GDirections(settings.gMap, (accessInfoElement? accessInfoElement : null));
			
			setNavigation();
		}
		
		function trim(str){
			if(typeof str != 'string' || str.length == 0)
				return str;
			return str.replace(/^\s+/,'','gm').replace(/\s+$/,'','gm').replace(/^%20/,'','gm').replace(/%20$/,'','gm');
		}
		
		// Funkcja pokazuje dojazd
		function setShowAccessNavigation(){
			$('.showAccess').submit(function(){
				from 	= $('form.showAccess :input.from').val();
				to 		= $('form.showAccess :input.to').val();
				settings.access.load('from: '+from+' to: @'+to);
				$(settings.accessInfoElement).show('slow');
				return false;
			})
		}
		
		// Funkcja dodaje marker do mapy
		function addMarker(lat,lng,mTitle,ico_url,ico_shadow_url){
			var point = new GLatLng(lat,lng);
			
			var marker = new GMarker(point,{title: mTitle});  
			marker.txt = mTitle;
			marker.lat = lat;
			marker.lng = lng;
			
			GEvent.addListener(marker,'click',function(){
				info  = '<div style="width: 220px;"><strong>'+marker.txt+'</strong><br /><br />';
				info += settings.showAccessFrom+'<br />';
				info += '<form class="showAccess" style="width: 200px;" onsubmit="return false;">';
				info += '<input type="hidden" name="to" class="to" value="'+marker.lat+','+marker.lng+'" />'
				info += '<input type="text" class="from" value="" name="from" style="width: 100%; font-family: Verdana;" />';
				info += '</form></div>';
				marker.openInfoWindowHtml(info);
			});
			GEvent.addListener(marker,'infowindowopen',function(){
				setShowAccessNavigation();
			});
			
			settings.gMap.addOverlay(marker);
		}
		
		function generateMarkersList(){
			if(typeof settings.markers.length != 'udefined' && settings.markers.length > 0){
				for(i in settings.markers){
					marker = settings.markers[i];
					if(typeof marker['cords'] == 'string' && marker['cords'].length > 0){
						$(settings.markersListElement).append('<li><a href="'+marker['cords']+'">'+(marker['title']? marker['title'] : '<span class="grey italic">'+settings.noTitle+'</span>')+'</a></li>');
					}
				}
			}
		}
		
		function setNavigation(){
			// Pokaz na mapie
			$(settings.markersListElement+' a').unbind('click').click(function(){
				var cords = $(this).attr('href');
				cords = cords.split('/');
				cords = cords.pop();
				cords = cords.split(',');
				cords[0] = trim(cords[0]);
				cords[1] = trim(cords[1]);
				settings.gMap.setCenter(new GLatLng(cords[0],cords[1]),11);
				
				return false;
			});
			
			// Wyczysc trase
			$('.wts_btp_clear_access').unbind().bind('click',function(){
				if(settings.access){
					settings.access.clear();
					$(settings.accessInfoElement).hide('fast');
					if(settings.zoomAreaPoint)
						settings.gMap.setCenter(settings.zoomAreaPoint,settings.zoomArea);
				}
				return false;
			});
		}
		
		// Funkcja ustawia wymiary warstwy
		function setView(el){
			if(!el)
				return false;
			el.style.width = settings.width;
			el.style.height = settings.height;
		}
		
		function generate(el){
			// Tworzymy nowy obiekt mapy
			settings.gMap = new GMap2(el);
			gMap = settings.gMap;
			// Centrowanie mapy
			gMap.setCenter(new GLatLng(settings.lat,settings.lng),settings.zoom);
			// Kontrolki
			if(settings.zoombar == true)
				gMap.addControl(new GLargeMapControl());
			if(settings.overwiev == true)
				gMap.addControl(new GOverviewMapControl());
			if(settings.scale == true)
				gMap.addControl(new GScaleControl());
			// Zmiana nazw typow map
			var mapType = gMap.getMapTypes();  
			mapType[0].getName = function() { return settings.mapTypeMapaText;}   
			mapType[1].getName = function() { return settings.mapTypeSatelitaText;} 
			mapType[2].getName= function() { return settings.mapTypeHybrydaText;}
			gMap.addControl(new GMapTypeControl());
			
			// Obsluga myszy
			// Przyblizanie po podwojnym kliknieciu
			gMap.enableContinuousZoom();
			if(settings.dbcZoom == true){
				gMap.enableDoubleClickZoom();
			}
			// Przyblizanie za pomoca scrolla
			if(settings.scrollZoom == true)
				gMap.enableScrollWheelZoom();
				
			// Markery
			if(typeof settings.markers.length != 'udefined' && settings.markers.length > 0){
				var zoomArea = new GLatLngBounds()
				for(i in settings.markers){
					marker = settings.markers[i];
					if(typeof marker['cords'] == 'string' && marker['cords'].length > 0){
						var cords = marker['cords'].split(',');
						cords[0] = trim(cords[0]);
						cords[1] = trim(cords[1]);
						addMarker(cords[0],cords[1],marker['title']);
						zoomArea.extend(new GLatLng(cords[0],cords[1]));
					}
				}
				settings.zoomArea = this.gMap.getBoundsZoomLevel(zoomArea);
				settings.zoomAreaPoint = zoomArea.getCenter();
				settings.gMap.setCenter(settings.zoomAreaPoint,settings.zoomArea);
			}
		}
		
		initialize();
		return true;
	}
})(jQuery);