/* author: ab, date: 07/13/2011 */ /* modified: eu, date: 12/01/2011, purpose: changed self.options.interval casting to interpret msecs and secs */ ;(function($) { $.widget("ma.bannerize", { options: { interval: 5, auto: true, shuffle: false, startat: 0, overlay: true, classname: '' }, _create: function(){ var self = this; // global reference to widget object self.rotating = self.options.auto; // banner element self.element.addclass('ui-banner ' + self.options.classname); // banner slides self.slides = self.element.find('ul:eq(0)') .addclass('ui-banner-slides'); // banner slogans self.slogans = self.element.find('ul:eq(1)') .addclass('ui-banner-slogans') .delegate('li', 'click.bannerize', function(event){ event.preventdefault(); var $obj = $(this); self.queue("stop"); if(!$obj.hasclass('ui-banner-slogans-current') && !$obj.hasclass('ui-banner-slogans-prev')){ self._rotate($obj.prevuntil('.ui-banner-slogans-current').length + 1, "next"); } }); if(self.options.shuffle){ self._shuffle(); self.options.startat = 0; } // left arrow self.arrowprev = $('', { href: '#' }) .addclass('ui-banner-arrow ui-banner-arrow-prev png_bg') .bind('click', function(event){ event.preventdefault(); self.queue("stop"); self._rotate(1, "prev"); }) .appendto(self.element); // right arrow self.arrownext = $('', { href: '#' }) .addclass('ui-banner-arrow ui-banner-arrow-next png_bg') .bind('click', function(event){ event.preventdefault(); self.queue("stop"); self._rotate(1, "next"); }) .appendto(self.element); self.arrows = $([]).pushstack([self.arrowprev[0], self.arrownext[0]]); self.overlay = $('
'); if(self.options.overlay){ self.overlay.appendto(self.element); } if(self.slides.children().length !== self.slogans.children().length){ // ensure banners and slogans have the same amount self.element.hide(); self.destroy(); } if(!self.slides.children(':eq(' + self.options.startat + ')').length){ // ensure the start at specifed exists self._setoption("startat", 0); } self.slides .children(':eq(' + self.options.startat + ')') .addclass('ui-banner-current ui-banner-slides-current') .next() .addclass('ui-banner-next ui-banner-slides-next') .end() .filter(function(i){ if(!self.options.startat){ self.slides .children(':last') .detach() .prependto(self.slides); } return true; }) .prev() .addclass('ui-banner-prev ui-banner-slides-prev'); self.slogans .children(':eq(' + self.options.startat + ')') .addclass('ui-banner-current ui-banner-slogans-current') .next() .addclass('ui-banner-next ui-banner-slogans-next') .end() .filter(function(i){ if(!self.options.startat){ self.slogans .children(':last') .detach() .prependto(self.slogans); } return true; }) .prev() .addclass('ui-banner-prev ui-banner-slogans-prev') .each(function(i, v){ var $obj = $(this); $obj.css('margintop', ($obj.outerheight() * -1) + 'px'); }); $('body').bind('keypress.bannerize', function(event){ // listen for keypress' that are left or right arrow if(/^(input|textarea)$/i.test(event.target.nodename)){ return; } if([37,39].indexof(event.keycode) !== -1){ self.queue("stop"); self._rotate(1, (event.keycode === 37) ? "prev" : "next"); } }); self.options.interval = self.options.interval.tostring().split(".")[0].length < 4 ? self.options.interval * 1000 : self.options.interval; if(self.options.auto){// start the queue self.queue("start"); } }, _shuffle: function(){ var self = this, pos, len, $slides = self.slides.children(), slides = [], $slogans = self.slogans.children(), slogans = []; while (len = $slides.length, len > 0){ pos = parseint(math.random() * len); slides.push($slides[pos]); slogans.push($slogans[pos]); $slides = $slides.filter(':not(:eq(' + pos + '))'); $slogans = $slogans.filter(':not(:eq(' + pos + '))'); } self.slides .empty() .append($([]).pushstack(slides)); self.slogans .empty() .append($([]).pushstack(slogans)); return; }, queue: function(action){ var self = this; if(action === "start"){ self.element .bind("rotate.bannerize", function(event){ var $obj = $(this); $obj .delay(self.options.interval, "rotate") .queue("rotate", function(next){ $obj.trigger("rotate"); next(); }); self._rotate(1, "next"); }) .delay(self.options.interval, "rotate") .queue("rotate", function(next){ var $obj = $(this); $obj.trigger("rotate"); next(); }) .dequeue("rotate"); self.rotating = true; } else{ self.element .unbind("rotate.bannerize") .clearqueue("rotate"); self.rotating = false; } }, _rotate: function(step, direction){ var self = this; if(self.sliding){ return; } (direction === "prev") ? self._slideback(step) : self._slideforward(step); }, _slideback: function(step){ var self = this; self.slides.queue("banner", function(next){ self.sliding = true; next(); }); for(var a = 1; a <= step; a++){ self.slides .queue("banner", function(next){ self.slides .children('.ui-banner-next') .removeclass('ui-banner-next ui-banner-slides-next') .css('left', ''); self.slogans .children('.ui-banner-next') .removeclass('ui-banner-next ui-banner-slogans-next') .css('left', ''); next(); }) .queue("banner", function(next){ self.slogans .children('.ui-banner-current') .toggleclass('ui-banner-current ui-banner-slogans-current ui-banner-next ui-banner-slogans-next') .end() .children('.ui-banner-prev') .animate({ margintop: '0px' }, 250, function(){ $(this).toggleclass('ui-banner-prev ui-banner-slogans-prev ui-banner-current ui-banner-slogans-current'); next(); }); self.slides .children('.ui-banner-current') .each(function(i, v){ var $obj = $(this); $obj.animate({ left: '+=' + $obj.width() + 'px' }, 250, function(){ $obj .toggleclass('ui-banner-current ui-banner-slides-current ui-banner-next ui-banner-slides-next') .css('left', ''); }) }) .end() .children('.ui-banner-prev') .animate({ left: '0px' }, 250, function(){ $(this) .toggleclass('ui-banner-prev ui-banner-slides-prev ui-banner-current ui-banner-slides-current') .css('left', ''); next(); }); }) .queue("banner", function(next){ self.slogans .children(':last') .addclass('ui-banner-prev ui-banner-slogans-prev') .each(function(i, v){ var $obj = $(this); $obj.css('margintop', ($obj.outerheight() * -1) + 'px'); }) .detach() .prependto(self.slogans); self.slides .children(':last') .addclass('ui-banner-prev ui-banner-slides-prev') .detach() .prependto(self.slides); next(); }) .queue("banner", function(next){ self.rotating = false; next(); }); } self.slides .queue("banner", function(next){ self.sliding = false; self._trigger("rotateback"); self._trigger("rotate"); next(); }) .dequeue("banner"); }, _slideforward: function(step){ var self = this; self.slides.queue("banner", function(next){ self.sliding = true; next(); }); for(var a = 1; a <= step; a++){ self.slides .queue("banner", function(next){ self.slides .children('.ui-banner-prev') .removeclass('ui-banner-prev ui-banner-slides-prev') .css('left', '') .detach() .appendto(self.slides); self.slogans .children('.ui-banner-prev') .removeclass('ui-banner-prev ui-banner-slogans-prev') .css('margintop', '') .detach() .appendto(self.slogans); next(); }) .queue("banner", function(next){ self.slogans .children('.ui-banner-current') .each(function(i, v){ var $obj = $(this); $obj.animate({ margintop: ($obj.outerheight() * -1) + 'px' }, 250, function(){ $obj.toggleclass('ui-banner-current ui-banner-slogans-current ui-banner-prev ui-banner-slogans-prev'); }); }) .end() .children('.ui-banner-next') .toggleclass('ui-banner-next ui-banner-slogans-next ui-banner-current ui-banner-slogans-current') .next() .addclass('ui-banner-next ui-banner-slogans-next'); self.slides .children('.ui-banner-current') .each(function(i, v){ var $obj = $(this); $obj.animate({ left: '-=' + $obj.width() + 'px' }, 250, function(){ $obj.toggleclass('ui-banner-current ui-banner-slides-current ui-banner-prev ui-banner-slides-prev'); }) }) .end() .children('.ui-banner-next') .animate({ left: '0px' }, 250, function(){ $(this) .toggleclass('ui-banner-next ui-banner-slides-next ui-banner-current ui-banner-slides-current') .next() .addclass('ui-banner-next ui-banner-slides-next'); next(); }); }); } self.slides .queue("banner", function(next){ self.sliding = false; self._trigger("rotatenext"); self._trigger("rotate"); next(); }) .dequeue("banner"); }, _setoption: function(key, value) { var self, oldvalue = self.options[key]; switch(key){ case "classname": self.element.toggleclass(this.options.classname + " " + value); break; case "interval": value = value.tostring().split(".")[0].length < 4 ? value * 1000 : value; break; } $.widget.prototype._setoption.apply(self, arguments); // call the base _setoption method self._trigger("setoption", { type: "setoption" }, { // trigger a callback when options change incase the user wants that option: key, original: oldvalue, current: value }); }, destroy: function(){ // undo everything var self = this; $(document).unbind("keypress.bannerize"); self.element .clearqueue("rotate") .unbind("rotate.bannerize") .removeclass('ui-banner ' + self.options.classname); self.slides .removeclass('ui-banner-slides') .children() .removeclass('ui-banner-current ui-banner-slides-current ui-banner-prev ui-banner-slides-prev ui-banner-next ui-banner-slides-next'); self.slogans .removeclass('ui-banner-slogans') .undelegate('li', 'click.bannerize') .children() .removeclass('ui-banner-current ui-banner-slides-current ui-banner-prev ui-banner-slides-prev ui-banner-next ui-banner-slides-next'); self.arrows.remove(); self.overlay.remove(); $.widget.prototype.destroy.call(self); } }); })(jquery);