// Tablica asocjacyjna tablic ze wspólrzędnymi obszarów, które użytkownik może
// przybliżyć na mapie. Format poszczególnych tablic jest następujący:
// [szerokosc geograficzna, dlugosc geograficzna, stopień przybliżenia]
focusPoints = {

  "FPPolska": [51.917168, 19.138184, 5],

	"FPDolnoslaskie": [50.951506,16.572876, 7, "/dolnoslaskie/"],
	"FPKujawsko-pomorskie": [53.018088,18.347168, 7, "/kujawskopomorskie/"],
	"FPLubelskie": [51.282535,22.802124, 7, "/lubelskie/"],
	"FPLubuskie": [52.217704,15.314941, 7, "/lubuskie/"],
	"FPLodzkie": [51.614606,19.434814, 7, "/lodzkie/"],
	"FPMalopolskie": [49.922935,20.22583, 7, "/malopolskie/"],
	"FPMazowieckie": [52.184037,21.225586, 6, "/mazowieckie/"],
	"FPOpolskie": [50.574516,17.833557, 7, "/opolskie/"],
	"FPPodkarpackie": [49.912325,22.318726, 7, "/podkarpackie/"],
	"FPPodlaskie": [53.363665,22.686768, 7, "/podlaskie/"],
	"FPPomorskie": [54.152784,17.95166, 7, "/pomorskie/"],
	"FPSlaskie": [50.257742,19.055786, 7, "/slaskie/"],
	"FPSwietokrzyskie": [50.776419,20.711975, 7, "/swietokrzyskie/"],
	"FPWarminsko-mazurskie": [53.787672,20.906982, 7, "/warminskomazurskie/"],
	"FPWielkopolskie": [52.291683,17.039795, 6, "/wielkopolskie/"],
	"FPZachodniopomorskie": [53.65115,15.567627, 7, "/zachodniopomorskie/"],

  "FPKatowice": [50.261254,19.023857, 11, "/slaskie/katowice/"],
  "FPKrakow": [50.046337,19.954948, 10, "/malopolskie/krakow/"],
  "FPPoznan": [52.412891,16.936798, 10, "/wielkopolskie/poznan/"],
  "FPTrojmiasto": [54.410139,18.569641, 9],
  "FPWarszawa": [52.241677,21.031265, 10, "/mazowieckie/warszawa/"],
  "FPWroclaw": [51.11667,17.017136, 10, "/dolnoslaskie/wroclaw/"]

}

// Zmienne pomocnicze do filtrowania wyników na mapie
markets_search_results = 0;
supermarkets_results = [];
hipermarkets_results = [];
piecminut_results = [];
var searchResultsRefresh = new Function();

/**
 * Klasa odpowiadająca za działanie mapy i obsługę jej interfejsu.
 * Należy ją uruchomić po załadowaniu się strony.
 * Wewnatrz tej funkcji, na poczatku znajdują się prywatne własciwosci,
 * które można dopasować do aktualnych potrzeb.
 *
 * @param mapID                 atrybut ID elementu w który zostanie przeksztalcony w mapę
 * @param focusPointSelectID    atrybut ID elementu 'select', ktory sluzy do wybierania przyblizonego obszaru
 * @param hipermarketCheckboxID atrybut ID elementu 'checkbox' który decyduje o tym czy pokazać na mapie hipermarkety
 * @param supermarketCheckboxID atrybut ID elementu 'checkbox' który decyduje o tym czy pokazać na mapie supermarkety
 * @param piecminutCheckboxID   atrybut ID elementu 'checkbox' który decyduje o tym czy pokazać na mapie piecminut
 */
