var SearchPage = {
	visible: false,
	request: null,
	delay: null,
	loaderInterval: null,
	query: '',
	
	setupInput: function() {
		var box = $('searchbox');
		var input = $('searchinput');
		var button = $('searchbutton');
		if (!box || !input || !button) return;
		
		var buttonWidth = parseInt(button.getStyle('width'));
		
		button.setStyle('display', 'none');
		
		var cont = button.getParent().getParent();
		var size = cont.getSize();
		
		var clearButton = new Element('div', { 'id': 'clearbutton', 'styles': { 'width': size.y, 'height': size.y } }).addEvent('click', function(e) {
			e.stopPropagation();
			SearchPage.hide();
			this.setStyle('display', 'none');
			if (input.value != 'Sök') {
				input.setStyle('color', '#666');
				input.value = 'Sök';
			}
		});
		
		if (input.value == 'Sök') {
			input.setStyle('color', '#666');
			clearButton.setStyle('display', 'none');
		}
		else
			input.setStyle('color', '#333');
		
		cont.grab(clearButton);
		
		input.setStyle('width', parseInt(input.getStyle('width')) + (buttonWidth - size.y));
		
		box.addEvent('click', function() { input.focus(); });
		input.addEvent('focus', function() {
			if (input.value == 'Sök') {
				input.value = '';
				input.setStyle('color', '#333');
			}
		});
		input.addEvent('blur', function() {
			if (input.value == '') {
				input.setStyle('color', '#666');
				input.value = 'Sök';
			}
		});
		input.addEvent('keyup', function(e) {
			if (e.code == 27) {
				SearchPage.clear();
				SearchPage.hide();
				input.value = '';
				clearButton.setStyle('display', 'none');
			}
			else if (input.value != SearchPage.query) {
				if (input.value != '') {
					SearchPage.search(input.value);
					clearButton.setStyle('display', 'block');
				}
				else {
					SearchPage.hide();
					clearButton.setStyle('display', 'none');
				}
			}
		});
		input.form.addEvent('submit', function(e) { e.stop(); SearchPage.search(input.value); });
	},
	
	initialize: function() {
		var width = parseInt($('mainwrap').getStyle('width'));
		var content = SearchPage.content = new Element('div', { 'class': 'content' }).grab(new Element('div', { 'class': 'loadingsymbol' }).set('tween', { duration: 200 }));
		var searchpage = SearchPage.sp = new Element('div', { id: 'searchpage', styles: { display: 'none', width: width, left: -width } }).grab(content).inject($('searchbox'), 'before');
		
		SearchPage.tween = null;
		SearchPage.scrollTween = null;
		SearchPage.scrollPos = null;
	},
	
	show: function() {
		if (!SearchPage.sp) SearchPage.initialize();
		if (SearchPage.visible) return;
		if (SearchPage.tween != null) SearchPage.tween.cancel();
		if (SearchPage.scrollTween != null) SearchPage.scrollTween.cancel();
		else SearchPage.scrollPos = window.getScroll();
		SearchPage.sp.setStyle('display', 'block');
		SearchPage.sp.setStyle('width', $('mainwrap').getStyle('width'));
		SearchPage.sp.setStyle((Browser.Engine.trident && Browser.Engine.version <= 4 ? 'height' : 'minHeight'), $('mainwrap').getStyle('height'));
		SearchPage.tween = new Fx.Tween(SearchPage.sp, { duration: 400 }).start('left', 0);
		SearchPage.tween.addEvent('complete', SearchPage.shown);
		SearchPage.scrollTween = new Fx.Scroll(window).start(0, 0);
		SearchPage.scrollTween.addEvent('complete', SearchPage.scrollComplete);
		SearchPage.visible = true;
	},
	
	shown: function() {
		SearchPage.tween = null;
		SearchPage.sp.setStyle('right', '0');
		SearchPage.sp.setStyle('width', 'auto');
	},
	
	hide: function() {
		if (!SearchPage.visible) return;
		if (SearchPage.tween != null) SearchPage.tween.cancel();
		if (SearchPage.scrollTween != null) SearchPage.scrollTween.cancel();
		SearchPage.sp.setStyle('right', 'auto');
		SearchPage.sp.setStyle('width', $('mainwrap').getStyle('width'));
		SearchPage.tween = new Fx.Tween(SearchPage.sp, { duration: 400 }).start('left', -parseInt(SearchPage.sp.getStyle('width')));
		SearchPage.tween.addEvent('complete', SearchPage.hidden);
		if (SearchPage.scrollPos != null) {
			SearchPage.scrollTween = new Fx.Scroll(window).start(SearchPage.scrollPos.x, SearchPage.scrollPos.y);
			SearchPage.scrollTween.addEvent('complete', SearchPage.scrollComplete);
		}
		if (SearchPage.delay != null) {
			clearTimeout(SearchPage.delay);
			SearchPage.delay = null;
		}
		SearchPage.clear();
		SearchPage.visible = false;
	},
	
	hidden: function() {
		SearchPage.tween = null;
		SearchPage.sp.setStyle('display', 'none');
	},
	
	scrollComplete: function() {
		SearchPage.scrollTween = null;
	},
	
	search: function(query) {
		SearchPage.show();
		if (SearchPage.request == null)
			SearchPage.request = new Request.JSON({ url: 'javascripts/search.js.php', method: 'get', link: 'cancel' }).addEvent('failure', SearchPage.resultsFailed).addEvent('success', SearchPage.resultsLoaded);
		SearchPage.clear();
		SearchPage.showLoader();
		if (SearchPage.delay != null)
			clearTimeout(SearchPage.delay);
		SearchPage.delay = setTimeout(SearchPage.delayedSearch, 500);
		SearchPage.query = query;
	},
	
	delayedSearch: function() {
		SearchPage.delay = null;
		SearchPage.request.send('q=' + encodeURIComponent(SearchPage.query));
	},
	
	resultsFailed: function() {
		SearchPage.hideLoader();
	},
	
	resultsLoaded: function(data) {
		SearchPage.hideLoader();
		
		var cases = data.cases, numCases = cases.length;
		var posts = data.posts, numPosts = posts.length;
		var news = data.news, numNews = news.length;
		var users = data.users, numUsers = users.length;
		
		var content = SearchPage.content;
		var createColumn = function(title, numHits) {
			var leftcolumn = new Element('div', { 'class': 'leftcolumn' }).grab(new Element('h3').appendText(title)).inject(content);
			if (numHits != null)
				leftcolumn.grab(new Element('div', { 'class': 'numhits' }).appendText((numHits == 1 ? '1 resultat' : numHits + ' resultat')))
			return new Element('div', { 'class': 'contentcolumn' }).inject(content);
		};
		
		if (numCases == 0 && numPosts == 0 && numNews == 0 && numUsers == 0) {
			createColumn('Inga träffar', null).set('html', 'Din sökning efter <span class="bold">' + SearchPage.query + '</span> gav inga träffar. Kontrollera din stavning eller försök med andra sökord.');
			return;
		}
		
		if (numCases > 0) {
			var col = createColumn('Cases', numCases);
			var row = new Element('tr');
			var scroller = new Element('div', { 'class': 'scroller' });
			col.grab(scroller.grab(new Element('div', { 'class': 'view' }).grab(new Element('table').grab(row))));
			
			for (var i = 0; i < numCases; i++) {
				var c = cases[i];
				var a = new Element('a', { href: 'portfolio/' + c.clientNicename + '/' + c.nicename, 'class': 'case fadingbackground' }).grab(new Element('span', { 'class': 'background' }));
				var fg = new Element('span', { 'class': 'foreground' }).inject(a);
				var thumb = new Element('span', { 'class': 'thumb' }).inject(fg);
				if (c.thumbnail != null && c.thumbnail != '')
					thumb.grab(new Element('img', { src: 'uploads/images/' + c.thumbnail, alt: c.name }));
				for (var j = 0; j < c.worktypes.length; j++) {
					fg.grab(new Element('img', { src: 'images/color_' + c.worktypes[j].colorName + '.png', width: 8, height: 8, alt: c.worktypes[j].name, 'class': 'color' }));
				}
				fg.grab(new Element('span', { 'class': 'title' }).appendText(c.name)).appendText(c.clientName);
				row.grab(new Element('td').grab(a));
				Site.setupFadingBackground(a);
			}
			
			Site.setupScroller(scroller);
		}
		
		if (numPosts > 0) {
			var col = createColumn('Blogginlägg', numPosts);
			
			for (var i = 0; i < numPosts; i++) {
				var post = posts[i];
				new Element('div', { 'class': 'hit' }).grab(new Element('h4').grab(new Element('a', { href: post.permalink }).appendText(post.title))).grab(new Element('div', { 'class': 'details' }).appendText(post.date + ' av ').grab(new Element('a', { href: 'bloggar/'/* + post.username*/ }).appendText(post.author))).grab(new Element('p').appendText(post.content)).inject(col);
			}
		}
		
		if (numNews > 0) {
			var col = createColumn('Nyheter', numNews);
			
			for (var i = 0; i < numNews; i++) {
				var news_post = news[i];
				new Element('div', { 'class': 'hit' }).grab(new Element('h4').grab(new Element('a', { href: 'nyheter/' + news_post.nicename }).appendText(news_post.title))).grab(new Element('div', { 'class': 'details' }).appendText(news_post.date)).grab(new Element('p').appendText(news_post.content)).inject(col);
			}
		}
		
		if (numUsers > 0) {
			var col = createColumn('Kontaktuppgifter', numUsers);
			var row = new Element('tr');
			var scroller = new Element('div', { 'class': 'scroller' });
			col.grab(scroller.grab(new Element('div', { 'class': 'view' }).grab(new Element('table').grab(row))));
			
			for (var i = 0; i < numUsers; i++) {
				var user = users[i];
				var a = new Element('a', { href: 'kontakt/' + user.nicename, 'class': 'contact fadingbackground' }).grab(new Element('span', { 'class': 'background' }));
				var fg = new Element('span', { 'class': 'foreground' }).inject(a);
				var thumb = new Element('span', { 'class': 'thumb' }).inject(fg);
				if (user.thumbnail != null && user.thumbnail != '')
					thumb.grab(new Element('img', { src: 'uploads/images/' + user.thumbnail, alt: user.firstname + ' ' + user.lastname }));
				fg.grab(new Element('span', { 'class': 'name' }).appendText(user.firstname + ' ' + user.lastname)).grab(new Element('span', { 'class': 'title' }).appendText(user.title));
				row.grab(new Element('td').grab(a));
				Site.setupFadingBackground(a);
			}
			
			Site.setupScroller(scroller);
		}
	},
	
	clear: function() {
		var children = SearchPage.content.getChildren();
		for (var i = children.length - 1; i >= 0; i--) {
			if (!children[i].hasClass('loadingsymbol')) children[i].dispose();
		}
		SearchPage.query = '';
	},
	
	showLoader: function() {
		var loader = SearchPage.sp.getElement('div.loadingsymbol');
		if (!loader) return;
		loader.fade(1);
		if (SearchPage.loaderInterval == null) {
			var pos = 0;
			SearchPage.loaderInterval = setInterval(function() { loader.setStyle('backgroundPosition', '0px ' + pos + 'px'); pos -= 20; if (pos <= -240) pos = 0; }, 50);
		}
	},
	
	hideLoader: function() {
		var loader = SearchPage.sp.getElement('div.loadingsymbol');
		if (!loader) return;
		loader.fade(0);
		if (SearchPage.loaderInterval != null) {
			clearInterval(SearchPage.loaderInterval);
			SearchPage.loaderInterval = null;
		}
	}
};

window.addEvent('domready', function() { if (!Site.IE6) SearchPage.setupInput(); });