var ReviewAutoCompleter = new Class({
	
	/* target element needs class autocompleter */
	
	selectables : [],
	pointer : 0,
	selected : null,
	lastkey : null,
	active : false,
	
	initialize : function(id, oOptions) {
		this.input = $(id);	 
		
		if($chk(oOptions.customid)) {
			this.customid = '[' + oOptions.customid + ']';
		} else {
			this.customid = '';
		}
		
		if($chk(oOptions.initplaceid)) {
			this.setSelected(oOptions.initplaceid);
		}
		
		if($chk(oOptions.limit)) {
			this.limit = oOptions.limit;
		} else {
			this.limit = 3;
		}
		
		this.input.addEvent('keyup', function(event) {
			var event = new Event(event);
			switch(event.key) {
				case('enter'):
					oReviewAutoCompleter.select();
					break;
				default:
					if(!['left','right','up','down','esc'].contains(event.key) && !event.shift && !event.control && !event.alt && !event.meta) {
						if(oReviewAutoCompleter.input.get('value').clean() != '') {
							oReviewAutoCompleter.keystroke();
						}
					}
					break;
			}
		});

		this.input.addEvent('keyup', function(event) {
			var event = new Event(event);
			switch(event.key) {
				case('up'):
					if(oReviewAutoCompleter.active) {
						oReviewAutoCompleter.keyup();
					}
					break;
				case('down'):
					if(oReviewAutoCompleter.active) {
						oReviewAutoCompleter.keydown();
					}
					break;
			}
		});
		
		this.input.addEvent('focus', function(event) {
			if($('place-review-selector' + oReviewAutoCompleter.customid).get('value') == Localization.starttypingreviewplace) {
				$('place-review-selector' + oReviewAutoCompleter.customid).set('value','');
				$('place-review-selector' + oReviewAutoCompleter.customid).setStyle('color','#1c4f6b');
			}
		});
		
		this.input.addEvent('blur', function(event) {
			event.stop();
			(function() {
				
				if($('place-review-selector' + oReviewAutoCompleter.customid).get('value').clean() == '') {

					$('place-review-selector' + oReviewAutoCompleter.customid).set('value',Localization.starttypingreviewplace);
					$('place-review-selector' + oReviewAutoCompleter.customid).setStyle('color','#555');
					
					if(oReviewAutoCompleter.customid.length > 0) {
						$('event-selector-cache' + oReviewAutoCompleter.customid).set('value', 0);
					}
					
				} else if (oReviewAutoCompleter.selected == null) { 
						
					$('place-review-selector' + oReviewAutoCompleter.customid).set('value',Localization.starttypingreviewplace);
					$('place-review-selector' + oReviewAutoCompleter.customid).setStyle('color','#555');	
					
					if(oReviewAutoCompleter.customid.length > 0) {
						$('event-selector-cache' + oReviewAutoCompleter.customid).set('value', 0);
					}
					
				} else { 
					
					
					if(oReviewAutoCompleter.customid.length > 0 && !$chk($('place-selector-name[' + oReviewAutoCompleter.selected.get('placeid') + ']'))) {
						
						//alert('selected placeid' + oReviewAutoCompleter.selected.get('placeid'));
						//alert('cache placeid' + $('event-selector-cache' + oReviewAutoCompleter.customid).get('value'));
						
						if(oReviewAutoCompleter.selected.get('placeid') != $('event-selector-cache' + oReviewAutoCompleter.customid).get('value')) {
						
							oReviewAutoCompleter.clearSelectables();
							$('place-review-selector' + oReviewAutoCompleter.customid).set('value',Localization.starttypingreviewplace);
							$('place-review-selector' + oReviewAutoCompleter.customid).setStyle('color','#555');
							
							$('event-selector-cache' + oReviewAutoCompleter.customid).set('value', 0);
							
						}
						
					} else {
					
						if(oReviewAutoCompleter.input.get('value') != $('place-selector-name[' + oReviewAutoCompleter.selected.get('placeid') + ']').get('text')) {
							
							oReviewAutoCompleter.clearSelectables();
							$('place-review-selector' + oReviewAutoCompleter.customid).set('value',Localization.starttypingreviewplace);
							$('place-review-selector' + oReviewAutoCompleter.customid).setStyle('color','#555');
							
						} 
					
					}
					
				}
				
				oReviewAutoCompleter.blur();

			}).delay(150,this);
		});
		
		
		this.dropdownwrapper = new Element('div', {style:'position:relative; 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);
		
	},
	
	setSelected : function(id) {
		this.selected = new Element('div', {'placeid':id});
	},
	
	getSelectable : function(id, html, style, target) {
		var selectable = new Element('div', {'target':target, 'id':'place-selector-' + id, 'placeid':id, 'style':style, 'class': 'auto-selectable'});
		selectable.set('html',html);
		if(selectable.get('id') != 'place-selector-loading' && selectable.get('id') != 'place-selector-empty') {
			this.selectables.include(selectable);
		}
		return selectable;
	},
	
	injectSelectable : function(selectable) {
		
		if(selectable.get('id') != 'place-selector-loading' && selectable.get('id') != 'place-selector-empty') {
		
			selectable.addEvent('mouseover', function(event) {
				if(oReviewAutoCompleter.pointer == 0) {
					this.setStyle('background-color','#617C97');
					this.setStyle('color','#fff');
				} else {
					if(oReviewAutoCompleter.selectables[oReviewAutoCompleter.pointer-1].id != this.id) {
						this.setStyle('background-color','#617C97');
						this.setStyle('color','#fff');
					}				
				}
	
			});
			selectable.addEvent('mouseout', function(event) { 
				if(oReviewAutoCompleter.pointer == 0) {
					this.setStyle('background-color','#F9FAFC');
					this.setStyle('color','#1C4F6B');
				} else {
					if(oReviewAutoCompleter.selectables[oReviewAutoCompleter.pointer-1].id != this.id) {
						this.setStyle('background-color','#F9FAFC');
						this.setStyle('color','#1C4F6B');
					} 					
				}
			});
			selectable.addEvent('click', function(event) {
				oReviewAutoCompleter.selected = this;
				oReviewAutoCompleter.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 #891a60; color:#1C4F6B; padding:4px; padding-left:7px;'));
		this.dropdown.setStyle('display','block');
		setTimeout("oReviewAutoCompleter.query()", 500);
	},
	
	query : function() {
		
		var now = new Date().getTime();
		if (now - this.lastStroke < 400) {
			return false;
		}
		
		this.active = true;
		
		//try cancel here instead of the keystroke timer (in production, fails on localhost).
		
		new Request.JSON({
			method: 'post',
			data: JSON.encode({'filter':this.input.get('value').clean(),'limit':this.limit}),
			url: '/ajax/oReviewAutoCompleter.query.review-places.ajax.php',
			instance : this,
			link: 'cancel',
			onRequest: function() {
				//
			},
			onFailure: function(exc) {
				oReviewAutoCompleter.error([Localization.js_default_ajax_error]);
				$('place-selector-loading').dispose();
				oReviewAutoCompleter.dropdown.setStyle('display','none');
			},
			onError: function() {
				oReviewAutoCompleter.error([Localization.js_default_ajax_error]);
				$('place-selector-loading').dispose();
				oReviewAutoCompleter.dropdown.setStyle('display','none');
			},
			onSuccess: function(o,r) {
				oReviewAutoCompleter.clearSelectables();
				var c = 0;
				o.ids.each(function(id, index) {
					oReviewAutoCompleter.injectSelectable(oReviewAutoCompleter.getSelectable(id ,o.htmls[index],'border-bottom:1px solid #891a60; color:#1C4F6B; padding:4px; padding-left:7px;', o.targets[index]));	
					c++;
				});
				if(c==0) {
					oReviewAutoCompleter.injectSelectable(oReviewAutoCompleter.getSelectable('empty',Localization.nomatches,'border-bottom:1px solid #891a60; color:#1C4F6B; padding:4px; padding-left:7px;'));
				} else {
					oReviewAutoCompleter.keydown();	
				}
			}
		}).send();
		
		
	},
	
	select : function() {
		
		if($chk(this.selected)) {
			
			if(this.customid.length > 0) {
				$('event-selector-cache' + oReviewAutoCompleter.customid).set('value',this.selected.get('placeid'));
			}

			this.input.set('value',$('place-selector-name[' + this.selected.get('placeid') + ']').get('text'));
			this.dropdown.setStyle('display','none');
			this.active = false;
			this.input.highlight('#b5e6bd');
			//this.input.blur();
			//$('event-date' + this.customid).focus();
			
			//redirect
			window.location = this.selected.get('target');
			
			
		} else {
			
			if(this.customid.length > 0) {
				$('event-selector-cache' + oReviewAutoCompleter.customid).set('value', 0);
			}
			
			this.input.highlight('#ad0000');

		}
		
	},
	
	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($('place-selector-loading'))) {
			$('place-selector-loading').dispose();
		}
		if($chk($('place-selector-empty'))) {
			$('place-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--;	
		}
	}
	
});
