;(function($) { $.fn.HomeRotator = function(settings) { var config = { jqClass: "rotator-jq", advance: true, // Auto-advance to next slide. See following two settings. advanceInterval: 5000, resumeAdvanceTimeout: 15000, start: 1, // Slide to start on. transition: "slide", // false, "fade", or "slide". transitionSpeed: 300 // in milliseconds }; if (settings) $.extend(config, settings); this.each(function() { var cont = $(this); var hasNav = InitNav(cont);; InitSlides(cont); if (!hasNav) return; if (config["advance"]) { var i = window.setInterval(function() { Advance(cont); }, config['advanceInterval']); cont.data("interval", i); } }); return this; function InitSlides(cont) { cont.addClass(config['jqClass']); var start = config["start"]; cont.find("ul.slides li:nth(" + (start-1) + ")") .siblings() .removeClass("active") .css({ display: "block", opacity: 0}) .end() .addClass("active"); if (config["transition"] == "slide") { var slides = cont.find("ul.slides li"); var width = slides.outerWidth(true); slides.each(function(idx) { var offset = width * (idx - start + 1); $(this).css("left", offset);//.attr("num", idx + 1); }); } cont.find("ul.nav li:nth(" + start + ")") .siblings() .removeClass("active") .end() .addClass("active"); } function InitNav(cont) { var nav = cont.find("ul.nav"); if (!nav.length) return false; var numSlides = cont.find("ul.slides li").length; if (numSlides == 1) { nav.remove(); return false; } nav.css({ left: -9999, top: -9999, "display": "block"}); var width = 0; nav.children() .each(function(idx) { width += $(this).outerWidth(true); }) .click(function(idx) { if (config["advance"]) { var t = cont.data("timeout"); window.clearTimeout(t); cont.removeData("timeout"); var i = cont.data("interval"); if (i) { window.clearInterval(i); cont.removeData("interval"); } if (config["resumeAdvanceTimeout"]) { var t = window.setTimeout(function() { var i = window.setInterval(function() { Advance(cont); }, config['advanceInterval']); cont.data("interval", i); }, config["resumeAdvanceTimeout"]); cont.data("timeout", t); } } if (cont.data("busy") || $(this).hasClass("active")) return false; if ($(this).hasClass("previous")) { Advance(cont, -1); } else if ($(this).hasClass("next")) { Advance(cont); } else { Advance(cont, parseInt($(this).text())); } return false; }) .find("a").css("outline-style", "none"); var padding = Math.floor((nav.innerWidth() - width) / 2); nav.css({ left: null, top: null, paddingLeft: padding}); return true; } function Advance(cont, num) { cont = $(cont); if (cont.data("busy")) return; cont.data("busy", true); var slide = cont.find("ul.slides li.active"); var nextSlide; if (num == -1) nextSlide = slide.prev(); else if (!num) nextSlide = slide.next(); else nextSlide = cont.find("ul.slides li:nth(" + (num - 1) + ")") if (!nextSlide.length) { if (num == -1) nextSlide = cont.find("ul.slides li:last"); else nextSlide = cont.find("ul.slides li:first"); } var nav = cont.find("ul.nav li.active"); var nextNav; if (num == -1) nextNav = nav.prev("[class!=previous]"); else if (!num) nextNav = nav.next("[class!=next]"); else nextNav = cont.find("ul.nav li:contains(" + num + ")") if (!nextNav.length) { if (num == -1) nextNav = cont.find("ul.nav li:nth(" + (cont.find("ul.nav li").length - 2) + ")") else nextNav = cont.find("ul.nav li:nth(1)"); } if (!config["transition"]) { slide.css("opacity", 0).removeClass("active"); nextSlide.addClass("active"); nav.removeClass("active"); nextNav.addClass("active"); nextSlide.css("opacity", 100); cont.removeData("busy"); } else if (config["transition"] == "fade") { slide.fadeOut("fast", function() { $(slide).removeClass("active"); nextSlide.addClass("active"); nav.removeClass("active"); nextNav.addClass("active"); nextSlide.fadeTo(config["transitionSpeed"], 1, function() { if ($.browser.msie) this.style.removeAttribute('filter'); cont.removeData("busy"); }); }); } else if (config["transition"] == "slide") { var dir = ""; if (num == -1) dir = "+="; else if (!num) dir = "-="; else if (parseInt(nav.text()) < parseInt(nextNav.text())) dir = "-="; else if (parseInt(nav.text()) > parseInt(nextNav.text())) dir = "+="; var width = slide.outerWidth(); nextSlide.addClass("active").css("opacity", 100); if ($.browser.msie) nextSlide.get(0).style.removeAttribute('filter'); if (dir == "-=") { nextSlide.css("left", width); } else if (dir == "+=") { nextSlide.css("left", width * -1); } slide.add(nextSlide).animate( { left: dir + width }, config["transitionSpeed"], "swing", function() { slide.add(nav).removeClass("active"); nextNav.addClass("active"); cont.removeData("busy"); } ) } } }; })(jQuery);