var Engine = {
		
	_checkForUpdatesTime: 30000,
	_notificatorTimeout: 4000,
	
	setup: function(engineName,title)
	{
		if(!title) title = $('a.init[rel=\''+engineName+'\']').html();
		
		var $container = $('#engines_container');
		var $engine = $(Engine.getBody(engineName,title));
		$engine.addClass('hidden');
		$container.append($engine);
		
		initLocalForms();
		
		$('.engine_body').height(Core.getEngineBodyHeight());
		$('.engine').height(Core.getEngineHeight());
		
		Engine.register(engineName);
	},
	
	getUrlString: function(engineName)
	{
		if(Core.global.engines[engineName].localSearch)
		{
			var keywords = $('#'+engineName+'-filters > form > input.skey').val();
			//var location = $('#'+engineName+'-filters > form > input.sloc').val();
		}
		else
		{
			var keywords = $keywords.val();
			//var location = $location.val();
		}
		
		var filters = '';
		
		for(var f in Core.global.engines[engineName].filters)
		{
			filters += '&'+f.replace(/ /g,'_')+'='+Core.global.engines[engineName].filters[f];
		}
		
		var str = 'page='+Core.global.engines[engineName].nextPage+'&keywords='+encodeURIComponent(keywords)+filters;
		return str;
	},
	
	updateActiveFilters: function(engineName)
	{
		$('a.filter[rel=\''+engineName+'\']').removeClass('selected');
		
		if(!Core.global.engines[engineName].hasOwnProperty('filters')) return false;
		
		for(var f in Core.global.engines[engineName].filters)
		{
			$('a.filter[rev=\''+Core.global.engines[engineName].filters[f]+'\']').addClass('selected');
		}
	},
	
	toggleFilter: function(engineName,param,paramValue)
	{
		if(!Core.global.engines[engineName].hasOwnProperty('filters'))
			Core.global.engines[engineName].filters = {};
			
		Core.global.engines[engineName].filters[param] = paramValue;
	},
	
	clearFilters: function(engineName)
	{
		if(Core.global.engines[engineName].hasOwnProperty('filters'))
		{
			delete Core.global.engines[engineName].filters;
			Core.global.engines[engineName].filters = {};
		}
	},
	
	isFilter: function(engineName,paramName)
	{
		if(!Core.global.engines[engineName].hasOwnProperty('filters')) 
			return false;
		else
			return Core.global.engines[engineName].filters.hasOwnProperty(paramName);
	},
	
	toggleFilters: function(engine)
	{
		var $body = $('#'+engine+'-body');
		
		if($('#'+engine+'-filters').is(':hidden')) 
		{
			$body.animate({scrollTop: 0},550);
			$('#'+engine+'-filters').show();
		}
		else 
		{
			if($body.scrollTop() > 0)
			{
				$body.animate({scrollTop: 0},550);
				return;
			}
			
			$('#'+engine+'-filters').hide();
		}
	},
	
	buildFilters: function(engineName,filters)
	{
		var $filters = $('#'+engineName+'-filters-cont');	
		
		if(filters == '') 
		{
			$filters.hide();
			return false;
		}
		
		
		$filters.show();
		var htmlFilters = '';
		
		for(var f in filters)
		{
			htmlFilters += '<dt>'+f+'</dt><dd>';
			
			for(var filter in filters[f])
			{
				var paramName = filter.replace(/::default/,'');
				
				if(filter.indexOf('::default') != -1)
				{
					if(!Engine.isFilter(engineName,f)) 
						this.toggleFilter(engineName,f,filters[f][filter]);
				}
				
				htmlFilters += '<a href="#" title="'+f+'" rel="'+engineName+'" class="filter" rev="'+filters[f][filter]+'">'+paramName+'</a>, '
			}
			
			htmlFilters = htmlFilters.substr(0,htmlFilters.length-2);
			htmlFilters += '</dd>';
		}
		
		$filters.html(htmlFilters);
		
		Engine.updateActiveFilters(engineName);
	},
	
	refresh: function(engineName)
	{
		if(!Engine.isRegistred(engineName)) Engine.setup(engineName);
		
		Core.global.engines[engineName].nextPage =1;
		$('#'+engineName+'-more').html('Show More').hide().attr('disabled',false);
		
		if(!Core.global.engines[engineName].localSearch)
		{
			$('#'+engineName+'-filters > form > input.skey').val($keywords.val());
			$('#'+engineName+'-filters > form > input.sloc').val($location.val());
			Core.global.engines[engineName].localSearch = false;
			Engine.clearFilters(engineName);
		}
		else
			Core.global.engines[engineName].localSearch = true;
		
		if($('#'+engineName+'-body').scrollTop())
		{
			$('#'+engineName+'-body').animate({scrollTop: 0},750,function(){
				$('#'+engineName+'-loader').fadeIn('fast');
				$.post('/engine/data/t/'+engineName,Engine.getUrlString(engineName),Engine.updateSearch,'json');
			});
		}
		else
		{
			$('#'+engineName+'-loader').show();
			$.post('/engine/data/t/'+engineName,Engine.getUrlString(engineName),Engine.updateSearch,'json');
		}
		
		//$('#'+engineName+'-loader').css({top:$('#'+engineName+'-body').scrollTop()}).show();
		//$.post('/engine/data/t/'+engineName,Engine.getUrlString(engineName),Engine.updateSearch,'json');
	},
	
	search: function(engineName,local)
	{
		Core.global.engines[engineName].nextPage =1;
		$('#'+engineName+'-more').html('Show More').hide().attr('disabled',false);
		
		if(!local) 
		{
			$('#'+engineName+'-filters > form > input.skey').val($keywords.val());
			$('#'+engineName+'-filters > form > input.sloc').val($location.val());
			Core.global.engines[engineName].localSearch = false;
			Engine.clearFilters(engineName);
		}
		else
		{
			Core.global.engines[engineName].localSearch = true;
		}
		
		if($('#'+engineName+'-body').scrollTop())
		{
			$('#'+engineName+'-body').animate({scrollTop: 0},750,function(){
				$('#'+engineName+'-loader').fadeIn('fast');
				$.post('/engine/data/t/'+engineName,Engine.getUrlString(engineName),Engine.updateSearch,'json');
			});
		}
		else
		{
			$('#'+engineName+'-loader').show();
			$.post('/engine/data/t/'+engineName,Engine.getUrlString(engineName),Engine.updateSearch,'json');
		}
	},
	
	updateSearch: function(json)
	{
		$('#'+json.header.engineName+'-loader').hide();
		$('#'+json.header.engineName+'-results').html('');
		
		if(json.header.status == false) 
		{
			$('#'+json.header.engineName+'-more').hide();
			$('#'+json.header.engineName+'-results').html('<li class="empty">'+json.header.error+'</li>');
			
			if($('#'+json.header.engineName+'-filters').is(':hidden'))
				Engine.toggleFilters(json.header.engineName);
			
			return 0;
		}
		
		if(json.header.numFound > json.body.length) 
			$('#'+json.header.engineName+'-more').show();
		
		Core.global.engines[json.header.engineName].notificator = false;
		
		if(!Core.global.engines[json.header.engineName].isUpdateScheduled)
		{
			Core.global.engines[json.header.engineName].isUpdateScheduled = true;
			Core.global.engines[json.header.engineName].timeoutId = setTimeout('Engine.checkForUpdates("'+json.header.engineName+'")',Engine._checkForUpdatesTime);
		}
		
		Core.global.engines[json.header.engineName].latestId = json.body[0].id;
		
		for(var i=0;i<json.body.length;i++)
		{
			Engine.appendResult(json.header.engineName,json.body[i],(i+1)%2);
		}
		
		Engine.buildFilters(json.header.engineName,json.filters);
		Core.tooltip();
	},
	
	more: function(engineName)
	{
		Core.global.engines[engineName].nextPage++;

		$('#'+engineName+'-more').html('<img src="/images/ajax-loader-more.gif" alt="Loading" />').attr('disabled',true);
		$.post('/engine/data/t/'+engineName,this.getUrlString(engineName),Engine.updateMore,'json');
	},
	
	updateMore: function(json)
	{
		if(json.header.status == 0)
		{
			$('#'+json.header.engineName+'-more').html('No more results');
			return false;
		}
			
		$('#'+json.header.engineName+'-more').html('Show More').attr('disabled',false);
		
		if(json.body.length%2)
			var incr = 0;
		else
			var incr = 1;
		
		for(var i=0;i<json.body.length;i++)
		{
			Engine.appendResult(json.header.engineName,json.body[i],(i+incr)%2);
		}
		
		Core.tooltip();
	},
	
	checkForUpdates: function(engineName)
	{
		if(Core.global.engines[engineName].active)
		{
			$.post('/engine/data/t/'+engineName,this.getUrlString(engineName),Engine.checkForUpdatesResponse,'json');
		}
		else
		{
			Core.global.engines[engineName].notificator = false;
			Core.global.engines[engineName].isUpdateScheduled = false;
		}
	},
	
	newPostNotificator: function(engineName)
	{
		if(Core.global.engines[engineName].notificator && Core.global.engines[engineName].active)
		{
			setTimeout('Engine.newPostNotificator("'+engineName+'")',Engine._notificatorTimeout);
			
			$('#'+engineName+' > .engine').animate({
				backgroundColor:'#f66914'
			},1000,null,function(){
				$(this).animate({
					backgroundColor:'#1f1f1f'
				},1000)
			});
		}
	},
	
	checkForUpdatesResponse: function(json)
	{
		if(json.header.status == 0)
		{
			if(!Core.global.engines[json.header.engineName].notificator)
				Core.global.engines[json.header.engineName].timeoutId = setTimeout('Engine.checkForUpdates("'+json.header.engineName+'")',Engine._checkForUpdatesTime);
			
			return 0;
		}
		
		if(json.body.length == 0)
			return 0;
		
		if(Core.global.engines[json.header.engineName].latestId != json.body[0].id)
		{	
			Core.global.engines[json.header.engineName].isUpdateScheduled = false;
			Core.global.engines[json.header.engineName].notificator = true;
			Engine.newPostNotificator(json.header.engineName);
		}
		else
		{
			if(!Core.global.engines[json.header.engineName].notificator)
				Core.global.engines[json.header.engineName].timeoutId = setTimeout('Engine.checkForUpdates("'+json.header.engineName+'")',Engine._checkForUpdatesTime);
		}
	},
	
	getLinkHtml: function(link,text,type)
	{
		if(link != 'null' && link)
			return '<div class="button left '+type+'" style="width: 85px"><a title="'+text+' - '+link+'" style="width: 70px" rel="nofollow" target="_blank" href="'+link+'">'+text+'</a><div></div></div>';
		else
			return '';
	},
	
	getSaveLinkHtml: function(id,engineName)
	{
		if(engineName == 'saved')
			var cl='unsave';
		else
			var cl='save';
		
		var head = cl.charAt(0).toUpperCase()+cl.substr(1);
		
		if(head == 'Save')
			var title = 'Save this post';
		else
			var title = 'Remove this post';
		
		return '<div class="save_button button left" style="width: 40px"><a class="'+cl+'" title="'+head+' - '+title+'" style="width: 25px" rel="'+id+'" href="#"><img src="/images/'+cl+'.png" alt="save" ></a><div></div></div>';
	},
	
	appendResult: function(engineName,result,bg)
	{
		var results = document.getElementById(engineName+'-results');
		var newli = document.createElement('li');
		
		newli.setAttribute('class','bg'+bg+' '+result.id);
		newli.setAttribute('className','bg'+bg+' '+result.id);
		
		newli.innerHTML = '';
		var cl = 'txtl';
		
		if(result.image_link && result.image_link != 'null')
		{
			newli.innerHTML += '<img class="avatar" src="'+result.image_link+'" alt="'+result.title+'">';
			cl = 'txt';
		}
		
		newli.innerHTML += '<div class="'+cl+'"><h3>'+result.title+'</h3><p>'+result.description+'</p></div>';
		var optionalLink = '';
		
		newli.innerHTML = '<div>'+newli.innerHTML+'<div class="clear"></div></div>';
		
		if(result.optional_link.link && result.optional_link.link != 'null')
		{
			optionalLink = this.getLinkHtml(result.optional_link.link, result.optional_link.text,'optional');
		}

		newli.innerHTML += '<div class="adds">'+this.getSaveLinkHtml(result.id,engineName)+this.getLinkHtml(result.link,'view more','more')+optionalLink+'<span class="date">'+result.created_at+'</span><div class="clear"></div></div>';
		
		//alert(newli.innerHTML)
		results.appendChild(newli);
	},
	
	toggle: function(engineName,title,init)
	{
		var hidden = false;
		
		if(!Engine.isRegistred(engineName))
		{
			Engine.setup(engineName,title);
			
			this.search(engineName);
			Core.global.engines[engineName].active = false;
			
			$('#'+engineName+'-more').hide();
			hidden = true;
		}
		
		if(Core.global.engines[engineName].active)
		{
			if (!init) {
				Core.global.engines[engineName].active = false;
				clearTimeout(Core.global.engines[engineName].timeoutId);
				$('#' + engineName).fadeOut(300, function(){
					$('#' + engineName).toggleClass('hidden');
				});
				
				$('a.init[rel=\'' + engineName + '\']').toggleClass('selected');
			}
			else{
				$('.engine_skin:not(:hidden)').each(function(i){
					if ($(this).attr('id') == engineName) {
						$('#engines').animate({
							scrollLeft: i * 280
						}, 600);
							
						//console(i * 280)
					}
				});
			}
		}
		else
		{
			Core.global.engines[engineName].active = true;
			if(!hidden) Engine.checkForUpdates(engineName);
			
			$('#'+engineName).fadeIn(450,function(){
				$('#'+engineName).toggleClass('hidden');
			});
			
			$('.engine_skin:not(:hidden)').each(function(i){
				if ($(this).attr('id') == engineName) {
					$('#engines').animate({
						scrollLeft: i * 280
					}, 600);
						
					//console(i * 280)
				}
			});
			
			$('a.init[rel=\''+engineName+'\']').toggleClass('selected');
		}
		
		Core.updateUrl();
		Core.tooltip();
		
	},
	
	isActive: function(engineName)
	{
		if(!this.isRegistred(engineName)) return false;
		else
		{
			return Core.global.engines[engineName].active;
		}
	},
	
	isRegistred: function(engineName)
	{
		return Core.global.engines.hasOwnProperty(engineName);
	},
	
	register: function(engineName,title)
	{
		Core.global.engines[engineName] 					= {};
		Core.global.engines[engineName].active				= true;
		Core.global.engines[engineName].name				= engineName;
		Core.global.engines[engineName].title				= title;
		Core.global.engines[engineName].nextPage 			= 2;
		Core.global.engines[engineName].localSearch			= false;
		Core.global.engines[engineName].latestId			= false;
		Core.global.engines[engineName].isUpdateScheduled	= false;
	},
	
	remove: function(engineName)
	{
		$('#'+engineName).remove();
		delete Core.global.engines[engineName];
	}		
}