var MooRevolver = new Class({
		initialize: function(element, options){
			this.setOptions({
				"pad":80,
				"yRadius":-80,
				"centerY":100,
				"border":0,
				"arrowLeft":null,
				"arrowRight":null,
				"fxDuration": 500,
				"fxTransition": Fx.Transitions.Sine.easeInOut,
				"fade":false,
				"minScale":0.5
			}, options);
					
			if($(element)){
			
				if($(this.options.arrowLeft)) {
					$(this.options.arrowLeft).addEvent("click", (function(e){
						new Event(e).stop();
						this.getPrevious();
					}).bind(this));
				}
					
				if($(this.options.arrowRight)) {
					$(this.options.arrowRight).addEvent("click", (function(e){
						new Event(e).stop();
						this.getNext();
					}).bind(this));
				}
				
				this.processing = false;
				this.containerSize = $(element).getSize();
				this.xRadius = (this.containerSize.size.x / 2) - this.options.pad;
				this.yRadius = this.options.yRadius;
				this.centerX = (this.containerSize.size.x / 2);
				this.centerY = this.options.centerY;
				this.minScale = this.options.minScale;
				
				this.items = $(element).getChildren();			
				this.totalItems = this.items.length;
				
				if($(this.options.descriptions)) {
					this.descriptions = $(this.options.descriptions).getChildren();
					if(this.descriptions.length != this.totalItems) {
						alert('Descriptions should match Items!');
					}
				}
				
				this.points = [];
				this.positions = [];
				this.sizes = [];
				this.zIndexes = [];
				this.opacities = [];
							
				for(var i = 0; i < this.totalItems; i++){					
					this.points.push(i);
					var pt = this.getTriplePoint(this.points[i]);
					
					this.items[i].setStyles({
						"left": pt.x,
						"bottom": pt.y
					});
					
					this.processItem(i, this.points[i]);
					this.processDescription(i, this.points[i]);
				}
				
				this.reposition();
				
			} else {
				return;
			}
		},
		
		getNext: function(){
			if (!this.processing) {
				this.processing = true;
				this.rotate(true);
			}
		},
		
		getPrevious: function(){
			if (!this.processing) {
				this.processing = true;
				this.rotate(false);
			}
		},
		
		rotate: function(forward){
			if(!this.processing) return;
	
			if(forward){
				this.items.push(this.items.shift());
				if(this.descriptions) {
					this.descriptions.push(this.descriptions.shift());
				}
			} else {
				this.items.unshift(this.items.pop());
				if(this.descriptions) {
					this.descriptions.unshift(this.descriptions.pop());
				}
			}
			
			var fxArray = [];
			
			for(var i = 0; i < this.totalItems; i++){
				var myEffects = this.items[i].effects({"duration": this.options.fxDuration, "transition": this.options.fxTransition});
				fxArray.push(myEffects);
				if(this.options.fade) {
					myEffects.start({"opacity": this.opacities[i], "bottom": this.positions[i].y, "left": this.positions[i].x, "width": this.sizes[i].x, "height": this.sizes[i].y});
				} else {
					myEffects.start({"bottom": this.positions[i].y, "left": this.positions[i].x, "width": this.sizes[i].x, "height": this.sizes[i].y});
				}
				this.items[i].setStyle("z-index", this.zIndexes[i]);

				if(this.descriptions) {				
					var descriptionFx = this.descriptions[i].effects({"duration": this.options.fxDuration, "transition": this.options.fxTransition});
					fxArray.push(descriptionFx);
					descriptionFx.start({"opacity": i == 0 ? 1 : 0});
				}
			}
			
			var g = new Group(null);
			g.initialize.apply(g, fxArray);
			g.addEvent("onComplete", (function(){ this.processing = false; }).bind(this));
		},
		
		reposition: function() {
			for (var _l = 0; _l < this.totalItems; _l++) {		
				var pt = this.getTriplePoint(this.points[_l]);
				this.positions.push({x: pt.x - ((this.items[_l].getSize().size.x + this.options.border) / 2), y: pt.y});
				
				this.items[_l].setStyles({
					"left": this.positions[_l].x,
					"bottom": this.positions[_l].y
				});
			}
		},
		
		getTriplePoint: function(_d) {
			var _x = this.centerX;
			/*
			if(_d > 0 && _d < this.totalItems / 2) {
				_x += this.xRadius * Math.min(2, _d);
			} else if(_d > 0 && _d >= this.totalItems / 2) {
				_x -= this.xRadius * Math.min(2, this.totalItems - _d);
			}
			*/
			if(_d == 1) {
				_x += this.xRadius;
			} else if (_d != 0 && _d == this.totalItems - 1) {
				_x -= this.xRadius;
			}
			var _y = this.centerY + this.yRadius;
			if(_d > 1 && _d < this.totalItems - 1) {
				_y += 40;
			}
			return {x : _x, y : _y};
		},
		
		processItem: function(_i, deg) {
			var size = 0;      
			var visible = true;
			
			if (deg == 0) {
				size = 1;
			} else if (deg == 1 || deg == this.totalItems - 1) {
				size = this.minScale;
			}
			
			if(visible) {
				this.scaleItem(_i, size);
				this.items[_i].setStyle("z-index", (size * 100).round());
				this.zIndexes.push((size * 100).round());
			}
		},
		
		processDescription: function(_i, deg) {
			var visible = false;
			if (deg == 0) {
				visible = true;
			}
			
			this.descriptions[_i].setStyle("opacity", visible ? 100 : 0);
		},
		
		scaleItem: function(_i, percentage) {
			var _x = ((this.items[_i].getSize().size.x + this.options.border) * percentage);
			var _y = ((this.items[_i].getSize().size.y + this.options.border) * percentage);
			
			this.sizes.push({x: _x, y: _y});
			
			percentage = percentage >= this.minScale ? 1.0 : 1;
			
			this.opacities.push(percentage);
		
			this.items[_i].setStyles({
				"width": _x,
				"height": _y,
				"opacity": this.options.fade ? percentage : 1
			});
		}
	});
	
	MooRevolver.implement(new Options);
	
	window.addEvent("load", function() {
		var revolver = new MooRevolver("book-revolver",
			{"fade": true, "arrowLeft": "book-prev", "arrowRight": "book-next", "descriptions": "book-descriptions",
			"minScale": 0.7});
		// revolver.getNext.periodical(4000, revolver);
	});