jQuery.fn.rating = function(url, options) {
	if(url == null) return;
	var settings = {url : url, increment : 1,maxvalue  : 5,   curvalue  : 0,   id        : 0,concept   : '',callBack  : '',active    : 1};
  if(options) {jQuery.extend(settings, options);};
  var container = jQuery(this);
  jQuery.extend(container, {averageRating: settings.curvalue,url: settings.url});
  settings.increment = (settings.increment < .75) ? .5 : 1;
  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="Cancelar Votacion">Cancel Rating</a></div>';
        container.empty().append(div);}
    } else {
      var $div = $('<div class="star"></div>')
        .append('<a href="#'+i+'" title="Valorar '+i+'/'+settings.maxvalue+'">'+i+'</a>')
        .appendTo(container);
      if (settings.increment == .5) {
        if (s%2) {
          $div.addClass('star-left');
        } else {
          $div.addClass('star-right');
        }}}
    i=i-1+settings.increment;
    s++;
}
var stars = jQuery(container).children('.star');
var cancel = jQuery(container).children('.cancel');	
  stars
    .mouseover(function(){
    	if(settings.active){
      		event.drain();
      		event.fill(this);
      	}})
    .mouseout(function(){
    	if(settings.active)
    	{
      		event.drain();
      		event.reset();}
    })
    .focus(function(){
    	if(settings.active){
      		event.drain();
      		event.fill(this);}})
    .blur(function(){
    	if(settings.active){
      		event.drain();
      		event.reset();}});
  stars.click(function(){
  if(settings.active){ 
	if(settings.active == true){
      settings.curvalue = (stars.index(this) * settings.increment) + settings.increment;
      jQuery.post(container.url, {
      	"id"      : settings.id,
		"concept" : settings.concept,
        "rating": jQuery(this).children('a')[0].href.split('#')[1] 
      }, settings.callBack, "json");
			return false;
		} else if (settings.maxvalue == 1) {
			settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
			$(this).toggleClass('on');
			jQuery.post(container.url, 
			{
				"id"      : settings.id,
				"concept" : settings.concept,
        		"rating"  : jQuery(this).children('a')[0].href.split('#')[1] 
      		}, settings.callBack, "json");
			return false;
		}
		return true;}
			
  });
	if(cancel){
    cancel
    .mouseover(function(){
  		if(settings.active){  
      		event.drain();
      		jQuery(this).addClass('on');}})
    .mouseout(function(){
    	if(settings.active){
      		event.reset();
      		jQuery(this).removeClass('on');}})
    .focus(function(){
    	if(settings.active){
      		event.drain();
      		jQuery(this).addClass('on');}})
    .blur(function(){
    if(settings.active){
      		event.reset();
      		jQuery(this).removeClass('on');}});
    cancel.click(function(){
    if(settings.active){ 
      event.drain();
      settings.curvalue = 0;
      jQuery.post(container.url, {"id" : settings.id,"concept" : settings.concept,"rating": jQuery(this).children('a')[0].href.split('#')[1] }, settings.callBack, "json");
      return false;}});}
	var event = {
		fill: function(el){ 
			var index = stars.index(el) + 1;
			stars.children('a').css('width', '100%').end().slice(0,index).addClass('hover').end();},
		drain: function() { 
			stars
				.filter('.on').removeClass('on').end()
				.filter('.hover').removeClass('hover').end();},
		reset: function(){
			stars.slice(0,settings.curvalue / settings.increment).addClass('on').end();}};    
event.reset();
return(this);	
};