// JavaScript Document
/*************************************************
Star Rating System (Wikipedia version)
Version: 7 Oct, 2008
Author: Ritesh Agrawal (ragrawal [at] gmail (dot) com)
Demonstration: http://examples.learningjquery.com/rating/
Modified by: Filipe Miguel Tavares (fmt [at] civilis (dot) net)

Usage: $('#rating').wikirating('url-to-post.php', {maxvalue:5, curvalue:0});
arguments
url : required -- post changes to 
options
  increment : 1, // value to increment by
	maxvalue: number of stars
	curvalue: number of selected stars
************************************************/
/**
* Function : dump()
* Arguments: The data - array,hash(associative array),object
*    The level - OPTIONAL
* Returns  : The textual representation of the array.
* This function was inspired by the print_r function of PHP.
* This will accept some data as the argument and return a
* text that will be a more readable version of the
* array/hash/object that is given.
*/

$.fn.wikirating = function(url, options) {

	if(url == null) return;

	var settings = {
	url: url,		// post changes to 
	increment: 1,	// value to increment by
	maxvalue: 5,	// max number of stars
	curvalue: 0,	// number of selected stars
	cancel: 1		// cancel button
	};
	
if(options) {
	$.extend(settings, options);
};
$.extend(settings, {cancel: (settings.maxvalue > 1) ? settings.cancel : false});

var container = $(this);

$.extend(container, {
	averageRating: settings.curvalue,
	url: settings.url
});
settings.increment = (settings.increment < .75) ? .5 : 1;


var ui = [];
var percOffset = settings.curvalue*100;
for(var i= 1; i <= settings.maxvalue ; i++){
 if (percOffset > 0) {
   ui[i] = percOffset > 100 ? 100 : percOffset;
   percOffset = percOffset - 100;
 } else {
   percOffset = 0;
   ui[i] = percOffset;
 }
}

//ui = ui.reverse();
var s = 0;
for(var i= 0; i <= settings.maxvalue ; i++){
	if (i == 0) {
		if(settings.cancel == true){
			var div = '<div class="cancel"><a href="#0" title="Cancel Rating">Cancel Rating</a></div>';
			container.empty().append(div);
		}
	} else {
		var $div = $('<div class="star"></div>')
			.append('<a href="#'+i+'#'+settings.commentId+'" style="width:'+ui[i]+'%" title="Votar '+i+'/'+settings.maxvalue+'">'+i+'</a>')
			.appendTo(container);
			$div.addClass('on').end();
		if (settings.increment == .5) {
			if (s%2) {
				$div.addClass('star-left');
			} else {
				$div.addClass('star-right');
			}
		}
	}
	i=i-1+settings.increment;
	s++;
}

var stars = $(container).children('.star');
var cancel = $(container).children('.cancel');

stars
	.mouseover(function(){
		event.drain();
		event.fill(this);
	})
	.mouseout(function(){
		event.drain();
		event.reset();
	})
	.focus(function(){
		event.drain();
		event.fill(this);
	})
	.blur(function(){
		event.drain();
		event.reset();
	});

// click
stars.click(function(){
	if ( settings.maxvalue > 1 ) {
		if ( $(container).parent().hasClass("active") ) {
			settings.curvalue = (stars.index(this) * settings.increment) + settings.increment;

			$.post(container.url, {
				"rating": $(this).children('a')[0].href.split('#')[1]
			});

			$(container).parent().removeClass("active").addClass("inactive");
			var commentId = $(this).children('a')[0].href.split('#')[2];
			$('#tooltip-'+commentId).html("Acabou de votar neste coment&aacute;rio");
			$('#voteCount-'+commentId).html("<br />");
			$('#tooltip-'+commentId).attr({title: 'A pontua&ccedil;&atilde;o do coment&aacute;rio resulta do c&aacute;lculo da m&eacute;dia de pontos/estrelas atribu&iacute;dos no total de votos que o coment&aacute;rio recebeu. Por exemplo, um coment&aacute;rio recebeu 2 votos: num dos votos o coment&aacute;rio recebeu 1 estrela, e no outro recebeu 5 estrelas. A pontua&ccedil;&atilde;o ser&aacute; de 3 = (6 estrelas) / (2 votos).<br/><br/>S&oacute; pode votar neste coment&aacute;rio uma &uacute;nica vez.'});
			$('#tooltip-'+commentId).tooltip({track: true, delay:0,fixPNG: true });
		}
		return false;
	} else if (settings.maxvalue == 1) {
		if ( $(container).parent().hasClass("active") ) {
			settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
			$(this).toggleClass('on');

			$.post(container.url, {
				"rating": $(this).children('a')[0].href.split('#')[1] 
			});

			$(container).parent().removeClass("active").addClass("inactive");
		}
		return false;
	}
	return true;
});

// cancel button events
if (cancel) {
	cancel
	.mouseover(function(){
//		event.drain();
		$(this).addClass('on');
	})
	.mouseout(function(){
		event.reset();
		$(this).removeClass('on');
	})
	.focus(function(){
//		event.drain();
		$(this).addClass('on');
	})
	.blur(function(){
		event.reset();
		$(this).removeClass('on');
	});

	// click events.
	cancel.click(function(){
		event.drain();
		settings.curvalue = options.curvalue;

		$.post(container.url, {
			"rating": $(this).children('a')[0].href.split('#')[1] 
		});

		stars.filter('.on').removeClass('on');
		$(container).parent().removeClass("inactive").addClass("active");
		return false;
	});
}

var event = {
	fill: function(el){ // fill to the current mouse position.
		var index = stars.index(el) + 1;
		stars
			.children('a').css('width', '100%').end()
			.slice(0,index).addClass('hover').end();
	},
	drain: function() { // drain all the stars.
		if ( $(container).parent().hasClass("active") ) {
		stars
			.filter('.on').removeClass('on').end()
			.filter('.hover').removeClass('hover').end();
		} else {
		stars
			.filter('.hover').removeClass('hover').end();
		}
	},
	reset: function(){ // Reset the stars to the default index.
		//stars.slice(0,settings.curvalue / settings.increment).addClass('on').end();
		//stars.slice(0,settings.curvalue / settings.increment).children('a').attr({ style: "200%" });
		stars.slice(0,Math.round(settings.curvalue) / settings.increment).addClass('on').end();

		var ui = [];
		var percOffset = settings.curvalue*100;
		for(var i= 1; i <= settings.maxvalue ; i++){
		 if (percOffset > 0) {
		   ui[i] = percOffset > 100 ? 100 : percOffset;
		   percOffset = percOffset - 100;
		 } else {
		   percOffset = 0;
		   ui[i] = percOffset;
		 }}
                stars.slice(0,1).children('a').attr({ style: 'width:'+ui[1]+'%' });
                stars.slice(1,2).children('a').attr({ style: 'width:'+ui[2]+'%' });
                stars.slice(2,3).children('a').attr({ style: 'width:'+ui[3]+'%' });
                stars.slice(3,4).children('a').attr({ style: 'width:'+ui[4]+'%' });
                stars.slice(4,5).children('a').attr({ style: 'width:'+ui[5]+'%' });
	}
};    
event.reset();

return(this);	

};
