jQuery.fn.rating = function(url, id, options) {
	
	if(url == null) return;
	
	var RATING_COOKIE_NAME = "gbk_rating";
	
	id = String(id);

    var settings = {
        url         : url, // post changes to 
        maxvalue    : 5,   // max number of stars
        curvalue    : 0    // number of selected stars
    };
	
    if(options) {
       jQuery.extend(settings, options);
    };
   
   
   var container = jQuery(this);
	
	jQuery.extend(container, {
            averageRating: settings.curvalue,
            url: settings.url
        });

	for(var i= 1; i <= settings.maxvalue ; i++){
		var size = i
        var div = '<div class="star"><a href="#'+i+'" title="Rate it '+i+'/'+size+'">'+i+'</a></div>';
		container.append(div);
	}

    var msg = $('<div class="message"></div>');
    container.append(msg);
	
    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(){
		
        var voted_all = $.cookie(RATING_COOKIE_NAME);
		if (voted_all) {
			voted = voted_all.split(';');
		} else {
			voted = new Array();
		}

        if(voted.has(id)){
            msg.html("Thanks, vote again tomorrow.");
            return false;
        }else{
            if(settings.maxvalue > 1){
                settings.curvalue = stars.index(this) + 1;
                msg.html("Please wait....");
                jQuery.post(container.url,
                    {"rating": jQuery(this).children('a')[0].href.split('#')[1]},
                    event.postCallback, 
                    'json'
                );
                return false;
            }else{
                settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
                $(this).toggleClass('on');
                msg.html("Please wait....");
                jQuery.post(container.url,
                    {"rating": jQuery(this).children('a')[0].href.split('#')[1]},
                    event.postCallback,
                    'json'
                );
                return false;
            }
            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()
				.filter(":lt("+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.filter(":lt("+settings.curvalue+")").addClass('on').end();
		},
        postCallback: function(data, textStatus){
            if(textStatus == "success" && data.status == 1){
				voted.push(id);
                $.cookie(RATING_COOKIE_NAME, voted.join(';'), { path: '/', expires: 1 }); // 1 day
                msg.html("Thanks, vote again tomorrow.");
            }else{
                //alert("callback\nstatus: "+textStatus+"\ndata status: "+data.status+"\ndata message: "+data.message+"\nrating: "+data.rating);
                msg.html("Sorry, please try again.");
            }
        }
	}        
	event.reset();
	
	return(this);	

}

