﻿(function ($) {
    $.fn.rating = function (options) {
        options = $.extend({
            url: 'getData',
            onSuccess: null,
            errorText: "An Error Occured"
        }, options || {});

        return this.each(function (i, item) {

            // Append star editing hml
            var ratingRoot = $(item).after("<ul class='star_rating'><li><a href='#' class='star_gray'>1 star</a></li><li><a href='#' class='star_gray'>2 stars</a></li><li><a href='#' class='star_gray'>3 stars</a></li><li><a href='#' class='star_gray'>4 stars</a></li><li><a href='#' class='star_gray'>5 stars</a></li><li><span class='ratingDesc'></li></ul>").next(".star_rating");
            if (ratingRoot.length == 0)
                return;
            var stars = $(ratingRoot).find('a.star_gray').toArray();
            var ratingDesc = $(ratingRoot).find("li span.ratingDesc");

            // Convert dropdown to hidden field
            var newItem = $("<input type='hidden' id='" + $(item).attr('id') + "' name='" + $(item).attr('name') + "' />").val($(item).val());
            $(item).replaceWith(newItem);
            item = newItem;

            // Set current value
            setStars(stars, ratingDesc, $(item).val());

            // Hookup event handling
            $(ratingRoot).bind("mousemove", function (e) {
                var rating = Math.min(Math.round((e.pageX - $(this).offset().left + 0) / 12), 5);
                setStars(stars, ratingDesc, rating);
            })
            .bind("mouseout", function (e) {
                var curRating = $(item).val();
                setStars(stars, ratingDesc, curRating);
            })
            .bind("click", function (e) {
                var rating = Math.min(Math.round((e.pageX - $(this).offset().left + 0) / 12), 5);
                setStars(stars, ratingDesc, rating);
                $(item).val(rating);
            });
        });
    }

    function setStars(stars, ratingDesc, rating) {
        for (var i = 0; i < 5; i++) {
            if (i + 1 <= rating)
                $(stars[i]).removeClass("star_gray").addClass('star');
            else
                $(stars[i]).removeClass("star").addClass('star_gray');
        }
        $(ratingDesc).text(ratingDescription(rating));
    }

    function ratingDescription(rating) {
        var r = parseInt(rating);
        switch (r) {
            case 1:
                return "Poor";
                break;
            case 2:
                return "Below Average";
                break;
            case 3:
                return "Average";
                break;
            case 4:
                return "Good";
                break;
            case 5:
                return "Great";
                break;
        }
    }

})(jQuery);
