(function($)
{
	jQuery.fn.searchAutoComplete = function(opt){
		
		opt = opt || {};
		cAutocompleteList.url = opt.url || '';
		cAutocompleteList.timeOut = opt.timeOut || '400';
		cAutocompleteList.startLetterCount = opt.startLetterCount || '3';
		
		jQuery(this).attr('autocomplete', 'off');
		cAutocompleteList.setTextInput(jQuery(this));
		
		if(jQuery.browser.msie){
			jQuery(this).bind('focus', function(){
				if(!cOverlay.isVisible()){
					jQuery(this).val('');
					jQuery('input[type=image]').removeAttr('disabled');
				}
			});
		}
		else{
			jQuery(this).bind('focus', function(){
				jQuery(this).val('');
				jQuery('input[type=image]').removeAttr('disabled');
			});
		}
		
		jQuery(this).parents('form').bind('submit', function(){
			cAutocompleteList.submitSearch('term_'+cAutocompleteList.position);
			
		});
		
		var inputElem = jQuery(this);
					
		jQuery(this).keyup(function(evt){
			var key = evt.which || window.event;
			hKeyEvent(this, key);
		});				
	}
	
	function hKeyEvent(elm, key){
		
		if(key == 38){ //pfeil hoch
			cAutocompleteList.prev();
		}
		else if(key == 40){ //pfeil runter
			cAutocompleteList.next();
		}
		else {
			var strSearchWord = jQuery(elm).val();
			
			if(strSearchWord.length >= cAutocompleteList.startLetterCount){
				
				cOverlay.modal();
				cAutocompleteList.load();
				
			}
			else{
				if(cOverlay.isVisible()){
					cOverlay.close();
				}
			}
		}
	}
	
	/*
	 * Konstruktor
	 */
	var Overlay = function(){
		this.init();
	}
	jQuery.extend(Overlay.prototype, {
		id: 'ui-overlay',
		olInstance: '',
		self: null,
		
		init: function(){				
				olInstance = jQuery('<div id="'+this.id+'"/>').appendTo(document.body)
						.hide().css({ position: 'absolute',
									zIndex: 1,
									backgroundColor: '#fff',
									opacity: 0.6});
				
				olInstance.click(function(){cOverlay.close(); jQuery('input[type=image]').focus();});
			},		
		modal: function(){
				if(!this.isVisible()){
					olInstance.css({ left: 0,
									top: 0,
									width: this.width(),
									height: this.height()
									}).fadeIn();
				}
			},
		close: function(){
				olInstance.fadeOut();
				cAutocompleteList.back();
			},			
		isVisible: function(){
				return olInstance.is(':visible');
			},
		height: function() {
			// für IE 6
			if (jQuery.browser.msie && jQuery.browser.version < 7) {
				var scrollHeight = Math.max(
					document.documentElement.scrollHeight,
					document.body.scrollHeight
				);
				var offsetHeight = Math.max(
					document.documentElement.offsetHeight,
					document.body.offsetHeight
				);
				
				if (scrollHeight < offsetHeight) {
					return jQuery(window).height();
				} else {
					return scrollHeight ;
				}
			// für Opera
			} else if (jQuery.browser.opera) {
				return Math.max(
					window.innerHeight,
					jQuery(document).height()
				) ;
			// für andere browsers
			} else {
				return jQuery(document).height() ;
			}
		},
		width: function() {
			// für IE 6
			if (jQuery.browser.msie && jQuery.browser.version < 7) {
				var scrollWidth = Math.max(
					document.documentElement.scrollWidth,
					document.body.scrollWidth
				);
				var offsetWidth = Math.max(
					document.documentElement.offsetWidth,
					document.body.offsetWidth
				);
				
				if (scrollWidth < offsetWidth) {
					return jQuery(window).width();
				} else {
					return scrollWidth ;
				}
			// für Opera
			} else if (jQuery.browser.opera) {
				return Math.max(
					window.innerWidth,
					jQuery(document).width()
				) ;
			// für andere browser
			} else {
				return jQuery(document).width() ;
			}
		}		
	});
	/*
	 * Konstruktor
	 */
	AutocompleteList = function(){
		this.init();
	}
	jQuery.extend(AutocompleteList.prototype, {
		aclid: 'ui-suggestion',
		url: '',
		instance: null,
		textInput: null,
		suggestInput: null,
		isFront: 0,
		position: 0,
		anzahl: 0,
		inpOverlay: null,
		searchValue: null,
		timer: null,
		timeOut: '',
		
		init: function(){
				this.create();
			},		
		load: function(){
				this.front();
				var a = this;
				if(this.timer) clearTimeout(this.timer);
				this.timer = setTimeout(function(){ a.open();}, this.timeOut);
			},				
		setTextInput: function(element){
				this.suggestInput = this.textInput = element;
			},			
		front: function(){				
				if(this.isFront == 0){
					this.isFront = 1;
					
					object = jQuery('div#searchinput');
					object.css({position: 'relative', zIndex:550})
			        var pos = object.offset();
					 jQuery('div#'+this.aclid).css({
			                top:pos.top,
			                left:pos.left
			                });
								
					 //kann auskommentiert werden wenn nicht benötigt
					 this.createInputOverlay(object);
				}
			},			
		back: function(){
				if(this.timer) clearTimeout(this.timer);
				this.isFront = 0;
		        jQuery('div#searchinput').css({zIndex: 1})
		        this.close();
		        
		        //kann auskommentiert werden wenn nicht benötigt
		        this.deleteInputOverlay();
			},			
		createInputOverlay: function(obj){
				var pos = obj.offset();
						
				this.suggestInput = 
				this.inpOverlay = jQuery('<input name="inpOverlay" type="text" />').appendTo('body').addClass('navSearchInput')
									.css({position: 'absolute',
											zIndex: 600,
											  left: pos.left-1,
											   top: pos.top-1,
											 width: obj.width() })
									.focus()
									.val(this.textInput.val());
				
				this.inpOverlay.keyup(function(evt){
					var key = evt.which || window.event;
					hKeyEvent(this, key);
					
					if(key == 13){ // enter event-code
						jQuery('form[name=search]').submit();
					}
				});
			},
		deleteInputOverlay: function(){
				this.suggestInput = this.textInput;
				this.textInput.focus().val(this.inpOverlay.val());
				this.inpOverlay.hide();
				jQuery('input[name=inpOverlay]').remove();
			},
		create: function(){				
			instance = jQuery('<div id="'+this.aclid+'" class="suggestionBox">...loading...</div>').hide().appendTo('body')
			.css({  position: 'absolute',
						zIndex: 99});
		},
		close: function(){
			instance.hide();
		},
		setCaretToEnd: function(){
			var input = document.getElementById("txtSearchString");
			
			if(input.createTextRange){
				var range = input.createTextRange();
				range.moveStart('character', input.value.length);
				range.moveEnd('character', input.value.length);
		    			
				range.select();
			}
		},
		open: function(){
				var text = this.suggestInput.val();
				instance.show();
				
				if(this.url.length > 1){
					jQuery.ajax({
						   type: "GET",
						   url: this.url,
						   data: 'queryString='+encodeURI(text),
						   success: cAutocompleteList.receiveData
						 });
				}
				else{
					instance.html('keine Seite definiert');
				}
			},
		receiveData: function(data){
				if(cAutocompleteList.isFront) {
					if(data.length >0) {
						instance.show();
						instance.html(data);

						jQuery(".suggestList li").hover(function () {
			    			 jQuery(this).removeClass("suggest");
			    			 jQuery(this).addClass("suggestHover");
			    		 }, function () {
							var idx = jQuery('.suggestList li').index(this);
							if((idx+1) != cAutocompleteList.position){
								jQuery(this).removeClass("suggestHover");
								jQuery(this).addClass("suggest");
							}
						});
			    	 	
			    	 	jQuery(".suggestList li").click(function(){
							document.getElementById('qString').innerHTML = jQuery(this).attr('queryString');
							document.getElementById('qString').title = jQuery(this).attr('queryString');
							cAutocompleteList.searchValue = jQuery(this).attr('queryString');
			    			 //jQuery('form[name=search]').submit();
			    		});
						
						jQuery("#btnClose").click(function(){
							
							cAutocompleteList.close();
							cOverlay.close();						
							
			    		});
						
						
				    	cAutocompleteList.count();
					}
				}
			},
		next: function(){
				if(this.position <= this.anzahl){
					jQuery('#term_'+this.position).removeClass('suggestHover');
					jQuery('#term_'+this.position).addClass('suggest');
					this.position = this.position + 1;
					jQuery('#term_'+this.position).removeClass('suggest');
					jQuery('#term_'+this.position).addClass('suggestHover');
				}
			},
		prev: function(){
				if(this.position > 1){
					jQuery('#term_'+this.position).removeClass('suggestHover');
					jQuery('#term_'+this.position).addClass('suggest');
					this.position = this.position - 1;
					jQuery('#term_'+this.position).removeClass('suggest');
					jQuery('#term_'+this.position).addClass('suggestHover');
				}
			},
		submitSearch: function(liID){
				var strSearch;
				if(this.searchValue != null)
					strSearch = this.searchValue;
				else if(this.position > 0)
					strSearch = jQuery('#'+liID).attr('queryString');
				else if(this.inpOverlay != null)
					strSearch = this.inpOverlay.val();
				
				jQuery('#txtSearchString').val(strSearch);
			},
		count: function(){
				var testFirst = jQuery('li.suggest');
				var anzahl=-1;
				testFirst.each(	//wieviel elemente enthält die Liste
					function(){
					anzahl=anzahl+1;
				});
				this.anzahl = anzahl;
				this.position = 0;
			},
		destroyList: function(){
			}
	});
	
	/*
	 * Instanziieren der klassen
	 */
	var cOverlay;
	var cAutocompleteList;
	jQuery(document).ready(function(){
		cOverlay = new Overlay();
		cAutocompleteList = new AutocompleteList();
	});
})(jQuery);
