
(function($) {

	$.fn.dynamItAutoComplete = function(options) {

		/* init options */
		if(!options) options = {};
		if(!options.url) 		options.url = '';
		if(!options.onselect)		options.onselect = function() { return true; };

		return this.attr('autocomplete', 'off').keydown(function(e) {
			var key = e.keyCode || window.event.keyCode;
			var $box = $(this).siblings('ol');

			if( key == 13 && $box.length ) {
				var $active = $box.find('.on');
				if( $active.length ) {
					$active.eq(0).click();
					return false;
				}
			}

		}).keyup(function(e) {
			var key = e.keyCode || window.event.keyCode;
			var $box = $(this).siblings('ol');

			// arrow key functionality
			if( key == 13 || (key >= 37 && key <= 40) ) {
				if( $box.length ) {
					var $active = $box.find('.on');
					switch( key ) {
						case 38:
							if( $active.parent('li').prev('li').length )
								$active.removeClass('on').parent('li').prev('li').children('a').addClass('on');
							break;
						case 40:
							if( $active.parent('li').next('li').length )
								$active.removeClass('on').parent('li').next('li').children('a').addClass('on');
							else if( !$active.length )
								$box.children('li').eq(0).children('a').addClass('on');
							break;
					}
				}
			} else {
				var inputfield = this;
				var query = $(inputfield).val();
				if(query.length && options.url.length) {
					$.get(options.url, {q: query}, function(data, status) {
						if( query == $(inputfield).val() ) {
							$(inputfield).siblings('ol').remove();
							if(status == 'success' && data.length) {
								$(data).insertAfter(inputfield);  // load the result
								$(inputfield).siblings().find('a').click( options.onselect ); // attach click event to result links
							}
						}
					});
				} else {
					$(inputfield).siblings('ol').remove();
				}
			}

		});

	};


})(jQuery);
