var Diko = {};
Diko = function(){
	function init(options){
		// Diko.Widgets.Info.init({
		// 	pattern: /(\w+)(\s+to:(\w{2}))?/i,
		// 	supportedLang: ['fr','kr','mq']
		// });
		// Diko.Widgets.Info2.init();
		if (options != null && options.page == 'home') {
			Diko.Widgets.SearchBox.init();
			
			$('#content .search-box form.general input.text').keyup(			Diko.Widgets.Suggestion.show);
			$('#content .search-box .suggestions li.close').live('click', Diko.Widgets.Suggestion.close);
			$('#content .search-box .suggestions li').live('mouseover', 	Diko.Widgets.Suggestion.highlight);
			$('#content .search-box .suggestions li').live('mouseout', 		Diko.Widgets.Suggestion.keepHighlighted);
		}
	};
	return {init:init};
}();

Diko.Widgets = {};

Diko.Widgets.SearchBox = function(){
	function init(){
		$(".search-box .from").sSelect();
		$(".search-box .to").sSelect();
	};
	
	return {init:init};
}();

Diko.Widgets.Info = function(){
	var pattern = /(\w+)(\s+to:(\w{2}))?/i;
	var supportedLang = ['fr','kr','mq'];
	
	function init(options){
		if (options.pattern != null) {pattern = options.pattern;}
		if (options.supportedLang != null) {supportedLang = options.supportedLang;}
	};
	
	function clear(){
		return '<span class="kr">kreyol</span><span class="fr">francais</span>';
	};
	
	function update(lang){
		return '<span class="fr">francais</span><span class="'+lang+'">'+lang+'</span>';
	};
	
	function lang(string){
		var md = string.match(pattern);
		if (md != null && md[3] != null) {
			for (x in supportedLang){ if (supportedLang[x] == md[3]) { return md[3]; } }
		}
		return null;
	};
	
	return {
		init: init,
		update: update,
		clear: clear,
		lang: lang
	};
}();

Diko.Widgets.Info2 = function(){
	function update(){
		var from = $('#content .search-box .from option[selected]');
		var to = $('#content .search-box .to option[selected]');
		var html = '<span class="'+from.val()+'">'+from.text()+'</span><span class="'+to.val()+'">'+to.text()+'</span>';
		$('#content .search-box .info').html(html);
	};
	
	function hoverIn(){
		$('#content .search-box .bulle').html($(this).text());
		$('#content .search-box .bulle').removeClass('hide');
	};
	
	function hoverOut(){
		$('#content .search-box .bulle').addClass('hide');
	};
	
	function selection(){
		var html = '<ul class="menu-from">\
		<li class="kr">Kreyol</li>\
		<li class="fr">Francais</li>\
		</ul>';
		$('#content .search-box .info').before(html);
	};
	
	function selectLang(){
		var t = $('#content .search-box .from option[selected]');
		
		$('#content .search-box .from option[selected]').removeAttr('selected');
		var elt = $('#content .search-box .from option[value="'+$(this).attr('class')+'"]');
		elt.attr('selected','selected');
		
		update();
	}
	
	function init(){
		$('#content .search-box .from').hide();
		$('#content .search-box .to').hide();
		
		var info = $('#content .search-box .info');
		update();
		info.removeClass('hide');
		
		info.find('span').live('mouseover', hoverIn);
		info.find('span').live('mouseout', hoverOut);
		info.find('span').live('click', selection);
			
		$('#content .search-box .menu-from li').live('click',selectLang);
	};
	
	return {
		init: init
	};
}();

