YAHOO.namespace("kainee");

YAHOO.kainee.slideshow = function(oConfig){
	var YUE = YAHOO.util.Event;
	var	YUD = YAHOO.util.Dom;

	var ss 			    = YUD.get('slide-show');
	var ssContent  		= YUD.get('slide-show-content');
   	var ssItems 	  	= ssContent.getElementsByTagName('li');
	var ssCover 		= YUD.get('slide-show-cover');
	
	YUD.addClass(ss, 'enable')
	YUD.addClass(ssCover, 'active')
	
	//Default settings
	var ssDelay = 3000;
	oConfig.delay !== 'undefined' ||  oConfig.delay < 3000 ? ssDelay = parseInt(oConfig.delay) : ssDelay = 3000;

	//Build all HTML so you have access to DOM
	ssBuildControls();

	//set up global Navigation elements
	var ssCaption;
	var ssControls;
	var ssNavItems      = YUD.get('ssNavList').getElementsByTagName('a');
	var ssNavPlay       = YUD.get('ssNavPlay');
	var ssNavPause      = YUD.get('ssNavPause');
	
	//animation custom events
	var ssControlOption   = new YAHOO.util.CustomEvent("NavOptions");
	ssControlOption.subscribe(ssToggleControlOption);

	YUE.addListener(ssNavPlay, 'click', ssPlay);
	YUE.addListener(ssNavPause, 'click', ssPause);
   	YUE.on("ssNavList", "click", ssNavShowItem);

    function ssNavShowItem(e) {
    	YUE.preventDefault(e);
    	var eTarget = YUE.getTarget(e);	
    	while (eTarget.id != "ssNavList"){
    		if(eTarget.nodeName.toUpperCase() == "A"){
    			//pause
    			ssPause(e);
    			//deactivate nav
    			deactivateNav(oConfig._current);
    			//switch to slide
    			showIt(parseInt(eTarget.id.replace('ssNavShowItem', '')));
    			break;
    		}else{
    			eTarget = eTarget.parentNode;
    		};
    	};
    };
    
	function ssBuildControls(){

	  oConfig.width = YUD.getFirstChild(YUD.getFirstChild(ssContent)).offsetWidth;

	  ssControls = document.createElement('div');
	  ssControls.id = 'ssControl';
	  
	  var ssNavList = document.createElement('ul');
	  ssNavList.id = 'ssNavList';
	  for(var i=0, j=ssItems.length; i<j; i++){
	    var oLiNode = document.createElement('li');
	    var oAnchorNode = document.createElement('a');
	    oAnchorNode.id = 'ssNavShowItem' + i;
	    oAnchorNode.setAttribute('href', '#');
	    var oAnchorNodeText = document.createTextNode(i+1);
	    oAnchorNode.appendChild(oAnchorNodeText);

	    oLiNode.appendChild(oAnchorNode);
	    ssNavList.appendChild(oLiNode);
	  };
	  
	  ssControls.appendChild(ssNavList);
	  
	  ss.appendChild(ssControls);

	  var ssControlOptions = new Array('play','ssNavPlay', 'pause', 'ssNavPause');
	  var ssControlList = document.createElement('ul');
	  ssControlList.id = 'navControls';
	  
	  for(var i=0, j=ssControlOptions.length; i<j; i=i+2){
	    var oLiNode = document.createElement('li');
	    var oAnchorNode = document.createElement('a');
	    oAnchorNode.id = ssControlOptions[i+1];
	    oAnchorNode.setAttribute('href', '#');
	    var oAnchorNodeText = document.createTextNode(ssControlOptions[i]);
	    oAnchorNode.appendChild(oAnchorNodeText);
	    oLiNode.appendChild(oAnchorNode);
	    ssControlList.appendChild(oLiNode);
	  };

	  ssControls.appendChild(ssControlList);

	  //add caption area
	  ssCaption = document.createElement('div');
	  ssCaption.id = 'ssCaption';
	  //var oAnchorNode = document.createElement('a');
	  //oAnchorNode.setAttribute('href', '#');

	  //var oCaption = document.createTextNode('');
	  //oAnchorNode.appendChild(oCaption);
	  //ssCaption.appendChild(oAnchorNode);

	  ssContent.parentNode.appendChild(ssCaption);

	};
	
	function ssPause(e){
	  YUE.preventDefault(e);
	  clearInterval(oConfig._oTimer);

	  //toggle buttons
	  ssControlOption.fire({text : 'pause'});
	};

	function ssPlay(e){
	  YUE.preventDefault(e);

	  //play, then animate
	  autoPlay();
	 
	  //pressed is twice, clear current animation
	  clearInterval(oConfig._oTimer);
	  oConfig._oTimer = setInterval(function(){autoPlay()}, ssDelay);

	  //toggle buttons
	  ssControlOption.fire({text : 'play'});

	};
	
	function ssToggleControlOption(type, args){
	  //when you press play, the button should change to pause
	  //and vice versa
	  if(args[0].text === 'pause'){
 			  YUD.addClass(ssNavPlay, 'active');
				  YUD.removeClass(ssNavPause, 'active');
	  }else{
				  YUD.removeClass(ssNavPlay, 'active');
 			  YUD.addClass(ssNavPause, 'active');
	  };

	};

	function showIt(n){
		oConfig._current = n;
		showActiveNav();
		
		var oAttributes = { 
			left : { to : -(n * oConfig.width)}
		};

		var oAnim = new YAHOO.util.Motion(ssContent, oAttributes, 0.5, YAHOO.util.Easing.easeOut);
		oAnim.onStart.subscribe(hideCaption);
		oAnim.animate();

	};
	
	function showActiveNav(){
		YUD.addClass(ssNavItems[oConfig._current], 'active');
	};

	function deactivateNav(n){
		YUD.removeClass(ssNavItems[n], 'active');
	};
	
	function showCaption(){
		
		if (YUD.getElementsByClassName('caption', 'div', ssCaption)[0]) {
			ssCaption.removeChild(YUD.getFirstChild(ssCaption));
		}
		
		// for each ssItem, check if there is a caption to display
		if (YUD.getElementsByClassName('caption', 'div', ssItems[oConfig._current])[0]) {
			ssItems[oConfig._current]._captionContent = YUD.getElementsByClassName('caption', 'div', ssItems[oConfig._current])[0];
			ssItems[oConfig._current]._captionContent.parentNode.removeChild(ssItems[oConfig._current]._captionContent)
		}

		// check if its been cached
		if (ssItems[oConfig._current]._captionContent) {
			ssCaption.appendChild(ssItems[oConfig._current]._captionContent);
			var oAttributes = { 
				opacity : { to : 0.8}
			};
	
			var oAnim = new YAHOO.util.Anim(ssCaption, oAttributes, 0.5, YAHOO.util.Easing.easeIn);
			oAnim.animate();
		}

	};

	function hideCaption(){
		var oAttributes = { 
			opacity : { to : 0}
		};

		var oAnim = new YAHOO.util.Anim(ssCaption, oAttributes, 0.5, YAHOO.util.Easing.easeIn);
		oAnim.onComplete.subscribe(showCaption);
		oAnim.animate();
	};

	function autoPlay(){
		deactivateNav(oConfig._current);
		if(oConfig._current != (ssItems.length-1)){
			oConfig._current =  parseInt(oConfig._current + 1);

		}else{
			oConfig._current = 0;
		};
		showIt(oConfig._current);
	};


	//the returned object here will become YAHOO.kainee.slideshow
	return  {
		init : function(){
			ssControlOption.fire({text : 'play'});
			if(oConfig.autoPlay){
				showIt(oConfig._current);
			}else{
				oConfig._current = 0;
				showActiveNav();
			};
			showCaption();
			oConfig._oTimer = setInterval(function(){autoPlay()}, ssDelay);
		}
	};
};

YAHOO.util.Event.onAvailable('slide-show-content', function(){
	if(YAHOO.util.Dom.inDocument(YAHOO.util.Dom.get('slide-show'))){
		slideshow = function(){
			var oConfig = {
				delay 			: 5000,
				direction	: "horizontal",
				autoPlay		: true,
				_current		: 0
			};
			
			return {
				init : function(){
					var oSlideShow = new YAHOO.kainee.slideshow(oConfig);
					oSlideShow.init();
				}
			};
		}();
	
		slideshow.init();
	}
});
