/*!
 * jCarousel - Riding carousels with jQuery
 *   http://sorgalla.com/jcarousel/
 *
 * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Inspired by the "Carousel Component" by Bill Scott
 *   http://billwscott.com/carousel/
 */

(function(i)
{
i.fn.jcarousel=function(a)
{
if(typeof a=="string")
{
var c=i(this).data("jcarousel"),b=Array.prototype.slice.call(arguments,1);
return c[a].apply(c,b)
}
else return this.each(function()
{
i(this).data("jcarousel",new h(this,a))
}
)
}
;
var p=
{
vertical:false,rtl:false,start:1,offset:1,size:null,scroll:3,visible:null,animation:"normal",easing:"swing",auto:0,wrap:null,initCallback:null,reloadCallback:null,itemLoadCallback:null,itemFirstInCallback:null,itemFirstOutCallback:null,itemLastInCallback:null, itemLastOutCallback:null,itemVisibleInCallback:null,itemVisibleOutCallback:null,buttonNextHTML:"<div></div>",buttonPrevHTML:"<div></div>",buttonNextEvent:"click",buttonPrevEvent:"click",buttonNextCallback:null,buttonPrevCallback:null,itemFallbackDimension:null
}
,q=false;
i(window).bind("load.jcarousel",function()
{
q=true
}
);
i.jcarousel=function(a,c)
{
this.options=i.extend(
{

}
,p,c||
{

}
);
this.locked=false;
this.buttonPrev=this.buttonNext=this.list=this.clip=this.container=null;
if(!c||c.rtl===undefined)this.options.rtl= (i(a).attr("dir")||i("html").attr("dir")||"").toLowerCase()=="rtl";
this.wh=!this.options.vertical?"width":"height";
this.lt=!this.options.vertical?this.options.rtl?"right":"left":"top";
for(var b="",d=a.className.split(" "),e=0;
e<d.length;
e++)if(d[e].indexOf("jcarousel-skin")!=-1)
{
i(a).removeClass(d[e]);
b=d[e];
break
}
if(a.nodeName.toUpperCase()=="UL"||a.nodeName.toUpperCase()=="OL")
{
this.list=i(a);
this.container=this.list.parent();
if(this.container.hasClass("jcarousel-clip"))
{
if(!this.container.parent().hasClass("jcarousel-container"))this.container= this.container.wrap("<div></div>");
this.container=this.container.parent()
}
else if(!this.container.hasClass("jcarousel-container"))this.container=this.list.wrap("<div></div>").parent()
}
else
{
this.container=i(a);
this.list=this.container.find("ul,ol").eq(0)
}
b!=""&&this.container.parent()[0].className.indexOf("jcarousel-skin")==-1&&this.container.wrap('<div class=" '+b+'"></div>');
this.clip=this.list.parent();
if(!this.clip.length||!this.clip.hasClass("jcarousel-clip"))this.clip=this.list.wrap("<div></div>").parent();
 this.buttonNext=i(".jcarousel-next",this.container);
if(this.buttonNext.size()==0&&this.options.buttonNextHTML!=null)this.buttonNext=this.clip.after(this.options.buttonNextHTML).next();
this.buttonNext.addClass(this.className("jcarousel-next"));
this.buttonPrev=i(".jcarousel-prev",this.container);
if(this.buttonPrev.size()==0&&this.options.buttonPrevHTML!=null)this.buttonPrev=this.clip.after(this.options.buttonPrevHTML).next();
this.buttonPrev.addClass(this.className("jcarousel-prev"));
this.clip.addClass(this.className("jcarousel-clip")).css(
{
overflow:"hidden", position:"relative"
}
);
this.list.addClass(this.className("jcarousel-list")).css(
{
overflow:"hidden",position:"relative",top:0,margin:0,padding:0
}
).css(this.options.rtl?"right":"left",0);
this.container.addClass(this.className("jcarousel-container")).css(
{
position:"relative"
}
);
!this.options.vertical&&this.options.rtl&&this.container.addClass("jcarousel-direction-rtl").attr("dir","rtl");
var f=this.options.visible!=null?Math.ceil(this.clipping()/this.options.visible):null;
b=this.list.children("li");
var g= this;
if(b.size()>0)
{
var j=0;
e=this.options.offset;
b.each(function()
{
g.format(this,e++);
j+=g.dimension(this,f)
}
);
this.list.css(this.wh,j+100+"px");
if(!c||c.size===undefined)this.options.size=b.size()
}
this.container.css("display","block");
this.buttonNext.css("display","block");
this.buttonPrev.css("display","block");
this.funcNext=function()
{
g.next()
}
;
this.funcPrev=function()
{
g.prev()
}
;
this.funcResize=function()
{
g.reload()
}
;
this.options.initCallback!=null&&this.options.initCallback(this,"init");
if(!q&& i.browser.safari)
{
this.buttons(false,false);
i(window).bind("load.jcarousel",function()
{
g.setup()
}
)
}
else this.setup()
}
;
var h=i.jcarousel;
h.fn=h.prototype=
{
jcarousel:"0.2.5"
}
;
h.fn.extend=h.extend=i.extend;
h.fn.extend(
{
setup:function()
{
this.prevLast=this.prevFirst=this.last=this.first=null;
this.animating=false;
this.tail=this.timer=null;
this.inTail=false;
if(!this.locked)
{
this.list.css(this.lt,this.pos(this.options.offset)+"px");
var a=this.pos(this.options.start);
this.prevFirst=this.prevLast=null;
this.animate(a, false);
i(window).unbind("resize.jcarousel",this.funcResize).bind("resize.jcarousel",this.funcResize)
}

}
,reset:function()
{
this.list.empty();
this.list.css(this.lt,"0px");
this.list.css(this.wh,"10px");
this.options.initCallback!=null&&this.options.initCallback(this,"reset");
this.setup()
}
,reload:function()
{
this.tail!=null&&this.inTail&&this.list.css(this.lt,h.intval(this.list.css(this.lt))+this.tail);
this.tail=null;
this.inTail=false;
this.options.reloadCallback!=null&&this.options.reloadCallback(this);
if(this.options.visible!= null)
{
var a=this,c=Math.ceil(this.clipping()/this.options.visible),b=0,d=0;
this.list.children("li").each(function(e)
{
b+=a.dimension(this,c);
if(e+1<a.first)d=b
}
);
this.list.css(this.wh,b+"px");
this.list.css(this.lt,-d+"px")
}
this.scroll(this.first,false)
}
,lock:function()
{
this.locked=true;
this.buttons()
}
,unlock:function()
{
this.locked=false;
this.buttons()
}
,size:function(a)
{
if(a!=undefined)
{
this.options.size=a;
this.locked||this.buttons()
}
return this.options.size
}
,has:function(a,c)
{
if(c==undefined||!c)c= a;
if(this.options.size!==null&&c>this.options.size)c=this.options.size;
for(var b=a;
b<=c;
b++)
{
var d=this.get(b);
if(!d.length||d.hasClass("jcarousel-item-placeholder"))return false
}
return true
}
,get:function(a)
{
return i(".jcarousel-item-"+a,this.list)
}
,add:function(a,c)
{
var b=this.get(a),d=0,e=i(c);
if(b.length==0)
{
var f;
b=this.create(a);
for(var g=h.intval(a);
f=this.get(--g);
)if(g<=0||f.length)
{
g<=0?this.list.prepend(b):f.after(b);
break
}

}
else d=this.dimension(b);
if(e.get(0).nodeName.toUpperCase()=="LI")
{
b.replaceWith(e);
 b=e
}
else b.empty().append(c);
this.format(b.removeClass(this.className("jcarousel-item-placeholder")),a);
e=this.options.visible!=null?Math.ceil(this.clipping()/this.options.visible):null;
d=this.dimension(b,e)-d;
a>0&&a<this.first&&this.list.css(this.lt,h.intval(this.list.css(this.lt))-d+"px");
this.list.css(this.wh,h.intval(this.list.css(this.wh))+d+"px");
return b
}
,remove:function(a)
{
var c=this.get(a);
if(!(!c.length||a>=this.first&&a<=this.last))
{
var b=this.dimension(c);
a<this.first&&this.list.css(this.lt, h.intval(this.list.css(this.lt))+b+"px");
c.remove();
this.list.css(this.wh,h.intval(this.list.css(this.wh))-b+"px")
}

}
,next:function()
{
this.stopAuto();
this.tail!=null&&!this.inTail?this.scrollTail(false):this.scroll((this.options.wrap=="both"||this.options.wrap=="last")&&this.options.size!=null&&this.last==this.options.size?1:this.first+this.options.scroll)
}
,prev:function()
{
this.stopAuto();
this.tail!=null&&this.inTail?this.scrollTail(true):this.scroll((this.options.wrap=="both"||this.options.wrap== "first")&&this.options.size!=null&&this.first==1?this.options.size:this.first-this.options.scroll)
}
,scrollTail:function(a)
{
if(!(this.locked||this.animating||!this.tail))
{
var c=h.intval(this.list.css(this.lt));
!a?c-=this.tail:c+=this.tail;
this.inTail=!a;
this.prevFirst=this.first;
this.prevLast=this.last;
this.animate(c)
}

}
,scroll:function(a,c)
{
this.locked||this.animating||this.animate(this.pos(a),c)
}
,pos:function(a)
{
var c=h.intval(this.list.css(this.lt));
if(this.locked||this.animating)return c;
if(this.options.wrap!= "circular")a=a<1?1:this.options.size&&a>this.options.size?this.options.size:a;
for(var b=this.first>a,d=this.options.wrap!="circular"&&this.first<=1?1:this.first,e=b?this.get(d):this.get(this.last),f=b?d:d-1,g=null,j=0,l=false,k=0;
b?--f>=a:++f<a;
)
{
g=this.get(f);
l=!g.length;
if(g.length==0)
{
g=this.create(f).addClass(this.className("jcarousel-item-placeholder"));
e[b?"before":"after"](g);
if(this.first!=null&&this.options.wrap=="circular"&&this.options.size!==null&&(f<=0||f>this.options.size))
{
e=this.get(this.index(f));
 if(e.length)g=this.add(f,e.clone(true))
}

}
e=g;
k=this.dimension(g);
if(l)j+=k;
if(this.first!=null&&(this.options.wrap=="circular"||f>=1&&(this.options.size==null||f<=this.options.size)))c=b?c+k:c-k
}
d=this.clipping();
var o=[],n=0;
f=a;
var m=0;
for(e=this.get(a-1);
++n;
)
{
g=this.get(f);
l=!g.length;
if(g.length==0)
{
g=this.create(f).addClass(this.className("jcarousel-item-placeholder"));
e.length==0?this.list.prepend(g):e[b?"before":"after"](g);
if(this.first!=null&&this.options.wrap=="circular"&&this.options.size!== null&&(f<=0||f>this.options.size))
{
e=this.get(this.index(f));
if(e.length)g=this.add(f,e.clone(true))
}

}
e=g;
k=this.dimension(g);
if(k==0)throw Error("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");
if(this.options.wrap!="circular"&&this.options.size!==null&&f>this.options.size)o.push(g);
else if(l)j+=k;
m+=k;
if(m>=d)break;
f++
}
for(g=0;
g<o.length;
g++)o[g].remove();
if(j>0)
{
this.list.css(this.wh,this.dimension(this.list)+j+"px");
if(b)
{
c-=j;
this.list.css(this.lt,h.intval(this.list.css(this.lt))- j+"px")
}

}
j=a+n-1;
if(this.options.wrap!="circular"&&this.options.size&&j>this.options.size)j=this.options.size;
if(f>j)
{
n=0;
f=j;
for(m=0;
++n;
)
{
g=this.get(f--);
if(!g.length)break;
m+=this.dimension(g);
if(m>=d)break
}

}
f=j-n+1;
if(this.options.wrap!="circular"&&f<1)f=1;
if(this.inTail&&b)
{
c+=this.tail;
this.inTail=false
}
this.tail=null;
if(this.options.wrap!="circular"&&j==this.options.size&&j-n+1>=1)
{
b=h.margin(this.get(j),!this.options.vertical?"marginRight":"marginBottom");
if(m-b>d)this.tail=m-d-b
}
for(;
a-- > f;
)c+=this.dimension(this.get(a));
this.prevFirst=this.first;
this.prevLast=this.last;
this.first=f;
this.last=j;
return c
}
,animate:function(a,c)
{
if(!(this.locked||this.animating))
{
this.animating=true;
var b=this,d=function()
{
b.animating=false;
a==0&&b.list.css(b.lt,0);
if(b.options.wrap=="circular"||b.options.wrap=="both"||b.options.wrap=="last"||b.options.size==null||b.last<b.options.size)b.startAuto();
b.buttons();
b.notify("onAfterAnimation");
if(b.options.wrap=="circular"&&b.options.size!==null)for(var e= b.prevFirst;
e<=b.prevLast;
e++)if(e!==null&&!(e>=b.first&&e<=b.last)&&(e<1||e>b.options.size))b.remove(e)
}
;
this.notify("onBeforeAnimation");
if(!this.options.animation||c==false)
{
this.list.css(this.lt,a+"px");
d()
}
else this.list.animate(!this.options.vertical?this.options.rtl?
{
right:a
}
:
{
left:a
}
:
{
top:a
}
,this.options.animation,this.options.easing,d)
}

}
,startAuto:function(a)
{
if(a!=undefined)this.options.auto=a;
if(this.options.auto==0)return this.stopAuto();
if(this.timer==null)
{
var c=this;
this.timer=setTimeout(function()
{
c.next()
}
, this.options.auto*1E3)
}

}
,stopAuto:function()
{
if(this.timer!=null)
{
clearTimeout(this.timer);
this.timer=null
}

}
,buttons:function(a,c)
{
if(a==undefined||a==null)
{
a=!this.locked&&this.options.size!==0&&(this.options.wrap&&this.options.wrap!="first"||this.options.size==null||this.last<this.options.size);
if(!this.locked&&(!this.options.wrap||this.options.wrap=="first")&&this.options.size!=null&&this.last>=this.options.size)a=this.tail!=null&&!this.inTail
}
if(c==undefined||c==null)
{
c=!this.locked&&this.options.size!== 0&&(this.options.wrap&&this.options.wrap!="last"||this.first>1);
if(!this.locked&&(!this.options.wrap||this.options.wrap=="last")&&this.options.size!=null&&this.first==1)c=this.tail!=null&&this.inTail
}
var b=this;
this.buttonNext[a?"bind":"unbind"](this.options.buttonNextEvent+".jcarousel",this.funcNext)[a?"removeClass":"addClass"](this.className("jcarousel-next-disabled")).attr("disabled",a?false:true);
this.buttonPrev[c?"bind":"unbind"](this.options.buttonPrevEvent+".jcarousel",this.funcPrev)[c?"removeClass": "addClass"](this.className("jcarousel-prev-disabled")).attr("disabled",c?false:true);
this.options.buttonNextCallback!=null&&this.buttonNext.data("jcarouselstate")!=a&&this.buttonNext.each(function()
{
b.options.buttonNextCallback(b,this,a)
}
).data("jcarouselstate",a);
this.options.buttonPrevCallback!=null&&this.buttonPrev.data("jcarouselstate")!=c&&this.buttonPrev.each(function()
{
b.options.buttonPrevCallback(b,this,c)
}
).data("jcarouselstate",c)
}
,notify:function(a)
{
var c=this.prevFirst==null?"init":this.prevFirst< this.first?"next":"prev";
this.callback("itemLoadCallback",a,c);
if(this.prevFirst!==this.first)
{
this.callback("itemFirstInCallback",a,c,this.first);
this.callback("itemFirstOutCallback",a,c,this.prevFirst)
}
if(this.prevLast!==this.last)
{
this.callback("itemLastInCallback",a,c,this.last);
this.callback("itemLastOutCallback",a,c,this.prevLast)
}
this.callback("itemVisibleInCallback",a,c,this.first,this.last,this.prevFirst,this.prevLast);
this.callback("itemVisibleOutCallback",a,c,this.prevFirst,this.prevLast, this.first,this.last)
}
,callback:function(a,c,b,d,e,f,g)
{
if(!(this.options[a]==undefined||typeof this.options[a]!="object"&&c!="onAfterAnimation"))
{
var j=typeof this.options[a]=="object"?this.options[a][c]:this.options[a];
if(i.isFunction(j))
{
var l=this;
if(d===undefined)j(l,b,c);
else if(e===undefined)this.get(d).each(function()
{
j(l,this,d,b,c)
}
);
else for(var k=d;
k<=e;
k++)k!==null&&!(k>=f&&k<=g)&&this.get(k).each(function()
{
j(l,this,k,b,c)
}
)
}

}

}
,create:function(a)
{
return this.format("<li></li>",a)
}
,format:function(a, c)
{
a=i(a);
for(var b=a.get(0).className.split(" "),d=0;
d<b.length;
d++)b[d].indexOf("jcarousel-")!=-1&&a.removeClass(b[d]);
a.addClass(this.className("jcarousel-item")).addClass(this.className("jcarousel-item-"+c)).css(
{
"float":this.options.rtl?"right":"left","list-style":"none"
}
).attr("jcarouselindex",c);
return a
}
,className:function(a)
{
return a+" "+a+(!this.options.vertical?"-horizontal":"-vertical")
}
,dimension:function(a,c)
{
var b=a.jquery!=undefined?a[0]:a,d=!this.options.vertical?(b.offsetWidth|| h.intval(this.options.itemFallbackDimension))+h.margin(b,"marginLeft")+h.margin(b,"marginRight"):(b.offsetHeight||h.intval(this.options.itemFallbackDimension))+h.margin(b,"marginTop")+h.margin(b,"marginBottom");
if(c==undefined||d==c)return d;
d=!this.options.vertical?c-h.margin(b,"marginLeft")-h.margin(b,"marginRight"):c-h.margin(b,"marginTop")-h.margin(b,"marginBottom");
i(b).css(this.wh,d+"px");
return this.dimension(b)
}
,clipping:function()
{
return!this.options.vertical?this.clip[0].offsetWidth-h.intval(this.clip.css("borderLeftWidth"))- h.intval(this.clip.css("borderRightWidth")):this.clip[0].offsetHeight-h.intval(this.clip.css("borderTopWidth"))-h.intval(this.clip.css("borderBottomWidth"))
}
,index:function(a,c)
{
if(c==undefined)c=this.options.size;
return Math.round(((a-1)/c-Math.floor((a-1)/c))*c)+1
}

}
);
h.extend(
{
defaults:function(a)
{
return i.extend(p,a||
{

}
)
}
,margin:function(a,c)
{
if(!a)return 0;
var b=a.jquery!=undefined?a[0]:a;
if(c=="marginRight"&&i.browser.safari)
{
var d=
{
display:"block","float":"none",width:"auto"
}
,e,f;
i.swap(b,d, function()
{
e=b.offsetWidth
}
);
d.marginRight=0;
i.swap(b,d,function()
{
f=b.offsetWidth
}
);
return f-e
}
return h.intval(i.css(b,c))
}
,intval:function(a)
{
a=parseInt(a);
return isNaN(a)?0:a
}

}
)
}
)(jQuery);


