/**
 * jQuery Ajax Rater Plugin
 *
 * This rater is based on the code Ritesh Agrawal did. Unfortunatly his CSS and the hover technique breaks in some browsers.
 * So i thought, why not use the best CSS star-rater known to man kind and throw it in the mix.
 * I have used the CSS and technique from Komodo Media since it is stable and tested on many, many browsers.
 *
 * This rater compared, has no cancel button. But i think we can live with that :)
 * To avoid conflicts i have changed the function name.
 *
 * Licensed under The MIT License
 *
 * @version     1.0
 * @since       03.01.2007
 * @author      Kjell Bublitz <m3nt0r.de@gmail.com
 * @link        http://www.m3nt0r.de/devel/raterDemo/ Demonstration and Documentation
 * @link        http://php.scripts.psu.edu/rja171/widgets/rating.php Based on Ritesh Agrawal Star Rating System
 * @link        http://komodomedia.com/blog/index.php/2007/01/20/css-star-rating-redux/ The Komodo Media CSS Rater Blogpost
 * @license     http://www.opensource.org/licenses/mit-license.php MIT
 * @package     jQuery Plugins
 * @subpackage  Rater
 */

/**
 * Usage: $('#rating').rater('your_servlet', {style:'basic', maxvalue:5, curvalue:0});
 *
 * @param url The address you want to post the result to.
 * @param options The style and value attributes
 *
 * Valid options:
 * ---------------------------------------
 *       style:       'basic', 'inline' OR 'small'
 *       maxvalue:    the maximum value / number of stars
 *       curvalue:    the initial value / selected stars
 */

jQuery.fn.rater = function(url, options, error, errorMsg)
{
	if(url == null) return;
	var settings = {
		url       : url, // post changes to
		maxvalue  : 5,   // max number of stars
		curvalue  : 0,    // number of selected stars
		minRating : 0,		// downvoting limit
		isFakeUser: 0,
		minRatingMessage: '' //Message to display when downvoting
	};

	if(options) { jQuery.extend(settings, options); };
	jQuery.extend(settings, {cancel: (settings.maxvalue > 1) ? true : false});

	var container = jQuery(this);
	jQuery.extend(container, { averageRating: settings.curvalue, url: settings.url });


	if(!settings.style || settings.style == null || settings.style == 'basic') {
		var raterwidth = settings.maxvalue * 17;
		var ratingparent = '<ul class="star-rating" style="width:'+raterwidth+'px">';
	}
	if(settings.style == 'small') {
		var raterwidth = settings.maxvalue * 10;
		var ratingparent = '<ul class="star-rating small-star" style="width:'+raterwidth+'px">';
	}
	if(settings.style == 'inline') {
		var raterwidth = settings.maxvalue * 10;
		var ratingparent = '<span class="inline-rating"><ul class="star-rating small-star" style="width:'+raterwidth+'px">';
	}

	container.append(ratingparent);

	// create rater
	var starWidth, starIndex, listitems = '';
	var curvalueWidth = Math.floor(100 / settings.maxvalue * settings.curvalue);
	for(var i = 0; i <= settings.maxvalue ; i++) {
			if (i == 0) {
				listitems+='<li class="current-rating" style="width:'+curvalueWidth+'%;">'+settings.curvalue+'/'+settings.maxvalue+'</li>';
			} else {
				starWidth = Math.floor(100 / settings.maxvalue * i);
				starIndex = (settings.maxvalue - i) + 2;
				listitems+='<li class="star"><a href="#'+i+'" title="' + getStarTitle(i, settings.maxvalue) + '" style="width:'+starWidth+'%;z-index:'+starIndex+'">'+i+'</a></li>';
			}

	}
	container.find('.star-rating').append(listitems);

	var stars = jQuery(container).find('.star-rating').children('.star');
	stars.bind('click', function()
		{
			vPageImpression("/player/starRate");
			raterValue = jQuery(this).children('a')[0].href.split('#')[1];
			downvoting = raterValue<settings.minRating;
			if(error == true || downvoting==true) {
				if(error==false && downvoting==true)
					errorMsg = settings.minRatingMessage;
				if (!document.getElementById("errormessage"))
					$('.playerInfoList').append('<div class="jsFlashMessage" id="errormessage"></div>');

				$(".jsFlashMessage").addClass("error playerError").html('<span class="icon">&nbsp;</span>' + errorMsg).fadeIn('fast').animate({opacity: 1.0}, 4000).fadeOut('slow');
				if(error == true && settings.isFakeUser==0) return false;
			}

			if(settings.maxvalue == 1) // on / off
			{
				settings.curset = (settings.curvalue == 0) ? 'set' : 'del';
				settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
					jQuery(container).find('.star-rating').children('.current-rating' ).css({width:(settings.curvalue*100)+'%'});
				jQuery.post('/favorite/'+settings.curset+'/'+container.url, { "rating": settings.curset });
				return false;
			} else {

				settings.curvalue = stars.index(this) + 1;
				jQuery(container).find('.star-rating').children('.current-rating').css({width:(settings.curvalue*17)+'px'});
				jQuery.post((container.url+'/?rating='+raterValue), { "rating": raterValue },
				function(response) {
					if (response.substr(0,3) == "err") {
						errorMsg = response.substr(3);
						if (!document.getElementById("errormessage"))
							$('.playerInfoList').append('<div class="jsFlashMessage" id="errormessage"></div>');

						$(".jsFlashMessage").addClass("error playerError").html('<span class="icon">&nbsp;</span>' + errorMsg).fadeIn('fast').animate({opacity: 1.0}, 4000).fadeOut('slow');
						return false;
					} else {
						if (response.substr(0,1) == "*")
						{
							response = response.substr(1);
						} else {
							if(downvoting == false && settings.isFakeUser == 0) {
								currentRatingNew = $('#ratingCount').html();
								newRate = Number(currentRatingNew)+1;
								$('#ratingCount').html(newRate);
							}
						}

						$('.showRatings span').css({width: Number(response)*17+'px'});
						$('.showRatings span').attr({ title: __('Gesamtbewertung: ') + Number(response).toFixed(2)});
						$('.showRatings').removeClass('baseRatings');
					}
				});

				return false;
			}

			return true;
		});
	return this; // strict warning: anonymous function does not always return a value. fix?
}

function getStarTitle(currentStar, maxStars) {
	switch (currentStar) {
		case 1:
			return __('Nicht so mein Ding');
		case 2:
			return __('Hat Potential');
		case 3:
			return __('Sehenswert');
		case 4:
			return __('Echt Cool');
		case 5:
			return __('Weltklasse');
		default:
			return i + '/' + maxStars;
	}
}
