
jQuery.fn.carousel = function(settings) {
	var defaults, timerId, validateParams, loadMedias, 
		setDimension, show, playShow, play;
	
	defaults = {		
		slide: false,
		speed: 300,		
		navContainer: "carouselNav",
		mediaContainer: "carouselMedia",
		activeClassName: "active",
		autoPlay: false,
		timer: 7,
		navInside: false,
		navCenter: true,
		navShow: true
	};
	settings = $.extend(defaults, settings);

	timerId = 0;

	loadMedias = function($carouselImages) {
		if ($.isFunction($.loadImages)) { 
			$carouselImages.each(function() {
				var $image = $(this),
					$link, toHide;
					
				if ($image.attr("id") === "") {
					if (document.getElementById($image.parent().attr("id")).nodeName === "A") {
						$link = $($image.parent());
						toHide = false;
						
						if (!$link.is(":visible")) {
							toHide = true;
							$link.show();
						}
						return function() {
							$.loadImages($("img", $link));
							if (toHide) { $link.hide(); }
						};
					}
				} else {
					return function() { $.loadImages($image); };
				}			
			});
		}
	};

	validateParams = function() {
			if (typeof(settings.autoPlay) !== "boolean") {
				settings.autoPlay = false;
			}
			if (isNaN(settings.timer)) {
				settings.timer = 7;
			}
			if (typeof(settings.slide) !== "boolean") {
				settings.slide = false;
			}
			if (isNaN(settings.speed)) {
				settings.speed = 300;
			}
			if (typeof(settings.navInside) !== "boolean") {
				settings.navInside = false;
			}
			if (typeof(settings.navCenter) !== "boolean") {
				settings.navCenter = true;
			}
			if (typeof(settings.navShow) !== "boolean") {
				settings.navShow = true;
			}
			if (typeof(settings.navContainer) !== "string") {
				settings.navContainer = "carouselNav";
			}
			if (typeof(settings.mediaContainer) !== "string") {
				settings.mediaContainer = "carouselMedia";
			}
			if (typeof(settings.activeClassName) !== "string") {
				settings.activeClassName = "active";
			}
		};


	setDimension = function($element) {
		var tallestH = 0,
			tallestW = 0,
			totalImgW = 0,
			dimension = {
				height: 0,
				width: 0
			}, 
			validData = false,		
			$carouselImages = $element.find("."+settings.mediaContainer+" img"),
			zIndex, $img, imgH, imgW, killOutLine,
			$nav;

		loadMedias($carouselImages);
		
		zIndex = 66666;
		
		$carouselImages.each(function(i) {
			$img = $(this);
			imgH = $img.outerHeight();
			imgW = $img.outerWidth();			
			
			if (imgH === 0) {
				return false;
			} else {
				validData = true;	
			}
			
			if (imgH > tallestH) {
				tallestH = imgH;
			}
			
			if (imgW > tallestW) {
				tallestW = imgW;
			}
			dimension.height = tallestH;
			dimension.width = tallestW;
			
			totalImgW += imgW;


			
			if (i === 0) { $img.show(); }
			
			if (i === 0 || !settings.slide) {
				$img.css("left", 0);
				if (i > 0 && !settings.slide) {
					$img.hide();	
				} 
				if (!settings.slide) {
					$img.css("position","absolute");
				}
			} else {
				$img.css("left", totalImgW-imgW+"px").css("float", "left");
			}
		});

		if (!validData) {
			return false;	
		} else {
			if (dimension.width) {
				$element.width(dimension.width);	
			}
			
			$element.find("."+settings.mediaContainer).each(function() {
				if (settings.slide) {
					$(this).width(totalImgW);
				} else {
					$(this).width(dimension.width);
				}
			});
			
			killOutLine = false;
			if ($.isFunction($().outLineKiller)) {
				killOutLine = true;
			}
			
			$element.find("."+settings.navContainer).each(function() {
				$nav = $(this);
				if (settings.navShow) {
					if (settings.navCenter) {
						$nav.css("left", (dimension.width-$nav.width())/2+"px");
					}
					if (killOutLine) {
						$("a",$nav).outLineKiller();
					}
					
					if (dimension.height) {
						if (settings.navInside) {
							$element.height(dimension.height);
							$nav.css("zIndex", zIndex++);	
						} else {
							$element.height(dimension.height+$nav.outerHeight(true));
						}
					}
				} else {
					$nav.hide();
					if (dimension.height) {
						$element.height(dimension.height);
					}
				}
			});
			return true;
		}
	};

	show = function(element, lnk, arrMedia) {
		var $element = $(element),
			$link = $(lnk),
			imageId,
			$img, $media;
		
		$element.find("."+settings.navContainer+" a").each(function() {
			$(this).removeClass(settings.activeClassName);
		});
		$link.addClass(settings.activeClassName);
					
		imageId = $link.attr("href").split("#")[1];
		$img = $("#"+imageId);

		if (settings.slide) {
			$element.find("."+settings.mediaContainer).each(function() {
				if ($img.length) {
					$(this).stop().animate({left: "-"+$img.css("left") }, settings.speed);
				}
			});
		} else {
			$.each(arrMedia, function(idx, value) {
				$media = $(value);
				if ($media.is(":visible") && ($img.attr("id")!==$media.attr("id"))) {
					if (settings.navInside) {
						$media.css("bottom",0);
					}
					$media.fadeOut(settings.speed, function() {
						$img.fadeIn(settings.speed);
					});
					return false;
				}								  
			});
		}
	};

	playShow = function(element, content, arrMedia, index) {
		var $element = $(element),
			$content = $(content),
			zIndex	= 66666, //$.getHighestZIndex(),
			$nav = $element.find("."+settings.navContainer);
		
		$content.css("zIndex", zIndex);
		$content.fadeIn(settings.speed);
		
		if ($nav.length) {
			$nav.css("zIndex", zIndex++);	
		}

		timerId = setTimeout(function() {
			var nextIdx = index+1>arrMedia.length-1? 0 : index+1;
			play($element, arrMedia, nextIdx, false);
		}, settings.timer*1000);
		
	};	

	play = function(element, arrMedia, index, isFirstTimeLoad) {
		if (arrMedia.length) {
			var $element = $(element),
				$img = $(arrMedia[index]),
				$media,
				nextIdx, href;
			
			
			$element.find("."+settings.navContainer+" a").each(function() {
				href = $(this).attr("href").split("#")[1];
				if (href === $img.attr("id")) {
					$(this).removeClass(settings.activeClassName).addClass(settings.activeClassName);
				} else {
					$(this).removeClass(settings.activeClassName);
				}
			});

			if (settings.slide) {
				$element.find("."+settings.mediaContainer).each(function() {
					$(this).stop().animate({left: "-"+$img.css("left") }, settings.speed,  function() {
						//interval validation
						if (isNaN(settings.timer)) {
							settings.timer = defaults.timer;
						}
						timerId = setTimeout(function() {
							nextIdx = index+1>arrMedia.length-1? 0 : index+1;
							play($element, arrMedia, nextIdx, false);
						}, settings.timer*1000);
					});
				});
			} else {
				$.each(arrMedia, function(idx, value) {
					$media = $(value);

					if ($media.is(":visible")) {
						if (!isFirstTimeLoad) {
							$media.fadeOut(settings.speed, function() {
								playShow($element, $img, arrMedia, index);
							});
						} else {
							playShow($element, $img, arrMedia, index);
						}
						return false;
					}					  
				});
			}
		}
	};
	
	return this.each(function(idx){
		var $element = $(this),
			$links, media, $link,
			$content, contentId;

		if (idx ===0) { validateParams(); }

		if (!$.data($element.get(0),"initialized")) {
			if (setDimension($element)) {			
				if (window.carouselTimerId) {
					clearTimeout(window.carouselTimerId);	
				}
				
				if (!settings.slide) {
					$element.css("overflow","visible");
				} 
		
				$links = $element.find("."+settings.navContainer+" a");
				
				if ($links.length > 1) {
					media = [];
	
					$links.each(function(i) {
						$link = $(this);
						contentId = $link.attr("href").split("#")[1];
						if (i===0) {
							$link.addClass(settings.activeClassName);
						} else {
							$link.removeClass(settings.activeClassName);				
						}
						try {
							$content = $("#"+contentId);
							
							if ($content.length) {
								if (settings.navInside) {
									$content.css("bottom",0);
								}						
								media.push($content);
							}
						} catch(e) {}
						
						$link.unbind("click").click(function() {
							show($element, $(this), media);
							clearTimeout(timerId);
							return false;
						});
					});
					
					if (settings.autoPlay) {
						play($element, media, 0, true);
					}
				} else if ($links.length === 1) {
					$links.hide();
				}
				$.data($element.get(0),"initialized",true);
			} else {
				window.carouselTimerId = setTimeout(function() {
					$element.carousel(settings);
				}, 100);
			}
		}
	});
};


$(document).ready(function() {
	$(".rotation").carousel({autoPlay:true, navInside:true, navCenter:false});
});

