	var map;
	var zoomLevel = 6;			// Optymalne ustawienie rozmiaru dla widoku Polski
	var zoomPoses = 12;			// Optymalne ustawienie rozmiaru dla widoku ulic
	var zoomCounties = 7;		// Optymalne ustawienie rozmiaru dla województw
	var json = '';
	var mgr;
	var centerLat	= 51.919438;
	var centerLng 	= 19.14513;
	var amarkersPoses = new Array();
	
	var markers = new Array();	// Lista wszystkich obiektów markerów
	
	$(window).unload( function () { 
		GUnload();
		/*alert('Czyszczę pozostałości google mapy');*/
	});
	
	$(document).ready(function() {
	
		// Podstawowa inicjacja
		initialize();
	
		if($('#mmForm').length > 0) {    
			$('select[name=select_region]').change(function() {
				showFormCities();
				var idcounty = $(this).val();
				moveToCounty(idcounty);
			});
      
			bindCityChangeEvents();
			
			$('.checkBoxButton').click(function(){
			   showFormCities();
			   initObjects(getMapPointsData());
			});
      
			$('#btn_search').click(function(){
				searchEvent();
				return false;
			});
			$('#btn_reset').click(function(){
				resetForm();
				return false;
			});
		}
	});
	
	function centerMap() {
		map.closeExtInfoWindow();
		map.setCenter(new GLatLng(centerLat,centerLng), zoomLevel);
	}
	
	function setAllPointsJson() {
		$.ajax({
			method: "GET",
			url: '/mm/maps/map_'+$("#map").val(),
			data: "",
			dataType: "json",
			async: false,
			success: function(sresultData) {
				json = sresultData;
				//console.debug(json);
			},
			error: function() {
				//alert('blad skladni');
			}
		});
	}
	
	function initialize() {
		if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("map_canvas"));
			map.setCenter(new GLatLng(centerLat,centerLng), zoomLevel);
			
			map.addControl(new MMZoomAndMoveControl());
			map.addControl(new MMMapTypeControl());
		}
		
		mgr = new MarkerManager(map);
		
		setAllPointsJson();
		
		initObjects(getMapPointsData());
	}
	
	/**
	 * Dynamiczne tworzenie markera (wspolrzedne lewodol)
	 *
	 * x float - współrzędna latitute
	 * y float - współrzędna longitude
	 * icoUrl string - adres do ikonki markera
	 * width integer - szerokość ikonki markera
	 * height integer - wysokość ikonki markera
	 * title string - nazwa markera (wyświetlana w title)
	 */	
	function makeMarkerP(x,y,id,icoUrl,width,height,title,anchor){	
		var marker;
		var tinyIcon = new GIcon();
		
		tinyIcon.image = icoUrl;
		tinyIcon.iconSize = new GSize(width, height);
		tinyIcon.iconAnchor = new GPoint(0, height);
		tinyIcon.infoWindowAnchor = new GPoint(width/2, height/2);
		
		markerOptions = { icon:tinyIcon, title:title };
		marker = new GMarker(new GLatLng(x,y), markerOptions);
			
		marker.id = id;
		marker.lat = x;
		marker.lng = y;     
		return marker;
	}
	
	/**
	 * Dynamiczne tworzenie markera (wspolrzedne srodek)
	 *
	 * x float - współrzędna latitute
	 * y float - współrzędna longitude
	 * icoUrl string - adres do ikonki markera
	 * width integer - szerokość ikonki markera
	 * height integer - wysokość ikonki markera
	 * title string - nazwa markera (wyświetlana w title)
	 */	
	function makeMarkerC(x,y,id,icoUrl,width,height,title,anchor){	
		var marker;
		var tinyIcon = new GIcon();
		
		tinyIcon.image = icoUrl;
		tinyIcon.iconSize = new GSize(width, height);
		tinyIcon.iconAnchor = new GPoint(width/2, height/2);
		tinyIcon.infoWindowAnchor = new GPoint(width/2, height/2);
		
		markerOptions = { icon:tinyIcon, title:title };
		marker = new GMarker(new GLatLng(x,y), markerOptions);
			
		marker.id = id;
		marker.lat = x;
		marker.lng = y;     
		return marker;
	}
	
	/**
	 * Dynamiczne tworzenie markera Posa
	 *
	 * x float 			- współrzędna latitute
	 * y float 			- współrzędna longitude
	 * idpos int 		- identyfikator posa
	 * title string 	- nazwa markera (wyświetlana w title)
	 * type int		 	- typ obiektu
	 */	
	function makeMarkerPos(x,y,idpos,title,type) 
	{
		if (type == 1)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-oddzial-okregowy.png',48,48,title)
		else if (type == 2)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-filia.png',48,48,title)
		else if (type == 4)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-oddzial-sprzedazowy.png',48,48,title)
		else if (type == 5)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-punkt-sprzedazy.png',48,48,title)
		else if (type == 6)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-centrala.png',48,48,title)
		else if (type == 8)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-regionalne-centrum-likwidacji-szkod.png',48,48,title)
		else if (type == 9)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-regionalne-centrum-likwidacji-szkod.png',48,48,title)
		else if (type == 10)
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-regionalne-centrum-likwidacji-szkod.png',48,48,title)
	
		GEvent.addListener(marker, "click", function() {
			// Podłącz event na klika by pokazać chmurkę
			showPosInfo(marker);
		});      
		return marker;
	}
	
		/**
	 * Dynamiczne tworzenie markera Grupy
	 *
	 * x float 			- współrzędna latitute
	 * y float 			- współrzędna longitude
	 * idpos int 		- identyfikator posa
	 * title string 	- nazwa markera (wyświetlana w title)
	 * type int		 	- typ obiektu
	 */	
	function makeMarkerGroup(x,y,idpos,title) 
	{
		var marker = makeMarkerP(x,y,idpos,'/gfx/mm/markers/ico-grupa.png',48,48,title)
	
		GEvent.addListener(marker, "click", function() {
			// Podłącz event na klika by pokazać chmurkę
			showGroupInfo(marker);
		});      
		return marker;
	}
	
	/**
	 * Dynamiczne tworzenie markera Miasta
	 *
	 * x float 			- współrzędna latitute
	 * y float 			- współrzędna longitude
	 * idcity int 		- identyfikator miasta
	 * title string 	- nazwa markera (wyświetlana w title)
	 * priority integer	- priorytet (zależy wielkość ikonki)
	 */
	function makeMarkerCity(x,y,idcity,title,priority) 
	{
		var marker;
	
		if (priority == 1)
			marker = makeMarkerC(x,y,idcity,'/gfx/mm/markers/ico_city_green20x20.png',20,20,title);
		else if (priority == 2)
			marker = makeMarkerC(x,y,idcity,'/gfx/mm/markers/ico_city_green16x16.png',16,16,title);
		else
			marker = makeMarkerC(x,y,idcity,'/gfx/mm/markers/ico_city_green12x12.png',12,12,title);
	
		GEvent.addListener(marker, "click", function() {
			moveTo(x, y, zoomPoses);
			showCityPosesList(idcity);
		});
    
		return marker;
	}
	
	
	function reqDirections(from){
		
		dir = new GDirections(map,document.getElementById("divcontentresults"));

		toLatLng = map.getExtInfoWindow().marker_.getLatLng();
      
		GEvent.addListener(dir,"load",function(){ //alert('bu');

			var p = this.getPolyline();
			p.setStrokeStyle({color:'#34B05C',opacity:0.8});
			map.addOverlay(p);
			map.closeExtInfoWindow();      

			var stMarker = dir.getMarker(1);
			/*
			summary = "<table><tr><td><b>Odległoťć: </b></td><td>" + dir.getDistance().html + "</td></tr><tr><td><b>Szacunkowy czas dojazdu:</b></td><td>" + dir.getDuration().html + "</td></tr></table>"; 
			summary += "<hr style=\"width:100px\"/><center><a href=\"javascript:showSummary()\">Pokaż szczegóły dojazdu</a></center>";
			*/
			
			//pobranie szczegolow trasy
			route = dir.getRoute(0);
			nSteps = route.getNumSteps();

			//showInfoSteps();
			//showRoutingStepsSplitter(nSteps);
			//hideAllTabs();
			//showRoutingTab();
			
			//cluster.removeMarkers();
			//cluster.refresh();    
			
			//removeMapChangeListeners();
			//setTimeout("stylize()",2000);
		}); 
		
		function handleErrors() {
			//alert('nie poszlo: :/');
			//console.debug(this.getStatus());
		}
		
		GEvent.addListener(dir,"error",handleErrors);
   
		dir.load("from: Polska, " + from + "  to: " + toLatLng.toUrlValue(),{"getPolyline":true});
	}
	
	
	/**
	 * Pobranie szczegółów obiektu Pos
	 *
	 * marker Marker - obiekt markera
	 */	
	function showPosInfo(marker) {

		$.ajax({
			method: "GET",
			url: '/mm/info/info_'+marker.id,
			data: "",
			dataType: "json",
			async: false,
			success: function(response) {
				map.closeExtInfoWindow();
				displayInfoWindow(marker,response) 
				//moveTo(marker.lat, marker.lng, zoomPoses);
			},
			error: function() {
				//alert('blad skladni');
			}
		})
	}
	
	/**
	 * Pobranie szczegółów obiektu Grupy
	 *
	 * marker Marker - obiekt markera
	 */	
	function showGroupInfo(marker) {

		$.ajax({
			method: "GET",
			url: '/mm/groups/group_'+marker.id,
			data: "",
			dataType: "json",
			async: false,
			success: function(response) {
				map.closeExtInfoWindow();
				displayGroupWindow(marker,response) 
			},
			error: function() {
				//alert('blad skladni');
			}
		})
	}
	
	/**
	 * Wyświetlenie chmurki obiektu Pos
	 *
	 * marker Marker - obiekt markera
	 * message string - treść wiadomości
	 */	
	function displayInfoWindow(marker,message) {

		marker.openExtInfoWindow(
			map, "chmurka",
			'<div id="infowindow">\
				<div class="info_left"><img src="'+message.photo+'"/></div>\
				<div class="info_right">\
					<a class="lay_title" href="/jednostka/'+marker.id+'">'+message.title+'</a>\
					<label class="info">Adres: '+message.address+',</label>\
					<label class="info">'+message.postcode+' '+message.city+'</label>\
					<!--<label class="info" style="padding-top: 4px;">'+message.avail+'</label>-->\
				</div>\
				<!--<div style="clear: both;"></div>\
				<div class="info_bottom">\
					<label class="info">Tel. stacjonarny: '+message.phone+'</label>\
				</div>-->\
				<div style="clear: both;"></div>\
				<div id="mm_routing_div" class="routing_div">\
					Dojazd z: <input id="dirtxt" type="text" style="width:120px"/>\
					<input type="image" style="vertical-align: top;" onclick="javascript:reqDirections(document.getElementById(\'dirtxt\').value);" src="/gfx/mm/buttons/but_ok.png"/>\
				</div>\
				<div class="more_pos_details"><a href="/jednostka/'+marker.id+'">zobacz więcej &raquo;</a></div>\
			</div>',
			{beakOffset: 4}
		); 
		//map.panDirection(-0.2, 0.2);
	}
	
	/**
	 * Wyświetlenie chmurki grup obiektów
	 *
	 * marker Marker - obiekt markera
	 * message string - treść wiadomości
	 */	
	function displayGroupWindow(marker,message) {

		var poslist = '';
		for (k_group in message) {
			poslist += '<a class="lay_title" href="javascript:void(0)" onclick="javascript:moveToPosDetails('+message[k_group].idpos+')">'+message[k_group].sname+'</a><br/><br/>';
		}
	
		marker.openExtInfoWindow(
			map, "chmurka",
			'<div id="infowindow">\
				<div class="info_right">\
					<p style="padding-left:10px; padding-right:10px">W tej lokalizacji znajduje się więcej jednostek terenowych. Wybierz konkretną jednostkę aby przejść do szczegółów:</p>\
					<div style="padding-left:10px; padding-right:10px">'+poslist+'</div>\
				</div>\
				<div style="clear: both;"></div>\
				<div class="info_bottom">\
				</div>\
				<div style="clear: both;"></div>\
			</div>',
			{beakOffset: 4}
		); 
		//map.panDirection(-0.2, 0.2);
	}
	
	/**
	 * pokazuje miasta w selec'ie w zaleznosci od wojewodztwa oraz wybranych typow
	 */   	
	function showFormCities() {
		var sformData = $('#mmForm').serialize();
	   
		$.post('/ajax.php', 'scontroller=mm&saction=showFormCities&' + sformData, function(sdata) {
			if(sdata.length > 0) {
				$('#cities_container').html(sdata);
				bindCityChangeEvents();
			}
		});

     /*
     var idcounty = $('select[name=select_region]').val();
     $('.cityoption').hide();
     $('.cityoption[value=0]').show();
     if(idcounty > 0){        
        $('input[name=city_county][value='+idcounty+']').each(function(i,j){
            var idcity = j.id.substr(12);
            if(checkFormCityPosTypes(idcity)){
              $('.cityoption[value='+idcity+']').show();
            }
        });
     }else{
        $('input[name=city_county]').each(function(i,j){
            var idcity = j.id.substr(12);
            if(checkFormCityPosTypes(idcity)){
              $('.cityoption[value='+idcity+']').show();
            }
        });
     }
     */
	}
  
	/**
	* sprawdza czy miasto ma typy wybrane z formularza
	*/     
	function checkFormCityPosTypes(idcity) {
		var spostypes = $('#city_postypes_'+idcity).val();      
		var apostypes = spostypes.split(',');
		var ischecked = false;
		for(key in apostypes) { 
			if($('.checkBoxButton[value=' + apostypes[key] + ']:checked').length > 0) {
				ischecked = true;
				break;
			}
		} 
		return ischecked;
	}

	/**
	 * przekazuje dane z formularza do funkcji rysowania mapy
	 */ 
	function getMapPointsData() {
		var stypes = '';
		$('.checkBoxButton').each(function(i,j) {
			if(j.checked == true) {
				stypes = stypes + j.value + ',' 
			}
		});

		return {spostypes: stypes};
	}
	
	/**
	 * Przeniesienie mapy do widoku podanego miasta
	 *
	 * x float - współrzędna latitute
	 * y float - współrzędna longitude
	 */	
	function moveTo(x, y, zoom) {
		map.setCenter(new google.maps.LatLng(x,y));
		map.setZoom(zoom);
	}
	
	/**
	 * przyblizenie do miasta o idcity podanym w argumencie
	 *    	 
	 */   	
	function moveToCity(idcity){
  		if(idcity > 0) {
			var slat = $('#city_lat_' + idcity).val();
			var slng = $('#city_lng_' + idcity).val();
			var szoom = zoomPoses;
          
			showCityPosesList(idcity);
		} else {
			var idcounty = $('select[name=select_region]').val();
			if(idcounty > 0) {
				var slat = $('#county_lat_' + idcounty).val();
				var slng = $('#county_lng_' + idcounty).val();
				var szoom = zoomCounties;
			} else {
				var slat = centerLat;
				var slng = centerLng;
				var szoom = zoomLevel;
			}
			map.closeExtInfoWindow();
		}
		moveTo(slat, slng, szoom);
	}
  
	/**
	 * przyblizenie do wojewodztwa o idcounty podanym w argumencie
	 *    	 
	 */   
	function moveToCounty(idcounty) {
  		if(idcounty > 0) {
			var slat = $('#county_lat_' + idcounty).val();
			var slng = $('#county_lng_' + idcounty).val();
			var szoom = zoomCounties;
		} else {
			var slat = centerLat;
			var slng = centerLng;
			var szoom = zoomLevel;
		}
		map.closeExtInfoWindow();
		moveTo(slat, slng, szoom);
	}
  
	/**
	 * rysowanie mapy
	 * 
	 * @param Array aparams - parametry przekazane z formularza      
	*/        
	function initObjects(aparams) {
		mgr.clearMarkers();
    
		// Pakiet markerów z ulicami
		var batchCities = [];
		
		// Pakiet markerów z posami
		var batchPoses = [];
		
		//tablica z posami potrzebna zeby przechodzic do szczegolow posa z listy pod mapa w widoku miasta
		amarkersPoses = [];
		
		//tablica grup markerów
		var batchGroups = [];
	  
		for (k_county in json.acounties) {
			for (k_city in json.acounties[k_county].acities) {
				if (getCityPriority(json.acounties[k_county].acities[k_city], aparams['spostypes']) > 0) {
					for (k_postype in json.acounties[k_county].acities[k_city].apos) {
						for (k_pos in json.acounties[k_county].acities[k_city].apos[k_postype]) {
							var v_pos = json.acounties[k_county].acities[k_city].apos[k_postype][k_pos];
							amarkersPoses[v_pos.idpos] = makeMarkerPos(v_pos.sglat,v_pos.sglng,v_pos.idpos,v_pos.sname,k_postype);
							batchPoses.push(amarkersPoses[v_pos.idpos]);
						}
					}
				}
				var v_city = json.acounties[k_county].acities[k_city];
				var npriority = getCityPriority(v_city, aparams['spostypes']);
				if (npriority > 0) {
    				batchCities.push(makeMarkerCity(v_city.sglat,v_city.sglng,v_city.idcity,v_city.sname, npriority));
				}
			}
		}
		// TODO
		// Zrobić jakoś tak, żeby ten licznik był w jSON
		// Zrobić także tak, żeby marker grupy w pliku jSON z mapą był tylko jeden
		var g = 0;
		//console.debug(json.agroups);
		for (k_group in json.agroups) {
			var v_gpos = json.agroups[k_group][0];
			batchGroups.push(makeMarkerGroup(v_gpos.sglat, v_gpos.sglng, g, 'Grupa jednostek'));
			g++;
		}
		
		mgr.addMarkers(batchGroups, 12, 17);
		mgr.addMarkers(batchCities, 0, 11);
		mgr.addMarkers(batchPoses, 12, 17);
		
		mgr.refresh();
	}
	
	/**
	 * sprawdza czy miasto nalezy do wybranego typu
	 */   	
	function getCityPriority(objCity, sformTypes) {
		var npriority = 0;
		var acityTypes = objCity.spostypes.split(',');
		var apriorities = objCity.spriorities.split(',');
	    
		for (key in acityTypes) {
			if (sformTypes.indexOf(acityTypes[key]) != -1) {
				npriority = apriorities[key];
				break;  
			}
		}
		return npriority;
	}
  
	/**
	 * pokazuje wszystkie jednostki z wybranego miasta na liscie
	 *        
	 */     
	function showCityPosesList(idcity) {
		for(k_county in json.acounties) {
			if(json.acounties[k_county].acities[idcity]) {
				$('.tab_content').hide();
				$('#tabs2').show();
				$('.sitemapNavigationItemActive').attr('class', 'sitemapNavigationItem');
				$('.sitemapNavigationItem').hide();
				var counter = 1;
				for(idtype in json.acounties[k_county].acities[idcity].apos) {
					if(counter == 1) {
						$('#tab_label_' + idtype).css('display', 'block');
						$('#tab_label_' + idtype).attr('class', 'sitemapNavigationItemActive');
					} else {
						$('#tab_label_' + idtype).css('display', 'list-item');
					}
					
					posCounter = 1;
          
					$('#tab_container_' + idtype).html("");
					for(idpos in json.acounties[k_county].acities[idcity].apos[idtype]) {
						var apos = json.acounties[k_county].acities[idcity].apos[idtype][idpos];
              
						$.ajax({
                			method: "GET",
                			url: '/mm/info/info_'+apos.idpos,
                			data: "",
                			dataType: "json",
                			async: false,
                			success: function(objResponse) {
								if(posCounter%2 == 1) {
									var sclassName = 'inner_content_odd'; 
								} else {
									var sclassName = 'inner_content'; 
								}
      
								$('#tab_container_' + idtype).append('<div class="' + sclassName + '"><div class="text"><a style="display: block;" href="#" onclick="return moveToPosDetails(' + apos.idpos + ');"><label class="bold">' + posCounter + '.</label> <span class="underline">'+ objResponse.city +'</span> ' + objResponse.address + '  </a></div><div class="cleaner"></div></div>');
								if(counter == 1) {
									$('#tab_container_' + idtype).show();
								}
							}
						});
						posCounter++;
					}
					counter++;
				}
        
				//mamy tylko jeden element na mapie wiec od razu pokazujemy jego szczegoly w chmurce
				if(posCounter == 2 && counter == 2) {
					moveToPosDetails(apos.idpos);
				} else {  //czyscimy chmurki z poprzednich miast zeby zapobiec przypadkowi "slaskiemu" :) tj. oddzialy blisko siebie ale w innych miastach i np.wybierajac katowice zostaje chmurka z chorzowa
					map.closeExtInfoWindow();
				}
			}
		} 
	}
  
	/**
	* przechodzenie miedzy zakladkami
	*/     
	function changeCityPosesTab(idtype) {  
		$('.tab_content').hide();
		$('#tab_container_' + idtype).show(); 
		$('.sitemapNavigationItemActive').css('display', 'list-item');
		$('.sitemapNavigationItemActive').attr('class', 'sitemapNavigationItem'); 
		$('#tab_label_' + idtype).css('display', 'block');
		$('#tab_label_' + idtype).attr('class', 'sitemapNavigationItemActive'); 
		return false;
	}
  
	/**
	 * przechodzi do widoku szczegolow posa
	 */     
	function moveToPosDetails(idpos) {
		showPosInfo(amarkersPoses[idpos]);
		return false;
	}
  
	/**
	 * funkcja obslugujaca klikniecie w przycisk "szukaj"
	 */     
	function searchEvent() {
  		//nie trzeba przerysowywac mapy bo jest ona przerysowywana przy zaznaczaniu/odznaczaniu checkboxow
      //initObjects(getMapPointsData());
			
		map.closeExtInfoWindow();
		var idcounty = $('select[name=select_region]').val();
		var idcity = $('select[name=select_city]').val();
			
		if(idcity > 0) {
			moveToCity(idcity);
		} else if(idcounty > 0) {
			moveToCounty(idcounty);
		} else {
			centerMap();
		}
	}
  
	/**
	 * resetowanie formularza
	 */     
	function resetForm() {
		$('select[name=select_region]').val(0);
		$('select[name=select_city]').val(0);
		 
		$('.checkBoxButton').each(function(i,j) {
			j.checked = true;
		});
     
		initObjects(getMapPointsData());
		map.closeExtInfoWindow();
		centerMap();
	}
  
	function bindCityChangeEvents() {		
		$('select[name=select_city]').change(function() {				
			var idcity = $(this).val();
			moveToCity(idcity);
		});
	}