/* ////////////////////////////////////////////////////////////////////////////
//
// Initialize Slider
//
/////////////////////////////////////////////////////////////////////////// */

var _sself;
var dont_start_slider = false;

function Slider(){
	_sself = this;
	
	// Add classes on slides to track content
	$('.slider li').each(function(){
		$(this).addClass($(this).index()+'');							  
	});
	
	// If true : running
	_sself.animated = false;
	_sself.bounced = false;
	_sself.speed = 1500;
	// Autorotation
	_sself.autorotation = false;
	_sself.duration = 300000;
	_sself.t;
	// Setting the container and controller
	_sself.container = $('.slider');
	_sself.controls = $('.slider-controls');
	_sself.arrows = $('#slideshow > a');
	_sself.width = 451;
	_sself.mLeft = -_sself.width;
	// Setting the initial values of the active slide - index : Content index - indexSlide : Slide index
	_sself.index = $('.active',_sself.container).index();
	_sself.indexSlide = $('.active',_sself.container).index();
	// Setting the initial values of info zone
	_sself.infoWidth = _sself.width/4;
	_sself.infoHeight = $(_sself.container).height() - $(_sself.container).height()/3;
	// Number of elements
	_sself.length = $('li',_sself.container).length - 1;
	
	// Methods	
	_sself.changeSlide = changeSSlide;
	_sself.bounceSibling = bounceSSibling;
	_sself.autoRotation = autoSRotation;
	_sself.stop = Sstop;
	_sself.start = Sstart;
	_sself.reset = Sreset;
	_sself.next = Snext;
	_sself.previous = Sprevious;
	
	// Bind events on MousePosition and ControlClick
	//_sself.container.bind('mousemove',mouseMove);
	//_sself.container.bind('mouseenter',mouseEnter);
	//_sself.container.bind('mouseleave',mouseLeave);
	$('li',_sself.controls).bind('click',controlsClick);
	//$(_sself.arrows).bind('mouseenter',arrowsHover);
	$(_sself.arrows).bind('click',arrowsClick);

	// Initialize last slide
	$('li',_sself.container).eq(0).before($('li',_sself.container).eq(_sself.length));
	$('li',_sself.container).eq(0).before($('li',_sself.container).eq(_sself.length));
	$('ul',_sself.container).css('margin-left','-900px');
	_sself.index -= 2;
	_sself.indexSlide += 2;

	// Display first infos
	$('li',_sself.container).eq(_sself.indexSlide).css('opacity','1');
	$('li',_sself.container).eq(_sself.indexSlide).find('.slider-info').fadeIn();
	
	if(_sself.autorotation){
		_sself.autoRotation();	
	}
}

/* ////////////////////////////////////////////////////////////////////////////
//
// Autorotation timer
//
/////////////////////////////////////////////////////////////////////////// */

// Arrows
function arrowsHover(){
	clearTimeout(_sself.t); 
	_sself.autorotation = false;
}

function arrowsClick(){
	if($(this).hasClass('bt_previous')){
		_sself.previous();
	} else {
		_sself.next();
	}
	
	return false;
}

// AutoRotation
function autoSRotation(){	
	clearTimeout(_sself.t);	
	if(_sself.autorotation){
		_sself.t = setTimeout("_sself.changeSlide(_sself.indexSlide,_sself.indexSlide + 1)",_sself.duration);
	}
}

// Exterior controls
function Sstop(){ 
	_sself.container.unbind('mouseleave',mouseLeave);
	
	clearTimeout(_sself.t); 
	_sself.autorotation = false; 
}

function Sstart(){ 
	_sself.container.bind('mouseleave',mouseLeave); 
	
	_sself.autorotation = true;
	_sself.autoRotation();
}

function Sreset(){	
	_sself.stop();
	
	_sself.width = _sself.container.width();
	$('ul',_sself.container).css('margin-left',(- _sself.indexSlide * _sself.width));
	
	_sself.start();
}

function Snext(){
	if(!_sself.animated){
		clearTimeout(_sself.t);
		_sself.changeSlide(_sself.indexSlide,_sself.indexSlide + 1);
	}
}

function Sprevious(){
	if(!_sself.animated){
		clearTimeout(_sself.t);
		_sself.changeSlide(_sself.indexSlide,_sself.indexSlide - 1);
	}
}

/* ////////////////////////////////////////////////////////////////////////////
//
// Change slide on Controller click
//
/////////////////////////////////////////////////////////////////////////// */

function controlsClick(){		
	if(!_sself.animated){
		// Stop timer
		clearTimeout(_sself.t);	
		_sself.autorotation = false;
		
		var clicked = $('.'+$(this).index(),_sself.container).index();
		_sself.changeSlide(_sself.indexSlide,clicked);	
	}
		
	return false;
}

/* ////////////////////////////////////////////////////////////////////////////
//
// Reposition slide on Mouse Enter, Mouse Leave and Mouse Move
//
/////////////////////////////////////////////////////////////////////////// */

