//console.log();
//window.alert=function(s){ console.log(s);}

function mapyPolski(param){
	MO={}; //zwracana instancja obiektu klasy mapyPolski

	if (typeof(param)=="undefined"){ //jeśli nie przekazano żadnych parametrów tworzymy pusty obiekt param żeby nie wyskakiwały błędy
		var param={};
	}	
	
	//--------KONFIGURACJA---------------
	var zoom=param.zoom || 6;
	var startLat=param.startLat || 52.17393169256846;
	var startLon=param.startLon || 18.8525390625;
	var IDMapaDiv=param.IDMapaDiv || "mapaPolski";
	var jezyk='polski';
	 
	//zoom
	var IDZoomIn=param.IDZoomIn || "zoomIn";
	var IDZoomOut=param.IDZoomOut || "zoomOut";
	
	//mala mapka	
	var IDMalaMapka=param.IDMalaMapka || 'mapa_mala_map';	
	var zoomSegmentu=param.zoomSegmentu || 8;
	
	//drag zoom
	var dragZoomBackButtonHTML=param.dragZoomBackButtonHTML || '<input id="dragZoomBack" type="button" value="" >';
	var dragZoomButtonHTML=param.dragZoomButtonHTML ||  '<input id="dragZoom" type="button" value="" title="zaznacz fragment który przybliżyć">';
	var dragZoomButtonZoomingHTML= param.dragZoomButtonZoomingHTML || '<input id="dragZoom" type="button" value="">';	
	var dragZoomButtonStartingStyle=param.dragZoomButtonStartingStyle || { width: '24px', height: '38px'};
	var dragZoomBackButtonStartingStyle=param.dragZoomBackButtonStartingStyle || { width: '24px', height: '38px', display:"none"};
	var dragZoomPolozenie =param.dragZoomPolozenie || new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(35, 120));
	
	//ruler
	var rulerIconSrodek="graf/marker_red.png";
	var rulerIconPromien="graf/marker_green.png";
	var IDFormSrodekLon=param.IDFormSrodekLon || "east"
	var IDFormSrodekLat=param.IDFormSrodekLat || "north";
	var IDFormPromien=param.IDFormPromien || "kilometry";
	
	//słownik z tekstami
	var slownik={ polski : {
													pomocWDymku : '<ul style="font-size:13px;"><li>użyj zielonego markera aby zmienić promień obszaru szukania'+
																									'</li>użyj czerwonego markera aby zmieniś środek obszaru szukania<li></ul>',
													pomocDragZoom : 'zaznacz obszar który chcesz przybliżyć'
												}
							};
	
	
	var teksty=slownik.polski;
	
	//-----ZMIENNE ROBOCZE----------
	var map=null;
	var ruler=null;	
	var bounds = new GLatLngBounds();
	var okrag=null;
	var marker1;
	var marker2;
	var dist=0;	
	
	//moduly
	var moduly={
		ruler:false, 
		dragZoom:false,
		zoom:false,
		malaMapka:false
	}	
	
	//---------------------------------METODY PUBLICZNE-----------------------
	//główna metoda
	MO.inicjuj = function(){
		inicjujMape();
	};
	

	//włączanie i wyłaczanie modułów
	MO.wlaczRuler=function(){
		moduly.ruler=true;
		ruler=dodajRuler();
	};
	
	MO.wylaczRuler=function(){
		if (ruler==null) { return; }
		moduly.ruler=false;
		ruler.clr();
		ruler=null;
	};	

	MO.wlaczZoom=function(){
		if (!document.getElementById(IDZoomIn)){
			moduly.zoom=true;
			dodajZoom();
			
			$("#"+IDZoomIn).click( function() {				
				map.zoomIn();
				return false;
			});
			
			$("#"+IDZoomOut).click( function() { 				
				map.zoomOut();
				return false;
			});				
		} else {
			moduly.zoom=true;
			$("#"+IDZoomIn).show();
			$("#"+IDZoomOut).show();
		}
		
	};
	
	
	MO.wylaczZoom=function(){
			moduly.zoom=false;
			$("#"+IDZoomIn).hide();
			$("#"+IDZoomOut).hide();	
	};
	
	
	MO.wlaczMalaMapka=function(){		
	  if (!moduly.malaMapka){
			moduly.malaMapka=true;
			
			$("#"+IDMalaMapka+" area").each(function(){
				
				$(this).click(function(){
					var wspTab=$(this).attr("name").split(",");
					wybierzSegment(parseFloat(wspTab[0]),parseFloat(wspTab[1]));				
					return false;
				});
			});		
		}
	};	
	
	MO.wlaczDragZoom = function(){
		dodajDragZoom();
	}
	
	
	
	//-----------------------------METODY PRYWATNE-----------------------------------
	var inicjujMape=function()	{
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById(IDMapaDiv));
			map.setCenter(new GLatLng(startLat, startLon), zoom);
			map.addControl(new GScaleControl());
			map.enableScrollWheelZoom();
			map.enableDoubleClickZoom();
			map.enableContinuousZoom();			 
		}		
	};
	
	
	
	
	//dodaje kontrolki zoom
	var dodajZoom = function(){
			$("#"+IDMapaDiv).append('<input id="'+IDZoomIn+'" type="button" value="" title="przybliż">');
			$("#"+IDMapaDiv).append('<input id="'+IDZoomOut+'" type="button" value="" title="oddal">');	
	}
	
	
	//dodaje drag zoom
	var dodajDragZoom=function(){
			var showPodpowiedzDragZoom = function(){
				if ($('#podpowiedzDragZoom:visible').length>0) { $('#podpowiedzDragZoom').hide();  return;}
				$('#podpowiedzDragZoom').show();
				
			}
			
			var hidePodpowiedzDragZoom = function(){
				$('#podpowiedzDragZoom').hide();
			}

			var addPodpowiedzDragZoom = function(){
				var html='<div id="podpowiedzDragZoom" style="display:none; font-weight:bold; z-index:102; width:300px; height:40px; position:absolute; top:10px; left:10px; text-align:center; background:#dcef96; border:2px solid black; font-size:15px; padding:4px;">'+teksty.pomocDragZoom+'</div>';
				$('#mapaPolski').append(html);
			}			
			
			var boxStyleOpts = {
          opacity: .2,
          border: "2px solid red"
        }

        /* second set of options is for everything else */
        var otherOpts = {
					backButtonEnabled: true,
					backButtonHTML: dragZoomBackButtonHTML,
          buttonHTML: dragZoomButtonHTML,
          buttonZoomingHTML: dragZoomButtonZoomingHTML,
          buttonStartingStyle: dragZoomButtonStartingStyle,
					backButtonStartingStyle:dragZoomBackButtonStartingStyle
        };

        /* third set of options specifies callbacks */
        var callbacks = {
          //buttonclick: function(){GLog.write("Looks like you activated DragZoom!")},
          //dragstart: function(){GLog.write("Started to Drag . . .")},
          //dragging: function(x1,y1,x2,y2){GLog.write("Dragging, currently x="+x2+",y="+y2)},
          //dragend: function(nw,ne,se,sw,nwpx,nepx,sepx,swpx){GLog.write("Zoom! NE="+ne+";SW="+sw)}
					buttonclick: function(){ $('#dragZoom').parent("div").hide(); showPodpowiedzDragZoom(); },
					dragstart: function(){ hidePodpowiedzDragZoom(); $('#dragZoom').parent("div").show();}
        };
				
				
				

				addPodpowiedzDragZoom();
				map.addControl(new DragZoomControl(boxStyleOpts, otherOpts, callbacks), dragZoomPolozenie);	
	}
	
	

	//wybór segmentu mapy
	var wybierzSegment=function(lat,lon){
		map.setCenter(new GLatLng(lat, lon), zoomSegmentu);
		if (ruler!==null){ 
			ruler.inicjujRuler(null,new GLatLng(lat, lon)); 
		}
	}
	
	
	//Klasa RULER
	var  dodajRuler=function(){
		var o={};
		
		var label1;
		var label2;
		var button=0;
		var line;
		var poly;


		function measure(){
			if(marker1&&marker2)
			line = [marker1.getPoint(),marker2.getPoint()];
			dist=marker1.getPoint().distanceFrom(marker2.getPoint());
			dist=dist.toFixed(0);
			dist=(parseInt(dist)/1000).toFixed(1);
			//label1.setContents(dist+"km");label2.setContents(dist);
			label1.setPoint(marker1.getPoint());
			label2.setContents(dist+"&nbsp;km");
			label2.setPoint(marker2.getPoint());
			if(poly)map.removeOverlay(poly);
			poly = new GPolyline(line,'#FFFF00', 8, 1)
			map.addOverlay(poly);
			
			drawCircle(marker1.getLatLng(), dist, 24);
			ustawDaneFormularza();
			//fit();
		}

		//document.getElementById("add").value="click on map";
		o.inicjujRuler=function(overlay,pnt,offsetLat, offsetLng ) {

			if(pnt && moduly.ruler)	{				
				var marker1Icon = new GIcon(G_DEFAULT_ICON);
				if (rulerIconSrodek) { marker1Icon.image = rulerIconSrodek;}
				if (button){ o.clr();}
				marker1 = new GMarker(pnt,{draggable: true, title:"zmień srodek", icon: marker1Icon});
				map.addOverlay(marker1);
				marker1.enableDragging();
				label1=new ELabel(pnt, "","labelstyle",new GSize(2,20),60);
				map.addOverlay(label1);
 				
				//var xxx=130/(map.getZoom()*map.getZoom()*map.getZoom()*(map.getZoom()/3));
				var xxx=9/Math.pow(1.7,map.getZoom());

				var autoOffsetLat=xxx;
				var autoOffsetLng=xxx;
				
				pnt2=new GLatLng(pnt.lat()+(offsetLat?offsetLat:autoOffsetLat), pnt.lng()+(offsetLng?offsetLng:autoOffsetLng));
				var marker2Icon = new GIcon(G_DEFAULT_ICON);
				if (rulerIconPromien) {marker2Icon.image = rulerIconPromien;}
				marker2 = new GMarker(pnt2 ,{draggable: true, title:"zmień promień", icon: marker2Icon});
				map.addOverlay(marker2);
				marker2.enableDragging();
				label2=new ELabel(pnt2, dist+"&nbsp;km","labelstyle",new GSize(2,20),60);
				map.addOverlay(label2);

				marker2.openInfoWindowHtml(teksty.pomocWDymku);

				measure();
			}
			
			GEvent.addListener(marker1,"click",function(){ marker2.closeInfoWindow();});
			GEvent.addListener(marker2,"click",function(){ marker2.closeInfoWindow();});
			
			GEvent.addListener(marker1,"drag",function(){ marker2.closeInfoWindow(); measure();});
			GEvent.addListener(marker1,"dblclick",function(){ marker2.closeInfoWindow(); o.clr();});
			GEvent.addListener(marker2,"drag",function(){marker2.closeInfoWindow(); measure();});
			GEvent.addListener(marker2,"dblclick",function(){marker2.closeInfoWindow(); o.clr();});
			//document.getElementById("add").value="You Have a Ruler";
			button++;
		}


		o.clr=function(){
			map.removeOverlay(poly);
			map.removeOverlay(marker1);
			map.removeOverlay(marker2);
			map.removeOverlay(label1);
			map.removeOverlay(label2);
			if (okrag!==null) {map.removeOverlay(okrag);}
			button=0;
			//document.getElementById("add").value="New Ruler";
			dist=0;
		};
		
		
		//rysuje okrag na mapie
		var drawCircle=function (center, radius, nodes, liColor, liWidth, liOpa, fillColor, fillOpa){
			// Esa 2006
			//calculating km/degree
			var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
			var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;

			//Loop 
			var points = [];
			var step = parseInt(360/nodes)||10;
			for(var i=0; i<=360; i+=step){
				var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + 
				(radius/lngConv * Math.sin(i * Math.PI/180)));
				points.push(pint);
				bounds.extend(pint); //this is for fit function
			}
			
			
			fillColor = fillColor||liColor||"#0055ff";//#0055ff
			liWidth = liWidth||2;
			
			if (okrag!==null) {map.removeOverlay(okrag);}
			okrag = new GPolygon(points,liColor,liWidth,liOpa,fillColor,fillOpa, {clickable:false});
			map.addOverlay(okrag);
		};
		
		GEvent.addListener(map, 'click',o.inicjujRuler );
		o.inicjujRuler(null,new GLatLng(startLat, startLon), 1, -2);
		return o; 
	}; 
	//----KONIEC KLASY dodajRuler-----
	
	//dopasowywuje zoom do "bounds"
	function fit(){ //póki co nie uzywana
		map.panTo(bounds.getCenter()); 
		map.setZoom(map.getBoundsZoomLevel(bounds));
	}



	
	//ustawia dane formularza lon, Lat i promień
	var ustawDaneFormularza=function(){
		//console.log(marker1.getLatLng().lng() + ' ' + marker1.getLatLng().lat());
		//console.log(marker2.getLatLng().lng() + ' ' + marker2.getLatLng().lat());
		document.getElementById(IDFormSrodekLon).value=parseInt(marker1.getLatLng().lng()*100)/100;
		document.getElementById(IDFormSrodekLat).value=parseInt(marker1.getLatLng().lat()*100)/100;
		document.getElementById(IDFormPromien).value=dist;
	}
	


	return MO;
}



$(function(){

	var m=mapyPolski();
	m.inicjuj();
	m.wlaczZoom();
	m.wlaczRuler();
	m.wlaczMalaMapka();	
	m.wlaczDragZoom();
});

