//by Adrian Carstea
var carousel=new Class.create();
	carousel.prototype = {
			initialize: function(params){
				this.params = params;
				this.carousel = $(this.params.carousel_ID).down("ul");

				this.type = ($(this.params.carousel_ID).hasClassName("vertical")?"vertical":"horizontal");

				this.items = this.carousel.childElements();
				
				this.selectedItem = 1;
				for(var i=0;i<this.items.length;i++){
					if(this.params.callback!==undefined){
						Event.observe(this.items[i],"click",this.callback.bindAsEventListener(this,this.items[i]));
					}
					if(this.items[i].hasClassName("selected")){
						this.selectedItem = i+1;
					}
				}

				this.dimensionsItems=this.items[(this.selectedItem-1)].getDimensions();

				this.chunk_length = parseInt(this.params.chunk_length) || 1;

				this.x=this.y=0;
				
				if(this.type=='horizontal'){
					this.cnt_items_visible=Math.abs($(this.params.carousel_ID).getWidth()/this.dimensionsItems.width);
					$(this.carousel).style.width = (this.dimensionsItems.width * this.items.length) + "px";
				}
				else{
					this.cnt_items_visible=Math.abs($(this.params.carousel_ID).getHeight()/this.dimensionsItems.height);
					$(this.carousel).style.height = (this.dimensionsItems.height * this.items.length) + "px";
				}
				
				this.hidden={"lft":0,"rgt":(this.items.length-this.cnt_items_visible)};
				
				if(this.selectedItem>1){
					if(this.selectedItem>this.cnt_items_visible){
						var selectedchunk=Math.ceil(this.selectedItem/this.chunk_length);
						if(selectedchunk*this.chunk_length>this.items.length){
							var whole_chunk_items=(selectedchunk-1)*this.chunk_length-this.cnt_items_visible;
							this.hidden.rgt=this.hidden.rgt-whole_chunk_items-(this.items.length-(selectedchunk-1)*this.chunk_length);
						}
						else{
							this.hidden.rgt=this.items.length-(selectedchunk*this.chunk_length);
						}
						this.hidden.lft=this.items.length-(this.hidden.rgt+this.cnt_items_visible);
					}

					if(this.type=='horizontal'){
						this.x-=((this.items.length-this.cnt_items_visible)-this.hidden.rgt)*this.dimensionsItems.width;
					}
					else{
						this.y-=((this.items.length-this.cnt_items_visible)-this.hidden.rgt)*this.dimensionsItems.height;
					}
					this.moveTo(this.carousel,this.x,this.y,true);
				}

				this.check_next_prev_availability();

				Event.observe($(this.params.previous),"click",this.previous.bindAsEventListener(this));
				Event.observe($(this.params.next),"click",this.next.bindAsEventListener(this));

				$(this.carousel).style.visibility="visible";
			},
			
			moveTo: function(div,x,y,instant){
				if(this.params.animation){
					if(instant){
						$(div).setStyle({"top":y+"px","left":x+"px"});
					}
					else{
						new Effect.Move($(div), { x: x, y: y, mode: 'absolute',duration: this.params.animation });
					}
				}
				else{
					$(div).setStyle({"top":y+"px","left":x+"px"});
				}

				this.check_next_prev_availability();
			},

			next: function(event){
				var el=event.nodeType==1?event:Event.element(event);
				if(this.hidden.rgt>0){
					if(this.hidden.rgt>=this.chunk_length){
						if(this.type=='horizontal'){
							this.x=this.x-this.chunk_length*this.dimensionsItems.width;
						}
						else{
							this.y=this.y-this.chunk_length*this.dimensionsItems.height;
						}
						this.hidden.rgt-=this.chunk_length;
						this.hidden.lft+=this.chunk_length;
					}
					else{
						if(this.type=='horizontal'){
							this.x=this.x-this.hidden.rgt*this.dimensionsItems.width;
						}
						else{
							this.y=this.y-this.hidden.rgt*this.dimensionsItems.height;
						}
						this.hidden.lft+=this.hidden.rgt;
						this.hidden.rgt-=this.hidden.rgt;
					}
				}
				this.moveTo(this.carousel,this.x,this.y);
			},

			previous: function(event){
				var el=event.nodeType==1?event:Event.element(event);
				if(this.hidden.lft>0){
					if(this.hidden.lft>=this.chunk_length){
						if(this.type=='horizontal'){
							this.x=this.x+this.chunk_length*this.dimensionsItems.width;
						}
						else{
							this.y=this.y+this.chunk_length*this.dimensionsItems.height;
						}
						this.hidden.rgt+=this.chunk_length;
						this.hidden.lft-=this.chunk_length;
					}
					else{
						if(this.type=='horizontal'){
							this.x=this.x+this.hidden.lft*this.dimensionsItems.width;
						}
						else{
							this.y=this.y+this.hidden.lft*this.dimensionsItems.height;
						}
						this.hidden.rgt+=this.hidden.lft;
						this.hidden.lft-=this.hidden.lft;
					}
				}
				
				this.moveTo(this.carousel,this.x,this.y);
			},

			check_next_prev_availability: function(){
				$(this.params.next).style.visibility=this.hidden.rgt>0?"visible":"hidden";
				$(this.params.previous).style.visibility=this.hidden.lft>0?"visible":"hidden";
			},

			callback: function(event){
				var el=event.nodeType==1?event:Event.element(event);
				if(this.params.callback!==undefined){
					eval(this.params.callback+"(arguments[1])");
				}
			}

	}