var SL_Slider = new Class({

	//implements
	Implements: [Options],
	
	//variables setup
	numNav: new Array(),		    //will store number nav elements (if used)
	timer: null,					//periodical function variable holder
	isSliding: 0,					//flag for animation/click prevention
	direction: 1,					//flag for direction (forward/reverse)
	
	//options
	options: {
		slideTimer: 8000,  			    //Time between slides (1 second = 1000), a.k.a. the interval duration
		orientation: 'horizontal',      //vertical, horizontal, or none: None will create a fading in/out transition.
		fade: false,                    //if true will fade the outgoing slide - only used if orientation is != None
		isPaused: true,					//flag for paused state
		transitionTime: 1100, 		    //Transition time (1 second = 1000)
		transitionType: 'cubic:out',	//Transition type
		container: null,				//container element
		globalContainer: null,			//Global Container ( Links + Slides )
		links: null,					// Link liste
		linksDisposition: null,			//'horizontal' or 'vertical' : links position
		withArrows: null,				//Activate Arrows or not
		arrows: null,					//Array of arrows
		items:  null, 					//Array of elements for sliding
		itemNum: 0,						//Current item number
		numNavActive: false,			//Whether or not the number navigation will be used
		numNavHolder: null,			    //Element that holds the number navigation
		numNavName: 'num',
		playBtn: null,					//Play (and pause) button element
		prevBtn: null,					//Previous button element
		nextBtn: null,					//Next button element
		resize: null,
		menuLink: false					//Lié à un menu (true/false)
	},

	//initialization
	initialize: function(options) {
		var self = this;
		
		//set options
		this.setOptions(options);
		
		//remove any scrollbar(s) on the container
		self.options.container.setStyle('overflow', 'hidden');
		
		//if there is a play/pause button, set up functionality for it
		if(self.options.playBtn != null) {
			//self.pauseIt();
			//self.options.playBtn.set('text', 'pause');
			self.options.playBtn.addClass('pause').removeClass('play');
			
			self.options.playBtn.addEvents({
				'click': function() {
					self.pauseIt();
				},
				'mouseenter' : function() {
					this.setStyle('cursor', 'pointer');
				},
				'mouseleave' : function() {
					
				}
			});
		}
		
		//if there is a prev & next button, set up functionality for them
		if(self.options.prevBtn && self.options.nextBtn){
			
			self.options.prevBtn.addEvents({
				'click' : function() {
					if(self.isSliding == 0){
						if(self.options.isPaused == false){
							$clear(self.timer);
							self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
						}
						self.direction = 0;
						self.slideIt();
					}
				},
				'mouseenter' : function() {
					this.setStyle('cursor', 'pointer');
				},
				'mouseleave' : function() {
				
				}
			});
			
			this.options.nextBtn.addEvents({
				'click' : function() {
					if(self.isSliding == 0){
						if(self.options.isPaused == false){
							$clear(self.timer);
							self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
						}
						self.direction = 1;
						self.slideIt();
					}
				},
				'mouseenter' : function() {
					this.setStyle('cursor', 'pointer');
				},
				'mouseleave' : function() {
					
				}
			});
		}
		
		//setup items (a.k.a. slides) from list
		self.options.items.each(function(el, i){
			  
			//f.y.i.  el = the element, i = the index
			el.setStyle('position', 'absolute');
			var itemH = el.getSize().y;
			var itemW = el.getSize().x;
			if(self.options.orientation == 'vertical'){
                el.setStyle('top', (-1 * itemH));
                el.setStyle('left', 0);
            }else if(self.options.orientation == 'none') {
                el.setStyle('left', 0);
                el.setStyle('top', 0);
                el.setStyle('visibility', 'hidden');
                el.setStyle('opacity', 0);
			}else{
                el.setStyle('left', (-1 * itemW));
            }
			// -- Number nav setup
			if(self.options.numNavActive == true){
				//create numbered navigation boxes, and insert into the 'num_nav' ul)
				var numItem = new Element('li', {id: 'num'+i, 'class': 'navLinkContainer inlineblock'});
				var numLink = new Element('a', {
					'class': 'numbtn',
					'html': (i+1)
				});
				numItem.adopt(numLink);
				self.options.numNavHolder.adopt(numItem);
				self.numNav.push(numLink);
				numLink.set('morph', {duration: 100, transition: Fx.Transitions.linear, link: 'ignore'});
				
				numLink.addEvents({
					'click' : function(){
						self.numPress(i);
					},
					'mouseenter' : function() {
						this.setStyle('cursor', 'pointer');
					}
				});
				
				//set initial number to active state
				if(i == self.options.itemNum){
					var initNum = self.numNav[i];
					initNum.addClass('active');
					if(self.options.withArrow == true)
					{
						$$('#arr'+i).addClass('active');
					}
				}
			}
			//end if num nav 'active'
		});
		/* Ajuste les boutons de lien en fonction de leur disposition */
		switch(self.options.linksDisposition)
		{
			case 'horizontal' :	self.adjustLinksWidth(self.options.links);
				break;
		
			case 'vertical' : self.adjustLinksHeight(self.options.links);
				break;
			
			default :;
		}

	},

	//startup method
	start: function() {
		
		var self = this;
		
		self.slideIt(self.options.itemNum);  //initialize first slide
		
		if(self.options.isPaused == false){
			self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
			//if(self.options.playBtn) self.options.playBtn.set('text', 'pause');
			if(self.options.playBtn) self.options.playBtn.addClass('pause').removeClass('play');
		}
		else{
			//self.pauseIt();
			//if(self.options.playBtn) self.options.playBtn.set('text', 'play');
			if(self.options.playBtn) self.options.playBtn.addClass('play').removeClass('pause');
		}
		//Si on a un menu externe lié
		if(self.options.menuLink == true) {
			var curItem = self.options.items[self.options.itemNum];
			var id=curItem.id;
			self.select_left_menu_item(id);
		}
	},
	
	
	slideIt: function(passedID) {
		
		var self = this;
		
		//get item to slide out
		var curItem = self.options.items[self.options.itemNum];
		if(self.options.numNavActive == true){
			var curNumItem =  self.numNav[self.options.itemNum];
			if(self.options.withArrow == true)
			{
				var curNavItem = $$('#arr'+self.options.itemNum);
			}
			
		}
		
		
		//check for passedID presence
		if(passedID != null) {
			if(self.options.itemNum != passedID){
				if(self.options.itemNum > passedID) {
					self.direction = 0;
				} else {
					self.direction = 1;
				}
				self.options.itemNum = passedID;
			}
		}
		else{
			self.changeIndex();
		}
		
		
		//now get item to slide in using new index
		var newItem = self.options.items[self.options.itemNum];
		
		if(self.options.menuLink == true) {
			var id=newItem.id;
			self.select_left_menu_item(id);
		}
		
		if(self.direction == 0){
			var curX = self.options.container.getSize().x;
			var newX = (-1 * newItem.getSize().x);
            var curY = self.options.container.getSize().y;
            var newY = (-1 * newItem.getSize().y);
		}
		else{
			var curX = (-1 * self.options.container.getSize().x);
			var newX = newItem.getSize().x;
            var curY = (-1 * self.options.container.getSize().y);
            var newY = newItem.getSize().y;
		}
		
		
		//add/remove active number's highlight
		if(self.options.numNavActive == true){
			var newNumItem =  self.numNav[self.options.itemNum];
			newNumItem.addClass('active');
			if(self.options.withArrow == true)
			{
				$$('#arr'+self.options.itemNum).addClass('active');
			}
		}
		
		//set up our animation stylings
		var item_in = new Fx.Morph(newItem, {
		     duration: self.options.transitionTime,
		     transition: self.options.transitionType,
		     link: 'ignore',
		     
		     onStart: function(){
				self.isSliding = 1;  //prevents extra clicks
			},
		     
		     onComplete: function(){
				self.isSliding = 0;  //prevents extra clicks
			}
		});
		
		
        if(self.options.orientation == 'vertical'){
            if(self.options.fade == true){item_in.start({'opacity':[0,1], 'visibility':'visible','top' : [newY, 0]});}
            else{item_in.start({'top' : [newY, 0]});}
        }else if(self.options.orientation == 'none') {
            item_in.start({'opacity':[0,1], 'visibility':'visible'});
        }else{
            if(self.options.fade == true){item_in.start({'opacity':[0,1], 'visibility':'visible','left' : [newX, 0]});}
            else{item_in.start({'left' : [newX, 0]});}
        }
        
		
		if(curItem != newItem){
			var item_out = new Fx.Morph(curItem, {
				duration: self.options.transitionTime,
				transition: self.options.transitionType,
				link: 'ignore'
			});
			
			if(self.options.numNavActive == true){
				curNumItem.removeClass('active');
				if(self.options.withArrow == true)
				{
					curNavItem.removeClass('active');
				}
			}
			
            if(self.options.orientation == 'vertical'){
                if(self.options.fade == true){item_out.start({'opacity':[0], 'visibility':'hidden','top' : [(curY)]});}
                else{item_out.start({'top' : [(curY)]});}
            }else if(self.options.orientation == 'none') {
                item_out.start({'opacity':[1,0], 'visibility':'hidden'});
            }else{
                if(self.options.fade == true){item_out.start({'opacity':[0], 'visibility':'hidden','left' : [(curX)]});}
                else{item_out.start({'left' : [(curX)]});}
            }
		}
		
		if(self.options.resize == true)
		{
			var height = newItem.getHeight();
			self.options.container.setStyle('height', height);
		}
		
	},
	
	//--------------------------------------------------------------------------------------------------------
	//supplementary functions  (mini-functions)
	//--------------------------------------------------------------------------------------------------------
	pauseIt: function () {
		
		var self = this;
		
		//only move if not currently moving
		if(self.isSliding == 0){
			if(self.options.isPaused == false){
				self.options.isPaused = true;
				$clear(self.timer);
				//self.options.playBtn.set('text', 'play');
				self.options.playBtn.addClass('play').removeClass('pause');
			}
			else{
				self.options.isPaused = false;
				self.slideIt();
				self.timer = self.slideIt.periodical(self.options.slideTimer, this, null);
				//self.options.playBtn.set('text', 'pause');
				self.options.playBtn.addClass('pause').removeClass('play');
			}
			
		} //end if not sliding
		
	},
	
	changeIndex: function() {
		var self = this;
		
		var numItems = self.options.items.length;  //get number of slider items
		
		//change index based on value of 'direction' parameter
		if(self.direction == 1){
			if(self.options.itemNum < (numItems - 1)){
				self.options.itemNum++;
			}
			else{
				self.options.itemNum = 0;
			}
		}
		else if(self.direction == 0){
			if(self.options.itemNum > 0){
				self.options.itemNum--;
			}
			else{
				self.options.itemNum = (numItems - 1);
			}
		}
		
	},
	
	numPress: function (theIndex) {
		var self = this;
		
		if((self.isSliding == 0) && (self.options.itemNum != theIndex)){
			if(self.options.isPaused == false){
				$clear(self.timer);
				self.timer = self.slideIt.periodical(self.options.slideTimer, this, null);
			}
			self.slideIt(theIndex);
		}
	},
	
	adjustLinksHeight: function(el)
	{
		var self = this;
		var itemNumber = el.length; //Nombre d'items
		var globalWrapperHeight = self.options.globalContainer.getHeight(); //Taille container
		var itemHeight = ((globalWrapperHeight-2) - (itemNumber)) / itemNumber; //On retire les border des différents éléments concernés
		el.setStyle('height', itemHeight);
		el.each(function(item){
			var text_length = item.getElement('a .link_title').get('text').length;
			if(text_length > 20)
			{
				item.getElement('a .link_title').setStyles({
					'line-height' : itemHeight/3,
					'padding-top' : itemHeight/6
				});
			}
			else
			{
				item.getElement('a').setStyle('line-height', itemHeight);
			}
		});
	},
	
	adjustLinksWidth: function(el)
	{
		var self = this;
		var itemNumber = el.length;
		var globalWrapperWidth = self.options.numNavHolder.getWidth() ;
		var wid = (( globalWrapperWidth - itemNumber) / itemNumber) ;
		
		el.each(function(item){
			item.setStyle('width', wid);
		});
		
		switch(itemNumber)
		{
			case 2:
			
			case 3: wid=wid-1;
			break;
			
			case 4: wid=wid-3;
			break;
		}

		el.getLast().setStyle('width', wid);
		
		if(self.options.withArrow == true)
		{
			self.options.arrows.setStyle('width',wid);
		}
	},
	
	select_left_menu_item: function(item_id)
	{
		$$('.left_menu_item').removeClass('current');
		$(item_id).addClass('current');
	}
	
	//------------------------  end supp. functions -----------------------------------------//

});
