var RabidRatings = new Class({

	Implements: Options,
	
	options: {
		url: null,
		leftMargin: 7,  /* The width in pixels of the margin before the stars. */
		starWidth: 23,  /* The width in pixels of each star. */
		starMargin: 5,  /* The width in pixels between each star. */
		scale: 5,       /* It's a five-star scale. */
		snap: 1         /* Will snap to the nearest star (can be made a decimal, too). */
	},
	
	initialize: function(options) {
		
		this.setOptions(options);
		var activeColor = this.options.activeColor;
		var votedColor  = this.options.votedColor;
		var fillColor   = this.options.fillColor;

		$$('.rabidRating').each(function(el) {
		//Does this if the browser is NOT IE6. IE6 users don't deserve fancy ratings. >:(
		if (!Browser.Engine.trident4) {
			el.id = el.getAttribute('id');
			el.wrapper = el.getElement('.wrapper');
			el.textEl = el.getElement('.rbvotes');
			el.offset = el.getPosition().x;
			el.fill = el.getElement('.ratingFill');
			el.starPercent = this.getStarPercent(el.id);
			this.fillVote(el.starPercent, el);
			el.currentFill = this.getFillPercent(el.starPercent);
			el.morphFx = new Fx.Morph(el.fill, {'link':'cancel'});
			el.widthFx = new Fx.Tween(el.fill, {property: 'width', link: 'cancel'});

			el.mouseCrap = function(e) { 
				var fill = e.client.x - el.offset;
				var fillPercent = this.getVotePercent(fill);
				var step = (100 / this.options.scale) * this.options.snap;
				var nextStep = Math.floor(fillPercent / step) + 1;
				this.fillVote(nextStep * step, el);
			}.bind(this);

			el.wrapper.addEvent('mouseenter', function(e) { 
				el.morphFx.start('.rabidRating .ratingActive');
				el.wrapper.addEvent('mousemove', el.mouseCrap);
			});

			el.wrapper.addEvent('mouseleave', function(e) {
				el.removeEvent(el.mouseCrap);
				el.morphFx.start('.rabidRating .ratingFill');
				el.widthFx.start(el.currentFill);
			});

			el.wrapper.addEvent('click', function(e) {
				el.currentFill = el.newFill;
				el.morphFx.start('.rabidRating .ratingVoted');
				el.wrapper.removeEvents();
				el.addClass('ratingVoted');
				el.textEl.addClass('loading');
				var vote = this.getVotePercent(el.newFill) / 100 * this.options.scale;
				if (this.options.url != null) {
					var req = new Request({url:this.options.url+vote+"/",onComplete:el.updateText}).post();	
				}
			}.bind(this));

			el.updateText = function(text) {
				el.textEl.removeClass('loading');
				el.textEl.set('text', text);
			};
		} else {
			el.destroy();
		}
		}.bind(this));
	},

	fillVote: function(percent, el) {
		el.newFill = this.getFillPercent(percent);
		if (this.getVotePercent(el.newFill) > 100) { el.newFill = this.getFillPercent(100); }
		el.fill.setStyle('width', el.newFill);
	},

	getStarPercent: function(id) {
		/* Format = anyStringHere-<id>-<float(currentStars)>_(scale); 
		 * Example: rabidRatings-5-3_5 //Primary key id = 5, 3/5 stars. */
		var stars = id.match(/(\d*\.?\d+)_(\d*\.?\d+)$/);
		var score = stars[1].toFloat();
		var scale = stars[2].toFloat();
		var percent =  (score / scale) * 100;
		return percent;
	},

	getFillPercent: function (starPercent) {
		return (starPercent/100)*((this.options.starWidth+this.options.starMargin)*this.options.scale) + this.options.leftMargin;
	},

	getVotePercent: function(divPosition) {
		var starsWidth = (this.options.starWidth+this.options.starMargin)*this.options.scale;
		var offset = this.options.leftMargin;
		var starPosition = divPosition - this.options.leftMargin;
		var percent = (starPosition / starsWidth * 100).round(2);
		return percent;
	}
});


window.addEvent('domready', function(){
	var rating = new RabidRatings({url:$('rateUrl').get('value')});
	
	var showAll = $('seeAllComments');
	if(showAll){
		var postedComments = new Elements($('postedComments').getElements('div.comment'));
		if(postedComments.length > 0){
			showAll.addEvent('click', function(e){
				new Event(e).stop();
				postedComments.removeClass('dNone');
				showAll.destroy();
			});
		}
	}
	
	var commentForm = $('postComment').getElement('form');
	var submitButton = commentForm.getElement('a.go');
	if(submitButton) {
		submitButton.removeClass('dNone');
		commentForm.getElement('input.submit').addClass('dNone');
		var ajaxload = commentForm.getElement('.ajaxload');
		var errorp = commentForm.getElement('div.error');
		
		var formRequest = new Request({
			url : commentForm.get('action'),
			method : 'post',
			onRequest : function(){
				errorp.set('html', '&nbsp;');
				ajaxload.removeClass('dNone');
			},
			onFailure : function(response){
				ajaxload.addClass('dNone');
				errorp.set('text', response.responseText);
			},
			onSuccess : function(response){
				ajaxload.addClass('dNone');
				if($('postedComments').getElements('div.comment').length < 1){
					$('postedComments').set('html', response);
				} else {
					$('postedComments').set('html', response+$('postedComments').get('html'));
				}
				commentForm.reset();
				window.location = 'http://'+window.location.host+window.location.pathname+'#comAnchor';
			}
		});
		
		commentForm.addEvent('submit', function(e){
			new Event(e).stop();
			formRequest.setOptions({data : commentForm.toQueryString()});
			formRequest.post();
		});
		
		submitButton.addEvent('click', function(e){
			new Event(e).stop();
			formRequest.setOptions({data : commentForm.toQueryString()});
			formRequest.post();
		}.bind(this));
	}
	
	
});
