/**
 * Artilinki Live(artlive) JS Class
 * 
 * This file contains all the method for the live uses.
 * This file use and require jquery plugin  
 * 
 * @author fl0r3nt
 */
(function ($) {
	var tabsContainer,	
	/**
	 * Defaults options
	 */
	liveDefaults = {
		transition: "easein",
		speed: 450,
		tabWidth: 419,		
		slideDelay: 5,		
		autoplay: true,
		autoloop: false,
		imgOpacity: 0.4,
		imgOverOpacity: 0.7,
		imgSelectOpacity: 1,
		imgOpacityStep: 0.02,
		decalageLabel: -2
	};
	
	/**
	 * selectTab : display selected tab and move it if necessary
	 */
	function selectTab(live, tabId) {
		freeze(live);
		var posx = tabId*liveDefaults.tabWidth;
		live.tabsContainer.animate({ 
			left: -posx
		}, liveDefaults.speed, 'linear', function () {
			unfreeze(live, tabId);
		});
		live.element.find('a.live_menuOn').removeClass('live_menuOn');
		$(live.tabs[tabId].link).addClass('live_menuOn');
	};
	
	/**
	 *  toggleSlideshow : starts/stops the slideshow
	 */
	function toggleSlideshow(live) {
		if (live.activeSlideshow == true) { //slideshow is on
			stopSlideshow(live);
		}
		else { //slideshow is off
			live.activeSlideshow = true;
			waitForSliding(live);
			live.slideshowButton.removeClass('paused').attr('title', artilinki.options.live.pause_state_label);
		}
	};
	
	/**
	 * stopSlideshow : Stop the slideshow
	 */
	function stopSlideshow(live) {
		if (live.activeSlideshow == true) { //slideshow is on
			live.activeSlideshow = false;
			clearInterval(live.slideInterval);
			live.slideshowButton.addClass('paused').attr('title', artilinki.options.live.play_state_label);
		}
	}
	
	/**
	 * waitForSliding : launch tempo between slide events
	 */
	function waitForSliding(live) {
		live.slideInterval = setInterval(function(){
			slideToNextTab(live);
		}, liveDefaults.slideDelay*1000);
	};
	
	/**
	 * slideToNextTab : launch the slide with the right next offset
	 */
	function slideToNextTab(live) {
		var nextId = live.selectedId + 1;
		if (nextId > live.tabs.length-1) {
			selectTab(live, 0);
			live.selectedId = 0;
			if (liveDefaults.autoloop == false) toggleSlideshow(live);	// Autoloop
		}
		else {
			selectTab(live, nextId);
			live.selectedId = nextId;
		}
	};
	
	/**
	 * freeze : freeze all events and effects for the transitions
	 */
	function freeze(v_live) { ArtLive.unsetNavigation(v_live);	};
	
	/**
	 * freeze : freeze all events and effects for the transitions
	 */
	function unfreeze(v_live, tabId) {
		v_live.selectedId = tabId;
		ArtLive.setupNavigation(v_live);
	};
	
	/**
	 * Live : main object for the application 
	 */ 
	ArtLive = $.fn.artlive = function (options, callback) {		
		// liveDefaults values & elements
		var $this = this;
		$this.id = options.id;
		$this.element = $(options.elt);
		$this.tabsContainer = $this.element.find('div.live_tabsContainer');
		$this.loading = $this.element.find('div.liveLoading');
		$this.selectedId = 0;
		$this.tabs = [];
		$this.activeSlideshow = false;
		$this.slideInterval = null;
		
		// Setting up tabs & tabs menu
		$this.element.find('ul.live_menu > li > a').each(function (i, elt) {
			var aElt = $(elt);
			var spanHeight = aElt.find('span').height();
			var pad = Math.round((aElt.outerHeight() - spanHeight)/2);
			pad = pad < 0 ? 0 : pad;
			aElt.css('padding-top',pad+'px').css('height',aElt.parent('li').height()-pad+'px');
			$this.tabs[i] = aElt.liveTab({live: $this, id: i, link: elt});
			aElt.click(function(event) {
				event.preventDefault();
				stopSlideshow($this);
				selectTab($this, i);
			});
		});
		
		//Setting up slideshow button
		$this.slideshowButton = $this.element.find('a.live_infosBtn');
		$this.slideshowButton.click(function (event){
			toggleSlideshow($this);
		});
		
		// Launch slideshow if autoplay is true
		if (liveDefaults.autoplay == true) toggleSlideshow($this);
		ArtLive.launch($this);
		return this;
	};
	
	/**
	 * live.launch : display the first tab of the live when loaded
	 * prevents all images and texts appears before page is loaded
	 */
	ArtLive.launch = function(live){
		var elt = $(live.tabs[0].element);
		elt.css('opacity',0).css('display','block').animate({ 
			opacity: 1
		}, liveDefaults.speed, 'linear', function() {
			for (var i=0; i < live.tabs.length; i++) {live.tabs[i].element.css('display','block');}
      live.loading.hide();
		});
		live.loading.animate({ 
			opacity: 0
		}, liveDefaults.speed, 'linear');
	};
	
	/**
	 * live.setupNavigation : setting up buttons for tab menu / launching parent method
	 */
	ArtLive.setupNavigation = function(v_live) {
		liveTab.setupNavigation(v_live.tabs[v_live.selectedId]);
	};
	
	/**
	 * live.setupNavigation : unset up buttons for tab menu / launching parent method
	 */
	ArtLive.unsetNavigation = function(v_live) {
		liveTab.unsetNavigation(v_live.tabs[v_live.selectedId]);
	};
	
	/**
	 * LiveTab : Tab object dependent to a live object
	 */
	liveTab = $.fn.liveTab = function (options, callback) {		
		// liveDefaults values & elements
		var $this = this;
		$this.id = options.id;
		$this.live = options.live;
		$this.link = options.link;
		$this.element = $this.live.element.find('div.tab_'+$this.id+'');
		$this.selectedId = 0;
		$this.objects = [];
		$this.infos = [];
		
		// Set tab position
		$this.element.css('left', $this.id*liveDefaults.tabWidth+'px');
		
		//Setting up list of objects' images
		$this.element.find('div.live_imgContainer li:not(.empty) a').each(function (i, elt) {
			$this.infos[i] = $($this.element.find('div.live_infos_slot').get(i));
			$this.objects[i] = $(elt).liveObject({id: i, elt: elt, tab: $this, live: $this.live});
		});
		if ($this.live.selectedId == $this.id) {
			liveTab.setupNavigation($this);
		}
		return this;
	};
	
	/**
	 * liveTab.setupNavigation : setting up buttons for image menu / launching liveObject's method
	 */
	liveTab.setupNavigation = function(tab) {
		for(var i=0; i < tab.objects.length; i++) {
			liveObject.setupNavigation(tab.objects[i]);
		}
	};
	
	/**
	 * liveTab.unsetNavigation : setting up buttons for image menu / launching liveObject's method
	 */
	liveTab.unsetNavigation = function(tab) {
		for(var i=0; i < tab.objects.length; i++) {
			liveObject.unsetNavigation(tab.objects[i]);
		}
	};
	
	
	/**
	 * LiveObject : main live object depends on a liveTab
	 */ 
	liveObject = $.fn.liveObject = function (options, callback) {		
		// liveDefaults values & elements
		var $this = this;
		$this.id = options.id;
		$this.element = $(options.elt);
		$this.tab = options.tab;
		$this.live = options.live;
		$this.infoDiv = $(options.tab.infos[$this.id]);
		$this.selectedId = 0;
		
		// Set object default attributes
		if ($this.tab.selectedId != $this.id) {
			$this.infoDiv.css('display', 'none');
			$this.element.css('opacity',liveDefaults.imgOpacity);
		}
		else {
			$this.element.animate({ 
				queue: false,
				opacity: liveDefaults.imgSelectOpacity
			}, liveDefaults.speed, 'linear');
		}
		return this;
	};
	
	/**
	 * liveObject.setupNavigation : set up mouseover, mouseout and click actions on the image link
	 */
	liveObject.setupNavigation = function(object) {
		object.element.bind('click', function(e){
			if (object.id != object.tab.selectedId) {
				e.preventDefault();
				liveObject.select(object);
			}
		})
		.bind('mouseover', function(e){
			if (object.id != object.tab.selectedId) {
				object.element.stop().animate({ 
					queue: false,
					opacity: liveDefaults.imgOverOpacity
				}, liveDefaults.speed, 'linear');
			}
		})
		.bind('mouseout', function(e){
			if (object.id != object.tab.selectedId) {
				object.element.stop().animate({ 
					queue: false,
					opacity: liveDefaults.imgOpacity
				}, liveDefaults.speed, 'linear');
			}
		});
	};
	
	/**
	 * liveObject.unsetNavigation : unset mouseover, mouseout and click actions on the image link
	 */
	liveObject.unsetNavigation = function(object) {
		object.element.unbind('mouseover').unbind('mouseout');
	};
	
	/**
	 * liveObject.select : set clicked object to selected state
	 */
	liveObject.select = function(object) {
		stopSlideshow(object.live);
		liveObject.unselect(object.tab.objects[object.tab.selectedId]);
		object.tab.selectedId = object.id;
		object.element.stop().animate({ 
			queue: false,
			opacity: liveDefaults.imgSelectOpacity
		}, liveDefaults.speed, 'linear');		
		object.tab.infos[object.id].css('display','block');
		if (!object.element.hasClass('artibox')) artibox.liveClickId = null; //Artibox bug prevent		
	};
	
	/**
	 *  liveObject.unselect : unset selected state on previous selected object
	 */
	liveObject.unselect = function(object) {
		object.element.stop().animate({ 
			queue: false,
			opacity: liveDefaults.imgOpacity
		}, liveDefaults.speed, 'linear');		
		object.tab.infos[object.id].css('display','none'); //Hide infos
	};
}(jQuery));
