var Search = {

	_elementList: [
		'tr_cel', 'td_cel', 'td_panstwo', 'td_region', 'td_miejscowosc', 'td_dzielnica', 'div_dzielnica', 'div_cena', 'div_czynsz', 'div_pokoje', 'span_liczba_ofert', 'tab_pierwotny', 'tab_wtorny', 'tab_komercyjne', 'tab_zagraniczne', 'tab_przetargi', 'tr_opcje', 'tr_gora_underline', 'advanced_link', 'div_przetarg_dni'
	],

	_inputList: [
		'rynek', 'cel', '_cel-sprzedaz', '_cel-wynajem', 'tab', 'pojedyncze', 'negocjowalne', 'typ', 'tekst', 'panstwo', '_panstwo', 'region', 'miejscowosc', 'dzielnica', 'cena_od', 'cena_do', 'czynsz_od', 'czynsz_do', 'pokoje_od', 'pokoje_do', 'metraz_od', 'metraz_do', 'z_doplata', 'negocjowalne', 'polecane', 'klient_typ', 'liczba_ofert', 'zdjecia', 'submit', 'przetarg', 'przetarg_dni'
	],

	_elements: {},

	/**
	 * Metoda zapisuje elementy do tablic
	 */
	initialize: function(tab) 
	{
		for (var i = 0, length = this._elementList.length; i < length; ++i) {
			this._elements[this._elementList[i]] = $('search_' + this._elementList[i]);
		}

		for (var i = 0, length = this._inputList.length; i < length; ++i) {
			this._elements[this._inputList[i]] = $('search_' + this._inputList[i]);
		}

		this._changeTab(tab, true);
		this._setupObservers();
	},

	/**
	 * Metoda reakcji zmiany zakładki
	 */
	_changeTab: function(tab, initialize) 
	{
		if (typeof initialize == 'undefined')
			initialize = false;

		this._elements['tab'].setValue(tab);
		try {
			Common.highlightTab('search_tab_' + tab, 'msz_sel');
		} catch (e) {
			// Na wirtualkach może się zdarzyć...
			//alert('Exception: Default tab does not exist');
		}

		switch (tab) {
			case 'wtorny':
				this._elements['rynek'].setValue('wtorny');
				this._elements['panstwo'].setValue('1');
				this._elements['przetarg'].setValue('*');
				if (!initialize)
					this._elements['cel'].setValue('sprzedaz');
				break;
			case 'komercyjne':
				this._elements['rynek'].setValue('*');
				this._elements['panstwo'].setValue('1');
				this._elements['przetarg'].setValue('*');
				if (!initialize && $F(this._elements['typ']) != 'dzialka')
					this._elements['cel'].setValue('wynajem');
				break;
			case 'zagraniczne':
				this._elements['rynek'].setValue('*');
				this._elements['cel'].setValue('sprzedaz');
				this._elements['panstwo'].setValue($F(this._elements['_panstwo']));
				this._elements['przetarg'].setValue('*');
				break;
			case 'przetargi':
				this._elements['rynek'].setValue('*');
				this._elements['cel'].setValue('*');
				this._elements['panstwo'].setValue('1');
				this._elements['przetarg'].setValue('1');
				break;
			default:
				this._elements['rynek'].setValue('pierwotny');
				this._elements['cel'].setValue('sprzedaz');
				this._elements['panstwo'].setValue('1');
				this._elements['przetarg'].setValue('*');
		}

		this._setCel($F(this._elements['cel']));

		this._fillTyp();
		this._changeTyp();
		this._toggleVisible();
		this._toggleLabels();
	},


	_changeTyp: function()
	{
		var tab = $F(this._elements['tab']);
		var typ = $F(this._elements['typ']);

		if (tab == 'komercyjne') {
			if (typ == 'dzialka') {
				this._elements['rynek'].setValue('pierwotny');
				this._setCel('sprzedaz');
				Common.Event.fire(this._elements['_cel-sprzedaz'], 'change');
			} else {
				this._elements['rynek'].setValue('*');
				this._setCel('wynajem');
				Common.Event.fire(this._elements['_cel-wynajem'], 'change');
			}

			this._toggleCel();
		}
	},

	/**
	 * Metoda ustawienia observerów na poszczególnych elementach
	 */
	_setupObservers: function()
	{
		var _this = this;

		Event.observe(this._elements['typ'], 'change', function(event) {
		
			_this._togglePokoje();
			_this._toggleOpcje();
			_this._setOpcje();

			if ($F(_this._elements['tab']) == 'zagraniczne') {
				_this._fillPanstwo();
			} else {
				_this._fillRegion();
			}

			_this._callbackTyp(event);

		});

		Event.observe(this._elements['_panstwo'], 'change', function(event) {
			_this._elements['panstwo'].setValue($F(_this._elements['_panstwo']));
			_this._fillSelect('region', _this._elements['region'], { panstwo: $F(_this._elements['_panstwo']) }, ['region', 'miejscowosc', 'dzielnica'], $F(Event.findElement(event)));
			_this._callbackPanstwo(event);
		});

		Event.observe(this._elements['region'], 'change', function(event) {
			_this._fillSelect('miejscowosc', _this._elements['miejscowosc'], { region: $F(_this._elements['region']) }, ['miejscowosc', 'dzielnica'], $F(Event.findElement(event)));
			_this._callbackRegion(event);
		});

		Event.observe(this._elements['miejscowosc'], 'change', function(event) {
			_this._fillSelect('dzielnica', _this._elements['dzielnica'], { miejscowosc: $F(_this._elements['miejscowosc']) }, ['dzielnica'], $F(Event.findElement(event)));
			_this._callbackMiejscowosc(event);
		});

		if (this._elements['tab_pierwotny'] != null) {
			Event.observe(this._elements['tab_pierwotny'], 'click', function(event) {
				_this._changeTab('pierwotny');
				_this._setOpcje();
				_this._fillRegion();
				_this._callbackPierwotny(event);
			});
		}

		if (this._elements['tab_wtorny'] != null) {
			Event.observe(this._elements['tab_wtorny'], 'click', function(event) {
				_this._changeTab('wtorny');
				_this._setOpcje();
				_this._fillRegion();
				_this._callbackWtorny(event);
			});
		}

		if (this._elements['tab_komercyjne'] != null) {
			Event.observe(this._elements['tab_komercyjne'], 'click', function(event) {
				_this._changeTab('komercyjne');
				_this._setOpcje();
				_this._fillRegion();
				_this._callbackKomercyjne(event);
			});
		}
	
		if (this._elements['tab_zagraniczne'] != null) {
			Event.observe(this._elements['tab_zagraniczne'], 'click', function(event) {
				_this._changeTab('zagraniczne');
				_this._setOpcje();
				_this._fillPanstwo();
				_this._callbackZagraniczne(event);
			});
		}

		if (this._elements['tab_przetargi'] != null) {
			Event.observe(this._elements['tab_przetargi'], 'click', function(event) {
				_this._changeTab('przetargi');
				_this._setOpcje();
				_this._fillRegion();
				_this._callbackPrzetargi(event);
			});
		}

		['sprzedaz', 'wynajem'].each(function(name) {
			Event.observe(_this._elements['_cel-' + name], 'change', function(event) {
				_this._elements['cel'].setValue(Event.findElement(event).getValue());
				_this._toggleCenaCzynsz();
				_this._toggleOpcje();
				_this._setOffersNumber();
				_this._fillRegion();
			});
		});
		
		Event.observe(this._elements['z_doplata'], 'change', function(event) {
			_this._setOpcje(true);
			_this._fillRegion();
		});

		Event.observe(this._elements['negocjowalne'], 'change', function(event) {
			_this._setOpcje(true);
			_this._fillRegion();
		});

		Event.observe(this._elements['polecane'], 'change', function(event) {
			_this._setOpcje(true);
			if ($F(_this._elements['tab']) == 'zagraniczne') {
				_this._fillPanstwo();
			} else {
				_this._fillRegion();
			}
		});

		Event.observe(this._elements['klient_typ'], 'change', function(event) {
			_this._setOpcje(true);
			_this._fillRegion();
		});

		Event.observe(this._elements['zdjecia'], 'change', function(event) {
			_this._setOpcje(true);
			_this._fillRegion();
		});

		Event.observe(this._elements['typ'], 'change', function(event) {
			_this._changeTyp();
		});
		
		this._callbackSetupObservers();
	},

	/**
	 * Metoda sprawdza sensowne checkboxy
	 */
	_setOpcje: function(onCheckbox)
	{
		var _this = this;
	
		var parameters = {
			rynek: $F(this._elements['rynek']),
			cel: $F(this._elements['cel']),
			typ: $F(this._elements['typ']),
			panstwo: ($F(this._elements['tab']) == 'zagraniczne' ? '_1' : '1')
		};

		if (typeof onCheckbox != 'undefined' && onCheckbox == true) {
			parameters = Object.extend(parameters, {
				z_doplata: (!this._elements['z_doplata'].visible() ? '*' : $F(this._elements['z_doplata'])),
				negocjowalne: (!this._elements['negocjowalne'].visible() ? '*' : $F(this._elements['negocjowalne'])),
				polecane: (!this._elements['polecane'].visible() ? '*' : $F(this._elements['polecane'])),
				klient_typ: (!this._elements['klient_typ'].visible() ? '*' : $F(this._elements['klient_typ'])),
				zdjecia: (!this._elements['zdjecia'].visible() ? '*' : $F(this._elements['zdjecia']))
			});
		};

		var ajaxObj = new Ajax.Request('/ajax-form,opcje',
		{
			method: 'post',
			parameters: Object.extend(parameters),
			onSuccess: function(transport) {
				if (transport.responseText == '[]')
					return false;
				var response = transport.responseText.evalJSON();
				var checkbox = ['z_doplata', 'negocjowalne', 'polecane', 'zdjecia', 'klient_typ'];
				for (var i = 0; i < 4; ++i) {
					if ('none' == _this._elements[checkbox[i]].style.display) {
						_this._elements[checkbox[i]].disabled = true;
					} else {
						if (0 == response[i]['liczbaOfert']) {
							_this._elements[checkbox[i]].disabled = true;
							_this._elements[checkbox[i]].checked = false;
						} else {
							_this._elements[checkbox[i]].disabled = false;
						}
					}
				}
				_this._setOffersNumber(); // to jest tutaj z powodu wyscigu
			},
			onFailure: function() { 
				alert(Lang.generic_error);
			}
		});

	},

	/**
	 * Metoda ustawia liczbę dostępnych ofert
	 */
	_setOffersNumber: function()
	{
		var _this = this;
	
		var parameters = {
			rynek: $F(this._elements['rynek']),
			cel: $F(this._elements['cel']),
			typ: $F(this._elements['typ']),
			panstwo: ($F(this._elements['tab']) == 'zagraniczne' ? '_1' : '1'),
			z_doplata: (this._elements['z_doplata'].disabled ? '*' : $F(this._elements['z_doplata'])),
			negocjowalne: (this._elements['negocjowalne'].disabled ? '*' : $F(this._elements['negocjowalne'])),
			polecane: (this._elements['polecane'].disabled ? '*' : $F(this._elements['polecane'])),
			klient_typ: (this._elements['klient_typ'].disabled ? '*' : $F(this._elements['klient_typ'])),
			zdjecia: (this._elements['zdjecia'].disabled ? '*' : $F(this._elements['zdjecia'])),
			przetarg: (this._elements['przetarg'].disabled ? '*' : $F(this._elements['przetarg']))
		};

		var ajaxObj = new Ajax.Request('/ajax-form,liczba-ofert',
		{
			method: 'post',
			parameters: Object.extend(parameters),
			onSuccess: function(transport) {
				if (transport.responseText == '[]')
					return false;
				var response = transport.responseText.evalJSON();
				_this._elements['span_liczba_ofert'].innerHTML = response.oferty;
			},
			onFailure: function() { 
				alert(Lang.generic_error);
			}
		});

	},

	/**
	 * Metoda wypełnia wybieraki
	 */
	_fillSelect: function(name, element, parameters, clear, value)
	{
		_this = this;

		/* pierwsze czyszczenie, żeby nic nie wisiało w czasie zmiany */
		clear.each(function(name) {
			Common.Form.clearSelect(_this._elements[name]);
		});

		if (value == '_none') return;

		parameters = Object.extend({
			rynek: $F(this._elements['rynek']),
			cel: $F(this._elements['cel']),
			typ: $F(this._elements['typ']),
			z_doplata: (!this._elements['z_doplata'].visible() ? '*' : $F(this._elements['z_doplata'])),
			negocjowalne: (!this._elements['negocjowalne'].visible() ? '*' : $F(this._elements['negocjowalne'])),
			polecane: (!this._elements['polecane'].visible() ? '*' : $F(this._elements['polecane'])),
			klient_typ: (!this._elements['klient_typ'].visible() ? '*' : $F(this._elements['klient_typ'])),
			zdjecia: (!this._elements['zdjecia'].visible() ? '*' : $F(this._elements['zdjecia'])),
			przetarg: (!this._elements['przetarg'].visible() ? '*' : $F(this._elements['przetarg']))
		}, parameters);

		this._fillSelectAjax(name, element, parameters, clear);

	},

	/**
	 * Metoda uruchamia faktycznego ajaxa z parametrami
	 */
	_fillSelectAjax: function(name, element, parameters, clear)
	{
		var _this = this;
		var ajaxObj = new Ajax.Request('/ajax-form,' + name.toLowerCase() ,
		{
			method: 'post',
			parameters: parameters,
			onSuccess: function(transport) {
				if (transport.responseText == '[]')
					return false;
				var response = transport.responseText.evalJSON();
				
				/* drugie czyszczenie żeby uniknąć wielokrotnego dodania */
				clear.each(function(name) {
					Common.Form.clearSelect(_this._elements[name]);
				});

				Common.Form.fillSelect(element, response);
			},
			onFailure: function() { 
				alert(Lang.generic_error);
			}
		});

	},

	/**
	 * Pomocnicza metoda do wypełniania wybieraka państw
	 */
	_fillPanstwo: function(value)
	{
		this._fillSelect('panstwo', this._elements['_panstwo'], { panstwo: '_1' }, ['_panstwo', 'region', 'miejscowosc', 'dzielnica'], value || '');
	},

	/**
	 * Pomocnicza metoda do wypełniania wybieraka regionów
	 */
	_fillRegion: function(value)
	{
		this._fillSelect('region', this._elements['region'], { panstwo: '1' }, ['_panstwo', 'region', 'miejscowosc', 'dzielnica'], value || '');
	},

	/**
	 * Pomocnicza metoda do wypełniania wybieraka typu po załadowaniu
	 */
	_fillTyp: function()
	{
		//options = Config.Search.typy[this._elements['tab'].getValue()];
		options = this._typy[$F(this._elements['tab'])];
		typ = Common.Form.clearSelect(this._elements['typ'], true);
		Common.Form.fillSelect(this._elements['typ'], options, typ);
	},

	/**
	 * Metoda zaznacza radiobutton celu
	 */
	_setCel: function(cel)
	{
		var cele = Array('sprzedaz', 'wynajem');
		for (i = 0; i < cele.length; i ++) {
			this._elements['_cel-' + cele[i]].checked = (cele[i] == cel);
		}
	},

	/**
	 * Metoda podmienia labele w zależności od zakładki
	 */
	_toggleLabels: function()
	{
		switch($F(this._elements['tab'])) {
			case 'przetargi':
				this._elements['typ'].previous().previous().innerHTML = Lang.przedmiot_ogloszenia;
				this._elements['tekst'].previous().innerHTML = Lang.slowo_kluczowe;
				break;

			default:
				this._elements['typ'].previous().previous().innerHTML = Lang.typ_nieruchomosci;
				this._elements['tekst'].previous().innerHTML = Lang.nazwa_adres_tekst;
		}
	},

	/**
	 * Metoda wyświetla elementy zmieniające widoczność
	 */
	_toggleVisible: function()
	{
		this._toggleCel();
		this._toggleOpcje();
		this._toggleCenaCzynsz();
		this._togglePokoje();
		this._toggleLokalizacja();
		this._togglePrzetargDni();
		this._toggleLinkToAdvanced();
	},

	/**
	 * Metoda wyświetla pasek celu
	 */
	_toggleCel: function()
	{
		var display = false;

		switch ($F(this._elements['tab'])) {
			case 'wtorny':
				display = true;
				break;
			
			case 'komercyjne':
				display = ($F(this._elements['typ']) == 'dzialka') ? false : true;
				break;

			default:
				display = false;
				
		}

		this._elements['tr_cel'].style.display = display ? '' : 'none';
		this._elements['_cel-sprzedaz'].disabled = display ? false : true;
		this._elements['_cel-wynajem'].disabled = display ? false : true;
	},

	/**
	 * Metoda wyświetla pole ceny lub czynszu
	 */
	_toggleCenaCzynsz: function()
	{
		switch ($F(this._elements['cel'])) {
			case 'wynajem':
				this._elements['div_czynsz'].style.display = '';
				this._elements['czynsz_od'].disabled = false;
				this._elements['czynsz_do'].disabled = false;
				
				this._elements['div_cena'].style.display = 'none';
				this._elements['cena_od'].disabled = true;
				this._elements['cena_do'].disabled = true;
				break;
			default:
				this._elements['div_cena'].style.display = '';
				this._elements['cena_od'].disabled = false;
				this._elements['cena_do'].disabled = false;

				this._elements['div_czynsz'].style.display = 'none';
				this._elements['czynsz_od'].disabled = true;
				this._elements['czynsz_do'].disabled = true;
		}
	},

	/**
	 * Metoda wyświetla pole pokojów
	 */
	_togglePokoje: function()
	{
		switch ($F(this._elements['typ'])) {
			case 'mieszkanie':
			case 'dom':
			case 'apartament':
			case 'loft':
				this._elements['div_pokoje'].style.display = '';
				this._elements['pokoje_od'].disabled = false;
				this._elements['pokoje_do'].disabled = false;
				break;
			default:
				this._elements['div_pokoje'].style.display = 'none';
				this._elements['pokoje_od'].disabled = true;
				this._elements['pokoje_do'].disabled = true;
		}
	},

	/**
	 * Metoda wyświetla odpowiednie wybieraki lokalizacji
	 */
	_toggleLokalizacja: function()
	{
		switch ($F(this._elements['tab'])) {
			case 'zagraniczne':
				this._elements['td_panstwo'].style.display = '';
				this._elements['_panstwo'].disabled = false;
				
				this._elements['td_dzielnica'].style.display = 'none';
				this._elements['div_dzielnica'].style.display = 'none';
				this._elements['dzielnica'].disabled = true;
				break;
			case 'przetargi':
				this._elements['td_panstwo'].style.display = 'none';
				this._elements['_panstwo'].disabled = true;

				this._elements['td_dzielnica'].style.display = '';
				this._elements['div_dzielnica'].style.display = 'none';
				this._elements['dzielnica'].disabled = true;
				break;
			default:
				this._elements['td_panstwo'].style.display = 'none';
				this._elements['_panstwo'].disabled = true;
				
				this._elements['td_dzielnica'].style.display = '';
				this._elements['div_dzielnica'].style.display = '';
				this._elements['dzielnica'].disabled = false;
		}
	},

	/**
	 * Metoda wyświetla wybierak dni przetargu
	 */
	_togglePrzetargDni: function()
	{
		switch ($F(this._elements['tab'])) {
			case 'przetargi':
				this._elements['div_przetarg_dni'].style.display = '';
				this._elements['przetarg_dni'].disabled = false;
				break;
			default:
				this._elements['div_przetarg_dni'].style.display = 'none';
				this._elements['przetarg_dni'].disabled = true;
		}
	},

	/**
	 * Metoda pokazuje/ukrywa link do szukarki zaawansowanej w zależności od rynku
	 */
	_toggleLinkToAdvanced: function()
	{
		switch ($F(this._elements['tab'])) {
			case 'przetargi':
				this._elements['advanced_link'].style.display = 'none';
				break;

			default:
				this._elements['advanced_link'].style.display = '';
				break;
		}
	},

	/**
	 * Metoda ukrywa lub pokazuje checkboxy
	 */
	_toggleCheckbox: function(id, enabled)
	{
		if (enabled) {
			this._elements[id].style.display = '';
			this._elements[id].next('label').style.display = '';
		} else {
			this._elements[id].style.display = 'none';
			this._elements[id].next('label').style.display = 'none';
		}
	},

	/**
	 * Metoda wyświetla odpowiednie checkboxy
	 */
	_toggleOpcje: function()
	{
		switch ($F(this._elements['tab'])) {
			case 'pierwotny':
				switch ($F(this._elements['typ'])) {
					// jakby się coś miało pojawić
					default:
						this._elements['tr_opcje'].style.display = '';
						this._elements['tr_gora_underline'].style.display = '';
						this._toggleCheckbox('z_doplata', true);
						this._toggleCheckbox('negocjowalne', true);
						this._toggleCheckbox('polecane', true);
						this._toggleCheckbox('klient_typ', false);
						break;
				}
				break;
			case 'wtorny':
				switch ($F(this._elements['typ'])) {
					case 'mieszkanie':
					case 'apartament':
					case 'loft':
					case 'dom':
						this._elements['tr_opcje'].style.display = '';
						this._elements['tr_gora_underline'].style.display = '';
						if ($F(this._elements['cel']) != 'wynajem') {
							this._toggleCheckbox('z_doplata', true);
							this._elements['z_doplata'].disabled = false;
						} else {
							this._toggleCheckbox('z_doplata', false);
							this._elements['z_doplata'].disabled = true;
						}
						this._toggleCheckbox('negocjowalne', false);
						this._toggleCheckbox('polecane', true);
						this._toggleCheckbox('klient_typ', true);
						break;
					default:
						this._elements['tr_opcje'].style.display = 'none';
						this._elements['tr_gora_underline'].style.display = '';
						this._toggleCheckbox('z_doplata', false);
						this._toggleCheckbox('negocjowalne', false);
						this._toggleCheckbox('polecane', false);
						this._toggleCheckbox('klient_typ', false);
				}
				break;
			case 'komercyjne':
				this._elements['tr_opcje'].style.display = 'none';
				this._elements['tr_gora_underline'].style.display = '';
				this._toggleCheckbox('z_doplata', false);
				this._toggleCheckbox('negocjowalne', false);
				this._toggleCheckbox('polecane', false);
				this._toggleCheckbox('klient_typ', false);
				break;
			case 'zagraniczne':
				this._elements['tr_opcje'].style.display = '';
				this._elements['tr_gora_underline'].style.display = '';
				this._toggleCheckbox('z_doplata', false);
				this._toggleCheckbox('negocjowalne', false);
				this._toggleCheckbox('polecane', true);
				this._toggleCheckbox('klient_typ', false);
				break;
			case 'przetargi':
				this._elements['tr_opcje'].style.display = 'none';
				this._elements['tr_gora_underline'].style.display = 'none';
				this._toggleCheckbox('z_doplata', false);
				this._toggleCheckbox('negocjowalne', false);
				this._toggleCheckbox('polecane', false);
				this._toggleCheckbox('klient_typ', false);
				break;
		}
	},

	_callbackTyp: function() {},
	_callbackPanstwo: function() {},
	_callbackRegion: function() {},
	_callbackMiejscowosc: function() {},
	_callbackDzielnica: function() {},
	_callbackPierwotny: function() {},
	_callbackWtorny: function() {},
	_callbackKomercyjne: function() {},
	_callbackZagraniczne: function() {},
	_callbackPrzetargi: function() {},
	_callbackSetupObservers: function() {},

	/**
	 * Metoda przejścia do szukarki zaawansowanej
	 */
	goToAdvanced: function()
	{
		tab = $F('search_tab');
		typ = $F('search_typ');
		cel = $F('search_cel');
		
		link = '/' + LangUrl.szukaj + ',';
		link += ',' + LangUrl.typ + ',' + LangUrl[typ];
		link += ',search_tab,' + LangUrl[tab];

		if (cel != '*')
			link += ',' + LangUrl.cel + ',' + LangUrl[cel];

		link += '?clear=2';

		location.href = link;
	}
};
