
/**********************************************************************************/
/*		Dagblad Intranet                                                          */	
/*		Editorial slideshow	  							                          */
/*		Requires: yahoo-dom.event.js,animation-min.js			                  */
/*		Wisdom 2008                                                               */
/**********************************************************************************/


YAHOO.dagblad.slideshow = (function() {

	var Dom = YAHOO.util.Dom,
		Event = YAHOO.util.Event
	
	/******************************************************************************/
	/*  SLIDESHOW CONFIGURATION SETTINGS                                          */
	/******************************************************************************/


	var settings = {

		defaultSlideshowId		: "recentPublishedSlideshow",
		slideShowClass			: "genericSlideshow",
		slideClass				: "slide",
		slideshowControlsClass	: "slideshowControls",
		slideshowCaptionClass	: "slideshowCaption",
		activeSlideClass		: "active",
		activeTimer				: false,
		enableLinkHighlighting	: true,
		linkHighlightClass		: "active",
		refLinkListId			: "editorialNewslist",		
		speed					: 2500
	};
	

	/******************************************************************************/
	/*  PUBLIC INIT FUNCTION                                                      */
	/******************************************************************************/


	var init = function(id, autostart) {
		
		if(!Dom.get(id) && !Dom.get(settings.defaultSlideshowId)) {
			
			// init inpage slideshows
			var slideShows = Dom.getElementsByClassName(settings.slideShowClass);
			for(var i=0; i<slideShows.length; i++) {
				init(slideShows[i].id);	
			}
			return;
		}

		if(settings.activeTimer) {
			stop();
		}

		if(Dom.get(id)) {
			var slideshowId = id;
			Dom.setStyle(Dom.getElementsByClassName(settings.slideShowClass, "div"), "display", "none");
			Dom.setStyle(id, "display", "block");
		} else {
			var slideshowId = settings.defaultSlideshowId;
		}
					
		var activeSlides = Dom.getElementsByClassName(settings.slideClass, "div", slideshowId);
		
		// setup slides
		for(var i=0; i<activeSlides.length; i++ ) {
			setupSlide(activeSlides[i]);
		}
	

		// start slideshow if applicable
		if(activeSlides.length > 1 && autostart) {			

			settings.activeTimer = window.setTimeout(function(){start(slideshowId);}, settings.speed);
		}
		
		// set slideshow controls if applicable
		var slideshowControls = Dom.getElementsByClassName(settings.slideshowControlsClass, "ul")[0];
		if(slideshowControls) {
			var controlNodes = slideshowControls.getElementsByTagName("a");
			Event.addListener(controlNodes, "click", function() {jumpTo(slideshowId,this)});
			Event.addListener(controlNodes, "click", function(e){Event.preventDefault(e)});
		}

		// set caption if applicable
		var captionObj = Dom.getElementsByClassName(settings.slideshowCaptionClass,null,slideshowId)[0];	
		if(captionObj) {
			captionObj.innerHTML = activeSlides[0].title;
		}
	};
	
	/******************************************************************************/
	/*  PRIVATE SET FUNCTION                                                      */
	/******************************************************************************/


	var setupSlide = function(slideObj) {
		if(Dom.hasClass(slideObj, settings.activeSlideClass)) {
			Dom.setStyle(slideObj, "opacity", "0.999");
			Dom.setStyle(slideObj, "filter", "filter: alpha(opacity=100)");
			Dom.setStyle(slideObj, "display", "block");
		} else {
			Dom.setStyle(slideObj, "opacity", "0");
			Dom.setStyle(slideObj, "filter", "filter: alpha(opacity=0)");
		}
	};

	/******************************************************************************/
	/*  PRIVATE START FUNCTION                                                    */
	/******************************************************************************/


	var start = function(rootId) {

		var currentSlide = getCurrentSlide(rootId);
		var nextSlide	 = getNextSlide(rootId);
		
		animate(currentSlide,nextSlide, rootId, true);
	};
	

	/******************************************************************************/
	/*  PRIVATE STOP FUNCTION                                                     */
	/******************************************************************************/


	var stop = function() {
		window.clearTimeout(settings.activeTimer);
	};
	

	/******************************************************************************/
	/*  PRIVATE GET CURRENT SLIDE FUNCTION                                        */
	/******************************************************************************/


	var getCurrentSlide = function(rootId) {

		return Dom.getElementsByClassName(settings.activeSlideClass, "div", rootId)[0];
	};
	

	/******************************************************************************/
	/*  PRIVATE GET NEXT SLIDE FUNCTION                                           */
	/******************************************************************************/


	var getNextSlide = function(rootId) {

		var rv = null;
	
		if(Dom.getNextSibling(getCurrentSlide(rootId))) {
			// return next slide
			rv = Dom.getNextSibling(getCurrentSlide(rootId));
		}
		else {
			// reached end of slides , return first slide
			rv = Dom.getElementsByClassName(settings.slideClass, "div", rootId)[0];
		}
		return rv;
	};
	
		
	var jumpTo = function(rootId,controlNode) {
		
		if(settings.activeTimer) {
			stop();
		}
		
		var currentSlide = getCurrentSlide(rootId);
		var targetSlide = Dom.get(controlNode.rev);
		
		if(currentSlide != targetSlide) {
			animate(currentSlide,targetSlide, rootId, false);
			Dom.removeClass(currentSlide, settings.activeSlideClass);
			Dom.addClass(targetSlide, settings.activeSlideClass);
	
			var controlNodes = Dom.getElementsByClassName(settings.slideshowControlsClass, "ul")[0].getElementsByTagName("li");
			Dom.removeClass(controlNodes, "active");
			Dom.addClass(controlNode.parentNode, "active");
	
			// set caption
			var captionObj = Dom.getElementsByClassName(settings.slideshowCaptionClass,null,rootId)[0];	
			if(captionObj) {
				captionObj.innerHTML = targetSlide.title;
			}
		}
	};
	
	/******************************************************************************/
	/*  PRIVATE ANIMATE SLIDE FUNCTION                                            */
	/******************************************************************************/


	var animate = function(slide, nextSlide, rootId, loop) {
		
	
		// fadeout current slide
		var fadeOutAnim = new YAHOO.util.Anim(slide, { opacity: { to: 0 }},50);
		fadeOutAnim.useSeconds = false;
		
		var fadeOutEnd = function() {
			Dom.setStyle(slide, "display", "none");
		}
		
		fadeOutAnim.onComplete.subscribe(fadeOutEnd);
		fadeOutAnim.animate();
		
		// fade in next slide
		Dom.setStyle(nextSlide, "display", "block");
		var fadeInAnim = new YAHOO.util.Anim(nextSlide, { opacity: { to: .999 }},50);
		fadeInAnim.useSeconds = false;
		
		var fadeInEnd = function() {

			if(settings.enableLinkHighlighting) {
				highLightLink(nextSlide.id);
			}

			Dom.removeClass(slide, settings.activeSlideClass);
			Dom.addClass(nextSlide, settings.activeSlideClass);
			
			settings.activeTimer = window.setTimeout(function(){start(rootId);}, settings.speed);

		}

		if(loop) {
			fadeInAnim.onComplete.subscribe(fadeInEnd);
		}
		fadeInAnim.animate();

	};
	

	/******************************************************************************/
	/*  PRIVATE HIGHLIGHT RELATED LINK FUNCTION                                   */
	/******************************************************************************/


	var highLightLink = function(id) {

		var allLinks = Dom.get(settings.refLinkListId).getElementsByTagName("a");
		Dom.removeClass(allLinks,settings.linkHighlightClass);
		var activeLink = Dom.getElementsBy(function(e){return e.rev == id},"a", settings.refLinkListId);
		if(activeLink) {
			Dom.addClass(activeLink, settings.linkHighlightClass);
		}
	};
	

	/******************************************************************************/
	/*  RETURN OBJECT WITH ALL PUBLIC FUNCTIONS									  */
	/******************************************************************************/

	return {
		init:init
	};

})();

Event.onDOMReady(function(){YAHOO.dagblad.slideshow.init(null,true);}, YAHOO.dagblad.slideshow, true);