Glider = Class.create();

	Object.extend(Object.extend(Glider.prototype,Abstract.prototype),
	{
		initialize:function(d,b)
		{
			this.scrolling=false;
			this.clicked=null;
			this.selectedTab=null;
			this.wrapper=$(d);
			this.scroller=this.wrapper.down("div.scroller");
			this.sections=this.wrapper.select("div.section");
			this.options=Object.extend({duration:1,frequency:3},b||{});
			this.sections.each(function(f,e){f._index=e});
			this.events={click:this.click.bindAsEventListener(this)};
			this.addObservers();
			
			if(this.options.initialSection)
			{
				if(this.options.selectedTab)
				{
					this.selectedTab=$(this.options.selectedTab)
				}
				this.moveTo(this.options.initialSection,this.scroller,{duration:this.options.duration})
			}
			
			if(this.options.autoGlide)
			{
				this.start()
			}
			
			var a=$(this.options.arrowNext);
			
			if(a)
			{
				this.arrowNext=a;
				Event.observe(a,"click",this.next.bindAsEventListener(this))
			}
			
			var c=$(this.options.arrowPrevious);
			
			if(c)
			{
				this.arrowPrevious=this.wrapper.select("div.arrowPrevious");
				Event.observe(c,"click",this.previous.bindAsEventListener(this))
			}
		},
		
		addObservers:function()
		{
			var a=this.wrapper.getElementsBySelector("div.controls a");
			a.invoke("observe","click",this.events.click)
		},
		
		click:function(b)
		{
			this.stop();
			var a=Event.findElement(b,"a");
			this.selectedTab=a.ancestors()[0];
			
			if(this.scrolling)
			{
				this.scrolling.cancel()
			}
			
			var x = a.href.split("#table_0")[1];
			this.x = x;
			
			this.moveTo(a.href.split("#")[1],this.scroller,{duration:this.options.duration});
			
			Event.stop(b)},moveTo:function(a,e,c)
			{
				this.current=$(a);
				Position.prepare();
				var d=Position.cumulativeOffset(e),b=Position.cumulativeOffset($(a));
				this.scrolling=new Effect.SmoothScroll(e,{duration:c.duration,x:(b[0]-d[0]),y:(b[1]-d[1])});
				this.activeCurrent();
				return false
			},
			
			activeCurrent:function()
			{
				if(this.options.activeSection&&this.selectedTab!=null)
				{
					this.cleanTabs();
					this.selectedTab.addClassName(this.options.activeSection)
				}
				
			},
			
			cleanTabs:function()
			{
				if(this.selectedTab)
				{
					var b=this.selectedTab.siblings();
					var c=b.size();
					for(var a=0;a<c;a++)
					{
						b[a].removeClassName(this.options.activeSection)
					}
				}
			},
		
		markNextClicked:function(b,a)
		{
			if(this.selectedTab)
			{
				if(b<a)
				{
					var c=this.selectedTab.nextSiblings();
					this.selectedTab=c[a-b-1]
				}
				else
				{
					if(b>a)
					{
						var c=this.selectedTab.previousSiblings();
						this.selectedTab=c[b-a-1];
					}
				}
			}
		},
		
		next:function()
		{
			if(this.current)
			{
				var b=this.current._index;
				var a=(this.sections.length-1==b)?0:b+1
			}
			else
			{
				var a=1
			}
			
			var x = a + 1;
			this.x = x;
			
			this.markNextClicked(b,a);
			this.moveTo(this.sections[a],this.scroller,{duration:this.options.duration})
		},
		
		previous:function()
		{
			if(this.current)
			{
				var a=this.current._index;
				var b=(a==0)?this.sections.length-1:a-1
			}
			else
			{
				var b=this.sections.length-1
			}
			
			var x = a - 1;
			this.x = x;
			
			this.markNextClicked(a,b);
			this.moveTo(this.sections[b],this.scroller,{duration:this.options.duration})
		},
		
		stop:function()
		{
			clearTimeout(this.timer)
		},
		
		start:function()
		{
			this.periodicallyUpdate()
		},
		
		periodicallyUpdate:function()
		{
			if(this.timer!=null)
			{
				clearTimeout(this.timer);
				this.next()
			}
			
			this.timer=setTimeout(this.periodicallyUpdate.bind(this),this.options.frequency*1000)
		}
	});
	
	Effect.SmoothScroll=Class.create();
	Object.extend(Object.extend(Effect.SmoothScroll.prototype,Effect.Base.prototype),
	{
		initialize:function(a)
		{
			this.element=$(a);
			var b=Object.extend({x:0,y:0,mode:"absolute"},arguments[1]||{});
			this.start(b)
		},
		
		setup:function()
		{
			if(this.options.continuous&&!this.element._ext)
			{
				this.element.cleanWhitespace();
				this.element._ext=true;
				this.element.appendChild(this.element.firstChild)
			}
			
			this.originalLeft=this.element.scrollLeft;
			this.originalTop=this.element.scrollTop;
			if(this.options.mode=="absolute")
			{
				this.options.x-=this.originalLeft;
				this.options.y-=this.originalTop
			}
		},
		
		update:function(a)
		{
			this.element.scrollLeft=this.options.x*a+this.originalLeft;
			this.element.scrollTop=this.options.y*a+this.originalTop
		}
	});
