var hints = {
	textarea: null,
	layer: null,
	visible: false,
	keyIgnore: false,
	lastPosition: null,
	path:null,
	init: function(pole,url) {
		hints.textarea = pole;
		hints.path = url;
		hints.layer = $("#hints");
		hints.textarea
			.blur(hints.hide)
			.click(hints.keyup)
			.focus(hints.keyup)
			.keyup(hints.keyup)
			.keydown(hints.keydown)
			.keypress(hints.keypress)
		;
	},
	
	isKeyIgnored: function(event, restore) {
		restore = restore || false;
		if(hints.keyIgnore) event.preventDefault();
		var result = hints.keyIgnore;
		if(restore) hints.keyIgnore = false;
		return result;
	},
	
	keypress: function(event) {
		if(hints.isKeyIgnored(event)) return false;
		if(event.keyCode == 13 && hints.visible) return false;
		
		return true;
	},
	
	keyup: function(event) {
		if(hints.isKeyIgnored(event, true)) return false;
		if(event.keyCode == 13) return hints.onEnter(event);
		
		var range = hints.textarea.getSelection();
		if(range.length == 0 && hints.lastPosition != range.start) {
			hints.lastPosition = range.start;
			setTimeout(function() {
				var newrange = hints.textarea.getSelection();
				if(newrange.length == 0 && newrange.start == range.start)
					hints.analyze(range);
			}, 0);
		}
		
		return true;
	},
	
	keydown: function(event) {
		if(hints.visible) {
			switch(event.keyCode) {
				case 13:
					hints.keyIgnore = true;	
					return hints.onEnter(event)
				case 27:
					hints.keyIgnore = true;
					hints.hide();
					
					event.preventDefault();
					return false;
				case 38:
					hints.keyIgnore = true;
					var prev = hints.layer.find("li.active").removeClass('active').prev();
					if(!prev.length) prev = hints.layer.find("li:last");
					prev.addClass('active');
					
					event.preventDefault();
					return false;
				case 40:
					hints.ignorekey = true;
					var next = hints.layer.find("li.active").removeClass('active').next();
					if(!next.length) next = hints.layer.find("li:first");
					next.addClass('active');
					
					event.preventDefault();
					return false;
			}
		}
		
		hints.hide(event);
		return true;
	},
	
	analyze: function(range) {
		var text = hints.textarea.val();
		var word = '';
		
		var i = range.start-1;
		var letter = '';
		while(i >= 0 && (letter = text.substr(i, 1)).match(/[a-z0-9ęóąśłżźćń]/i)) {
			word = '' + letter + word;
			i--;
		}
		//$.post("http://localhost/lewiatan/site/scripts/dictionary.php", {word: word}, hints.update, 'json');
		$.ajax({
			url: hints.path+"scripts/dictionary.php", 
			type: "POST",
			dataType: "json",
			data: {word: word},
			success: hints.update
				/*function(data){
				var text = "";
				$.each(data, function(i, item){
					text += item.word;
				});
				alert(text);
			}*/
		});
	},
	
	update: function(words) {
		if (words!=null){	
			words.length ? hints.show() : hints.hide();
			hints.layer.empty();
			$.each(words, function(key, word) {
				hints.layer.append('<li>'+word.word+'</li>');
				
			});
			hints.layer.find("li:first").addClass('active');
		}
	},
	
	show: function() {
		if(hints.visible) return false;
		var p = hints.textarea.offset();
		hints.layer.css({left: parseInt(p.left+1)+'px', top: parseInt(p.top+25)+'px'}).show();
		hints.visible = true;
		
		return true;
	},
	
	hide: function() {
		if(!hints.visible) return false;
		hints.layer.hide();
		hints.visible = false;
		
		return true;
	},
	
	onEnter: function(event) {
		hints.insert(hints.layer.find("li.active").text());
		hints.hide();
		hints.layer.empty();
		event.preventDefault();
		return false;
	},
	
	insert: function(word) {
		var range = hints.textarea.getSelection();
		var text = hints.textarea.val();
	
		var i = range.start-1;
		while(i >= 0 && text.substr(i, 1).match(/[a-z0-9ęóąśłżźćń]/i)) i--;
		hints.textarea.replaceSelection(word.substr(range.start-i-1));
	}
}
