/**
 * jquery.scrollable 1.0.1. 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.1 - Mon Jan 26 2009 12:49:15 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);
}
fireEvent(conf,"onSeek",self,i);
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;
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||index<this.getSize())){

self.getItems().removeClass(klass);
item.addClass(klass);
var delta=Math.floor(conf.size/2);
var to=index-delta;
if(to>self.getSize()-conf.size){

to--;
}
if(to!==index){

return this.seekTo(to,time,fn);
}
}
return self;
}
}
);
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<self.getPageAmount();
i++){

var item=$("<"+conf.naviItem+"/>").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);

