var r = null;
var rselect = null;
var rselect_timeout = null;


$.ui.autocomplete.prototype._suggest = function(items) {
	var ul = this.menu.element
		.empty()
		.zIndex( this.element.zIndex() + 1 ),
	menuWidth,
	textWidth;
	this._renderMenu( ul, items );
	// TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
	this.menu.deactivate();
	this.menu.refresh();
	this.menu.element.show().position( $.extend({
		of: this.element.parent()
	}, this.options.position ));
	
	menuWidth = ul.width( "" ).outerWidth();
	textWidth = this.element.parent().outerWidth();
	ul.outerWidth( Math.max( menuWidth, textWidth ) );
}

function click_region(e, nuts3, nuts_name) {
	if (r != null) {
		r.abort();
		r = null;
	}

	if (!rselect) {
		rselect = $(document.createElement('div'));
		rselect.attr('id', 'region_select_container');
		$('#left_cont').append(rselect);
		rselect.bind('mouseout', function (event) {
			//if (event.target.id == rselect.attr('id')) {
				rselect_timeout = setTimeout("rselect.hide()", 500);
			//}
		});
		rselect.bind('mouseover', function (event) {
			if (rselect_timeout) {
				clearTimeout(rselect_timeout);
			}
			rselect_timeout = null;
		});
	}
	if (rselect_timeout) {
		clearTimeout(rselect_timeout);
	}
	rselect.hide();
	rselect.empty();
	rselect.rselect_change = function(event) {
		if (!event.target) return false;
		var trg = event.target;
		if (trg.nodeName == 'INPUT') {
			if (trg.checked) {
				$('.loc-store').trigger('locationadd', [$(trg).attr('nuts_name'), trg.value, 0]);
			} else {
				$('.loc-store').find('#'+trg.value).remove()
				$('.loc-input').trigger('place');
			}
		}
	};
	
	if (!e.pageX && e.clientX) {
		var w = $(window);
		e.pageX = e.clientX+w.scrollLeft();
		e.pageY = e.clientY+w.scrollTop();
	}
	var pos = $(rselect[0].parentNode).offset();
	rselect.css({'left': (e.pageX-pos.left-10)+'px', 'top': (e.pageY-pos.top-10)+'px'});
	var rp = $(document.createElement('p'));
	var inp = $(document.createElement('input'));
	inp.attr({'class': 'chbox', 'type': 'checkbox', 'value': nuts3, 'nuts_name': nuts_name+' (kraj)'});
	if ($('.loc-store').find('#'+nuts3).length > 0) {
		inp.attr('checked', true);
	}
	inp.bind('change', rselect.rselect_change);

	var lbl = $(document.createElement('label'));
	lbl.append(inp);
	lbl.append('celý kraj '+nuts_name);
	rp.append(lbl);
	rselect.append(rp);
	rselect.append('<span>načítám data...</span>');
	
	
	rselect.bind('click', function(event) {
		if (!event.target) return false;
		var trg = event.target;
		if (trg.nodeName == 'LABEL') {
			return true;
		} else if (trg.nodeName == 'INPUT') {
			var kraj = trg.value.match(/^[A-Z]{2}[0-9]{3}$/) ? true : false;
			if (kraj && trg.checked) {
				var el = rselect.find('ul input[type=checkbox]:checked').attr('checked', false).change();
			} else {
				var el = rselect.find('input[type=checkbox]:first').attr('checked', false).change();
			}
			return true;
		}
		return false;
	});
	rselect.show();
	
	r = $.ajax({
		url: baseURL+'/rpc/address.php',
		type: 'POST',
		dataType: 'text',
		data: 'akce=okresy&kraj='+nuts3,
		timeout: 10000,
		success: function(data) {
			$('span', rselect).remove();
			var ul = $(document.createElement('ul'));
			var okresy = data.split('#');
			var loc_store = $('.loc-store');
			for (i=0; i<okresy.length; i++) {
				var a = okresy[i].split('|');
				if (a.length == 2) {
					var li = $(document.createElement('li'));
					var inp = $(document.createElement('input'));
					inp.attr({'class': 'chbox', 'type': 'checkbox', 'value' : a[0], 'nuts_name': a[1]+(nuts3 != 'CZ010' ? ' (okres)' : '')} );
					if (loc_store.find('#'+a[0]).length > 0) {
						inp.attr('checked', true);
					}
					inp.bind('change', rselect.rselect_change);
					li.append(inp);
					li.append(a[1]);
					ul.append(li);
				}
			}
			rselect.append(ul);
		}
	});
}


