/** * jquery.scrollable 1.0.2. Put your HTML scroll. * * Copyright (c) 2009 Tero Piirainen * http://flowplayer.org/tools/scrollable.html * * Dual licensed under MIT and GPL 2+ licenses * http://www.opensource.org/licenses * * Launch : March 2008 * Version : 1.0.2 - Tue Feb 24 2009 10:52:04 GMT-0000 (GMT+00:00) */ (function($){ function fireEvent(opts,name,self,arg){ var fn=opts[name]; if($.isFunction(fn)){ try{ return fn.call(self,arg); }catch(error){ if(opts.alert){ alert("Error calling scrollable."+name+": "+error); } else{ throw error; } return false; } } return true; } var current=null; function Scrollable(root,conf){ var self=this; if(!current){ current=self; } var horizontal=!conf.vertical; var wrap=$(conf.items,root); var index=0; var navi=root.siblings(conf.navi).eq(0); var prev=root.siblings(conf.prev).eq(0); var next=root.siblings(conf.next).eq(0); var prevPage=root.siblings(conf.prevPage).eq(0); var nextPage=root.siblings(conf.nextPage).eq(0); $.extend(self,{ getVersion:function(){ return[1,0,1]; }, getIndex:function(){ return index; }, getConf:function(){ return conf; }, getSize:function(){ return self.getItems().size(); }, getPageAmount:function(){ return Math.ceil(this.getSize()/conf.size); }, getPageIndex:function(){ return Math.ceil(index/conf.size); }, getRoot:function(){ return root; }, getItemWrap:function(){ return wrap; }, getItems:function(){ return wrap.children(); }, seekTo:function(i,time,fn){ time=time||conf.speed; if($.isFunction(time)){ fn=time; time=conf.speed; } if(i<0){ i=0; } if(i>self.getSize()-conf.size){ return self; } var item=self.getItems().eq(i); if(!item.length){ return self; } if(fireEvent(conf,"onBeforeSeek",self,i)===false){ return self; } if(horizontal){ var left=-(item.outerWidth(true)*i); wrap.animate({left:left},time,conf.easing,fn?function(){ fn.call(self); }:null); }else{ var top=-(item.outerHeight(true)*i); wrap.animate({top:top},time,conf.easing,fn?function(){ fn.call(self); }:null); } if(navi.length){ var klass=conf.activeClass; var page=Math.ceil(i/conf.size); page=Math.min(page,navi.children().length-1); navi.children().removeClass(klass).eq(page).addClass(klass); } if(i===0){ prev.add(prevPage).addClass(conf.disabledClass); }else{ prev.add(prevPage).removeClass(conf.disabledClass); } if(i>=self.getSize()-conf.size){ next.add(nextPage).addClass(conf.disabledClass); }else{ next.add(nextPage).removeClass(conf.disabledClass); } current=self; index=i; fireEvent(conf,"onSeek",self,i); document.cookie = 'jquery.scrollable = ' + index; return self; }, move:function(offset,time,fn){ var to=index+offset; if(conf.loop&&to>(self.getSize()-conf.size)){ to=0; } return this.seekTo(to,time,fn); }, next:function(time,fn){ return this.move(1,time,fn); }, prev:function(time,fn){ return this.move(-1,time,fn); }, movePage:function(offset,time,fn){ return this.move(conf.size*offset,time,fn); }, setPage:function(page,time,fn){ var size=conf.size; var index=size*page; var lastPage=index+size>=this.getSize(); if(lastPage){ index=this.getSize()-conf.size; } return this.seekTo(index,time,fn); }, prevPage:function(time,fn){ return this.setPage(this.getPageIndex()-1,time,fn); }, nextPage:function(time,fn){ return this.setPage(this.getPageIndex()+1,time,fn); }, begin:function(time,fn){ return this.seekTo(0,time,fn); }, end:function(time,fn){ return this.seekTo(this.getSize()-conf.size,time,fn); }, reload:function(){ return load(); }, click:function(index,time,fn){ var item=self.getItems().eq(index); var klass=conf.activeClass; if(!item.hasClass(klass)&&(index>=0||indexself.getSize()-conf.size){ to--; } if(to!==index){ return this.seekTo(to,time,fn); } } return self; } }); var cookie = document.cookie; var name = 'jquery.scrollable='; var start = cookie.indexOf(name, 0); if(start != -1) { start += name.length; var end = cookie.indexOf(';', start); if(end == -1) { end = cookie.lenght; } var i = cookie.substring(start, end); self.move(parseInt(i), conf.interval / 5); } if($.isFunction($.fn.mousewheel)){ root.bind("mousewheel.scrollable",function(e,delta){ var step=$.browser.opera?1:-1; self.move(delta>0?step:-step,50); return false; }); } prev.addClass(conf.disabledClass).click(function(){ self.prev(); }); next.click(function(){ self.next(); }); nextPage.click(function(){ self.nextPage(); }); prevPage.addClass(conf.disabledClass).click(function(){ self.prevPage(); }); if(conf.keyboard){ $(window).unbind("keypress.scrollable").bind("keypress.scrollable",function(evt){ var el=current; if(!el){ return; } if(horizontal&&(evt.keyCode==37||evt.keyCode==39)){ el.move(evt.keyCode==37?-1:1); return evt.preventDefault(); } if(!horizontal&&(evt.keyCode==38||evt.keyCode==40)){ el.move(evt.keyCode==38?-1:1); return evt.preventDefault(); } return true; }); } function load(){ navi.each(function(){ var nav=$(this); if(nav.is(":empty")||nav.data("me")==self){ nav.empty(); nav.data("me",self); for(var i=0;i").attr("href",i).click(function(e){ var el=$(this); el.parent().children().removeClass(conf.activeClass); el.addClass(conf.activeClass); self.setPage(el.attr("href")); return e.preventDefault(); }); if(i===0){ item.addClass(conf.activeClass); } nav.append(item); } }else{ var els=nav.children(); els.each(function(i){ var item=$(this); item.attr("href",i); if(i===0){ item.addClass(conf.activeClass); } item.click(function(){ nav.find("."+conf.activeClass).removeClass(conf.activeClass); item.addClass(conf.activeClass); self.setPage(item.attr("href")); }); }); } }); if(conf.clickable){ self.getItems().each(function(index,arg){ var el=$(this); if(!el.data("set")){ el.bind("click.scrollable",function(){ self.click(index); }); el.data("set",true); } }); } if(conf.hoverClass){ self.getItems().hover(function(){ $(this).addClass(conf.hoverClass); }, function(){ $(this).removeClass(conf.hoverClass); }); } return self; } load(); var timer=null; function setTimer(){ timer=setInterval(function(){ self.next(); },conf.interval); } if(conf.interval>0){ root.hover(function(){ clearInterval(timer); }, function(){ setTimer(); }); setTimer(); } } jQuery.prototype.scrollable=function(conf){ var api=this.eq(typeof conf=='number'?conf:0).data("scrollable"); if(api){ return api; } var opts={ size:5, vertical:false, clickable:true, loop:false, interval:0, speed:400, keyboard:true, activeClass:'active', disabledClass:'disabled', hoverClass:null, easing:'swing', items:'.items', prev:'.prev', next:'.next', prevPage:'.prevPage', nextPage:'.nextPage', navi:'.navi', naviItem:'a', onBeforeSeek:null, onSeek:null, alert:true }; $.extend(opts,conf); this.each(function(){ var el=new Scrollable($(this),opts); $(this).data("scrollable",el); }); return this; }; }) (jQuery);