var SearchAutoCompleter = new Class({
	
	/* target element needs class autocompleter */
	
	selectables : [],
	pointer : 0,
	selected : null,
	lastkey : null,
	active : false,
	keywords : null,
	oldkeywords : null,
	
	initialize : function(id, oOptions) {
		this.input = $(id);	 
		
		if($chk(oOptions.customid)) {
			this.customid = '[' + oOptions.customid + ']';
		} else {
			this.customid = '';
		}
		
		if($chk(oOptions.inititemid)) {
			this.setSelected(oOptions.itititemid);
		}
		
		if($chk(oOptions.limit)) {
			this.limit = oOptions.limit;
		} else {
			this.limit = 7;
		}
		
		this.input.addEvent('keyup', function(event) {
			var event = new Event(event);
			switch(event.key) {
				case('enter'):
					oSearchAutoCompleter.select();
					break;
				default:
					if(!['left','right','up','down','esc'].contains(event.key) && !event.shift && !event.control && !event.alt && !event.meta) {
						if(oSearchAutoCompleter.input.get('value').clean() != '') {
							oSearchAutoCompleter.keystroke();
						}
					}
					break;
			}
		});

		this.input.addEvent('keyup', function(event) {
			var event = new Event(event);
			switch(event.key) {
				case('up'):
					if(oSearchAutoCompleter.active) {
						oSearchAutoCompleter.keyup();
					}
					break;
				case('down'):
					if(oSearchAutoCompleter.active) {
						oSearchAutoCompleter.keydown();
					}
					break;
			}
		});
		
		this.input.addEvent('focus', function(event) {
			if($('search-panel-input' + oSearchAutoCompleter.customid).get('value') == oSearchAutoCompleter.defaultstring) {
				$('search-panel-input' + oSearchAutoCompleter.customid).set('value','');
				$('search-panel-input' + oSearchAutoCompleter.customid).setStyle('color','#1c4f6b');
				
				oSearchAutoCompleter.autorefreshinstance = oSearchAutoCompleter.autoRefresh.periodical(500);
				
			}
		});
		
		this.input.addEvent('blur', function(event) {
			event.stop();
			(function() {
				
				if($('search-panel-input' + oSearchAutoCompleter.customid).get('value').clean() == '') {

					$('search-panel-input' + oSearchAutoCompleter.customid).set('value',oSearchAutoCompleter.defaultstring);
					$('search-panel-input' + oSearchAutoCompleter.customid).setStyle('color','#555');
					
					if(oSearchAutoCompleter.customid.length > 0) {
						$('event-selector-cache' + oSearchAutoCompleter.customid).set('value', 0);
					}
					
				} else if (oSearchAutoCompleter.selected == null) { 
						
					$('search-panel-input' + oSearchAutoCompleter.customid).set('value',oSearchAutoCompleter.defaultstring);
					$('search-panel-input' + oSearchAutoCompleter.customid).setStyle('color','#555');	
					
					if(oSearchAutoCompleter.customid.length > 0) {
						$('event-selector-cache' + oSearchAutoCompleter.customid).set('value', 0);
					}
					
				} else { 
					
					
					if(oSearchAutoCompleter.customid.length > 0 && !$chk($('search-selector-name[' + oSearchAutoCompleter.selected.get('itemid') + ']'))) {
						
						if(oSearchAutoCompleter.selected.get('itemid') != $('event-selector-cache' + oSearchAutoCompleter.customid).get('value')) {
						
							oSearchAutoCompleter.clearSelectables();
							$('search-panel-input' + oSearchAutoCompleter.customid).set('value',oSearchAutoCompleter.defaultstring);
							$('search-panel-input' + oSearchAutoCompleter.customid).setStyle('color','#555');
							
							$('event-selector-cache' + oSearchAutoCompleter.customid).set('value', 0);
							
						}
						
					} else {
						
						//alert( oSearchAutoCompleter.selected.get('id'));
						
						if(oSearchAutoCompleter.input.get('value') != $('search-selector-name[' + oSearchAutoCompleter.selected.get('itemid') + ']').get('text')) {
							
							oSearchAutoCompleter.clearSelectables();
							$('search-panel-input' + oSearchAutoCompleter.customid).set('value',oSearchAutoCompleter.defaultstring);
							$('search-panel-input' + oSearchAutoCompleter.customid).setStyle('color','#555');
							
						} 
					
					}
					
				}
				
				oSearchAutoCompleter.blur();
				clearInterval(oSearchAutoCompleter.autorefreshinstance);
				

			}).delay(150,this);
		});
		
		
		/*if(Browser.Engine.webkit) {
			var top = '23px';
		} else {
			var top = '22px';
		}*/
		
		this.dropdownwrapper = new Element('div', {style:'position:absolute; background:#F9FAFC; top:23px; left:-3px; z-index:2; width:0px; height:0px; overflow:visible;'});
		this.dropdownwrapper.inject(this.input,'before');
		
		this.dropdown = new Element('div');
		this.dropdown.set('style',oOptions.style);
		var top = this.input.getSize().y;
		if(Browser.Engine.webkit) {
			top = top + 2;	
		} else if(Browser.Engine.trident) {
			top = top + 1;	
		}
		this.dropdown.setStyle('top',top);
		this.dropdown.inject(this.dropdownwrapper);
		
		this.hidden = new Element('input', {'type':'hidden','id':'hidden-input'});
		this.hidden.inject(this.dropdownwrapper);
		
	},
	
	autoRefresh : function() {
		
		if(!this.active && oSearchAutoCompleter.input.get('value').clean() != '' && oSearchAutoCompleter.input.get('value').clean() != this.oldkeywords) {
			oSearchAutoCompleter.keystroke();
		}
		
		this.oldkeywords = oSearchAutoCompleter.input.get('value').clean();
		
	},
	
	setSelected : function(id) {
		this.selected = new Element('div', {'itemid':id});
	},
	
	getSelectable : function(id, html, style, targeturl) {
		var selectable = new Element('div', {'id':'search-selector-' + id, 'itemid':id, 'style':style, 'class': 'auto-selectable', 'targeturl': targeturl});
		selectable.set('html',html);
		if(selectable.get('id') != 'search-selector-loading' && selectable.get('id') != 'search-selector-empty') {
			this.selectables.include(selectable);
		}
		return selectable;
	},
	
	injectSelectable : function(selectable) {
		
		if(selectable.get('id') != 'search-selector-loading' && selectable.get('id') != 'search-selector-empty') {
		
			selectable.addEvent('mouseover', function(event) {
				if(oSearchAutoCompleter.pointer == 0) {
					this.setStyle('background-color','#617C97');
					this.setStyle('color','#fff');
				} else {
					if(oSearchAutoCompleter.selectables[oSearchAutoCompleter.pointer-1].id != this.id) {
						this.setStyle('background-color','#617C97');
						this.setStyle('color','#fff');
					}				
				}
	
			});
			selectable.addEvent('mouseout', function(event) { 
				if(oSearchAutoCompleter.pointer == 0) {
					this.setStyle('background-color','#F9FAFC');
					this.setStyle('color','#1C4F6B');
				} else {
					if(oSearchAutoCompleter.selectables[oSearchAutoCompleter.pointer-1].id != this.id) {
						this.setStyle('background-color','#F9FAFC');
						this.setStyle('color','#1C4F6B');
					} 					
				}
			});
			selectable.addEvent('click', function(event) {
				oSearchAutoCompleter.selected = this;
				oSearchAutoCompleter.select();
			});
		
		} else {
			selectable.setStyle('cursor','default');
		}
		selectable.inject(this.dropdown);
	},
	
	keyup : function() {
		//alert(this.pointer);
		this.resetSelectables();
		this.decreasePointer();
		if(this.lastkey == 'down') {
			this.decreasePointer();
		}
		if($chk(this.selectables[this.pointer])) {
			this.selectables[this.pointer].setStyle('background-color','#617C97');
			this.selectables[this.pointer].setStyle('color','#fff');
			this.selected = this.selectables[this.pointer];
		} else {
			this.selected = null;	
		}
		this.lastkey = 'up';
	},
	
	keydown : function() {
		//alert(this.pointer);
		this.resetSelectables();
		if(this.lastkey == 'up') {
			this.increasePointer();
		}
		if($chk(this.selectables[this.pointer])) {
			this.selectables[this.pointer].setStyle('background-color','#617C97');
			this.selectables[this.pointer].setStyle('color','#fff');
			this.selected = this.selectables[this.pointer];
		} else {
			this.selected = null;	
		}
		this.increasePointer();
		this.lastkey = 'down';
	},
	
	keystroke : function() {
		this.lastStroke = new Date().getTime();
		this.clearSelectables();
		this.injectSelectable(this.getSelectable('loading',Localization.ajaxloading,'border-bottom:1px solid #646464; color:#1C4F6B; border-left:1px solid #646464; border-right:1px solid #646464; background:#F9FAFC; padding:4px; padding-left:7px; width:337px; z-index:2;'));
		this.dropdown.setStyle('display','block');
		$('search-panel-loading-indicator').setStyle('display','block');
		setTimeout("oSearchAutoCompleter.query()", 500);
	},
	
	query : function() {
		
		var now = new Date().getTime();
		if (now - this.lastStroke < 400) {
			return false;
		}
		
		this.active = true;
		this.keywords = this.input.get('value').clean();
		
		//try cancel here instead of the keystroke timer (in production, fails on localhost).
		
		new Request.JSON({
			method: 'post',
			data: JSON.encode({'filter':this.keywords,'limit':this.limit}),
			url: '/ajax/Searchpanel.oSearchAutoCompleter.query.php',
			instance : this,
			link: 'cancel',
			onRequest: function() {
				//
			},
			onFailure: function(exc) {
				oSearchAutoCompleter.error([Localization.js_default_ajax_error]);
				$('search-selector-loading').dispose();
				oSearchAutoCompleter.dropdown.setStyle('display','none');
				$('search-panel-loading-indicator').setStyle('display','none');
			},
			onError: function() {
				oSearchAutoCompleter.error([Localization.js_default_ajax_error]);
				$('search-selector-loading').dispose();
				oSearchAutoCompleter.dropdown.setStyle('display','none');
				$('search-panel-loading-indicator').setStyle('display','none');
			},
			onSuccess: function(o,r) {
				oSearchAutoCompleter.clearSelectables();
				var c = 0;
				o.ids.each(function(id, index) {
					oSearchAutoCompleter.injectSelectable(oSearchAutoCompleter.getSelectable(id ,o.htmls[index],'border-bottom:1px solid #646464;  border-left:1px solid #646464; border-right:1px solid #646464; background:#F9FAFC; color:#1C4F6B; padding:4px; padding-left:7px; width:337px; z-index:2; cursor:pointer; ', o.urls[index] ));	
					c++;
				});
				if(c==0) {
					oSearchAutoCompleter.injectSelectable(oSearchAutoCompleter.getSelectable('empty',Localization.nomatches,'border-bottom:1px solid #646464; border-left:1px solid #646464; border-right:1px solid #646464; background:#F9FAFC; color:#1C4F6B; padding:4px; padding-left:7px; width:337px; cursor:pointer; z-index:2;', null));
				} else {
					oSearchAutoCompleter.keydown();	
				}
				$('search-panel-loading-indicator').setStyle('display','none');
			}
		}).send();
		
		
	},
	
	select : function() {
		
		if($chk(this.selected)) {
			
			/*
			if(this.customid.length > 0) {
				$('event-selector-cache' + oSearchAutoCompleter.customid).set('value',this.selected.get('itemid'));
			}
			*/
			
			//alert(this.selected.get('id').replace(/search-selector-/i,''));
			
			if(Context.sitemode == 1) {
				try {
					pageTracker._trackEvent('SearchRequest', 'desktop', this.input.get('value'));
				} catch(err) {
					//do nothing;		
				}
			}
			
			clearInterval(oSearchAutoCompleter.autorefreshinstance);
			this.oldkeywords = $('search-selector-name[' + this.selected.get('itemid') + ']').get('text');
			this.input.set('value',$('search-selector-name[' + this.selected.get('itemid') + ']').get('text'));
			this.dropdown.setStyle('display','none');
			this.active = false;
			//this.input.highlight('#b5e6bd');
			
			location.href = this.selected.get('targeturl');
			
			/*
			//this.input.blur();
			$('event-date' + this.customid).focus(); 
			*/
			
			
		} else {
			
			/* 
			if(this.customid.length > 0) {
				$('event-selector-cache' + oSearchAutoCompleter.customid).set('value', 0);
			}
			
			this.input.highlight('#ad0000');
			*/
			
			//location.href = '/en/search/keywords/blabla';

		}
		
	},
	
	blur : function() {
		this.pointer = 0;
		//this.resetSelectables();
		this.dropdown.setStyle('display','none');
		this.active = false;
		
		/* if(!$chk(this.selected) && $chk($('autocompleter-selected-cache' + this.customid))) {
			if($('autocompleter-selected-cache' + this.customid).get('value')
			$('autocompleter-selected-cache' + this.customid).set('value', 0);
		}*/
		
	},
	
	clearSelectables : function() {
		//this.resetSelectables();
		this.selectables.each(function(el) {
			el.dispose();							   
		});
		if($chk($('search-selector-loading'))) {
			$('search-selector-loading').dispose();
		}
		if($chk($('search-selector-empty'))) {
			$('search-selector-empty').dispose();
		}
		this.selectables = [];
		this.pointer = 0;
		this.selected = null;
	},
	
	resetSelectables : function() {
		$$('div.auto-selectable').each(function(el) {
			el.setStyle('background-color','#F9FAFC');
			el.setStyle('color','#1C4F6B');
		});
		this.selected = null;
	},
	
	increasePointer : function() {
		if((this.pointer + 1) > this.selectables.length) {
			this.pointer = 0;
		} else {
			this.pointer++;	
		}
	},
	
	decreasePointer : function() {
		if((this.pointer) == 0) {
			this.pointer = this.selectables.length;
		} else {
			this.pointer--;	
		}
	},
	
	error : function(messages) {
		//alert(messages[0]);
	}
	
});
