﻿//http://jvance.com
$.fn.rater = function(options) {
    var opts = $.extend({}, $.fn.rater.defaults, options);
    return this.each(function() {
        var $this = $(this);
        $.fn.rater.set($this, opts);
        
        //$.fn.rater.mark($this, opts,0);
    });
};
$.fn.rater.defaults = {
    actionUrl: location.href,
    units: 5,
    step: 1,
    disabled: false,
    disabledInfo: null,
    rate: 0,
    rateCount: 0
};

$.fn.rater.set = function($this, opts) {
    var $on = $.fn.rater.getEl($this, 'starsOn');
    var $off = $.fn.rater.getEl($this, 'starsOff');
    
    // ustawienie bieżącej oceny
    var $rating = $.fn.rater.getEl($this, 'rating');
    $rating.text(opts.rate);
    
    // ustawienie ilości głosujących
    var $rateCount = $.fn.rater.getEl($this, 'rateCount').find('span');
    $rateCount.text(opts.rateCount);

    // hack - trzeba podać na sztywno tą wysokość, bo jeśli rating jest ładowany do niewidocznego diva (zakładki) to
    // jego wysokość jest wówczas 0 i po przełączeniu gdy już powinien być widoczny - nie jest i kapa mantel
    //opts.size = $on.height();
    opts.size = 18;

    //if (opts.rate == undefined) opts.rate = $on.width() / opts.size;
    if (opts.id == undefined) opts.id = $this.attr('id');
    
    $on.css('max-width', opts.units*opts.size)
       .css('width', opts.rate*opts.size);
    
    $off.css('width', opts.units*opts.size);
    
    if (! opts.disabled) {
    	$.fn.rater.on($this, opts);
    // jeśli jest wyłączone głosowanie
    } else {
    	$.fn.rater.off($this, opts);
    }
}


$.fn.rater.getEl = function($this, el) {
	return $this.find('.ui-rater-' + el);
}

$.fn.rater.on = function($this, opts) {
	var $on = $.fn.rater.getEl($this, 'starsOn');
    var $off = $.fn.rater.getEl($this, 'starsOff');

    if ($this.hasClass('off')) $this.removeClass('off');
    $this.toggleClass('on');
    
    $off.css('cursor', 'pointer');
	$on.css('cursor', 'pointer');

	$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;
		//alert(width);
		$on.width(width);
	}).hover(function(e) {$on.addClass('ui-rater-starsHover'); }, function(e) {
		$on.removeClass('ui-rater-starsHover');
		$on.width(opts.rate * opts.size);
	}).click(function(e) {
		$.fn.rater.rate($this, opts);
	});
}
// zanaczanie czerwonych gwiazdek
$.fn.rater.mark = function($this, opts, rate) {
	var $on = $.fn.rater.getEl($this, 'starsOn');
    var $off = $.fn.rater.getEl($this, 'starsOff');
    
    $on.addClass('ui-rater-starsHover');
	$on.width($off.height()*rate);
	$on.removeClass('ui-rater-starsHover');
	alert('tu jestem');
}
$.fn.rater.off = function($this, opts) {
	var $on = $.fn.rater.getEl($this, 'starsOn');
    var $off = $.fn.rater.getEl($this, 'starsOff');
    
    if ($this.hasClass('on')) $this.removeClass('on');
    $this.toggleClass('off');
    
    $off.css('cursor', 'default')
	    .unbind('click')
	    .unbind('mousemove')
	    .unbind('mouseenter')
	    .unbind('mouseleave');
    
    $on.css('cursor', 'default');


	if (opts.disabledInfo) {
		$off.attr('title', opts.disabledInfo);
	}
	//alert(8);
}

$.fn.rater.rate = function($this, opts) {
	var $on = $.fn.rater.getEl($this, 'starsOn');
    var $off = $.fn.rater.getEl($this, 'starsOff');
    
	var rate = Math.round($on.width() / $off.width() * (opts.units * opts.step)) / opts.step;
	//opts.actionUrl = opts.actionUrl + rate;
	//alert(opts.actionUrl);
	$off.fadeTo(300, 0.3, function() {
		//return;
	    $.ajax({
	        type: 'POST',
	        url: opts.actionUrl,
	        data: {
	            format: 'json',
	            rate: rate
	        },
	        dataType: 'json',
	        success: function(data) {
	        	if (data.status != 1) {
	        		alert('Głosowanie zakończone niepowodzeniem.');
	        		return;
	        	}
	            //alert(data.debugRequest);
	            //alert(data.debugResponse);
	            $.each(data, function(k,v) {
	            	opts[k] = v;
	            });

	            // ustaw nowe parametry ratera
	            $.fn.rater.set($this, opts);
	            $off.fadeTo(300, 1);
	            $off.fadeTo(100, 0.2);
	            $off.fadeTo(300, 1);
	            $off.fadeTo(100, 0.2);
	            $off.fadeTo(300, 1);
	        },
	        error: function(data, a, b) {
	            //ajaxLoaderDiv.addClass('hidden');
	        	//alert(b);
	            alert('Wystąpił nieznany błąd...');
//	            alert(a);
//	            alert(b);
	        }

	   });
	});
	//$off.fadeTo(2200, 1);
	//$.fn.rater.off($this, opts);

//	$.fn.rater.on($this, opts);
/*    
	var $on = $this.find('.ui-rater-starsOn');
    var $off = $this.find('.ui-rater-starsOff');
    $off.fadeTo(600, 0.4, function() {
        $.ajax({
            url: opts.actionUrl,
            type: "POST",
            data: 'id=' + opts.id + '&rating=' + rating,
            complete: function(req) {
                if (req.status == 200) { //success
                    opts.rate = parseFloat(req.responseText);
                    $off.fadeTo(600, 0.1, function() {
                        $on.removeClass('ui-rater-starsHover').width(opts.rating * opts.size);
                        var $count = $this.find('.ui-rater-rateCount');
                        $count.text(parseInt($count.text()) + 1);
                        $this.find('.ui-rater-rating').text(opts.rating.toFixed(1));
                        $off.fadeTo(600, 1);
                        $this.attr('title', 'Your rating: ' + rating.toFixed(1));
                    });
                } else { //failure
                    alert(req.responseText);
                    $on.removeClass('ui-rater-starsHover').width(opts.rating * opts.size);
                    $this.rater(opts);
                    $off.fadeTo(2200, 1);
                }
            }
        });
    });
*/
};

