//	Carousel Parameters
//	--------------------
//	param:data							type:array						format: [object1:{img:{src:"", alt:""}, title:"", desc:"", callToAction:{href:"", target:"", txt:""}}, object2:{img:{src:"", alt:""}, title:"", desc:"", callToAction:{href:"", target:"", txt:""}},....]
//	param:options						type:object						format: see below

//	Carousel Options
//	-----------------
//	param: itemsToShow					type: integer					defaults to: 3,
//	param: moveSpeed					type: integer					defaults to: 500,
//	param: showInfoPanel				type: boolean					defaults to: true,
//	param: transitionSpeed				type: integer					defaults to: 300,
//	param: autoScroll					type: boolean					defaults to: true,
//	param: autoScrollDelay				type: integer					defaults to: 5000,
//	param: scrollWrap					type: boolean					defaults to: true,
//  param: showControls					type: boolean					defaults to: true,
//	param: prevText						type: string					defaults to: "< prev",
//	param: nextText						type: string					defaults to: "next >",
//	param: takeoverCloseText			type: string					defaults to: "close",
//	param: vertical						type: boolean					defaults to: false,
//	param: showMenu						type: boolean					defaults to: true,
//	param: itemOptions					type: object					defaults to:  {}

//  Panel Item Options
//  -------------------
//	param: minAlpha						type: float						defaults to: 0.75,
//	param: maxAlpha						type: integer					defaults to: 1,
//	param: fadeSpeed					type: integer					defaults to: 200,
//	param: useHand						type: boolean					defaults to: true,
//	param: useAlphaHover				type: boolean					defaults to: true,
//	param: descTruncVal					type: integer					defaults to: 150,
//	param: descMinTrail					type: integer					defaults to: 10,
//	param: descTrailText				type: string					defaults to: "...",
//	param: clickAction					type: function  				defaults to: function(){return true;}
	
// Example Instantiation
// ----------------------
// $("#carousel-1").carousel(data, {itemsToShow:4, autoScroll:false, scrollWrap:false, vertical:false, itemOptions:{useAlphaHover:true, minAlpha:0.75, maxAlpha:1, fadeSpeed:250}});
	
(function($){	
$.fn.extend({
	carouselItem: function(data, options){
		
		var defaults =  {
				minAlpha: 0.75,
				maxAlpha:1,
				fadeSpeed:200,
				useHand:true,
				useAlphaHover:true,
				descTruncVal:150,
				descMinTrail:10,
				descTrailText:"...",
				clickAction: function(){alert("click"); return true;}
		};
		
		options = $.extend(defaults, options);
		
		return this.each(function(){			
			var obj = $(this);

				obj.isActive = false;
				obj.panelContent = parseData(data);
				obj.data("panelContent", {img:{src:obj.panelContent.img.src, alt:obj.panelContent.img.alt}, text:obj.panelContent.text})
				obj.append(generateContent());
				
				if(options.useAlphaHover){
					$("img.tn", obj).css({opacity:options.minAlpha});
					obj.bind('mouseenter', {alpha:options.maxAlpha, speed:options.fadeSpeed}, rollOverOutHandler);
					obj.bind('mouseleave', {alpha:options.minAlpha, speed:options.fadeSpeed}, rollOverOutHandler);
				};
				obj.bind("click", {panel:obj}, options.clickAction);
				obj.css({cursor:"pointer"});


			function generateContent(){
				var container  = $("<div class='item-content'></div>");
				var img = (obj.panelContent.img.src != null)? $("<div class='tnwrapper'><img class='tn' src='" + obj.panelContent.img.src + "' alt='" + obj.panelContent.img.alt + "' /></div>") : "";
				var text = (obj.panelContent.text != null)? $("<p>" + truncateText(obj.panelContent.text) + "</p>") : "";
				container.append(img).append(text);
				return container;
			};
		
			function rollOverOutHandler(evt){
				if(!obj.hasClass('active')){
				if(!obj.isActive){
					obj.isActive = true;
					$("img.tn", obj).fadeTo(evt.data.speed, evt.data.alpha);
				}else{
					obj.isActive = false;
					$("img.tn", obj).fadeTo(evt.data.speed, evt.data.alpha);
				}
				}
			};
		
			function parseData(content){
				var data = {img: new Image(),
					text: ""
					};
					
				data.img.src = (typeof(content.img) != "undefined") ? content.img.src : null;
				data.img.alt = (typeof(content.img) != "undefined") ? content.img.alt : null;
				data.text = (typeof(content.text) != "undefined") ? content.text : null;
				return data;	
			};
	
			function truncateText(text){
				var body = text;
   				if(body.length > options.descTruncVal + options.descMinTrail) {
   					var splitLocation = body.indexOf(' ', options.descTruncVal);
    				if(splitLocation != -1) {
     					var splitLocation = body.indexOf(' ', options.descTruncVal);
     					var str = body.substring(0, splitLocation) + '<span class="trailText">' + options.descTrailText + '</span>';
					}
				}else{
					var str = text;
				}
				return str;
			};
		});
	}
});
})(jQuery);

