(function($){
	$.fn.extend({
		simpleAutoComplete: function( page, options, callback ){
			if(typeof(page) == "undefined" ){}
			var classAC = 'autocomplete';
			var selClass = 'sel';
			var attrCB = 'rel';
			var thisElement = $(this);
			$(":not(div." + classAC + ")").click(function(){$("div." + classAC).remove();});
			thisElement.attr("autocomplete","off");
			thisElement.keyup(function( ev ){
				var getOptions = { query: thisElement.val() }
				if( typeof(options) == "object" ){
					classAC = typeof( options.autoCompleteClassName ) != "undefined" ? options.autoCompleteClassName : classAC;
					selClass = typeof( options.selectedClassName ) != "undefined" ? options.selectedClassName : selClass;
					attrCB = typeof( options.attrCallBack ) != "undefined" ? options.attrCallBack : attrCB;
					if( typeof( options.identifier ) == "string" )
					getOptions.identifier = options.identifier;
					if( typeof( options.extraParamFromInput ) != "undefined" )
					getOptions.extraParam = $( options.extraParamFromInput ).val();
				}
				kc = ( ( typeof( ev.charCode ) == 'undefined' || ev.charCode === 0 ) ? ev.keyCode : ev.charCode );
				key = String.fromCharCode(kc);
				if (kc == 27){$('div.' + classAC).remove();}
				if (kc == 13){$('div.' + classAC + ' li.' + selClass).trigger('click');}
				if (key.match(/[a-zA-Z0-9_\- ]/) || kc == 8 || kc == 46)
				{$.get(page, getOptions, function(r){
						$('div.' + classAC).remove();
						autoCompleteList = $('<div>').addClass(classAC).html(r);
						if (r != ''){
							autoCompleteList.insertAfter(thisElement);
							var position = thisElement.position();
							var height = thisElement.height();
							var width = thisElement.width();
							$('div.' + classAC).css({'top': ( height + position.top + 6 ) + 'px','left': ( position.left )+'px','margin': '0px'});
							$('div.' + classAC + ' ul').css({'margin-left': '0px'});
							$('div.' + classAC + ' li').each(function( n, el ){
								el = $(el);
								el.mouseenter(function(){$('div.' + classAC + ' li.' + selClass).removeClass(selClass);$(this).addClass(selClass);});
								el.click(function(){thisElement.attr('value', el.text());
									if( typeof( callback ) == "function" )
										callback( el.attr(attrCB).split('_') );
									$('div.' + classAC).remove();
									thisElement.focus();});});}});}
				if (kc == 38 || kc == 40){if ($('div.' + classAC + ' li.' + selClass).length == 0)
					{if (kc == 38){$($('div.' + classAC + ' li')[$('div.' + classAC + ' li').length - 1]).addClass(selClass);} else {$($('div.' + classAC + ' li')[0]).addClass(selClass);}}else{
						sel = false;
						$('div.' + classAC + ' li').each(function(n, el)
						{el = $(el);if ( !sel && el.hasClass(selClass) ){el.removeClass(selClass);$($('div.' + classAC + ' li')[(kc == 38 ? (n - 1) : (n + 1))]).addClass(selClass);sel = true;}});
						
					}if($('div.' + classAC + ' li.' + selClass).text()!='')	thisElement.attr('value', $('div.' + classAC + ' li.' + selClass).text());}if (thisElement.val() == ''){$('div.' + classAC).remove();}});}});})(jQuery);

