
jQuery.fn.rating = function(url, options) {
	
	if(url == null) return;
	
	var settings = {
        url       : url, // post changes to 
        maxvalue  : 5,   // max number of stars
        curvalue  : 0,   // number of selected stars
        nb_votes  : 0,
        note_tot  : 0
    };
	
    if(options) {
       jQuery.extend(settings, options);
    };
    
    if ( settings.note_tot > 0 )
    	settings.curvalue = ( settings.nb_votes > 0 ? Math.round(settings.note_tot/settings.nb_votes) : 0 );
   
   var container = jQuery(this);
	
	jQuery.extend(container, {
            averageRating: settings.curvalue,
            url: settings.url
        });

	for(var i= 1; i <= settings.maxvalue ; i++){
         var div = '<div class="star"><a href="#'+i+'" title="Noter '+i+'/'+settings.maxvalue+'">'+i+'</a></div>';
		 container.append(div);

	}
	
	var stars = jQuery(container).children('.star');
	
    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();
         });

    stars.click(function(){
		if(settings.maxvalue > 1){
            settings.curvalue = stars.index(this) + 1;
            jQuery.post(container.url, { "rating": jQuery(this).children('a')[0].href.split('#')[1] },
            			function (data, textStatus) { if ( textStatus == "success" ) { 
            				newCur = parseInt(data);
            				if ( newCur != 0 )
            					settings.curvalue = newCur;
            				}
            			});
			return false;
		}
		else if(settings.maxvalue == 1){
			settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
			$(this).toggleClass('on');
			jQuery.post(container.url, {
                "rating": jQuery(this).children('a')[0].href.split('#')[1] 
            });
			return false;
		}
		return true;
			
    });

        
	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.
			stars
				.filter('.on').removeClass('on').end()
				.filter('.hover').removeClass('hover').end();
		},
		reset: function(){ // Reset the stars to the default index.
			stars.slice(0, settings.curvalue).addClass('on').end();
		}
	}        
	event.reset();
	
	return(this);	

}