/*
 * 20091129 Refactoring
 */
$.fn.rater = function(options) {
    var opts = $.extend({}, $.fn.rater.defaults, options);
    
    return this.each(function() {
        var $this = $(this);
        var $on = $('.ui-rater-starsOn', $this);
        var $off = $('.ui-rater-starsOff', $this);

        function getRating() {
            return Math.round($on.width() / $off.width() * (opts.ratings.length * opts.step)) / opts.step;
        }

        function writeTitle(rating) {
            $(opts.titleSelector).text( opts.ratings[rating-1] == undefined ? '' : opts.ratings[rating-1] );
        }

        if (opts.size == undefined) opts.size = $off.height();
        if (opts.rating == undefined) opts.rating = $on.width() / opts.size;
        if (opts.id == undefined) opts.id = $this.attr('id');

        if (opts.enabled) {
            $off.mousemove(function(e) {
                var left = e.clientX - $off.offset().left;
                var width = $off.width() - ($off.width() - left);
                width = Math.min(Math.ceil(width / (opts.size / opts.step)) * opts.size / opts.step, opts.size * opts.ratings.length);
                $on.width(width);
                var r = getRating();
                writeTitle(r);
            }).mouseenter(function() {
                $on.addClass('ui-rater-starsHover');
            }).mouseleave(function() {
                $on.removeClass('ui-rater-starsHover');
                $on.width(opts.rating * opts.size);
                //writeTitle(opts.rating);
                writeTitle(-1);
            }).click(function() {
                $on.removeClass('ui-rater-starsHover');
                $.ajax({
                    url: '/ratings/add',
                    type: 'POST',
                    dataType: 'json',
                    data: $.extend(opts.data, {rating: getRating()}),
                    success: function(data) {
                        if (data) {
                            $off.unbind();
                            $off.css('cursor', 'default');
                            $on.css('cursor', 'default');
                            $off.fadeTo(600, 0.1, function() {
                                $on.removeClass('ui-rater-starsHover').width(Math.round(data.average) * opts.size);
                                $this.find('.ui-rater-rateCount').text(parseInt(data.count));
                                $this.find('.ui-rater-rating').text(data.average);
                                $off.fadeTo(500, 1);
                            });
                        }
                    },
                    complete: function(req) {
                        if (!req.status == 200) {
                            alert(req.responseText);
                            $off.fadeTo(2200, 1);
                        }
                    }
                });
            });
        }
        $on.css('cursor', 'pointer');
        $on.width(opts.rating * opts.size);
        //writeTitle(opts.rating);
    });
};

$.fn.rater.defaults = {
    ratings: ['1', '2', '3', '4', '5'],
    enabled: true,
    step: 1,
    inputSelector: '',
    titleSelector: '',
    data: {}
};

