﻿/* jQuery Carousel 0.9.2
Copyright 2008-2009 Thomas Lanciaux and Pierre Bertet.
This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
*/
; (function ($) {
	$.fn.carousel = function (params) {
		var params = $.extend({ direction: "horizontal", loop: false, dispItems: 1, pagination: false, paginationPosition: "inside", nextBtn: '<a role="button">Next</a>', prevBtn: '<a role="button">Previous</a>', btnsPosition: "inside", nextBtnInsert: "appendTo", prevBtnInsert: "prependTo", nextBtnInsertFn: false, prevBtnInsertFn: false, autoSlide: false, autoSlideInterval: 3000, delayAutoSlide: false, combinedClasses: false, effect: "slide", slideEasing: "swing", animSpeed: "normal", equalWidths: "true", verticalMargin: 0, callback: function () { }, useAddress: false, adressIdentifier: "carousel", tabLabel: function (tabNum) { return tabNum; } }, params); if (params.btnsPosition == "outside") { params.prevBtnInsert = "insertBefore"; params.nextBtnInsert = "insertAfter"; }
		params.delayAutoSlide = params.delayAutoSlide || params.autoSlideInterval; return this.each(function () {
			var env = { $elts: {}, params: params, launchOnLoad: [] }; env.$elts.carousel = $(this).addClass("js"); env.$elts.content = $(this).children().css({ position: "absolute", "top": 0 }); env.$elts.wrap = env.$elts.content.wrap('<div class="carousel-wrap"></div>').parent().css({ overflow: "hidden", position: "relative" }); env.steps = { first: 0, count: env.$elts.content.children().length }; env.steps.last = env.steps.count - 1; if ($.isFunction(env.params.prevBtnInsertFn)) { env.$elts.prevBtn = env.params.prevBtnInsertFn(env.$elts); } else { env.$elts.prevBtn = $(params.prevBtn)[params.prevBtnInsert](env.$elts.carousel); }
			if ($.isFunction(env.params.nextBtnInsertFn)) { env.$elts.nextBtn = env.params.nextBtnInsertFn(env.$elts); } else { env.$elts.nextBtn = $(params.nextBtn)[params.nextBtnInsert](env.$elts.carousel); }
			env.$elts.nextBtn.addClass("carousel-control next carousel-next"); env.$elts.prevBtn.addClass("carousel-control previous carousel-previous"); initButtonsEvents(env); if (env.params.pagination) { initPagination(env); }
			initAddress(env); $(function () {
				var $items = env.$elts.content.children(); var $maxHeight = 0; $items.each(function () { $item = $(this); $itemHeight = $item.outerHeight(); if ($itemHeight > $maxHeight) { $maxHeight = $itemHeight; } }); if (env.params.verticalMargin > 0) { $maxHeight = $maxHeight + env.params.verticalMargin; }
				$items.height($maxHeight); var $firstItem = env.$elts.content.children(":first"); env.itemWidth = $firstItem.outerWidth(); if (params.direction == "vertical") { env.contentWidth = env.itemWidth; } else { if (params.equalWidths) { env.contentWidth = env.itemWidth * env.steps.count; } else { env.contentWidth = (function () { var totalWidth = 0; env.$elts.content.children().each(function () { totalWidth += $(this).outerWidth(); }); return totalWidth; })(); } }
				env.$elts.content.width(env.contentWidth); env.itemHeight = $maxHeight; if (params.direction == "vertical") { env.$elts.content.css({ height: env.itemHeight * env.steps.count + "px" }); env.$elts.content.parent().css({ height: env.itemHeight * env.params.dispItems + "px" }); } else { env.$elts.content.parent().css({ height: env.itemHeight + "px" }); }
				updateButtonsState(env); $.each(env.launchOnLoad, function (i, fn) { fn(); }); if (env.params.autoSlide) { window.setTimeout(function () { env.autoSlideInterval = window.setInterval(function () { goToStep(env, getRelativeStep(env, "next")); }, env.params.autoSlideInterval); }, env.params.delayAutoSlide); } 
			});
		});
	}; function initButtonsEvents(env) { env.$elts.nextBtn.add(env.$elts.prevBtn).bind("enable", function () { var $this = $(this).unbind("click").bind("click", function () { goToStep(env, getRelativeStep(env, ($this.is(".next") ? "next" : "prev"))); stopAutoSlide(env); }).removeClass("disabled"); if (env.params.combinedClasses) { $this.removeClass("next-disabled previous-disabled"); } }).bind("disable", function () { var $this = $(this).unbind("click").addClass("disabled"); if (env.params.combinedClasses) { if ($this.is(".next")) { $this.addClass("next-disabled"); } else if ($this.is(".previous")) { $this.addClass("previous-disabled"); } } }).hover(function () { $(this).toggleClass("hover"); }); }; function initPagination(env) { env.$elts.pagination = $('<div class="center-wrap"><div class="carousel-pagination"><p></p></div></div>')[((env.params.paginationPosition == "outside") ? "insertAfter" : "appendTo")](env.$elts.carousel).find("p"); env.$elts.paginationBtns = $([]); env.$elts.content.find("li").each(function (i) { if (i % env.params.dispItems == 0) { env.$elts.paginationBtns = env.$elts.paginationBtns.add($('<a role="button" title="View slide #' + env.params.tabLabel(env.$elts.paginationBtns.length + 1) + '"'+ '><span>' + env.params.tabLabel(env.$elts.paginationBtns.length + 1) + '</span></a>').data("firstStep", i)); } }); env.$elts.paginationBtns.each(function () { $(this).appendTo(env.$elts.pagination); }); env.$elts.paginationBtns.slice(0, 1).addClass("active"); env.launchOnLoad.push(function () { env.$elts.paginationBtns.click(function (e) { goToStep(env, $(this).data("firstStep")); stopAutoSlide(env); }); }); }; function initAddress(env) { if (env.params.useAddress && $.isFunction($.fn.address)) { $.address.init(function (e) { var pathNames = $.address.pathNames(); if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) { goToStep(env, pathNames[1] - 1); } else { $.address.value('/' + env.params.adressIdentifier + '/1'); } }).change(function (e) { var pathNames = $.address.pathNames(); if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) { goToStep(env, pathNames[1] - 1); } }); } else { env.params.useAddress = false; } }; function goToStep(env, step) { env.params.callback(step); transition(env, step); env.steps.first = step; updateButtonsState(env); if (env.params.useAddress) { $.address.value('/' + env.params.adressIdentifier + '/' + (step + 1)); } }; function getRelativeStep(env, position) { if (position == "prev") { if ((env.steps.first - env.params.dispItems) >= 0) { return env.steps.first - env.params.dispItems; } else { return ((env.params.loop) ? (env.steps.count - env.params.dispItems) : false); } } else if (position == "next") { if ((env.steps.first + env.params.dispItems) < env.steps.count) { return env.steps.first + env.params.dispItems; } else { return ((env.params.loop) ? 0 : false); } } }; function transition(env, step) {
		switch (env.params.effect) {
			case "no": if (env.params.direction == "vertical") { env.$elts.content.css("top", -(env.itemHeight * step) + "px"); } else { env.$elts.content.css("left", -(env.itemWidth * step) + "px"); }
				break; case "fade": if (env.params.direction == "vertical") { env.$elts.content.hide().css("top", -(env.itemHeight * step) + "px").fadeIn(env.params.animSpeed); } else { env.$elts.content.hide().css("left", -(env.itemWidth * step) + "px").fadeIn(env.params.animSpeed); }
				break; default: if (env.params.direction == "vertical") { env.$elts.content.stop().animate({ top: -(env.itemHeight * step) + "px" }, env.params.animSpeed, env.params.slideEasing); } else { env.$elts.content.stop().animate({ left: -(env.itemWidth * step) + "px" }, env.params.animSpeed, env.params.slideEasing); }
				break;
		} 
	}; function updateButtonsState(env) {
		if (getRelativeStep(env, "prev") !== false) { env.$elts.prevBtn.trigger("enable"); } else { env.$elts.prevBtn.trigger("disable"); }
		if (getRelativeStep(env, "next") !== false) { env.$elts.nextBtn.trigger("enable"); } else { env.$elts.nextBtn.trigger("disable"); }
		if (env.params.pagination) { env.$elts.paginationBtns.removeClass("active").filter(function () { return ($(this).data("firstStep") == env.steps.first) }).addClass("active"); } 
	}; function stopAutoSlide(env) { if (!!env.autoSlideInterval) { window.clearInterval(env.autoSlideInterval); } };
})(jQuery);