jQuery.fn.ratingStars = function(numStars, initialRating, starWidth, canRate) {
    
    var containerJQO = this;
    var stars = Array();
    if(!initialRating) {
        initialRating = 0;
    }
    //empty stars layer
    var emptyDiv = document.createElement('div');
    var emptyDivJQO = jQuery(emptyDiv);
    emptyDivJQO.css("position", "relative");
    containerJQO.append(emptyDivJQO);
    for(var starIndex = 0; starIndex < numStars; starIndex++) {
        var starElement = document.createElement('div');
        var starJQO = jQuery(starElement);
        starJQO.addClass('star_block');
        starJQO.addClass('star_empty');
        emptyDivJQO.append(starJQO);
    }
    
    //current rating layer
    var currentDiv = document.createElement('div');
    var currentDivJQO = jQuery(currentDiv);
    currentDivJQO.css("position", "absolute");
    containerJQO.append(currentDivJQO);
    for(starIndex = 0; starIndex < numStars; starIndex++) {
        starElement = document.createElement('div');
        starJQO = jQuery(starElement);
        //Add the style.
        starJQO.addClass('star_block');

        var integerPart = Math.floor(initialRating);
        var decPart = initialRating - integerPart;
        if(starIndex + 1 <= integerPart) {
            starJQO.addClass('star_full');
        } else if(starIndex == integerPart){
            starJQO.addClass('star_full');
            starJQO.width(decPart * starWidth);
        }

        currentDivJQO.append(starJQO);
    }

    if(canRate) {
        //rate it layer
        var rateDiv = document.createElement('div');
        var rateDivJQO = jQuery(rateDiv);
        rateDivJQO.css("position", "absolute");
        containerJQO.append(rateDivJQO);
        for(starIndex = 0; starIndex < numStars; starIndex++) {
            starElement = document.createElement('div');
            starJQO = jQuery(starElement);
            starJQO.addClass('star_block');
            rateDivJQO.append(starJQO);
            stars.push(starJQO);
            //Store the rating that represents this star.
            starElement.rating = starIndex + 1;
        
            //hook up the click event
            starJQO.click(function() {
                containerJQO.triggerHandler("ratingChanged", {
                    rating: this.rating
                });
            });

            starJQO.mouseenter(function() {
                //            currentDivJQO.css("visibility", "hidden");
                //Highlight selected stars.
                for(var index = 0; index < this.rating; index++) {
                    stars[index].addClass('star_rate');
                }
                //Unhighlight unselected stars.
                for(index = this.rating; index < numStars; index++) {
                    stars[index].removeClass('star_rate');
                }
            });

            containerJQO.mouseleave(function() {
                //            currentDivJQO.css("visibility", "visible");
                //Unhighlight unselected stars.
                for(var index = 0; index < numStars; index++) {
                    stars[index].removeClass('star_rate');
                }
            });
        }
    }


    return this;
};
