vyletnik.ui = {};
vyletnik.ui.Initializer = function (controls) {
	return {
		init : function () {
			for (var i = 0; i < controls.length; i++) {
				controls[i].init();
			}
		}
	};
};

vyletnik.ui.LoadingBar = function () {
	var qWindow;
	return {
		init : function () {
			qWindow = jQuery('#loadingBar');
		},
		showLoading : function () {
			qWindow.css('display', 'block');
		},
		hideLoading : function () {
			qWindow.css('display', 'none');			
		}
	};
};

/**
 * Obecna implementace kategorii. Vyuziva se jako pomocnik pri implementaci
 * kategorii mist, sluzeb, turistickych informaci ....
 * Umi ukazovat a schovavat kategorie
 */
vyletnik.ui.Categories = function (layerManager) {
	var qCategories;
	var qCategoriesInputs;
	var qToggler;
	var qAllCheckbox;
	
	var addedHandler = null;
	var removedHandler = null;
	var onShowHandler = null;
	
	var pub = {
		/**
		 * Inicializuje komponentu
		 * @param categoryCssPath - cesta za pomoci ktere je jquery schopen najit skupinu
		 * s checkboxama
		 */
		init : function (categoryCssPath) {
			//inicializace div kontaineru
			qCategories = jQuery(categoryCssPath + ' .options');
			qToggler = jQuery(categoryCssPath + ' a');
			
			qAllCheckbox = jQuery(categoryCssPath + ' input.group');
			//IE 7 a 6 spatne zpracovavaji udalost chnage nad checkboxem, takze jeste inforumjeme klikem
			qAllCheckbox.click(function () {
				qAllCheckbox.change();
			});
			qAllCheckbox.change(function () {
				if (jQuery(this).attr('checked') === true) {
					pub.selectAll();
				} else {
					pub.unselectAll();
				}
			});
			
			qToggler.click(function (e) {
				e.preventDefault();
				pub.toggle();
			});
			
			//inicializace checkboxu kategorii
			qCategoriesInputs = qCategories.find('input');
			qCategoriesInputs.change(function () {
				var checked = jQuery(this).attr('checked');
				var id = parseInt(jQuery(this).val(), 10);
				if (checked === true) {
					if (addedHandler !== null) {
						addedHandler(id);
					}
				} else {
					if (removedHandler !== null) {
						removedHandler(id);
					}
				}
			});
			//protoze IE vygeneruje onchange az pri ztrate focusu,
			//tak po kliknuti na checkbox presuneme focus rodice
			qCategoriesInputs.click(function () {
				qCategories[0].focus();
			});

			qAllCheckbox.change();
		},
		/**
		 * Ukaze a schova kategorie
		 */
		toggle : function () {			
			if (qCategories.css('display') == 'block') {
				hide();
			} else {
				show();
			}
		},
		hide : function () {
			hide();
		},
		show : function () {
			show();
		},
		/**
		 * Zaskrtne vsechny kategorie
		 */
		selectAll : function () {
			qCategoriesInputs.attr('checked', true);
			qCategoriesInputs.change();
		},
		/**
		 * Odskrtne vsechny kategorie
		 */
		unselectAll : function () {
			qCategoriesInputs.attr('checked', false);
			qCategoriesInputs.change();
		},
		select : function (values) {
			pub.unselectAll();
			jQuery.each(values, function (key, value) {
				var toCheck = qCategories.find('[value=' + value + ']');
				toCheck.attr('checked', true);
				toCheck.change();				
			});
		},
		/**
		 * Metoda na zaregistrovani handleru, obsluhujiciho zaskrtnuti kategorie
		 */
		added : function (handler) {
			addedHandler = handler;
		},
		/**
		 * Metoda na zaregistrovani handleru, obsluhujiciho odebrani kategorie z vyberu
		 */
		removed : function (handler) {
			removedHandler = handler;
		},
		onShow : function (handler) {
			onShowHandler = handler;
		}
	};
	function hide() {
		qCategories.css('display', 'none');
	}
	function show() {
		if (onShowHandler !== null) {
			onShowHandler();
		}
		qCategories.css('display', 'block');
		layerManager.top(qCategories);
	}
	return pub;	
};
vyletnik.ui.NapovedaButton = function (napovedaPopup) {
	return {
		init : function () {
			napovedaPopup.init();
			jQuery('#helpButton').click(function (e) {
				e.preventDefault();
				napovedaPopup.show();
			});
		}
	};
};
vyletnik.ui.NapovedaPopup = function () {
	var qWindow;
	return {
		init : function () {
			qWindow = jQuery('#helpWindow');
			qWindow.dialog({
				title : 'Nápověda',
				width : 500,
				height : 400,
				maxHeight : 400, 
				resizable : false,
				autoOpen : false
			});
		},
		show : function () {
			qWindow.dialog('open');
		}
	};
};
vyletnik.ui.Popuper = function () {
	var popupsContainer;
	return {
		init : function () {
			popupsContainer = jQuery('#popUps .wrapper');
		},
		getPopup : function (text) {
			var win = jQuery('<div class="popUp">' + 
				'<div class="top"></div>' + 
				'<div class="inside">' + text + '</div>' +
				'<div class="bottom"></div>' +
				'</div>');
			
			return {
				show : function () {
					win.click(function () {
						win.remove();
					});
					win.appendTo(popupsContainer);
				},
				hide : function () {
					win.remove();
				}
			};
		}
	};
};
vyletnik.ui.LayerManager = function () {
	var last = 0;
	var topElement;
	return {
		top : function (qElement) {
			if (topElement != qElement) {
				last++;
				qElement.css("z-index", last);
				topElement = qElement;
			}
		}
	};
};
vyletnik.ui.Suggest = function (textbox, contentLoader) {
	var qTextbox;
	var qPanel;
	var qAllItems = [];
	var selected = null;
	
	function show() {
		qPanel.css('display', 'block');
	}
	function close() {
		qPanel.css('display', 'none');
		selected = null;
	}
	function select(pos) {
		if (selected !== null) {
			unselect(selected);
		}
		element = qAllItems[pos];
		element.css('background', '#F59B46');
		selected = pos;
	}
	function unselect(pos) {
		element = qAllItems[pos];
		element.css('background', 'none');
	}	
	function selectNext() {
		if (selected !== null) {
			if (selected === qAllItems.length - 1) {
				select(0);			
			} else {
				select(selected + 1);
			}
		} else {
			select(0);
		}
	}
	function selectPrev() {
		if (selected !== null) {
			if (selected === 0) {
				select(qAllItems.length - 1);			
			} else {
				select(selected - 1);
			}
		} else {
			select(qAllItems.length - 1);
		}		
	}
	function showHide() {
		if (qTextbox.val().length < 3) {
			if (qPanel.css('display') != 'none') {
				close();
			}
		} else {
			loadContent();
		}
	}
	function loadContent() {
		var currentValue = qTextbox.val();
		setTimeout(function () {
			if (currentValue === qTextbox.val()) {
				selected = null;
				contentLoader.load(currentValue, {
					setItems : function (items) {
						qPanel.empty();
						qAllItems = [];
						selected = null;
						jQuery.each(items, function (i, group) {
							addGroup(group);
						});
						if (qPanel.css('display') != 'block') {
							show();
						}
					}
				});
			}
		}, 300);
	}
	function addGroup(group) {
		if (jQuery(group.points).size() > 0) {
			qPanel.append('<h3>' + group.nazev + '</h3>');
			jQuery.each(group.points, function (i, item) {
				addItem(item);
			});
		}
	}
	function addItem(item) {
		var description = item.description;
		if (description) {
			description = description.substr(0, 40);
		} else {
			description = '';
		}
		var hItem = '<div class="item">';
		hItem += '<img style="width:40px; height:40px;float: right" src="http://www.vyletnik.cz/img.php?f=' + item.image + '">';
		
		hItem += '<h4>' + item.name + ' (' + item.kategorie_name + ')</h4>';
		if (description) {
			hItem += '<p>' + description + '</p>';
		}
		hItem += '<div class="clear"></div>' + '</div>';		
			
		var qItem = jQuery(hItem);
		qItem.mouseover(function () {
			select(jQuery(this).data('pos'));
		});
		qItem.click(function () {
			document.location = item.mapLink;
		});
		qAllItems[qAllItems.length] = qItem;
		qItem.data('info', item);
		qItem.data('pos', qAllItems.length - 1);
		qPanel.append(qItem);
	}
	function proccessKey(e) {
		if (e.keyCode == 40) {
			e.preventDefault();
			e.stopPropagation();
			selectNext();
		} else if (e.keyCode == 38) {
			e.preventDefault();
			e.stopPropagation();
			selectPrev();
		} else if (e.keyCode == 27) {
			close();
		} else if (e.keyCode == 13) {
			if (qAllItems[selected]) {
				e.preventDefault();
				e.stopPropagation();					
				document.location = qAllItems[selected].data('info').mapLink;
			}
		}		
	}
	return {
		init : function () {
			qTextbox = jQuery(textbox);
			qTextbox.keyup(function (e) {
				if (e.keyCode != 40 && e.keyCode != 38 && e.keyCode != 27 && e.keyCode != 13) {
					showHide();
				} else {
					if (!jQuery.browser.mozilla) {
						proccessKey(e);
					}
				}
			});
			qTextbox.keypress(function (e) {
				proccessKey(e);
			});
			
			//pokud ztratime focus kliknutim na suggest panel
			var close_allowed = true;
			qTextbox.blur(function (e) {
				if (close_allowed === true) {
					close();
				}
			});
			qPanel = jQuery('#suggest');
			qPanel.mouseover(function () {
				close_allowed = false;
			});
			qPanel.mouseout(function () {
				close_allowed = true;
			});
		}
	};
};
vyletnik.ui.suggest = {};
vyletnik.ui.suggest.ContentLoader = function () {
	var cache = {};
	return {
		load : function (phrase, itemsSetter) {
			if (cache[phrase]) {
				itemsSetter.setItems(cache[phrase]);
			} else {
				jQuery.getJSON('/suggest/?jsoncallback=?', {phrase : phrase}, function (items) {
					cache[phrase] = items;
					itemsSetter.setItems(items);
				});
			}
		}
	};
};