$(function () {
	$('.loc-store').bind('click', function(event) {
		if (event.target) {
			var et = $(event.target);
			if (et.hasClass('loc-container')) {
				et.remove();
				$('.loc-input').trigger('place');
				return false;
			} else if (et.hasClass('loc-remove')) {
				et.parent().remove();
				$('.loc-input').trigger('place');
				return false;
			}
		}
	}).bind('locationadd', function(event, name, nuts, radius) {
		var $self = $(this);
		var $suggest_input = $self.find('.loc-input');
		$suggest_input.hide();
		$self.find('#'+nuts).remove();
		$self.append('<span class="loc-container" id="'+nuts+'">'+name+(radius > 0 ? '&nbsp;+'+radius+'&nbsp;km' : '')+'<input type="hidden" name="l[]" value="'+nuts+'" radius="'+radius+'" /><span class="loc-remove">&times;</span></span> ');
		$suggest_input.trigger('place');
	});

	$('.loc-input').autocomplete({
		appendTo: '.loc-store',
		delay: 300,
		minLength: 2,
		source: function(request, response) {
			if (r != null) {
				r.abort();
				r = null;
			}
			var s = new Array('a','c','d','e','i','l','n','o','r','s','t','u','y','z');
			var r = new Array('(a|á)','(c|č)','(d|ď)','(e|é|ě)','(i|í)','(l|ž)','(n|ň)','(o|ó)','(r|ř)','(s|)','(t|)','(u|ú|ů)','(y|ý)','(z|)');
			var t = request.term;
			for (var i = 0; i<r.length; i++) {
				var re = new RegExp(s[i],'gi');
				t = t.replace(re, r[i]);
			}
			r = $.ajax({
				url: baseURL+'/rpc/hplocsuggest/',
				dataType: 'json',
				data: 'q='+encodeURIComponent(request.term),
				timeout: 10000,
				term: t,
				success: function(data) {
					var re = new RegExp('(\\b'+this.term.replace(/(\*|;|%)/,'').split(/[ ,]/).join('|\\b')+')', 'gi');
					response($.map(data, function(item) {
						return {
							label: '<span class="loc">'+item.name.replace(re, '<span class="loc-match">$1</span>')+'</span>',
							value: item.short_name,
							nuts: item.nuts
						}
					}))
				}
			});
		},
		select: function(event, ui) {
			var originalTarget = event.srcElement || event.originalTarget;
			var radius = originalTarget ? $(originalTarget).attr('radius') : 0;
			if (!radius) {
				radius = 0;
			}
			var self = $(this);
			var $ls = $('.loc-store');
			$ls.trigger('locationadd', [ui.item.value, ui.item.nuts, radius]);
			return false;
		},
		open: function(event, ui) {
			var self = this;
			var $w = $(this).autocomplete('widget');
			var max_length = 0;
			var elms = $w.find('.loc');
			for (var i = 0; i < elms.length; i++) {
				if (elms[i].offsetWidth > max_length) {
					max_length = elms[i].offsetWidth;
				}
			}
			if ($w.width() < (max_length + 100)) {
				$w.css('width', (max_length + 100)+'px');
			}
			var r_nuts5 = new RegExp('^[A-Z]{2}[0-9]{3}[0-9A-Z]{1}[0-9]{6}$','i');
			$(this).autocomplete('widget').find('.ui-menu-item').each(function(index,menuItem) {
				var $r = $('<span class="radius">+<a radius="5" title="obce v okolí 5 km">5</a>,<a radius="10" title="obce v okolí 10 km">10</a>,<a radius="20" title="obce v okolí 20 km">20</a>&nbsp;km</span>');
				var $mi = $(menuItem);
				var d = $mi.data('item.autocomplete');
				if (d && d.nuts && r_nuts5.test(d.nuts)) {
					$mi.find('a').append($r);
				}
			});
		}
	}).bind('focus', function() {
		$(this).val('');
	}).bind('place', function() {
		var $self = $(this);
		$self.css('position', 'absolute');
		var $op = $self.parent();
		var focus = true;
		if ($op.find('.loc-container').length == 0) {
			$self.val($self.data('emptyText'));
			focus = false;
		} else {
			$self.val('');
		}
		var $lc = $op.find('.loc-container:last');
		var opw = $op.width();
		$op.find('br').remove();
		if ($lc.length == 0) {
			$op.append('<br />');
			var right = 2;
			var top = 0;
		} else {
			var right = Math.round($lc.position().left + $lc.outerWidth() + 5);
			var top = $lc.position().top-1;
		}
		
		if ((opw - right) >= 100) {
			$self.css('position', 'absolute');
			$self.css('left', right+'px');
			$self.css('top', Math.round(top)+'px');
			$self.css('width', Math.round(opw-right-$self.outerWidth()+$self.width())+'px');
		} else {
			$op.append('<br /><br />');
			$self.css('left', '2px');
			$self.css('top', Math.round($lc.position().top+$lc.outerHeight()+1)+'px');
			$self.css('width', Math.round(opw)+'px');
		}
		$self.show();
		if (focus) {
			$self.focus();
		}
	}).trigger('place').data('emptyText', 'Zadejte kraj, okres, obec, část obce');
	
	$('#cat_tree_cont').bind('click', function(event) {
		if (event.target) {
			if (event.target.nodeName == 'A') {
				$('#cat_tree_cont a.selected').removeClass('selected');
				var et = $(event.target);
				var et_rel = et.attr('rel');
				et.addClass('selected');
				var ic = et.parents('.prop_cat').find('.prop_cat_icon');
				var ss = $('#second_slide');
				var st = ss.find('.selected_type');
				var sc = ss.find('.sc_container');
				st[0].className = 'selected_type';
				if (ic.length > 0) {
					var c = ic[0].className.split(' ');
					st.addClass(c[1]);
				}
				sc.empty();
				et.parents('.prop_cat').find('.sub_cat_cont .cat-anchor').map(function(i,el){
					var lb = $('<label></label>');
					var cb = $('<input type="checkbox" name="sc[]" />').attr('value', el.rel).addClass('sc-cbox');
					if (!et_rel || (et_rel == el.rel)) {
						cb.attr('checked', 'checked');
					}
					lb.append(cb).append($(el).text()).addClass('sc-item');
					sc.append(lb);
				});
				
				st.text(et.parents('.prop_cat').find('.ct_cat .cat-anchor').text());
				$('#slider_cont').scrollTo({top: '0px',left:'990px'},300);
				/*$('#srch_overlay').hide();
				$('#map_tip').hide();*/
				$('#srch_start').removeClass('button-gray');
				return false;
			}
		}
	});
	
	var sc = $('#slider_cont');
	if (sc.length > 0) {
		sc.scrollTo({top: '0px',left:'0px'});
	}
	
	$('#srch_start').bind('click', function () {
		var href = '';
		var flt = $(this).parents('.search_top').find('input:not(.loc-store input)').serialize();
		if (flt) {
			href += (href ? '&' : '?')+flt+'&filter_submit=';
		}
		var loc_str = $.map($('.loc-store input[type=hidden]'), function (el, i) {
			var e = $(el);
			var r = e.attr('radius');
			return 'l[]='+e.val()+(r && (r > 0) ? '&r[]='+i+(r < 10 ? '0' : '')+r : '');
		}).join('&');
		if (loc_str) {
			href += (href ? '&' : '?')+loc_str;
		}
		var t = $('#cat_tree_cont input[type=hidden]').serialize();
		if (t) {
			href += (href ? '&' : '?')+t;
		}
		var cat = $('#cat_tree_cont');
		if (cat.length > 0) {
			var cat_s = cat.find('a.selected').attr('href');
			if (cat_s) {
				href = cat_s+href;
			} else {
				alert('Zvolte některý z druhů nemovitostí.');
				return false;
			}
		}
		
		if (href) {
			window.location.href = href;
		}
		return false;
	});
	
});