(function($){
		  
$.fn.extend({
	
	carousel: function(dataset, options) {
  		
		var defaults = {
			itemsToShow:3,
			moveSpeed:500,
			showInfoPanel:true,
			transitionSpeed:300,
			autoScroll: true,
			autoScrollDelay:5000,
			scrollWrap:true,
   			showControls: true,
			prevText:"< prev",
			nextText:"next >",
			takeoverCloseText:"close",
			vertical:false,
			showMenu:true,
			itemOptions: {}
		};
		
		options = $.extend(defaults, options);
		
		return this.each(function(i) {	
			
			var obj = $(this);
			var	dm = obj.displayManager = {};
			var	dtm	= obj.dataManager = {};
			dtm.data = dataset;
				
			options.itemOptions.clickAction = (typeof(options.itemOptions.clickAction) == 'function')? options.itemOptions.clickAction : panelClickHandler;	
			
			dm.displayArea = $("<div class='item-display'></div>")
			dm.itemHolder = $("<div class='item-wrapper'></div>")
			dm.items = [];
			for(var i=0; i < dtm.data.length; i++){
				var item = $("<div id='item-"+i+"' class='item'></div>");
				item.carouselItem(dtm.data[i], options.itemOptions);
				item.data("id", i);
				dm.items[i] = item;
				dm.itemHolder.append(item);
			}
			dm.displayArea.append(dm.itemHolder);
			obj.append(dm.displayArea);
			
			dm.totalItems = dm.items.length;
			dm.itemWidth = $(".item:first", obj).innerWidth();
			dm.displayWidth = (options.vertical)? dm.itemWidth : (dm.itemWidth * options.itemsToShow);
			dm.totalItemGroups = Math.ceil(dm.totalItems/options.itemsToShow);
			dm.currItemGroup = 1;
			var maxHeight = function(){var height = 0; $(dm.items).each(function(){ if($(this).height() > height) height = $(this).height();}); return height;}
			dm.itemHeight = maxHeight();
			dm.itemHolder.width((options.vertical)? dm.itemWidth : dm.itemWidth * dm.totalItems);
			dm.itemHolder.height((options.vertical)?  maxHeight()*dm.totalItems : dm.itemHeight );
			dm.displayArea.width(dm.displayWidth -2);
			dm.displayArea.height((options.vertical)? dm.itemHeight * options.itemsToShow : dm.itemHeight );
			dm.displayArea.css({overflow:"hidden"});
			obj.css({position:"relative", width:dm.displayWidth});
			dm.itemHolder.css({position:"relative", left:"0px"});
			(options.vertical)? $(dm.items).css({float:"none"}) : $(dm.items).css({float:"left"});
			if(options.showControls) createControls();
			if(options.showMenu) createGoToMenu();
			if(options.autoScroll) autoScroll();
			
			updateNavigation();
			
			function createControls(){
				obj.append("<div class='controls'><a class='prevBtn' href='javascript:void(0);'>"+options.prevText+"</a><a class='nextBtn' href='javascript:void(0);'>"+options.nextText+"</a></div>");
				obj.prevBtn = $("a.prevBtn", obj);
				obj.nextBtn = $("a.nextBtn", obj);
				obj.prevBtn.bind("click",{}, prevClickHandler);
				obj.nextBtn.bind("click",{}, nextClickHandler);
			};
	
			function prevClickHandler(evt){
				if(options.scrollWrap){
					dm.currItemGroup = (dm.currItemGroup-1 == 0)? dm.totalItemGroups : (dm.currItemGroup-1)%dm.totalItemGroups;
				}else{
					if(!$(this).hasClass("disabled")){
						dm.currItemGroup--;
					};
				};
				goto();
			};
	
			function nextClickHandler(evt){
				if(options.scrollWrap){
					dm.currItemGroup = (dm.currItemGroup%dm.totalItemGroups == 0)? 1:dm.currItemGroup+1;
				}else{
					if(!$(this).hasClass("disabled")){
						dm.currItemGroup++;		
					};
				};
				goto();
			};
	
			function createGoToMenu(){
				obj.append("<ul class='menu'></ul>");
				for(var i in dtm.data){
					if(dtm.data.hasOwnProperty(i)){
						$("ul.menu", obj).append("<li><a href='javascript:void(0);' class='gotoBtn' id='goto-"+(1+parseInt(i))+"' rel='"+(1+parseInt(i))+"'>"+(1+parseInt(i))+"</a></li>");
					}
				}
				$("ul.menu li a.gotoBtn", obj).click(function(evt){ 
															  evt.preventDefault(); 
															  dm.currItemGroup = Math.ceil(parseInt($(this).attr("rel"))/options.itemsToShow); 
															  goto(); 
															  dm.items[(parseInt($(this).attr("rel"))-1)].click();
															  });
			};
	
			function goto(){
				var currXPos = parseInt(dm.itemHolder.css("left"));
				var targetXPos = (dm.currItemGroup == dm.totalItemGroups && dm.totalItems%options.itemsToShow !=0 )? -1* ((dm.currItemGroup-2)*(options.itemsToShow*dm.itemWidth) + (dm.totalItems%options.itemsToShow)*dm.itemWidth) : -1* (dm.currItemGroup-1)*(options.itemsToShow*dm.itemWidth); 
				var currYPos = parseInt(dm.itemHolder.css("top"));
				var targetYPos = (dm.currItemGroup == dm.totalItemGroups && dm.totalItems%options.itemsToShow !=0 )? -1* ((dm.currItemGroup-2)*(options.itemsToShow*dm.itemHeight) + (dm.totalItems%options.itemsToShow)*dm.itemHeight) : -1* (dm.currItemGroup-1)*(options.itemsToShow*dm.itemHeight); 

				var vector = {};
					vector.x = targetXPos-currXPos;
					vector.y = targetYPos-currYPos;
				if(options.vertical){
					if((vector.y > -1*(options.itemsToShow*dm.itemHeight) && vector.y < 0) || (vector.y < (options.itemsToShow*dm.itemHeight) && vector.y > 0 )){
						var speed =	(options.moveSpeed * (dm.totalItems%options.itemsToShow)+options.moveSpeed/2);
					}else{
						var speed = (options.moveSpeed * options.itemsToShow);
					};
					dm.itemHolder.stop().animate({top:"+="+vector.y+"px"}, speed, "swing");
				}else{	
					if((vector.x > -1*(options.itemsToShow*dm.itemWidth) && vector.x < 0) || (vector.x < (options.itemsToShow*dm.itemWidth) && vector.x > 0 )){
						var speed =	(options.moveSpeed * (dm.totalItems%options.itemsToShow)+options.moveSpeed/2);
					}else{
						var speed = (options.moveSpeed * options.itemsToShow);
					};
					dm.itemHolder.stop().animate({left:"+="+vector.x+"px"}, speed, "swing");
				}
				updateNavigation();
			};
	
	function updateNavigation(){
		(dm.currItemGroup < 2)? obj.prevBtn.addClass("disabled") : obj.prevBtn.removeClass("disabled");
		(dm.currItemGroup > dm.totalItemGroups-1)? obj.nextBtn.addClass("disabled") : obj.nextBtn.removeClass("disabled");
		var id = dm.currItemGroup-1;
		$('.menu a.active').removeClass('active');
		$('.menu a:eq('+id+')').addClass('active');
	};
	
	function panelClickHandler(evt){
		if(options.showInfoPanel){
			evt.preventDefault();
			showTakeOver(evt.data.panel);
		}
		return true;
	};
	
	function showTakeOver(panel){
		obj.append("<div class='takeover-wrapper'><div class='takeover-bg'></div></div>");
		var to = $(".takeover-wrapper", obj);
		
		var imgSrc = $("img.tn", panel).attr("src").replace(/lo-res/, "med-res");
		
		var alt = $("img.tn", panel).attr("alt");
		
		var html = "<div class='takeover-content'><div class='takeover-content-inner'>";
			html += "<img class='takeover-img' src='"+imgSrc+"' alt='"+alt+"' />";
			html += "<p>"+dtm.data[panel.data("id")].text+"</p>";
			html += "</div></div>"
		
		to.append(html);
		to.append("<a href='javascript:void(0);' class='takeover-close'>"+options.takeoverCloseText+"</a>");
		$(".takeover-close", to).css({position:"absolute", top:"0px", right:"0px", zIndex:"100"})
		to.css({position:"absolute", left:"0px", top:"0px", width:obj.width(), height:"0px", zIndex:"1", overflow:"hidden"});
		$(".takeover-bg", to).css({position:"absolute", left:"0px", top:"0px", width:obj.width(), height:obj.height(), opacity:"0.75", background:"#000000", zIndex:"1"});
		$(".takeover-content", to).css({position:"absolute", left:"0px", top:"0px", width:obj.width(), height:dm.itemHolder.height(), opacity:"0", zIndex:"2"});
		$(".takeover-img", to).css({height:$(".takeover-content", to).height()-20})
		to.animate({height:obj.height()}, options.transitionSpeed, function(){
			$(".takeover-content", to).animate({opacity:"1"}, options.transitionSpeed);
		});
		$(".takeover-close", $(".carousel")).click(function(evt){ evt.preventDefault(); hideTakeOver();});
	};
	
	function hideTakeOver(){
		var to = $(".takeover-wrapper", obj);
		$(".takeover-content", to).animate({opacity:"0"}, options.transitionSpeed, function(){
		to.stop().animate({height:"0px"}, options.transitionSpeed, function(){ to.remove(); });});
	};
	
	function autoScroll(){
		options.scrollWrap = true;
		obj.bind("mouseenter", {}, stopTimer);
		obj.bind("mouseleave", {}, startTimer);
		startTimer();
	};
	
	function startTimer(){
		obj.intervalID = setInterval(triggerNext, options.autoScrollDelay);
	};
	
	function stopTimer(){
		clearInterval(obj.intervalID);
	};
	
	function triggerNext(){
		obj.nextBtn.click();
	};
		
		});
	}
	
	
	
})
})(jQuery);

