YAHOO.namespace("kainee");

YAHOO.kainee.productSlider = function(oElement, oConfig){
	var YUE = YAHOO.util.Event;
	var	YUD = YAHOO.util.Dom;
	
	var productDetailsWrapper = YUD.get('product-details');

	var carousel = oElement;
	YUD.addClass(carousel, "carousel");
	
	var carouselCover 		= carousel.getElementsByTagName("div")[0];
	YUD.addClass(carouselCover, "carousel-cover");
	YUD.addClass(carouselCover, "active");
	
	var carouselContent  	= carousel.getElementsByTagName("ul")[0];
	var carouselItems 		= carouselContent.getElementsByTagName("li");
	
	var btnNext;
	var btnPrevious;
	
	var controlOption   = new YAHOO.util.CustomEvent("NavOptions");
	controlOption.subscribe(toggleControlOption);

	var requestProduct   = new YAHOO.util.CustomEvent("requestProduct");
	requestProduct.subscribe(getProductDetails);
	
	function loadIt() {
		if(carouselItems.length > 1) {
			buildControls();
			oConfig.width = YUD.getFirstChild(carouselContent).offsetWidth;
			if (oConfig._current == 0) {
				YUD.addClass(btnPrevious, "inactive");
			}
		}
		YUE.on(carouselContent, 'click', handleProductClick);
	}

	function buildControls() {
		var carouselControlOptions = new Array('next','btnNext', 'previous', 'btnPrevious');
		
		for(var i=0, j=carouselControlOptions.length; i<j; i=i+2) {
			var oButton = document.createElement("button");
			oButton.id = carouselControlOptions[i+1];
			var oButtonText = document.createTextNode(carouselControlOptions[i]);
			oButton.appendChild(oButtonText);
			carouselContent.parentNode.parentNode.appendChild(oButton);
		}

		btnNext = YUD.get("btnNext");
		btnPrevious = YUD.get("btnPrevious");

		YUE.addListener(btnNext, "click", nextItem);
		YUE.addListener(btnPrevious, "click", prevItem);
	}

	function toggleControlOption(type, args){
	  switch(args[0].text){
	  	case "next" :
			oConfig._current < carouselItems.length -1 ? showIt(oConfig._current + 1) : showIt(0);
		break;
	  	case "prev" :
			oConfig._current == 0 ? showIt(carouselItems.length - 1) : showIt(oConfig._current - 1);
		break;
	  }
	}
	
	function nextItem(e){
		YUE.preventDefault(e);
		if (oConfig._current != carouselItems.length -1) {
		  controlOption.fire({text : 'next'});
		}
	}

	function prevItem(e){
	  YUE.preventDefault(e);
		if (oConfig._current != 0) {
		  controlOption.fire({text : 'prev'});
		}
	}

	function showIt(n){
		oConfig._current = n;
		
		if (oConfig._current == 0) {
			YUD.addClass(btnPrevious, "inactive");
		} else {
			YUD.removeClass(btnPrevious, "inactive");
		}

		if (oConfig._current == carouselItems.length -1) {
			YUD.addClass(btnNext, "inactive");
		} else {
			YUD.removeClass(btnNext, "inactive");
		}

		var oAttributes = { 
			left : { to : -(n * oConfig.width)}
		};
		
		var oAnim = new YAHOO.util.Motion(carouselContent, oAttributes, 0.5, YAHOO.util.Easing.easeOut);
		oAnim.animate();

	}

	function handleProductClick(e) {
    	YUE.preventDefault(e);
    	var eTarget = YUE.getTarget(e);
		while (!YUD.hasClass(eTarget, "carousel-cover") && eTarget.nodeName.toUpperCase() != "LI"){
			if(eTarget.nodeName.toUpperCase() == "A"){
    			requestProduct.fire(eTarget);
				break;
    		}else{
    			eTarget = eTarget.parentNode;
    		}
    	}
	}
	
	function getProductDetails(type, args) {
		// make ajax call
		var sURL = args[0].href;
		var callback = {
		  success:handleSuccess,
		  failure:handleFailure
		};

		YUD.setStyle(productDetailsWrapper, 'opacity', '0.2');
		YUD.addClass(productDetailsWrapper, 'waiting');

		YAHOO.util.Connect.initHeader('X-Requested-For', 'InterniProduct');
		YAHOO.util.Connect.asyncRequest('GET', sURL, callback);
	}


	function handleSuccess(o) {
		if(o.responseText !== undefined){
			var productDetailsRequest = eval("(" + o.responseText + ")");
			if (productDetailsRequest.success == 'correct')
			{
				productDetailsWrapper.innerHTML = productDetailsRequest.content;
				YUD.setStyle(productDetailsWrapper, 'opacity', '0.95');
				YUD.removeClass(productDetailsWrapper, 'waiting');
			}
		}
	}

	function handleFailure(o) {
		if(o.responseText !== undefined){
			YUD.setStyle(productDetailsWrapper, 'opacity', '0.95');
			YUD.removeClass(productDetailsWrapper, 'waiting');
			return false;
		}
	}
	
	
	return  {
		init : function(){
			loadIt();
		}
	};
};

YAHOO.util.Event.onAvailable("product-carousel", function(){
	productCarousel = function(){
		var oConfig = {
			delay 			: 5000,
			direction	: "horizontal",
			autoPlay		: true,
			_current		: 0
		};
		
		return {
			init : function(){
				var carouselElement = YAHOO.util.Dom.get("product-carousel");
				var oCarousel = new YAHOO.kainee.productSlider(carouselElement, oConfig);
				oCarousel.init();
			}
		};
	}();

	productCarousel.init();
});

