(function($j){ 

$j.fn.CodeCarousel = function(options) {

	if($j(this).size()){  
		 var defaults = { 
				 items: 1, 
				 itemsPerPage: 0, 
				 width: null,
				 height: null,
				 carouselAutoScroll: null,
				 carouselAutoScrollDelay: 2500,
				 carouselVertical: null
			};

		 var settings = $j.extend(defaults, options);

 	return this.each(function() { 
			obj = $j(this);

 			carouselHolder = "c-carousel";
			carouselHousing = "c-carousel-outer";
			carouselInner = "c-carousel-inner";
			carouselItem = "c-carousel-item";
			carouselPaging = "c-carousel-paging";
			carouselNav = "c-carousel-nav";
			carouselPrev = "c-carousel-prev";
			carouselNext = "c-carousel-next";
			carousel  = '';
			carouselItems = null;
			carouselItemsPerPage = null;
			
			setUpCarousel();
			
		function setUpCarousel(){
			
			//set private vars
			var self = this;
			var carousel = obj.attr('class');
			var cCarousel = obj;
			var carouselHolder = self.carouselHolder;
			var carouselHousing = self.carouselHousing;
			var carouselInner = self.carouselInner;
			var carouselItem = self.carouselItem;
			var carouselItems = settings.items;
			var carouselPaging = self.carouselPaging;
			var carouselNav = self.carouselNav;
			var carouselPrev = self.carouselPrev;
			var carouselNext = self.carouselNext;
			var carouselItemsPerPage = (settings.itemsPerPage + 1);
			var cWidth = settings.width;
			var cHeight = settings.height;
			var cStyle = ('');
			var cPaddingTop = 0;
			var cPaddingBottom = 0;
			var cMarginTop = 0;
			var cMarginBottom = 0;
			var cPaddingLeft = 0;
			var cPaddingRight = 0;
			var cMarginLeft = 0;
			var cMarginRight = 0;
			var carouselTrueWidth = 0;
			var pageCount = null;
			var listItemCount = null;
			var carouselListWidth = 0;
			var carouselList = new Array();
			var carouselItemId = ('');
			var carouselItemClass = ('');
			var carouselSplit = 0;
			
			var carouselAutoScroll = settings.carouselAutoScroll;
			var carouselAutoScrollDelay = settings.carouselAutoScrollDelay;
			
			var carouselVertical = settings.carouselVertical;
		
			//set global vars
			self.carouselItems = carouselItems;
			self.carousel = carousel;
			self.carouselItemsPerPage = carouselItemsPerPage;
			
			//strip and replace the original list item
			$j('li', cCarousel).each(function(index){
																								
					pageCount = parseInt((index+1)/carouselItems);
					listItemCount = index;
					//get the current attributes of the li (should add more here)
					var carouselItemTrueId = $j(this).attr('id');
					var carouselItemTrueClass = $j(this).attr('class');
					
					//clone the attributes
					if(carouselItemTrueId != ""){
						carouselItemId = (' id="' + carouselItemTrueId + '"');
					}else{
						carouselItemId = ('');
					}
					
					if(carouselItemTrueClass != ""){
						carouselItemClass =	(' class="' + carouselItemTrueClass + '"');
					}else{
						carouselItemClass = ('');
					}
					
					carouselList.push('<li' + carouselItemId + ' ' + carouselItemClass + '>' + $j(this).html() + '</li>');
					
					if(index < carouselItems){
								cPaddingTop += parseInt($j(this).css('padding-top'));
								cPaddingBottom += parseInt($j(this).css('padding-bottom'));
								cMarginTop += parseInt($j(this).css('margin-top'));
								cMarginBottom += parseInt($j(this).css('margin-bottom'));
								cPaddingLeft += parseInt($j(this).css('padding-left'));
								cPaddingRight += parseInt($j(this).css('padding-right'));
								cMarginLeft += parseInt($j(this).css('margin-left'));
								cMarginRight += parseInt($j(this).css('margin-right'));
								
							$j(this).children().each(function(){
								cPaddingTop += parseInt($j(this).css('padding-top'));
								cPaddingBottom += parseInt($j(this).css('padding-bottom'));
								cMarginTop += parseInt($j(this).css('margin-top'));
								cMarginBottom += parseInt($j(this).css('margin-bottom'));
								cPaddingLeft += parseInt($j(this).css('padding-left'));
								cPaddingRight += parseInt($j(this).css('padding-right'));
								cMarginLeft += parseInt($j(this).css('margin-left'));
								cMarginRight += parseInt($j(this).css('margin-right'));
							});
					}
					
			});
			
			if (carouselVertical){
			
				// set width and height of carousel
				var carouselGroupXExtras = (cMarginRight + cPaddingRight) + (cMarginLeft + cPaddingLeft);
				carouselListHeight = (parseInt($j('li', cCarousel).height())) * (carouselItems) + (carouselGroupXExtras) * carouselItemsPerPage;
		
				if(carouselItemsPerPage > 1 || carouselItems == 1){
					carouselListHeight =  (carouselListHeight * pageCount);
				}
				
				var carouselGroupItemExtra = (cPaddingTop + cPaddingBottom) + (cMarginTop + cMarginBottom);
				
				
				if(cWidth != undefined){
					cWidth = ('width: ' + cWidth + ';');
				}else{
					cWidth = ('width: ' + $j('li', cCarousel).width() + 'px;');
				}
							
				if(cHeight != undefined){
					cHeight = ('height: ' + cHeight + 'px;');
				}else{
					cHeight = ('height: ' + parseInt(($j('li', cCarousel).height() * (carouselItems)) + carouselGroupItemExtra)  + 'px;');
				}
				
				//alert('Overall height:' + carouselListHeight);
				
			} else {
				
				// set width and height of carousel
				var carouselGroupXExtras = (cMarginRight + cPaddingRight) + (cMarginLeft + cPaddingLeft);
				carouselListWidth = (parseInt($j('li', cCarousel).width())) * (carouselItems) + (carouselGroupXExtras) * carouselItemsPerPage;
		
				if(carouselItemsPerPage > 1 || carouselItems == 1){
					carouselListWidth =  (carouselListWidth * pageCount);
				}
				
				var carouselGroupItemExtra = (cPaddingTop + cPaddingBottom) + (cMarginTop + cMarginBottom);
				
				
				if(cWidth != undefined){
					cWidth = ('width: ' + cWidth + ';');
				}else{
					cWidth = ('width: ' + $j('li', cCarousel).width() + 'px;');
				}
							
				if(cHeight != undefined){
					cHeight = ('height: ' + cHeight + 'px;');
				}else{
					cHeight = ('height: ' + parseInt(($j('li', cCarousel).height() * (carouselItems)) + carouselGroupItemExtra)  + 'px;');
				}
				
				//alert('Overall width: '+carouselListWidth);
			}
			
			//generate controls
			carouselControls = ('<div class="'+ carouselNav +' ' + carouselPrev + '"></div><div class="'+ carouselNav +' '+ carouselNext +'"></div><div class="' + carouselPaging + '"></div>');
			
			
			//place the carousel container
			cCarousel.wrap('<div class="' + carouselHousing + ' ' + carousel + '" style="position: relative;"><div class="' + carouselHolder + '" style="overflow: hidden; ' + cHeight + ' "><div class="' + carouselInner + '" style="position: absolute;"></div></div>' + carouselControls + '</div>');
			var cCarouselInner = $j('.' + carouselInner, '.'+carousel);
			
			if (!carouselVertical){
				//set the width of the inner container
				$j('.'+carouselInner, '.'+carousel).css({width : carouselListWidth, overflow:'hidden'}); 
			} else {
				$j('.'+carouselInner, '.'+carousel).css({overflow:'hidden'}); 			
			}
			
			// write out the new carousel			
			var cCarouselHolder = $j('.' + carouselHolder);
			var carouselItemLength = carouselList.length;
			var	carouselListNew = ('<div class="' + carouselItem + '"><ul>');
			var cCarouselItemsPerPage = carouselItemsPerPage;
			
			
			if(carouselItemsPerPage > 1){
				var pageListCount = (carouselItems * carouselItemsPerPage-1);
			}else{
				var pageListCount = (carouselItems * carouselItemsPerPage);
			}
			
				for(var i = 0; i < carouselItemLength; i++){
					
						carouselListNew += (carouselList[i]);
						if(parseInt(pageListCount) != 0){
							
							if(i == pageListCount-1 && i != listItemCount){
								
								carouselListNew += ('</ul></div><div class="' + carouselItem + '"><ul>');
									if(carouselItemsPerPage > 1){
										pageListCount += (carouselItems *  carouselItemsPerPage-1);
									}else{
										pageListCount += (carouselItems *  carouselItemsPerPage);
									}
							}
						}
				}
			
			carouselListNew += ('</ul></div>');
			//remove the old list item
			cCarousel.remove();
			//place the new one in the dom
			$j(cCarouselInner,'.'+carousel).append(carouselListNew)
			
			//set up the navigation controls
			setupNav();			

			startCarouselAutoScroll();

		};
		
		function setupNav(){
			
			var self = this;
			var cCarousel = '.'+self.carousel;
			var nav = "c-carousel-nav";
			var navPrev = "c-carousel-prev";
			var navNext = "c-carousel-next";
			var cNav = $j('.' + nav, cCarousel);
			var cNavPrev = $j('.' + navPrev, cCarousel);
			var cNavNext = $j('.' + navNext, cCarousel);
			var carouselInner = self.carouselInner;
			var cCarouselInner = $j('.' + carouselInner, cCarousel);
			var carouselItem = self.carouselItem;
			var cCarouselItem = $j('.' + carouselItem, cCarousel);
			var carouselItems = settings.items;
			var carouselWidth = cCarouselItem.width();
			var carouselHeight = cCarouselItem.height();	

			var carouselVertical = settings.carouselVertical;

			var carouselLength = 0;
			var carouselTotalItems = 0;
			var navCount = 1;
			var carouselPaging = self.carouselPaging;
			var cCarouselPaging = $j('.' + carouselPaging, cCarousel);
			var carouselItemsPerPage = settings.itemsPerPage;
			
			cCarouselItem.each(function(index){		
				carouselLength = index+1;
				carouselTotalItems = carouselLength;
			});
			
			$j('li', cCarousel).each(function(index){		
				carouselTotalItems = index+1;
			});
			
			var pagingText = ('<span class="current">' + navCount + '</span> / <span class="total">' + carouselLength + '</span>');
			
			if(navCount == carouselLength){
				cNavNext.addClass('c-carousel-next-disabled')
			}
			if(navCount == 1){
				cNavPrev.addClass('c-carousel-prev-disabled')
			}
			
			if(carouselVertical){
				var cCarouselScrollDirection = "top";
				var cCarouselScrollAmount = carouselHeight;
			} else {
				var cCarouselScrollDirection = "left";
				var cCarouselScrollAmount = carouselWidth;
			}
			
			//self.newsItemList = $j(self, '.c-carousel-inner');
			//alert('Item list: '+newsItemList.length+', Total items: '+carouselLength);
			//var _newsItemToAppend = $j('<div class="c-carousel-item"></div>');

			cNav.click(function(evt){
				stopCarouselAutoScroll();
				
				var myTarget = $j(evt.target);
				if(myTarget.is('.'+navNext)){
					if(navCount < carouselLength){							
						if (carouselVertical){
							cCarouselInner.animate({
								"top": '-=' + parseInt(cCarouselScrollAmount)
								},"slow");
						} else {
							cCarouselInner.animate({
								"left": '-=' + parseInt(cCarouselScrollAmount)
								},"slow");						
						}

						//self._newsItemToAppend = self.newsItemList[navCount];
						//alert(_newsItemToAppend.html());
						//$j(self).appendTo(_newsItemToAppend);		
						//alert(carouselItems);	
						//carouselItems++;
						//alert(carouselItems);
						navCount++;
						$j('.current', cCarousel).text(navCount);
					}
				}
				if(myTarget.is('.'+navPrev)){
					if(navCount > 1){
						if (carouselVertical){
							cCarouselInner.animate({
								"top": '+=' + parseInt(cCarouselScrollAmount)
								},"slow");
						} else {
							cCarouselInner.animate({
								"left": '+=' + parseInt(cCarouselScrollAmount)
								},"slow");						
						}
						navCount --;
						$j('.current', cCarousel).text(navCount);
					}
				}
				
				if(navCount == carouselLength){
					cNavNext.addClass('c-carousel-next-disabled')
				}else{
					cNavNext.removeClass('c-carousel-next-disabled')
				}
				if(navCount == 1){
					cNavPrev.addClass('c-carousel-prev-disabled')
				}else{
					cNavPrev.removeClass('c-carousel-prev-disabled')
				}
				
			});
			
			
			//set nav text
			cCarouselPaging.append(pagingText);
			
		};
	
		
		function startCarouselAutoScroll(){
					
				var _carouselAutoScroll = settings.carouselAutoScroll;
				var _carouselAutoScrollDelay = settings.carouselAutoScrollDelay

				if (_carouselAutoScroll){
					var self = this;
					var _carouselToScroll = '.' + obj.attr('class');
						
					var _carouselEndItem = null;
				
					triggerAutoScroll = function(){
						$j('.c-carousel-next', _carouselToScroll).trigger('click');
						this.timer = setTimeout( "triggerAutoScroll()" , 2500);	
					}
							
					setTimeout( "triggerAutoScroll()" , 2500);	
				}
		
		};
		
		function stopCarouselAutoScroll(){
			clearTimeout(this.timer);		
		};
		

			
	
	});
	

	
	}
}
})(jQuery); 
