﻿// 
$J.fn.rater = function(options) {
    var opts = $J.extend({}, $J.fn.rater.defaults, options);
    return this.each(function() {
        var _this = $J(this);
        var _on = _this.find('.ui-rater-starsOn');
        var _off = _this.find('.ui-rater-starsOff');
        opts.size = _on.height();
        
        if (opts.rating == undefined) 
            opts.rating = _on.width() / opts.size;
            
        _on.removeClass('ui-rater-starsHover').width(RateHelper.round(opts.rating) * opts.size);
        var ratingText = opts.ratingText ? opts.ratingText : 'Your rating';
        
        opts.rating = parseFloat(opts.rating);
        
        if (_this.find('.ui-rater-rating')) {
            _this.find('.ui-rater-rating').text(opts.rating.toFixed(2));
            _this.attr('title', ratingText + ': ' + opts.rating.toFixed(2));
        }
            
        if (opts.id == undefined) 
            opts.id = _this.attr('id');

        if (opts.enable){
            _off.mousemove(function(e) {
                var left = e.clientX - _off.offset().left;
                var width = _off.width() - (_off.width() - left);
                width = Math.ceil(width / (opts.size / opts.step)) * opts.size / opts.step;
                if (width > _off.width()) width = _off.width();
                _on.width(width);
            }).hover(function(e) { _on.addClass('ui-rater-starsHover'); e.stopPropagation(); e.preventDefault(); }, function(e) {
                _on.removeClass('ui-rater-starsHover');
                _on.width(RateHelper.round(opts.rating) * opts.size);
            }).click(function(e) {
				var isRatingAllowed = true;
				if (opts.onBeforeRate)
				{
					isRatingAllowed = opts.onBeforeRate();
				}
				if (isRatingAllowed) {
					var r = Math.round(_on.width() / _off.width() * (opts.units * opts.step)) / opts.step;
					_off.css('cursor', 'default'); _on.css('cursor', 'default');
					$J.fn.rater.rate(_this, opts, r);
                }
                
                return false;
            }).css('cursor', 'pointer'); _on.css('cursor', 'pointer');
        } else {
                _on.addClass('ui-rater-starsHover');
                }
    });
};

$J.fn.rater.defaults = {
    postHref: location.href,
    units: 5,
    step: 1,
    onBeforeRate: null
};

$J.fn.rater.rate = function(_this, opts, _rating) {
    var _on = _this.find('.ui-rater-starsOn');
    var _off = _this.find('.ui-rater-starsOff');
    //alert(opts.object_guid);
    //alert('object_guid=' + opts.object_guid + '&member_guid=' + opts.member_guid + '&rating=' + rating+'&object_type='+opts.object_type);
    _off.fadeTo(600, 0.4, function() {
        $J.getJSON(
            opts.postHref
            , {
                object_guid: opts.object_guid
                , member_guid: opts.member_guid
                , rating: _rating
                , object_type: opts.object_type
            }
            , function(obj){
                if (obj.res && obj.res == "true") {
                    if (opts.update_stat == true) {
                        onRated(opts.object_guid);
                    }
                    opts.rating = parseFloat(obj.rating);
                    _off.fadeTo(600, 0.1, function() {
                        _on.removeClass('ui-rater-starsHover').width(RateHelper.round(opts.rating) * opts.size);
                        if (_this.find('.ui-rater-rating'))
                            _this.find('.ui-rater-rating').text(opts.rating.toFixed(2));
                        _off.fadeTo(600, 1);
                        var ratingText = opts.ratingText ? opts.ratingText : 'Avarage rating';
                        _this.attr('title', ratingText + ': ' + opts.rating.toFixed(2));
                    }).css('cursor', 'pointer'); _on.css('cursor', 'pointer');
                } else { //failure
                    _on.removeClass('ui-rater-starsHover').width(opts.rating * opts.size);
                    _this.rater(opts);
                    _off.fadeTo(2200, 1);
                    _this.attr('title', 'Error occured');
                    _off.css('cursor', 'pointer'); _on.css('cursor', 'pointer');
                }
            }
        );
//        $J.ajax({
//            url: opts.postHref,
//            type: "GET",
//            data: 'object_guid=' + opts.object_guid + '&member_guid=' + opts.member_guid + '&rating=' + rating+'&object_type='+opts.object_type,
//            complete: function(req) {
//                if (req.status == 200) { //success
//                    //alert(req.responseText);
//                    opts.rating = parseFloat(req.responseText);
//                    _off.fadeTo(600, 0.1, function() {
//                        _on.removeClass('ui-rater-starsHover').width(opts.rating * opts.size);
//                        if (_this.find('.ui-rater-rating'))
//                            _this.find('.ui-rater-rating').text(opts.rating.toFixed(2));
//                        _off.fadeTo(600, 1);
//                        var ratingText = opts.ratingText ? opts.ratingText : 'Your rating';
//                        _this.attr('title', ratingText + ': ' + opts.rating.toFixed(2));
//                    });
//                } else { //failure
//                    _on.removeClass('ui-rater-starsHover').width(opts.rating * opts.size);
//                    _this.rater(opts);
//                    _off.fadeTo(2200, 1);
//                }
//            }
//        });
    });
};

var RateHelper = {
    round : function(val){
        var tmp = Math.floor(val); 
        var d = (val-tmp);
        if (d <= 0.25) d = 0;
        else if (0.25 <= d && d < 0.75) d= 0.5;
        else d =1;
        return tmp+d;
    }
}