function ZSApp(mapID, focusPointSelectID, hipermarketCheckboxID, supermarketCheckboxID, piecminutCheckboxID){

	if(!GBrowserIsCompatible()) return 0;

/* Private properties */

	var defaultFocusPoint = "FPPolska";

	var showHipermarkets = true;
	var showSupermarkets = true;
	var showPiecminut = true;
	var showPath = '';
	var q = '';

	var baseMarketIcon = new GIcon({ // podstawowe ustawienia markera sklepów
		shadow: "/img/hanldowy/zs/shadow50.png", // plik zawierający cień ikon markerów
		iconSize: new GSize(20, 34),
		shadowSize: new GSize(37, 34),
		iconAnchor: new GPoint(9, 34),
		infoWindowAnchor: new GPoint(9, 2),
		infoShadowAnchor: new GPoint(18, 25)
	});
	var hipermarketIcon = new GIcon(baseMarketIcon, "/img/handlowy/sub/znajdzsklep/marker_blue.png"); // ikona hipermarketu
	var supermarketIcon = new GIcon(baseMarketIcon, "/img/handlowy/sub/znajdzsklep/marker_red.png"); // ikona supermarketu
	var piecminutIcon = new GIcon(baseMarketIcon, "/img/handlowy/sub/znajdzsklep/marker_yellow.png"); // ikona piecminut


/* Private methods */

	/**
	 * Metoda, która tworzy nowy marker (tick) sklepu i na podstawie podanych
	 * parametrów ustala jego właściwości, wygląd i zachowanie.
	 *
	 * @param  market tablica z danymi na temat pojedynczego sklepu
	 * @param  icon   ikona jaką dany sklep zostanie oznaczony na mapie
	 * @return        marker, czyli obiekt klasy GMarker
	 */
	function createMarketMarker(market, icon){

		var point = new GLatLng(market[1],market[2])
		var marker = new GMarker(point, icon);

		GEvent.addListener(marker, "mouseover", function() {
			marker.openInfoWindowHtml(
				'<div class="mapTooltip">'+
					'<div class="name"><a href="'+market[5]+'" title="przejdź na stronę sklepu">'+market[0]+'</a></div>'+
					'<div class="address">'+market[3].replace('|','<br />')+'</div>'+
					'<div class="tel">tel.: '+market[4]+'</div>'+
				'</div>'
			);
		});

		return marker;

	}

	/**
	 * Metoda, która pobiera dane na temat poszczególnych sklepów z podanego
	 * źródła, a następnie umieszcza te sklepy na mape.
	 *
	 * @param markets tablica z danymi na temat sklepów
	 * @param icon    ikona jaką sklepy z podanej wcześniej tablicy zostaną oznaczone na mapie
	 */
	function addMarketMarkers(markets, icon){

		for(var i = 0; markets[i]; i++)
			if(markets[i].length)
				map.addOverlay(createMarketMarker(markets[i], icon));

	}

	/**
	 * Metoda, wczytujaca wyniki znajdowania sklepow
	 * Wykorzystywana przy zmianie paremetrow oraz submicie formularza
	 */
	function searchList(){
		q = document.getElementById('ZSSzukaj2Mi').value;
		showPath = focusPoints[focusPointSelect.value][3];
		showHipermarkets = hipermarketCheckbox.checked;
		showSupermarkets = supermarketCheckbox.checked;
        showPiecminut = piecminutCheckbox.checked;
/*
		mapSearchList.load('/page/pl/handlowy/hipermarkety/znajdz-sklep/?search=true&path=' +
				showPath + "&s=" + showSupermarkets + "&h=" + showHipermarkets + "&q=" + q);

            _gaq.push(['_trackPageview', '/downloads/pdfs/corporateBrief.pdf']);

*/
		mapSearchList.load_post('/page/pl/tanie-promocje/znajdz-sklep-ajax/','search=true&path=' +
				showPath + "&s=" + showSupermarkets + "&h=" + showHipermarkets + "&p=" + showPiecminut + "&q=" + q);

		_gaq.push(['_trackPageview', '/page/pl/tanie-promocje/znajdz-sklep-ajax/','search=true&path=' +
				showPath + "&s=" + showSupermarkets + "&h=" + showHipermarkets + "&p=" + showPiecminut + "&q=" + q]);

		return false;
	}

	/**
	 * Metoda, która przybliża mapę nad wskazanym przez użytkownika w formularzu terenie.
	 * Ustawia takze informacje w jakich sciezkach szukac sklepow do wynikow wyszukiwania i
	 * wywoluje metode, znajdujaca wyniki wyszukiwania
	 */
	function focusPointChange(){

		var focusPoint = focusPointSelect.value;
		map.setCenter(new GLatLng(focusPoints[focusPoint][0], focusPoints[focusPoint][1]), focusPoints[focusPoint][2]);
		showPath = focusPoints[focusPoint][3];

		//searchList();

	}

	/**
	 * Metoda, która po wywołaniu sprawdza które sklepy powinny być widoczne
	 * (odczytuje to bezpośrednio z formularza) i te sklepy pokazuje, a resztę ukrywa.
	 * Ustawia takze informacje w jakich rodzajow sklepow szukac w wynikach wyszukiwania i
	 * wywoluje metode, znajdujaca wyniki wyszukiwania
	 */
	function switchVisibleMarketMarkers(){

		showHipermarkets = hipermarketCheckbox.checked;
		showSupermarkets = supermarketCheckbox.checked;
        showPiecminut = piecminutCheckbox.checked;

		searchList();

	}


	function searchResultsRefresh_local(){

		var markets_search_results = 0;
		var markets_search_results_all = 0; //temp

		var lastFocusPoint;
		var mapSearchList = document.getElementById('mapSearchList');

		supermarkets_results = [];
		hipermarkets_results = [];
        piecminut_results = [];

		for(var i = 0, t; t = mapSearchList.childNodes[i++];)
			if(t.nodeType==1){

				markets_search_results_all++

				if(t.className.indexOf('supermarket')+1){
					for(var j = 0; supermarkets[j]; j++)
						if(t.getElementsByTagName('a')[0].href.indexOf(supermarkets[j][5])+1){
							supermarkets_results.push(supermarkets[j]);
							lastFocusPoint = new GLatLng(supermarkets[j][1], supermarkets[j][2]);
							markets_search_results++;
							break;
						}
				}
				if(t.className.indexOf('hipermarket')+1){
					for(var j = 0; hipermarkets[j]; j++)
						if(t.getElementsByTagName('a')[0].href.indexOf(hipermarkets[j][5])+1){
							hipermarkets_results.push(hipermarkets[j]);
							lastFocusPoint = new GLatLng(hipermarkets[j][1], hipermarkets[j][2]);
							markets_search_results++;
							break;
						}
				}
                if(t.className.indexOf('piecminut')+1){
					for(var j = 0; piecminut[j]; j++)
						if(t.getElementsByTagName('a')[0].href.indexOf(piecminut[j][5])+1){
							piecminut_results.push(piecminut[j]);
							lastFocusPoint = new GLatLng(piecminut[j][1], piecminut[j][2]);
							markets_search_results++;
							break;
						}
				}

			}

		map.clearOverlays();
		//addMarketMarkers((markets_search_results?hipermarkets_results:hipermarkets), hipermarketIcon);
		//addMarketMarkers((markets_search_results?supermarkets_results:supermarkets), supermarketIcon);

		if(markets_search_results_all){

			addMarketMarkers(hipermarkets_results, hipermarketIcon);
			addMarketMarkers(supermarkets_results, supermarketIcon);
			addMarketMarkers(piecminut_results, piecminutIcon);

			if(markets_search_results==1){
				map.setCenter(lastFocusPoint, 15);
			} else {
				focusPointChange();
			}

		} else {

			addMarketMarkers(hipermarkets, hipermarketIcon);
			addMarketMarkers(supermarkets, supermarketIcon);
			addMarketMarkers(piecminut, piecminutIcon);

		}

	}


/* Constructor */

	var map = new GMap2(document.getElementById(mapID));

	map.addControl(new GSmallMapControl());

	var focusPointSelect = document.getElementById(focusPointSelectID);
	focusPointSelect.onchange = searchList;
	focusPointChange(); // wrzucić do searchResultsRefresh()

	var hipermarketCheckbox = document.getElementById(hipermarketCheckboxID);
	var supermarketCheckbox = document.getElementById(supermarketCheckboxID);
	var piecminutCheckbox = document.getElementById(piecminutCheckboxID);
	hipermarketCheckbox.onclick = supermarketCheckbox.onclick = piecminutCheckbox.onclick = switchVisibleMarketMarkers;

	// wyslij zapytanie po submitowaniu
	var searchForm = document.getElementById('ZSSzukajForm');
	searchForm.onsubmit = searchList;

	searchResultsRefresh = searchResultsRefresh_local;

	searchList();

}

onload = function(){

	ZSApp('map', 'ZSSzukaj2Woj', 'ch1', 'ch2', 'ch3');

}


/**
 * Klasa odpowiadająca za działanie doładowywania wyników wyszukiwania sklepów
 */
var mapSearchList = {

	/**
	 * Metoda, która wczytuje ,,ajaksowo'' podany url i wywoluje dodanie zawartosci
	 */
	load : function(url) {
		document.getElementById('mapSearchList').innerHTML = 'laduje...';
		ajax.get(url,mapSearchList.addContent);
	},

	load_post : function(url,msg) {
		document.getElementById('mapSearchList').innerHTML = 'laduje...';
		ajax.post(url,msg,mapSearchList.addContent);
	},

	/**
	 * Metoda, która dodaje zawartosc do elementu o id mapSearchList
	 */
	addContent : function(content) {
		document.getElementById('mapSearchList').innerHTML = content;
		searchResultsRefresh();
	}
}

