var eSuggest = new Class({
	
	Extends: Autocompleter,
	items: {}, 
	found: [], 
// 	stuktur: 0: name/nickname, 1: nachname/mitglieder, 2: nachname, 3: avatar, 4: typ, 5: id/leer, 6: prio
	ipt: null,
	pattern: null,
	timer: null,
	suggestTimer: null,
	infotimer: null,
	limit: null,
	choiceHeight: 50,
	choiceCnt: 0,
	searching: false,
	research: false,
	lastLength: 0,
	lastSuggest: null,
	patternChanged: false,
	
	request: false,
	user: false,
	wpool: false,
	wdb: false,
	
	initialize: function(){
		if(!$('top-search')) {
			return false;
		}
		this.ipt = $('top-search');
		this.ipt.addEvent('focus', this.initSearch.bind(this));
		this.ipt.addEvent('keyup', this.keyUp.bind(this));
		
		var options = {
			maxChoices: 6,
			injectChoice: this.injectChoice,
			overflow: true,
			fxOptions: null,
			delay: 600,
			minLength: 1,
			customChoices: null
		};
		
		options.customChoices = new Element('ul', {
			'class': this.options.className,
			'styles': {
				'zIndex': this.options.zIndex
			}
		}).inject(document.body);
		this.fix = new OverlayFix(options.customChoices);
		
		if (this.options.relative) {
			options.customChoices.inject($(autocomplete_el), 'after');
			this.relative = $(autocomplete_el).getOffsetParent();
		}
		
		this.parent('top-search', options);
	},
	
	keyUp: function(e) {
		this.pattern = this.ipt.value;
		this.patternChanged = (this.pattern.length != this.lastLength);
		
		if(!this.patternChanged && e) {
			return;
		}
		if(!this.request) {
			this.initialize();
			this.initSearch();
		}
		if(this.pattern.length < this.lastLength && this.found.length > 0) {
			this.found.empty();
		}
		
		this.lastLength = this.pattern.length;
		
		$clear(this.timer);
		this.timer = this.checkString.delay(100, this, [this]);
		if(this.patternChanged) {
			$clear(this.suggestTimer);
			this.suggestTimer = this.getSuggested.delay(300, this, [this]);
		}
	},
	
	getSuggested: function() {
		if(this.pattern.length < 2 || this.pattern == this.lastSuggest) {
			return false;
		}
		this.request = new Request.JSON({
			url: '/suche/suggest/quick,' + this.pattern,
			method: 'get',
			onComplete: this.addSuggested.bind(this)
		}).send();
	},
	
	calculateLimit: function() {
		var y = document.body.getSize().y;
		l = y/100*60/this.choiceHeight;		
		this.limit = Math.floor((l>6?6:(l<3?3:l)));
	},
	
	initSearch: function() {
		if(!this.limit) {
			this.calculateLimit();
			window.addEvent('resize', this.calculateLimit.bind(this));
		}
		
		if(this.items.length > 0) {
			if(this.found.length > 0 && this.ipt.value.length > 0) {
				this.keyUp();
			}
			return;
		}
		
		if(this.request) {
			return;
		}
		
		this.request = new Request.JSON({
			url: '/suche/suggest/init',
			method: 'post',
			onComplete: this.updateItems.bind(this)
		}).send();
	},
	
	updateItems: function(response) {
		this.items = response;
	},
	
	addSuggested: function(response) {
		if(response && this.items && response.length > 0) {
			this.items.extend(response);			
		}
		this.found.empty();
		$clear(this.timer);
		this.timer = this.checkString.delay(100, this, [this]);
	},
	
	checkString: function() {
		if(this.searching) {
			this.research = true;
		}
		else {		
			this.research = false;
			this.searching = true;
		}
		if(this.pattern.length == 0) {
			return false;
		}		
		
		// this.found.empty();
		this.choiceCnt = 0;
		this.pattern = this.pattern.toLowerCase();
		
		if(this.items) {
			this.research = false;
			var item = null;
			
			// suche nur in suchergebnissen
			if(this.found.length > 0) {
				var search = this.found;
			}
			else {
				var search = this.items;
			}
			
			var matches = 0;
			var tmp = [];
			
			for(i=0; i < search.length; i++) {
				if(!search[i]) {
					continue;
				}
				item = search[i];
				found = false;
				if(this.matchPattern(item)) {
					if(tmp.indexOf(item[0]+'_'+item[5]) >= 0) {
						continue;
					}
					if(item) {
						tmp[i] = item[0]+'_'+item[5];
					}
					this.found[i] = item;
					matches++;
					found = true;
				}
				if(!found && this.found[i]) {
					delete this.found[i];
				}
			}
		}
		
		if(matches > 0) {
			// this.found = this.found.sort(this.reOrderFound);
			this.update(this.found);
		}
		else {
			if(this.suggestTimer > 0) {
				this.update(['Suche nach Vorschlägen...']);
			}
			else {
				this.update([]);
			}
			
			this.suggestTimer = 0;
		}
		this.searching = false;
	},
	
	reOrderFound: function(a, b) {
		return (a[6] < b[6]? 1 : -1);
	},
	
	matchPattern: function(item) {
		if(!item[0]) {
			return false;
		}
			
		// if(item[0].toLowerCase().indexOf(this.pattern) >= 0 || (item[4] == 'u' && item[1].toLowerCase().indexOf(this.pattern) >= 0)) {
		if(item[0].toLowerCase().startsWith(this.pattern)) {
			return true;
		}
		
		if(item[4] == 'u' || item[4] == 'm') {
			if(item[1].toLowerCase().startsWith(this.pattern) || item[2].toLowerCase().startsWith(this.pattern)) {
				return true;
			}
			
			if(item[1].toLowerCase().indexOf(' '+this.pattern) >= 0 || item[2].toLowerCase().indexOf(' '+this.pattern) >= 0) {
				return true;
			}
		}
		
		if(item[0].toLowerCase().indexOf(' '+this.pattern) >= 0) {
			return true;
		}
		
		return false;
	},
	
	query: function() {
		return true;
	},
	
	decodeLink: function(ln) {
		if(!ln) {
			return '/app/1/img/placeholder/avatar_female_58x58.jpg';
		}
		
		n = ln.length;
		
		dln = '_58x58.jpg';
		dln = ln.slice(n-32) + dln;
		dln = "/" + dln;
		dln =  ln.slice(n-34,n-32) + dln;
		dln = "/" + dln;
		dln = ln.slice(n-36,n-34) + dln;
		dln = "/" + dln;
		dln = ln.slice(n-38,n-36) + dln;
		dln = "/" + dln;
		if(n == 40) {
			dln = '20' + ln.slice(0,2) + dln;
		} 
		else {
			dln = '200' + ln.slice(0,1) + dln;
		}
		
		dln = 'http://cdn.eraffe.net/modified/' + dln;
		
		return dln;
	},
	
	decodeURL: function(token) {
		if(token[4] == 'u' || token[4] == 'm') {
			return '/mitglieder/profil/' + token[0];
		}
		else if(token[4] == 'p') {
			return '/treffpunkte/profil/id,' + token[5];
		}
		else if(token[4] == 'g') {
			return '/gruppen/profil/id,' + token[5];
		}
	},
	
	addInfo: function(token) {
		cnt = (this.choiceCnt-this.limit);
		if(cnt <= 0) {
			// return;
		}
		if(cnt > 200) {
			text = 'Weitere '+ cnt+ ' Treffer anzeigen';
		}
		else {
			text = 'Weitere Treffer anzeigen';
		}
		var choice = new Element('li', {
			'html': text,
			'class': 'last',
			'id': 'more-info',
			'styles': {
				'color': 'gray',
				'padding': '8px'
			}
		});
		
		var span = new Element('span', {
			'html': ''
		});
		choice.appendChild(span);
		
		this.choices.appendChild(choice);
		this.addChoiceEvents(choice).inject(this.choices);
		choice.removeEvents('click');
		choice.addEvent('click', function() {
			this.ipt.getParent('form').submit();
			return false;
		}.bind(this));
		
		$('more-info').slide('hide').slide('in');
	},
	
	truncateResult: function(str) {
		var l = 27;
		if(str.length > l) {
			str = str.substr(0, l) + '...';
		}
		
		return str;
	},
	
	injectChoice: function(token) {
		if(!token) {
			return;
		}
		this.choiceCnt++;
		this.queryValue = this.pattern;
		$clear(this.infotimer);
		this.infotimer = this.addInfo.delay(1300, this);
		if(this.choiceCnt > this.limit) {
			return;
		}
		
		var choice = new Element('li', {
			'styles': {
				'height': this.choiceHeight + 'px'				
			}
		});
		
		if ($type(token) == 'string') {
			choice.appendText(token);
			choice.inputValue = '';
		}
		else {
			choice.appendChild(new Element('img', {
				'src': this.decodeLink(token[3]),
				'alt': token[0],
				'styles': {
					'float': 'left',
					'margin-right': '4px',
					'width': '48px',
					'height': '48px',
					'clear': 'left',
					'overflow': 'hidden',
					'border': '1px solid #fff'
				}
			}));
			var span = new Element('span', {
				'html': this.markQueryValue(this.truncateResult(token[0]))				
			});
			choice.appendChild(span);
			if(token[0].length > 27) {
				choice.set('title', token[0]);
			}
			
			span.appendChild(new Element('a', {
				'href': this.decodeURL(token),
				'styles': {
					'display': 'none'
				}
			}));
			span.appendChild(new Element('br'));
			if(token[4] == 'u') {
				span.set('html', span.get('html') + this.markQueryValue(token[1]) + ' ' + token[2].substr(0,1) + '.');
			}
			else if(token[4] == 'm') {
				span.set('html', span.get('html') + this.markQueryValue(token[1]) + ' ' + token[2].substr(0,1) + '.');
				new Element('br').inject(span);
				if(token[6] > 0) {
					if(token[6] == 1) {
						var ftext = '1 gemeinsamer Freund';
					}
					else {
						var ftext = token[6] + ' gemeinsame Freunde';
					}
				}
				else {
					var ftext = '';
				}
				
				new Element('span', {
					'html': ftext,
					'class': 'infotext'
				}).inject(span);
			}
			else if(token[4] == 'p') {
				new Element('span', {
					'html': 'Treffpunkt<br/>' + token[1],
					'class': 'infotext'
				}).inject(span);
				
			}
			else if(token[4] == 'g') {
				new Element('span', {
					'html': 'Gruppe<br/>' + token[1],
					'class': 'infotext'
				}).inject(span);
				
			}
			
			span.parentNode.removeEvents('click');
			span.parentNode.addEvent('click', function(){
				document.location =	this.decodeURL(token);
				return false;
			}.bind(this), this);
			
			choice.inputValue = token[0];
		}
		this.addChoiceEvents(choice).inject(this.choices);		
	}	
});

window.addEvent('domready', function() {
	var oSuggest = new eSuggest();
});