function mouseEnter(e){
	if(_sself.autorotation){		
		// Stop autoRotation
		clearTimeout(_sself.t);	
		_sself.autorotation = false;
	}
}

function mouseLeave(e){	
	if(!_sself.animated){
		// Put image back in place
		var margin = - _sself.indexSlide * _sself.width;
		_sself.bounceSibling(margin);
	}
	
	_sself.bounced = false;
			
	// Restart autorotation
	_sself.autorotation = true;
	_sself.autoRotation();
}

function mouseMove(e){
	_sself.mLeft = - _sself.indexSlide * _sself.width;
	var offset = $(this).offset();
	var x = e.pageX - offset.left;
	var y = e.pageY - offset.top;
	
	// Authorize animation only if cursor back to middle section
	if(x > _sself.width/4 && x < (_sself.width - _sself.width/4)){
		_sself.animated = false;
	}
	
	// If : not currently changing slide
	// Else : currently changing slide or just did
	if(!_sself.animated){
		if(y > _sself.infoHeight && x < _sself.infoWidth){
			if(_sself.bounced){
				_sself.bounceSibling(_sself.mLeft);
			}
		} else {			
			if(x < _sself.width/4){
				// Bounce slide : previous
				if(!_sself.bounced){
					margin = _sself.mLeft + _sself.width/16;
					_sself.bounceSibling(margin);
				}
			} else if(x > (_sself.width - _sself.width/4)){
				// Bounce slide : next
				if(!_sself.bounced){
					margin = _sself.mLeft - _sself.width/16;
					_sself.bounceSibling(margin);
				}
			} else {
				if(_sself.bounced){
					_sself.bounceSibling(_sself.mLeft);
				}
			}
		}
	}
}

/* ////////////////////////////////////////////////////////////////////////////
//
// Show part of a sibling
//
/////////////////////////////////////////////////////////////////////////// */

function bounceSSibling(margin){			
	// Change bounced state
	if(_sself.bounced){
		_sself.bounced =  false;
	} else {
		_sself.bounced = true;
	}
	
	$('ul',_sself.container).stop(true, false).animate({marginLeft: margin},{'duration': 250, 'easing': 'easeInOutQuad'});
}

/* ////////////////////////////////////////////////////////////////////////////
//
// Change slide
//
/////////////////////////////////////////////////////////////////////////// */

function changeSSlide(current,clicked){			
	_sself.animated = true;
	
	// Unbind Mouse Move
	//_sself.container.unbind('mousemove',mouseMove);
	
	// Recalculate margin
	_sself.mLeft = Math.abs(_sself.width*clicked)*-1;
	var gap = Math.abs(current - clicked);
		
	// Redefine active slide
	$('li',_sself.controls).eq($('li',_sself.container).eq(current).attr('class')).removeClass('active');
	$('li',_sself.controls).eq($('li',_sself.container).eq(clicked).attr('class')).addClass('active');
			
	_sself.index = $('li',_sself.container).eq(clicked).index()
	_sself.indexSlide = $('li',_sself.container).eq(clicked).index();
		
	// Change slider infos
	$('li',_sself.container).eq(current).removeClass('active');
	$('li',_sself.container).eq(current).animate({opacity: 0.5}, 250);
	//$('li',_sself.container).eq(current).find('.slider-info').stop(true, true).fadeOut(250);
	//$('li',_sself.container).eq(clicked).find('.slider-info').stop(true, true).delay(_sself.speed - 250).fadeIn(250);
	
	// Animate slides
	$('ul',_sself.container).stop(true, false).animate({marginLeft:_sself.mLeft}, {'duration': _sself.speed, easing: 'easeInOutQuad', 'complete': function(){				
		_sself.animated = false;
		
		$('li',_sself.container).eq(clicked).addClass('active');
		$('li',_sself.container).eq(clicked).animate({opacity: 1}, 250);
		
		// If : clicked slide is the first, put last slide before for loop
		// Else If : clicked slide is the last, put first slide after for loop
		var tempLength = _sself.length;
		
		if(clicked <= 1){
			$('li',_sself.container).eq(0).before($('li',_sself.container).eq(_sself.length));
			$('ul',_sself.container).css('margin-left',-_sself.width*2+'px');
			_sself.index ++;
			_sself.indexSlide ++;
		} else if(clicked >= tempLength - 1){
			$('li',_sself.container).eq(_sself.length).after($('li',_sself.container).eq(0));
			$('ul',_sself.container).css('margin-left',-(_sself.indexSlide - 1)*_sself.width+'px');
			_sself.index --;
			_sself.indexSlide --;
		}
		
		// Rebind Mouse Move
		//_sself.container.bind('mousemove',mouseMove);
		
		if(_sself.autorotation){
			_sself.autoRotation();
		}
	}});
}
