Carousel = new Class({
	options: {
		width: window.getSize().x-100,
		height: 390,
		itemWidth: 525,
		itemHeight: 390,
		zoom: 0.75,
		zoomOffset: 5,
		duration: 500,
		fps: 50,
		resize: true
	},
	
	Implements: [Options,Events],
	
	initialize: function(container,subcontainer,elements,options) {
		this.items = [];
		this.dimensions = [];
		this.container = $(container);
		this.subcontainer = $(subcontainer);
		/*this.keyboard = new Keyboard({
			events: { 
				'left': this.prev.bind(this), 
				'right': this.next.bind(this)
			}
		});*/
		
		this.setOptions(options);
		$$(elements).each(function(el){
			this.add(el);
		}.bind(this));
		
		for(var i=0;i<this.items.length;i++){
			this.dimensions[i] = {
				i: i,
				x: ((this.options.width-this.options.itemWidth)/(this.items.length-1))*i,
				y: 0,
				w: this.options.itemWidth,
				h: this.options.itemHeight,
				z: 50-Math.abs(i-Math.floor(this.items.length/2)),
				p: 1-((Math.min(Math.abs(i-Math.floor(this.items.length/2)), this.options.zoomOffset)/this.options.zoomOffset)*(1-this.options.zoom))
			};
		};
		
		this.subcontainer.setStyles({
			'width':       this.options.width,
			'height':      this.options.height,
			'margin-left': (this.options.width/-2)
		});
		$$(elements).each(function(el){
			el.setStyle('left',(this.options.width/2)-(this.options.itemWidth/2));
		}.bind(this));
		
		this.current = Math.floor(this.items.length/2);
		
		this.start();
	},
	next: function(){
		for(var i=0;i<this.items.length;i++){
			this.items[i].index = (this.items[i].index==this.items.length-1 ? 0 : this.items[i].index+1);
		}
		this.start(1);
		//this.goto(this.current+1);
	},
	prev: function(){
		for(var i=0;i<this.items.length;i++){
			this.items[i].index = (this.items[i].index==0 ? this.items.length-1 : this.items[i].index-1);
		}
		this.start(-1);
	},
	goto: function(n){
		
	},
	filter: function(){
		
	},
	add: function(el){
		this.items.push(new Carousel.Item(el, this))
	},
	start: function(dir){
		this.items.each(function(item, i){
			item.move(dir);
		});
	}
	
});

Carousel.Item = new Class({
	
	Implements: Events,
	
	initialize: function(element, carousel) {
		this.element = element;
		this.carousel = carousel;
		this.index = this.carousel.items.length;
		this.fxElement = new Fx.Morph(this.element, {fps:this.carousel.options.fps, duration:this.carousel.options.duration,transition:Fx.Transitions.Quad.easeInOut});
		this.fxImage = new Fx.Morph(this.element.getElement('img'), {fps:this.carousel.options.fps, duration:this.carousel.options.duration,transition:Fx.Transitions.Quad.easeInOut});
		this.options = this.carousel.options;
		this.x = 0;
		this.y = 0;
		this.w = element.getSize().x;
		this.h = element.getSize().y;
		this.dimensions = {};
		if(this.options.shadow){
			this.element.getElement('img').addClass('shadow');
		}
	},
	move: function(dir){
		this.dimensions = this.carousel.dimensions[this.index];
		if(this.options.resize){
			this.fxImage.start({
				'margin-left': Math.ceil((this.dimensions.w-(this.dimensions.w*this.dimensions.p))/2),
				'margin-top':  Math.ceil((this.dimensions.h-(this.dimensions.h*this.dimensions.p))/2),
				'width':       Math.ceil(this.dimensions.w*this.dimensions.p),
				'height':      Math.ceil(this.dimensions.h*this.dimensions.p)
			});
			this.fxElement.start({
				'left':    this.dimensions.x,
				//'top':     this.dimensions.y,
				//'width':       Math.ceil(this.dimensions.w*this.dimensions.p),
				//'height':      Math.ceil(this.dimensions.h*this.dimensions.p),
				'z-index': this.dimensions.z
			});	
		}else{
			this.fxImage.start({
				'margin-left': Math.ceil((this.dimensions.w-(this.dimensions.w*this.dimensions.p))/2),
				'margin-top':  Math.ceil((this.dimensions.h-(this.dimensions.h*this.dimensions.p))/2)
				//'width':       Math.ceil(this.dimensions.w*this.dimensions.p),
				//'height':      Math.ceil(this.dimensions.h*this.dimensions.p)
			});
			this.fxElement.start({
				'left':    this.dimensions.x,
				//'top':     this.dimensions.y,
				'width':       Math.ceil(this.dimensions.w*this.dimensions.p),
				'height':      Math.ceil(this.dimensions.h*this.dimensions.p),
				'z-index': this.dimensions.z
			});
		}
	}
});
