$().ready(function(){
	
	//setup
	var o = {};
	
	o.container  = $('#scroll');
	o.scrollList = $('#main_list');
	o.scrollTop  = $('#scroll_top');
	o.scrollBottom = $('#scroll_bottom');
	o.slides       = $('#slides');
	
	o.timeInterval = 5000;
	o.scrollHeight = o.scrollList.find('li:first').height();
	o.itemsVisible = 5;
	o.container.css({'height':o.itemsVisible*o.scrollHeight});
	o.items_visible_ceil = Math.ceil(o.itemsVisible/2);
	
	o.initialSelectedItem = o.scrollList.find('li:nth-child('+o.items_visible_ceil+')');
	o.initialSelectedItem.addClass('selected');
	o.initialSelectedSlide = o.slides.find('div.slide:nth-child('+o.items_visible_ceil+')');
	o.initialSelectedSlide.addClass('selected').show();
	o.total = o.scrollList.find('li').size();
	//ends setup
	
	$('.slide a[href*=#no-link]').addClass('void_link').bind('click',function(evnt){
		
		evnt.preventDefault();
		
	});
	//initial timer
	o.scrollList.bind('start',function(){
		
		o.interval = setInterval(function(){
			
			o.nextSlide = o.scrollList.find('.selected').next();
			
			if(!o.nextSlide.height()){
				
				o.nextSlide = o.scrollList.find('li:first');
				
			}
			
			o.scrollList.trigger('scroll',['down', o.nextSlide, o.scrollList.find('li.selected')]);
			
		},o.timeInterval);
	
	});
	//ends initial timer
	
	//starts timer now
	o.scrollList.trigger('start');
	
	$('.UI_control').bind('disable',function(){
		
		$(this).addClass('disabled');
		
	});
	
	$('.UI_control').bind('enable',function(){
		
		$(this).removeClass('disabled');
		
	});
	
	o.scrollList.bind('scroll',function(e, direction, nextSlide, selected, itemOffset, positionFix){
		
		$(this).addClass('animated');
		
		selected.removeClass('selected');
		nextSlide.addClass('selected');
		
		o.currentSlide = $(selected.find('a').attr('href'));
		
		o.currentSlide.fadeOut(400, function(){
			
			o.currentSlide.removeClass('selected');
			o.realNextSlide = $(o.nextSlide.find('a').attr('href'));
			o.realNextSlide.addClass('selected');
			
			$(o.realNextSlide).fadeIn(700,function(){
				
				
				
			});	
			
		});
		
		if(o.total > o.itemsVisible){
			
			$('.UI_control').trigger('disable');
			
			switch(direction){
			
				case 'down':
					
					o.scrollList.animate({
						
						top:o.scrollList.position().top - o.scrollHeight
						
					},{
						
						duration:400,
						queue:false,
						complete: function(){
							
							//because of the way a website grows, the element insertion triggers
							//just after the animation to the bottom is complete, this is because
							//we already have an element to show right now, otherwise this wouldn't
							//slides
							
							o.swap_item = o.scrollList.find('li:first');
							o.scrollList.append(o.swap_item);
							
							o.scrollList.css({top:o.scrollList.position().top + o.scrollHeight});
							
							$('.UI_control').trigger('enable');	
							o.scrollList.removeClass('animated');
							
						}
						
					});
					
				break;
				
				case 'up':
					
					//because of how a website flows and grows, first we need to add the
					//new element on the top of the list, that way we can scroll to the top and
					//find an element instead of an empty space
					
					o.swap_item = o.scrollList.find('li:last');
					o.scrollList.prepend(o.swap_item);
					o.scrollList.css({top:o.scrollList.position().top - o.scrollHeight});
					
					o.scrollList.animate({
						
						top:o.scrollList.position().top + o.scrollHeight
						
					},{
						
						duration:400,
						queue:false,
						complete: function(){
							
							$('.UI_control').trigger('enable');
							o.scrollList.removeClass('animated');
							
						}
						
					});
					
				
				break;
				
				case 'custom-top':
					
					o.scrollList.animate({
						
						top: o.scrollList.position().top - o.positionFix
						
					},{
						
						duration:400,
						queue:false,
						complete:function(){
							
							$('.UI_control').trigger('enable');
							o.scrollList.removeClass('animated');
							
							for(var i = 0; i< (itemOffset); i++){
						
								o.swap_item = o.scrollList.find('li:first');
								o.scrollList.append(o.swap_item);
								
							}
							
							o.scrollList.css({top:0});
							$('.UI_control').trigger('enable');
							o.scrollList.removeClass('animated');
							
						}
						
					});
				
				break;
				
				case 'custom-bottom':
					
					for(var i = 0; i< (itemOffset); i++){
						
						o.swap_item = o.scrollList.find('li:last');
						o.scrollList.prepend(o.swap_item);
						
					}
					
					o.scrollList.css({top:o.scrollList.position().top - positionFix});
					
					
					o.scrollList.animate({
						
						top: 0
						
					},{
						
						duration:400,
						queue:false,
						complete:function(){
							
							$('.UI_control').trigger('enable');
							o.scrollList.removeClass('animated');
							
							o.scrollList.css({top:0});
							$('.UI_control').trigger('enable');
							o.scrollList.removeClass('animated');
							
						}
						
					});
					
				
				break;
				
			}
			
		}
		
	});
	
	o.scrollTop.click(function(evnt){
		
		if($(this).is(':not(.disabled)')){
			
			clearInterval(o.interval);
			
			o.interval = setTimeout(function(){
				
				o.scrollList.trigger('start');
				
			},5000);
			
			o.selected = o.scrollList.find('li.selected');
			o.nextSlide = o.selected.prev();
			
			o.scrollList.trigger('scroll', ['up', o.nextSlide, o.selected]);
			
		}
		
		evnt.preventDefault();
		
	});
	
	o.scrollBottom.click(function(evnt){
		
		if($(this).is(':not(.disabled)')){
			
			clearInterval(o.interval);
			
			o.interval = setTimeout(function(){
				
				o.scrollList.trigger('start');
				
			},5000);
			
			o.selected = o.scrollList.find('li.selected');
			o.nextSlide = o.selected.next();
			
			o.scrollList.trigger('scroll', ['down', o.nextSlide, o.selected]);
			
		}
		
		evnt.preventDefault();
		
	});
	
	o.scrollList.find('li a').bind('click',function(evnt){
		
		if($(this).parent().is(':not(.selected)') && o.scrollList.is(':not(.animated)')){
			
			clearInterval(o.interval);
		
				o.interval = setTimeout(function(){
				
				o.scrollList.trigger('start');
				
			},5000);
				
			if($(this).parent().next().is('.selected')){
				
				o.selected = o.scrollList.find('li.selected');
				o.nextSlide = o.selected.prev();
				
				o.scrollList.trigger('scroll', ['up', o.nextSlide, o.selected]);
				
			}
			else if($(this).parent().prev().is('.selected')){
				
				o.selected = o.scrollList.find('li.selected');
				o.nextSlide = o.selected.next();
				
				o.scrollList.trigger('scroll', ['down', o.nextSlide, o.selected]);
				
				evnt.preventDefault();
				
			}
			else{
				
				o.prevAllSize         = $(this).parent().prevAll().size();
				o.selectedPrevAllSize = o.scrollList.find('.selected').prevAll().size();
				
				if(o.prevAllSize > o.selectedPrevAllSize){
					
					o.positionFix = 0;
					
					for(var i = 0; i< (o.prevAllSize - o.selectedPrevAllSize); i++){
						
						o.positionFix += o.scrollHeight;
						
					}
					
					o.offset = o.prevAllSize - o.selectedPrevAllSize;
					
					o.nextSlide = $(this).parent();
					o.selected = o.scrollList.find('.selected');
					
					o.scrollList.trigger('scroll',['custom-top',o.nextSlide, o.selected, o.offset, o.positionFix]);
					
				}
				else{
					
					o.positionFix = 0;
					o.offset = o.selectedPrevAllSize - o.prevAllSize;
					
					for(var i = 0; i< (o.selectedPrevAllSize - o.prevAllSize); i++){
						
						o.positionFix += o.scrollHeight;
						
					}
					
					o.nextSlide = $(this).parent();
					o.selected = o.scrollList.find('.selected');
					
					o.scrollList.trigger('scroll',['custom-bottom',o.nextSlide, o.selected, o.offset, o.positionFix]);
					
				}
				
			}
			
		}
		
		evnt.preventDefault();
		
	});
	

});

