Rating example

by napascual

HTML

<div class="val">
    <div class="icon">
        <div class="star-icon start-1"></div>
        <div class="star-icon start-2"></div> 
        <div class="star-icon start-3"></div> 
        <div class="star-icon start-4"></div> 
        <div class="star-icon start-5"></div>
    </div>
    <p class="rating-text"></p>
</div>

 <div class="val">
    <div class="icon">
        <div class="off-icon star-icon start-1"></div>
        <div class="off-icon star-icon start-2"></div> 
        <div class="off-icon star-icon start-3"></div> 
        <div class="off-icon star-icon start-4"></div> 
        <div class="off-icon star-icon start-5"></div>
    </div>
    <p class="rating-text"></p>
</div>

CSS

.val{
    overflow:hidden;
    clear:both;
}
.star-icon{
    position:relative;
    float:left;
    display:inline;
    overflow:hidden;
    width:25px;
    height:24px; 
    background:url(http://img405.imageshack.us/img405/251/ratinstartoff.png); 
}
.star-icon:hover{
    cursor:pointer
}
.star-icon:hover,.on-icon,.on-temp-icon{
    background-image:url(http://img196.imageshack.us/img196/6681/ratinstarton.png);
}
.off-temp-icon{ 
    background-image:url(http://img405.imageshack.us/img405/251/ratinstartoff.png); 
}
.rating-text{
    font-weight:bold;
    float:left;
    display:inline;
    margin-left:7px;
}

JavaScript

var text = ["", "Pésimo", "Muchos problemas", "Mal", "Todo bien, pero...", "Todo correcto"];
$(function() {
    $(".star-icon").click(function() {
        _this = $(this);
        _this.siblings(".set-icon").removeClass("set-icon");
        _this.addClass("on-icon").addClass("set-icon");
        _this.prevAll().addClass("on-icon");
        _this.nextAll().removeClass("on-icon");
    });
    $(".star-icon").bind("mouseout", function() {
        var _this = $(this).removeClass("on-temp-icon");
        _this.prevAll().removeClass("on-temp-icon");
        _this.nextAll().removeClass("off-temp-icon");
        $(".icon").css("opacity", "1");
        updateText(_this,_this.parent().find(".set-icon"));
    });
    $(".star-icon").bind("mouseover", function() {
        var _this = $(this).addClass("on-temp-icon");
        var _prevAll = _this.prevAll();
        var _length = _prevAll.length;
        var op = (_length + 1) / 10;
        _prevAll.addClass("on-temp-icon");
        _this.nextAll().addClass("off-temp-icon");
        _this.parent(".icon").css("opacity", "" + (op + .3));
        updateText(_this, _this);
    });

    function updateText(obj, active) {
        var len = active.prevAll().length;
        if (active.length > 0) len += 1;
        else len = 0;
        obj.parent().next(".rating-text").text(text[len]);
    }
});