//try { console.log(); alert=function(s) { console.log(s);}; } catch(err) { }


function ClassWyszukiwarka(){
	var MO={};
	var kryteriaWyszukiwania={}; //kryteria zczytane z formularza
	var db=ClassDB(); //baza danych:]
	var slownik=ClassSlownik($('body').attr('class'));
	var daneWyszukanychObiektow=new Array();//dane obiektów obecnie wyswietlanych
	var wyswietlaneObiekty=new Array(); //lista obiektów obecnie wyswietlanych
	//konfiguracja
	var opcje={ ileNaStronie : 10,
							 promienNumeracjiStron : 3
						};

	//metody prywatne
	
	var inicjuj=function(){ //~konstruktor
		bindujEventy();
		preloadDaneWyszukiwania();
		$('.szukajB').attr('disabled', false);
	//	alert(Util.intersect([1,2,3],[2,3,4]));
		//alert(Array.prototype.unique);
	};
	
	//----binduje eventy ----
	var bindujEventy = function(){
		//start wyszukiwania
		$('.szukajB').click(function(){
			vis.setLoader(1);
			setTimeout(function(){
				resetujKryteriaWyszukiwania();				
				wczytajKryteriaWyszukiwania();
				wyszukaj();
			},10);
			toggleAdv(false);
			vis.hideMap();
			return false;
		});
		
		
		$('.zaawansowaneB').click(function(){
			toggleAdv();
		});
		
		//------SZUKANIE PO MAPIE-----
		$('#pg_mapa-miniatura-marker').mousedown(function(){ vis.showMap(); });
		$('#pg_mapa-miniatura').mousedown(function(){ vis.showMap(); });
		$('#rozwinMapeB').click(function(){ vis.showMap(); });
	};
	
	
	//przełącza stan "zaawansowanych" na przeciwny, chyba że dostanie parametr "b" [true|false] =>wtedy ustawia zaawansowane zgodnie z wartością "b"
	var toggleAdv = function(b){
		if(typeof(b)==="undefined"){
			if($('.advHide:visible').length>0){
				$('.advHide').slideUp();
				$('.advStatus').html('+');
			} else {
				$('.advHide').slideDown();
				$('.advStatus').html('-');			
			}
		} else if(!b){
			if($('.advHide:visible').length>0){
				$('.advHide').slideUp();
				$('.advStatus').html('+');
			} 	
		} else if(b){
			if($('.advHide:visible').length==0){
				$('.advHide').slideDown();
				$('.advStatus').html('-');	
			} 	
		}
	};
	
	
	//ładuje dane które zawsze są potrzebne do wyszukiwania
	var preloadDaneWyszukiwania = function(){
		db.laduj('obiektsortorder'); 
		if (typeof(mapa)!='undefined'){
			db.laduj('obiektWsp'); 
		}
	};
	
	
	//-----wszytuje kryteria z formularza-----
	var wczytajKryteriaWyszukiwania = function(){
		//===miasto===
		if ($('#miasto').val()){
			kryteriaWyszukiwania.miasto={ display : $('#miasto').val(),
																		search : Util.usunPL($('#miasto').val()),
																		typ : 'string'																		
																	};
		}
		
		//===współrzędne===
		if (typeof(mapa)!='undefined'){
			var daneMapa=mapa.podajDane();
			kryteriaWyszukiwania.obiektWsp={ display : { lon : daneMapa.lon, lat : daneMapa.lat, promien : daneMapa.r },
																				search : { lon : daneMapa.lon, lat : daneMapa.lat, promien : daneMapa.r },
																				typ : 'wspolrzedne'																		
																			};
		}
		
		//===rodzaj===
		if ($('#rodzaj').val()){
			kryteriaWyszukiwania.rodzaj={ display : $('#rodzaj').val(),
																		search : $('#rodzaj').val(),
																		typ : 'numer'																		
																	};		
		}
		
		//===położenie1===
		if ($('#polozenie1').val()){
			kryteriaWyszukiwania.polozenie1={ display : $('#polozenie1').val(),
																		search : $('#polozenie1').val(),
																		typ : 'numer'																		
																	};		
		}		
		
		//===województwo===
		if ($('#wojewodztwo').val()){
			kryteriaWyszukiwania.wojewodztwo={ display : $('#wojewodztwo').val(),
																		search : $('#wojewodztwo').val(),
																		typ : 'numer'																		
																	};		
		}			

		//===kraina===
		if ($('#kraina').val()){
			kryteriaWyszukiwania.kraina={ display : $('#kraina').val(),
																		search : $('#kraina').val(),
																		typ : 'numer'																		
																	};		
		}	
		
		//===cena min===
		if ($('#cenaMinOd').val() && $('#cenaMinDo').val()){
			kryteriaWyszukiwania.cenaMin={ display : { od : $('#cenaMinOd').val(), 'do' : $('#cenaMinDo').val()},
																				search : {  od : $('#cenaMinOd').val(), 'do' : $('#cenaMinDo').val() },
																				typ : 'widelkiLiczba'																		
																			};		
		}
		
		

		//=== pokoje ===
		if ($('.daneFormPokoje:checked').length){
			var maska=0;
			$('.daneFormPokoje:checked').each(function(){
				maska|=this.value;
			});

			kryteriaWyszukiwania.pokoje={ display : maska,
																		search : maska,
																		typ : 'maskaAND'																		
																	};		
		}
		
	
		//=== miejsca ===
		if ($('#liczbaMiejsc').val()){
			kryteriaWyszukiwania.miejsca={ display : { od : $('#liczbaMiejsc').val(), 'do' : 10000},
																				search : {  od : $('#liczbaMiejsc').val(), 'do' : 10000 },
																				typ : 'widelkiLiczba'																		
																			};		
		}
		
		
		
		//=== cecha ===
		if ($('.daneFormCecha:checked').length){
			var maska=0;
			$('.daneFormCecha:checked').each(function(){
				maska|=this.value;
			});

			kryteriaWyszukiwania.cecha={ display : maska,
																		search : maska,
																		typ : 'maskaAND'																		
																	};		
		}	
		
		
		//=== hobby ===
		if ($('.daneFormHobby:checked').length){
			var maska=0;
			$('.daneFormHobby:checked').each(function(){
				maska|=this.value;
			});

			kryteriaWyszukiwania.hobby={ display : maska,
																		search : maska,
																		typ : 'maskaAND'																		
																	};		
		}			
	
	};
	
	
	//resetuje kryteria wyszukiwania (obiekt kryteriaWyszukiwania)
	var resetujKryteriaWyszukiwania = function(){
		kryteriaWyszukiwania={};
		wyszukaneObiekty=new Array();
	};
	
	
	//-----------------WYSZUKIWANIE--------------
	var wyszukaj = function(){	
		MO.wynik={}; //efekty wyszukania
		var wyszukaneObiekty=new Array();
		
		//sprawdzamy czy wszystkie potrzebne dane są juz w DB
		var daneGotowe=true;		
		for(var k in kryteriaWyszukiwania){
			if (typeof(db.dane[k])=='undefined' || db.dane[k].inprogress) { 
				if (typeof(db.dane[k])=='undefined'){
					db.laduj(k);
				}				
				daneGotowe = false;
			}
		}
		
		//jesli nie ma jeszcze potrzebych danych to odpalamy wyszukaj za 100ms
		if (!daneGotowe) {
			setTimeout(function(){ wyszukaj();}, 100);
			return;
		}
		
		//-------------------szukamy-------------------
		wyszukaneObiekty=new Array();
		var pierwszeKryterium=true;
		for(var k in kryteriaWyszukiwania){
			kryteriaWyszukiwania[k].znalezione=new Array();			

			//string np miasto wpisane z palca
			if (kryteriaWyszukiwania[k].typ=='string'){			
				for (var q in db.dane[k].search){
					if (typeof(db.dane[k].search[q]) == 'string'){
						if (db.dane[k].search[q].indexOf(kryteriaWyszukiwania[k].search) == 0){
							//alert(kryteriaWyszukiwania[k].search+'    '+db.dane[k].search[q]);
							kryteriaWyszukiwania[k].znalezione = db.dane[k].data[q].concat(kryteriaWyszukiwania[k].znalezione);
						}
					}	
				}
			}

			//wspolrzedne + promien
			if (kryteriaWyszukiwania[k].typ=='wspolrzedne'){	
				for (var q=0; q<db.dane[k].length; q++){
					if ( czyWspWOkolicy(db.dane[k][q][1],db.dane[k][q][2],kryteriaWyszukiwania[k].search.lon,kryteriaWyszukiwania[k].search.lat, kryteriaWyszukiwania[k].search.promien)){
						kryteriaWyszukiwania[k].znalezione.push(db.dane[k][q][0]);
					}									
				}
			}	
			

			//maska OR
			if (kryteriaWyszukiwania[k].typ=='maskaOR'){	
				for (var q=0; q<db.dane[k].search.length; q++){
					//kryteriaWyszukiwania[k].search
					if ( db.dane[k].search[q]===(db.dane[k].search[q] & kryteriaWyszukiwania[k].search) ){
							kryteriaWyszukiwania[k].znalezione=db.dane[k].data[q].concat(kryteriaWyszukiwania[k].znalezione);
					}									
				}
			}	

			//maska AND
			if (kryteriaWyszukiwania[k].typ=='maskaAND'){	
				//alert(db.dane[k]);
				for (var q=0; q<db.dane[k].search.length; q++){
					if ( db.dane[k].search[q]===(db.dane[k].search[q] & kryteriaWyszukiwania[k].search) ){
							kryteriaWyszukiwania[k].znalezione= kryteriaWyszukiwania[k].znalezione.length > 0 ? Util.dajCzescWspolna(db.dane[k].data[q],kryteriaWyszukiwania[k].znalezione) : db.dane[k].data[q];
					}									
				}
			}				
			
			//widełki liczby
			if (kryteriaWyszukiwania[k].typ=='widelkiLiczba'){	
				//alert(kryteriaWyszukiwania[k].search);
				for (var q=0; q<db.dane[k].length; q++){
					if ( db.dane[k][q][1]>=kryteriaWyszukiwania[k].search.od &&  db.dane[k][q][1]<=kryteriaWyszukiwania[k].search['do']){
						kryteriaWyszukiwania[k].znalezione.push(db.dane[k][q][0]);
					}									
				}
			}				
			
			//numer 
			if (kryteriaWyszukiwania[k].typ=='numer'){	
				for (var i=0; i<db.dane[k].search.length; i++){					
						if (db.dane[k].search[i]==kryteriaWyszukiwania[k].search){
							kryteriaWyszukiwania[k].znalezione=db.dane[k].data[i];
							break;
						}										
				}
				//delete db.dane[k].search[i];
			}			

			// bierzemy część wspólną wszystkich wyszukanych i wyszukanyw w bierzącej iteracji
			//alert(kryteriaWyszukiwania[k].znalezione.sort());
			if (pierwszeKryterium){
				wyszukaneObiekty = kryteriaWyszukiwania[k].znalezione;				
				pierwszeKryterium=false;
			}	else {
				wyszukaneObiekty=Util.dajCzescWspolna(wyszukaneObiekty,kryteriaWyszukiwania[k].znalezione);
			}	
			
		}
		
		wyszukaneObiekty = Util.arrayUnique(wyszukaneObiekty);
		
		if (typeof(wyszukaneObiekty)!='undefined' && wyszukaneObiekty.length>0){
			wyszukaneObiekty.sort(sortujWyszukaneObiekty);
			MO.wynik.ileWyszukanych=wyszukaneObiekty.length;
			MO.wynik.wyszukaneObiekty=wyszukaneObiekty;
			pobierzDaneWyszukanychObiektow(1);
		} else {
			var html="BRAK WYNIKÓW";
			$('#wyniki').html(html);
			vis.setLoader(0);
			// brak wyników
		}	
		
	};
	
	//sprawdza czy wspolrzedne znajdują się w okolicy danego pun (innych wspolrzednych), odl podawana w km, x,y podawane w stopniach
	//sprowadza koło do kwadratu opisanego na tym kole
	var czyWspWOkolicy = function(x1,y1,x2,y2,odl){
			
		var odlStopnie = odl/90;
		return (Math.abs(x1-x2)<odlStopnie && Math.abs(y1-y2)<odlStopnie);
	}
	
	//---------metoda ustalajaca wzajemną kolejość 2 obiektów
	var sortujWyszukaneObiekty = function(a, b){		
			if (!parseInt(db.dane.obiektSortOrder[b]) || !parseInt(db.dane.obiektSortOrder[a])) { return 0; }		
			return db.dane.obiektSortOrder[b]-db.dane.obiektSortOrder[a];
	};
	
	//-------------- wyświetlanie listy wyszukanych obiektów-------
	var pobierzDaneWyszukanychObiektow = function(strona){
		strony(strona);
		wyswietlaneObiekty=MO.wynik.wyszukaneObiekty.slice(opcje.ileNaStronie*(strona-1),opcje.ileNaStronie*(strona-1)*1+opcje.ileNaStronie);
		daneWyszukanychObiektow=new Array();	
		
		for (var o in wyswietlaneObiekty){
			if (parseInt(wyswietlaneObiekty[o])>0){
				var nrString=wyswietlaneObiekty[o]+'';
				$.getJSON('db/dane/obiekt/'+nrString.substr(0,2)+"/"+wyswietlaneObiekty[o]+".dat", function(odp){			
					daneWyszukanychObiektow[odp['nr']]=odp;
					//jeśli mamy już dane wszsystkich obiektów to wyświetlamy	
					if (daneWyszukanychObiektow.countNumbers()==wyswietlaneObiekty.length){
						wyswietlWyniki();
					}
				});					
			}			
		}
	};
	
	var wyswietlWyniki = function (){
		var html='<tr><td colspan="4" class="wynikiNaglowek">'+slownik.wyszukiwarka.wyszukanychObiektow+': '+MO.wynik.ileWyszukanych+'</td></tr>';
		for(var o in wyswietlaneObiekty){
			if (parseInt(wyswietlaneObiekty[o])>0){
					
					var nr = wyswietlaneObiekty[o];
					var std='&nbsp;';
					for(var i=0; i<daneWyszukanychObiektow[nr].std; i++){
						std+='<img class="gwiazdka" src="graf/star.gif"/>';
					}
					html +=['<tr class="wierszWynik" id="o_'+daneWyszukanychObiektow[nr].nr+'"><td class="fotoTD">',
										//(daneWyszukanychObiektow[nr].zdjecia.length>0? '<img class="foto" src="db/obiektfoto/'+daneWyszukanychObiektow[nr].zdjecia[0]+'">' : '<img class="foto" src="graf/no-foto.png">')+'</td>',
										//(daneWyszukanychObiektow[nr].zdjecia.length>0? '<img class="foto" src="http://www.noclegiw.pl/zdjecia/'+daneWyszukanychObiektow[nr].zdjecia[0].substr(0,3)+'medium/'+daneWyszukanychObiektow[nr].zdjecia[0]+'">' : '<img class="foto" src="graf/no-foto.png">')+'</td>',
										(daneWyszukanychObiektow[nr].zdjecia.length>0? '<img class="foto" src="'+daneWyszukanychObiektow[nr].zdjecia[0]+'">' : '<img class="foto" src="graf/no-foto.png">')+'</td>',
										'<td><div class="nazwa">'+daneWyszukanychObiektow[nr].nazwy[slownik.jezykFull]+std+'</div>',
										'<div>'+daneWyszukanychObiektow[nr].miasto+': '+daneWyszukanychObiektow[nr].rodzaje[slownik.jezykFull]+'</div><div>'+(daneWyszukanychObiektow[nr].cenamin? slownik.wyszukiwarka.noclegOd+': <span class="cena">'+daneWyszukanychObiektow[nr].cenamin+" PLN</span>" : '')+'</div>',
										'<div>'+(daneWyszukanychObiektow[nr].pokoje[slownik.jezykFull] ? '<b>'+slownik.wyszukiwarka.pokoje+'</b> <span class="pokoje">'+daneWyszukanychObiektow[nr].pokoje[slownik.jezykFull]+" </span> "+(daneWyszukanychObiektow[nr].miejsca ? '( <b>'+daneWyszukanychObiektow[nr].miejsca+' '+slownik.wyszukiwarka.miejsc+'</b> )' : '') : '')+'</div></td></tr>'].join('');
					
			}
		}
		
		//----stronnicowanie + ile wyszukanych
		
		//ile wyszukanych
		html += '<tr class="stronnicowanie"><td colspan="4"><div class="stronnicowanieLewy">'+slownik.wyszukiwarka.wyszukanychObiektow+': '+MO.wynik.ileWyszukanych+'</div>';
		
		//--strony
		html+='<div class="stronnicowaniePrawy">';
		if (strony.poprzedniaStrona!==null){
			html+='<span  class="stronaNr" id="s_'+strony.poprzedniaStrona+'">'+slownik.wyszukiwarka.poprzedniaStrona+'</span>';
			for(var i=0; i<strony.stronyPrzed.length; i++){
				html+='<span  class="stronaNr" id="s_'+strony.stronyPrzed[i]+'">'+strony.stronyPrzed[i]+'</span>';
			}
		}
		
		if (strony.ileWyszukanychStron>1){
			html+='<span class="bierzacaStrona">'+strony.bierzacaStrona+'</span>';
		}
		
		if (strony.nastepnaStrona!==null){
			for(var i=0; i<strony.stronyPo.length; i++){
				html+='<span  class="stronaNr" id="s_'+strony.stronyPo[i]+'">'+strony.stronyPo[i]+'</span>';
			}
			html+='<span class="stronaNr" id="s_'+strony.nastepnaStrona+'">'+slownik.wyszukiwarka.nastepnaStrona+'</span>';
		}		
		html+='</div>';
		
		html+='</td></tr>';
		
		$('#wyniki').html(html);
		bindujEventyListy();
		vis.setLoader(0);
	};
	
	//binuje eventy nowoprzybyłej listy obiektów
	var bindujEventyListy = function(){
		//stronnicowanie
		$('.stronnicowanie .stronaNr').click(function(){	
			vis.setLoader(1);
			$(this).css('font-weight','bold');
			pobierzDaneWyszukanychObiektow(parseInt(this.id.substr(2)));
			return false;
		});
		
		//wiersze obiektów
		$('.wierszWynik').click(function(){
			otworzStroneObiektu(this.id.substr(2));
		});
		
	}
	
	// dane dla numeracji stron
	var strony = function(bierzacaStrona){		
		strony.bierzacaStrona=bierzacaStrona;
		strony.ileWyszukanychStron=Math.ceil(MO.wynik.ileWyszukanych/opcje.ileNaStronie);
		strony.poprzedniaStrona=null;
		strony.nastepnaStrona=null;
		strony.stronyPrzed=new Array();
		strony.stronyPo=new Array();

		//strony przed bierzacaStrona
		if (strony.bierzacaStrona>1){
			strony.poprzedniaStrona=strony.bierzacaStrona-1; //poprzednia strona
			for (var i=opcje.promienNumeracjiStron; i>0; i--){
				if (strony.bierzacaStrona-i>0) {
					strony.stronyPrzed.push(strony.bierzacaStrona-i);
				}
			}
		}
		
		//strony po bierzacaStrona
		if (strony.bierzacaStrona<strony.ileWyszukanychStron){	
			strony.nastepnaStrona=strony.bierzacaStrona+1; //nastepna strona
			for (var i=1; i<=opcje.promienNumeracjiStron; i++){
				if (strony.bierzacaStrona+i<=strony.ileWyszukanychStron) {
					strony.stronyPo.push(strony.bierzacaStrona+i);
				}
			}
		}
		
	};
	
	//Otwieranie strony obiektu
	var otworzStroneObiektu = function(obiektNr){
		MO.obiektNr=obiektNr; 
		MO.jezyk=slownik.jezyk;
		var idOkna="meteor_"+parseInt(Math.random()*100000000); //IE6 nie może miec kropek w nazwie okna
		var stronaObiektu=window.open('szczegoly.html', idOkna);
	};
	
	//---------------------------------------------EFEKTY WIZUALNE------------------------------
	var vis=function(){
		return {
			setLoader : function(b){
				if (b){
					$('.szukajB').append('<img class="szukajBimg" src="graf/szukajb-loader.gif" style="position:absolute; left:-19px; top:1px;">');
					$('.szukajB').attr('disabled',true);
					$('html').css('cursor','progress ');
				} else {
					$('.szukajBimg').remove();
					$('.szukajB').attr('disabled',false);
					$('html').css('cursor','');
				}
			},
			hideMap : function(){
				$('#mapa-interaktywna').animate({ height: 60});
				$('#rozwinMapeB').fadeIn();
			},
			showMap : function(){
				$('#mapa-interaktywna').animate({ height: 600});
				$('#rozwinMapeB').fadeOut();
			}			
			
		};
	}();

	
	
	
	
	//----start---
	inicjuj();
	return MO;
}




//dla IE
wyszukiwarka={};


$(function(){
	//jeśli jest mapa to ją ładujemy
	if (typeof(ObslugaMapy)!='undefined'){
		mapa=ObslugaMapy();
		if (!mapa.centrujWgHash()){
			mapa.centruj(20.96470833287739,52.212398098902995);	
		}
		
	}

	wyszukiwarka=ClassWyszukiwarka();
	

});