YAHOO.namespace("kqed");
// TODO update to 0.6.2, get minified, http://billwscott.com/carousel/updates.html#download

YAHOO.kqed.HomepageCarousel = function() {
	// TODO optimize included libs and strings as var names

	return {
		targetDiv: "dhtml-carousel",
		imageBasePath: "/assets/img/home/",
		
		/**
		 * Custom inital load handler. Called when the carousel loads the initial
		 * set of data items. Specified to the carousel as the configuration
		 * parameter: loadInitHandler
		 **/
		loadInitialItems: function(type, args) {
		    var start = args[0];
		    var last = args[1]; 

		    YAHOO.kqed.HomepageCarousel.load(this, start, last);    
		},

		/**
		 * Custom load next handler. Called when the carousel loads the next
		 * set of data items. Specified to the carousel as the configuration
		 * parameter: loadNextHandler
		 **/
		loadNextItems: function(type, args) {    

		    var start = args[0];
		    var last = args[1]; 
		    var alreadyCached = args[2];
		    
		    if(!alreadyCached) {
		        YAHOO.kqed.HomepageCarousel.load(this, start, last);
		    }
		},

		/**
		 * Custom load previous handler. Called when the carousel loads the previous
		 * set of data items. Specified to the carousel as the configuration
		 * parameter: loadPrevHandler
		 **/
		loadPrevItems: function(type, args) {
		    var start = args[0];
		    var last = args[1]; 
		    var alreadyCached = args[2];
		    
		    if(!alreadyCached) {
		        YAHOO.kqed.HomepageCarousel.load(this, start, last);
		    }
		},
		load: function(carousel, start, last) {

		    for(var i=start; i<=last; i++) {
		        carousel.addItem(i, fmtItem(imageList[i-1], "#", "Number "+i));
		    }
		},

		/**
		 * Custom button state handler for enabling/disabling button state. 
		 * Called when the carousel has determined that the previous button
		 * state should be changed.
		 * Specified to the carousel as the configuration
		 * parameter: prevButtonStateHandler
		 **/
		handlePrevButtonState: function(type, args) {

		    var enabling = args[0];
		    var leftImage = args[1];
		    if(enabling) {
		        leftImage.src = YAHOO.kqed.HomepageCarousel.imageBasePath + "left-enabled.gif";        
		        leftImage.id = "repoint";
		    } else {
		        leftImage.src = YAHOO.kqed.HomepageCarousel.imageBasePath + "left-disabled.gif";    
		        leftImage.id = "unpoint";
		    }
		    
		},

		/**
		 * Custom button state handler for enabling/disabling button state. 
		 * Called when the carousel has determined that the next button
		 * state should be changed.
		 * Specified to the carousel as the configuration
		 * parameter: nextButtonStateHandler
		 **/
		handleNextButtonState: function(type, args) {

		    var enabling = args[0];
		    var rightImage = args[1];
		    if(enabling) {
		        rightImage.src = YAHOO.kqed.HomepageCarousel.imageBasePath + "right-enabled.gif";    
		        rightImage.id = "repoint";
		    } else {
		        rightImage.src = YAHOO.kqed.HomepageCarousel.imageBasePath + "right-disabled.gif";
		        rightImage.id = "unpoint";
		    }
		    
		},

		/**
		 * You must create the carousel after the page is loaded since it is
		 * dependent on an HTML element (in this case 'dhtml-carousel'.) See the
		 * HTML code below.
		 **/
		// var carousel; // for ease of debugging; globals generally not a good idea
		pageLoad: function(carouselSize) {
		    YAHOO.kqed.HomepageCarousel.carousel = new YAHOO.extension.Carousel(YAHOO.kqed.HomepageCarousel.targetDiv, 
		        {
		            numVisible:        4,
		            animationSpeed:    0.4,
		            animationMethod:   YAHOO.util.Easing.easeBoth,
		            scrollInc:         4,
		            navMargin:         15,
		            size:              carouselSize,
		            loadInitHandler:   YAHOO.kqed.HomepageCarousel.loadInitialItems,
		            prevElement:     "prev-arrow",
		            nextElement:     "next-arrow",
		            loadNextHandler:   YAHOO.kqed.HomepageCarousel.loadNextItems,
		            loadPrevHandler:   YAHOO.kqed.HomepageCarousel.loadPrevItems,
		            prevButtonStateHandler:   YAHOO.kqed.HomepageCarousel.handlePrevButtonState,
		            nextButtonStateHandler:   YAHOO.kqed.HomepageCarousel.handleNextButtonState
		        }
		    );

		  /**
		     * Set this to the number of milliseconds between elements
		     **/
		  YAHOO.kqed.HomepageCarousel.carousel.autoplay_time = 6000;

		  /**
		     * Set this to the number of milliseconds between elements
		     **/
		  YAHOO.kqed.HomepageCarousel.carousel.fade_rate = .3;


		    var carousel_cur_num  = 0; // start at the second item, 0 indexed
		    var carousel_next_interval;
		    var carousel_items = new Array();

		    YAHOO.kqed.HomepageCarousel.carousel.select_tab = function(tab) { //sets carousel_cur_num as side effect
		       var cur_spot = (tab.id.match(/-(\d+)$/))[1];
		       if( (cur_spot-1) == carousel_cur_num ) { return; }
		       
		       var last_num = carousel_cur_num;
		       carousel_cur_num = cur_spot-1;

		       YAHOO.util.Dom.removeClass(carousel_items, 'selected');
		       YAHOO.util.Dom.addClass(tab, 'selected');

		       var last_main = document.getElementById('tab' + (last_num+1));
		       var curr_main = document.getElementById('tab' + cur_spot);

		       fade_out = new YAHOO.util.Anim( last_main, { opacity: {to: 0} }, YAHOO.kqed.HomepageCarousel.carousel.fade_rate );
		       fade_in  = new YAHOO.util.Anim( curr_main, { opacity: {to: 1} }, YAHOO.kqed.HomepageCarousel.carousel.fade_rate );
		       YAHOO.util.Dom.removeClass(curr_main, 'not_viewable');
		       fade_out.animate();
		       fade_in.animate();
		       fade_out.onComplete.subscribe( function() {YAHOO.util.Dom.addClass(last_main, 'not_viewable');} );
		    }

		    YAHOO.kqed.HomepageCarousel.carousel.stop_autoplay = function (perm) {
		      if( perm == 1) { YAHOO.kqed.HomepageCarousel.carousel.autoplay_time = 0; }
		      if( ! carousel_next_interval ) { return; }
		      clearInterval(carousel_next_interval);
		    }
		    YAHOO.kqed.HomepageCarousel.carousel.start_autoplay = function () { 
		      if( YAHOO.kqed.HomepageCarousel.carousel.autoplay_time == 0 ) { return; }
		      carousel_next_interval = setInterval(YAHOO.kqed.HomepageCarousel.carousel.click_next, YAHOO.kqed.HomepageCarousel.carousel.autoplay_time);
		    }

		    var list_items = document.getElementById('mycarousel').getElementsByTagName('li');
		    for( var i=0; i<list_items.length; i++ ) {
		      if( list_items[i].className.match('box-item') ) {
		        carousel_items.push(list_items[i]);
		        ( function (cur_tab) {
		            cur_tab.onclick = function() { YAHOO.kqed.HomepageCarousel.carousel.stop_autoplay(1); YAHOO.kqed.HomepageCarousel.carousel.select_tab(cur_tab); return false; };
		          }
		        )( list_items[i] );
		      }
		    }

		    YAHOO.kqed.HomepageCarousel.carousel.click_next = function() {
				if( carousel_cur_num && (carousel_cur_num+1) % YAHOO.kqed.HomepageCarousel.carousel.cfg.getProperty('numVisible') == 0 ) { YAHOO.kqed.HomepageCarousel.carousel.scrollNext() }

				YAHOO.kqed.HomepageCarousel.carousel.select_tab(carousel_items[carousel_cur_num+1]);

				if( carousel_cur_num >= carousel_items.length-1 ) {
					clearInterval(carousel_next_interval);
					setTimeout( 
						function() { 
							YAHOO.kqed.HomepageCarousel.carousel.scrollTo(1); 
							YAHOO.kqed.HomepageCarousel.carousel.select_tab(carousel_items[0]);
						}, 
						YAHOO.kqed.HomepageCarousel.carousel.autoplay_time 
					);
				}
			}

		    var highlights_box = document.getElementById('highlights');
		    YAHOO.util.Event.addListener(highlights_box, 'mouseover', YAHOO.kqed.HomepageCarousel.carousel.stop_autoplay);
		    YAHOO.util.Event.addListener(highlights_box, 'mouseout', YAHOO.kqed.HomepageCarousel.carousel.start_autoplay);
		    YAHOO.kqed.HomepageCarousel.carousel.start_autoplay();
		},
		init: function(carouselSize) {
			YAHOO.kqed.HomepageCarousel.pageLoad(carouselSize);
		}
	};
}();