Diko.Widgets.Suggestion = function(){
	var updateTimer = null;
	var delayToDisplaySuggestions = 650;
	
	function setUpdateTimer(query){
		return setTimeout(function(){ Diko.Data.Suggestion.list(query, update); }, delayToDisplaySuggestions);
	};
	
	function link_to(from,to,word){
		return '<li><a href="/diko/'+from+'/'+to+'/'+word+'" title="'+word+'">'+word+'</a></li>\n';
	};
	
	function keyArrowUp(search_input){
		var li = $('#content .search-box ul.suggestions li.hover');
		if (li.length != 0){
			var prev = li.prev();
			if(prev.length != 0 && !prev.hasClass('close')){
				li.removeClass('hover');
				prev.addClass('hover');
				search_input.val(prev.find('a').text());
			}
		}		
	};
	
	function keyArrowdown(search_input){
		var li = $('#content .search-box ul.suggestions li.hover');
		if (li.length == 0){
			var elt = $('#content .search-box ul.suggestions li:first');
			elt.addClass('hover');
			search_input.val(elt.find('a').text());
		}
		else {
			var next = li.next();
			if(next.length != 0 && !next.hasClass('close')){
				li.removeClass('hover');
				next.addClass('hover');
				search_input.val(next.find('a').text());
			}
		}		
	};
	function clear(){
	 	$('#content .search-box ul.suggestions').addClass('hide');
		clearTimeout(updateTimer);
		return false;
	};
	
	function update(data,t){
		if (t!='success' || data.length == 0){ clear(); }
		var suggestions = "";
		$(data).each(function(i,suggestion){ suggestions += link_to('kr','fr',suggestion); });
		if (suggestions != ''){
			var ul = $('#content .search-box ul.suggestions');	
			suggestions += '<li class="close"><p>close</p></li>';			
			ul.html(suggestions);
			ul.removeClass('hide');
			ul.show();
		}
	};
	
	function show(e){
		// keycodes => http://www.aspdotnetfaq.com/Faq/What-is-the-list-of-KeyCodes-for-JavaScript-KeyDown-KeyPress-and-KeyUp-events.aspx
		var search_input = $(this);
		var query = search_input.val();
		var ul_suggestions = $('#content .search-box ul.suggestions');
		
		// detect Translation Preference
		// var lang = Diko.Widgets.Info.lang(query);
		// var info = $("#content .search-box .info");
		// if (lang != null) { info.html( Diko.Widgets.Info.update(lang) ); }
		// else if(e.keyCode == 8 || e.keyCode == 46){ info.html( Diko.Widgets.Info.clear() ); }
		
		if (query != '' && !ul_suggestions.hasClass('hide') && e.keyCode == 40) { keyArrowdown(search_input); }
		if (query != '' && !ul_suggestions.hasClass('hide') && e.keyCode == 38) { keyArrowUp(search_input); }
		if (query != '' && query.indexOf(' ') == -1 && e.keyCode >= 65 && e.keyCode <= 90 || e.keyCode == 8 || e.keyCode == 46) { 
			updateTimer = setUpdateTimer(query);
		}
		if (query == '') { clear(); }
	};
	
	function close() {
		$('#content .search-box .suggestions').fadeOut();
	}
	
	function highlight(){
		var li_hover = $('#content .search-box .suggestions li.hover');
		if(li_hover.length > 0) {li_hover.removeClass('hover');}
		var li = $(this);
		if (li.hasClass('close')) { return false; }
		var search_input = $('#content .search-box form.general input.text');
		search_input.val(li.find('a').text());
		li.addClass('hover');
		return 0;
	};
	
	function keepHighlighted(){
		var li = $(this);
		if (li.hasClass('close')) { return false; }
		li.addClass('hover');
		return 0;
	};
	
	return {
		show: show,
		close: close,
		highlight: highlight,
		keepHighlighted: keepHighlighted
	};
}();

Diko.Data={};
Diko.Data.Suggestion = function(){
	function list(letters,callback){
		current_letters = $('#content .search-box form.general input.text').val();
		if (current_letters != letters){ return false; }
		$.getJSON("/suggestions/kr/"+letters+".json","",callback);
		return 0;
	};
	return {list:list};
}();