var Rating = new Class({

	initialize: function(rating_box, containerbox) {
		this.box = $(rating_box);
		this.container = $(containerbox);
		var reldata = this.box.getProperty('rel').split(' ');
		this.MAXWIDTH = 109;
		this.MAXHEIGHT = 22;
		
		this.current_rating = reldata[0];
		this.initial = this.current_rating;
		this.given_rating = this.current_rating;
		this.ratingtype = reldata[1];
		this.ratingid = reldata[2];
		this.xs = ((reldata[3] != "xs:0") ? reldata[3].split(':').pop() : false);
		this.left_offset = 0;
		
		this.outline = this.box.getElement('img.detect');
		this.filled = this.box.getElement('img.over');
		this.basic = this.box.getElement('img.under');
		
		this.safe = {'left':0,'right':0};
		
		this.graduations = [
			10,
			21,
			31,
			43,
			53,
			65,
			75,
			87,
			97,
			this.MAXWIDTH
		];
		
		this.outline.addEvent('mousemove',this.detectRating.bind(this));
		this.outline.addEvent('mouseleave',this.resetRating.bind(this));
		this.outline.addEvent('click',this.rate.bind(this));
		
		this.showRating(this.initial);
	},
	
	resetRating: function() {
		this.showRating(this.given_rating);
	},
	
	showRating: function(rating) {
		var right = this.graduations[rating-1];
		this.filled.setStyle('clip','rect(0px,'+((rating != 0) ? right : 0 )+'px,'+this.MAXHEIGHT+'px,0px)');
	},
	
	parseRating: function(real_x) {
		var current = 0; var iter = 0; var last = 0;
		if (real_x < this.graduations[0])
			current = 1;
		else
		{
			this.graduations.each(function(pos){
				last = pos;
				if (real_x < parseInt(pos) && current == 0) 
				{
					current = iter+1;	// Take advantage of fencepost error to get the right offset
				}
				
				iter += 1;
			},this);
		}
		return current;
		
	},
	
	detectRating: function(event) {
		var real_x = parseInt(event.client.x - event.target.getPosition().x);
		real_x = parseInt(real_x);
		/*if (Client.Engine.ie6)
			real_x += 18;*/
		//debug('client_x:'+event.client.x+' left:'+event.target.getPosition().x+' new_rel_x:'+real_x);
		
		/*this.box.getElement('span').innerHTML = 'rx:'+real_x+' cx:'+event.client.x+' tx:'+event.target.getPosition().x;*/
		if (real_x < this.safe.left || real_x > this.safe.right)
		{
			var rating = this.parseRating(real_x);
			if (rating != 0)
			{
				this.safe.left = ((rating > 1) ? this.graduations[rating-2] : 0);
				this.safe.right = ((rating < 10) ? this.graduations[rating-1] : this.MAXWIDTH);
				this.showRating(rating);
				this.on = rating;
			}
		}
	},
	
	rate: function() {
		var url = "?guimode=ajax&plugin=Rating&action=do-rating";
		this.given_rating = this.on;
		var postBody = Object.toQueryString({ rid: this.ratingid, rtype: this.ratingtype, rvalue: this.given_rating, xs: this.xs });
		
		var fader = this.box.getElement('span');
		var fx = fader.effects({wait: false, duration: 300, transition: Fx.Transitions.Quart.easeOut });
		var self = this;
		this.is_busy_fading = true;
		fx.start({
				'opacity': 0.05
		}).chain(function(){
			fader.setHTML("Thank you!");
			// Become opaque, after waiting a second
			this.start({
				'opacity': 1
			});
		}).chain(function(){
			self.is_busy_fading = false;
		});
		
		new Ajax(url, { 
			 method: "post", 
			 data: postBody,
			 onComplete: this.receive.bind(this)
		}).request();
	},
	
	receive: function(ajax) {
		if (this.is_busy_fading)
		{
			setTimeout(this.receive.pass(ajax,this), 100);
			return;
		}
		ajax = ajax.trim();
		var breakdown = ajax.split(" ");
		var new_rating = breakdown.shift();
		var new_count = breakdown.join(" ");
		
		this.current_rating = new_rating;
		this.frozen = false;
		this.resetRating();
		
		var content = '<b>'+new_rating+'</b> ( '+new_count+' )';
		
		var rtv = this.rating_type_visual;
		var fader = this.box.getElement('span');
		var fx = fader.effects({ wait: true, duration: 300, transition: Fx.Transitions.Quart.easeOut });
		var self = this;
		fx.start({
				'opacity': 0.05
		}).chain(function(){
			fader.setHTML(content);
			
			this.start({
				'opacity': 1
			}); 
		});
	}

});
