// JavaScript Document
/*************************************************
Star Rating System
First Version: 21 November, 2006
Second Version: 17 May, 2007
Author: Ritesh Agrawal (http://php.scripts.psu.edu/rja171/widgets/rating.php)
        email: ragrawal [at] gmail (dot) com
Inspiration: Will Stuckey's star rating system (http://sandbox.wilstuckey.com/jquery-ratings/)
Half-Star Addition: Karl Swedberg
Demonstration: http://examples.learningjquery.com/rating/
Usage: $('#rating').rating('url-to-post.php', {maxvalue:5, curvalue:0});

arguments
url : required -- post changes to 
options
  increment : 1, // value to increment by
	maxvalue: number of stars
	curvalue: number of selected stars
	

************************************************/

jQuery.fn.rating = function(url, options)
{
	if(url == null) return;
	
	var settings =
	{
		url : url, // post changes to 
		increment : 1, // value to increment by
		maxvalue  : 5,   // max number of stars
		curvalue  : 0,    // number of selected stars
		enabled  : true    // number of selected stars
	};

	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
	});
	settings.increment = (settings.increment < .75) ? .5 : 1;

	var rs = jQuery('<div class=ratingstars></div>').appendTo(container.empty());
	
	for(var i = 0,s = 0; i <= settings.maxvalue ; i++)
	{
	    if (i == 0)
		{
			if(settings.cancel == true)
			{
				var idiv = settings.enabled ? '<a href="#0" title="0"></a>' : '<span href="#0" title="0"></span>';
				var div = $('<div class="ratingcancel"></div>').append(idiv).appendTo(rs);
			}
		}
		else
		{
			var idiv = settings.enabled ? '<a href="#'+i+'" title="'+i+'">'+i+'</a>' : '<span href="#'+i+'" title="'+i+'">'+i+'</span>';
			var $div = $('<div class="ratingstar"></div>').append(idiv).appendTo(rs);
			if(settings.increment == .5) $div.addClass(s % 2 ? 'ratingstar-left' : 'ratingstar-right');
		}
    	i = i - 1 + settings.increment;
	    s++;
	}
	
	var rm = jQuery('<div class=ratingmessage></div>').appendTo(container);
	var stars = rs.children('.ratingstar');
	var cancel = rs.children('.ratingcancel');
	
	stars
	.mouseover(function(){
		event.drain();
		event.fill(this);
    })
	.mouseout(function(){
		event.drain();
		event.reset();
	})
    .focus(function(){
		event.drain();
		event.fill(this);
	})
	.blur(function(){
		event.drain();
		event.reset();
	})
	.click(function(){
		if(settings.cancel && settings.enabled)
		{
			settings.curvalue = (stars.index(this) * settings.increment) + settings.increment;
			jQuery.post(container.url,
			{
				rating : jQuery(this).children('a')[0].href.split('#')[1],
				page: document.location
			});
			$.get('/modules/rating/rate.php?get_message=MessageOk',function(data){
				rm.html(data).show();
			});
		}
		else if(!settings.rated)
		{
			$.get('/modules/rating/rate.php?get_message=MessageAllowGuest',function(data){
				rm.html(data).show();
			});
		}
		else
		{
			$.get('/modules/rating/rate.php?get_message=MessageAlreadyRated',function(data){
				rm.html(data).show();
			});
		}
		return false;
	});

	if(cancel)
	{
		cancel
			.mouseover(function(){
				event.drain();
				jQuery(this).addClass('ratingon');
			})
			.mouseout(function(){
				event.reset();
				jQuery(this).removeClass('ratingon');
			})
			.focus(function(){
				event.drain();
				jQuery(this).addClass('ratingon');
			})
			.blur(function(){
				event.reset();
				jQuery(this).removeClass('ratingon');
			}).click(function(){
				if(settings.enabled)
				{
					event.drain();
					settings.curvalue = 0;
					jQuery.post(container.url, {"rating": jQuery(this).children('a')[0].href.split('#')[1]});
	      			return false;
				}
				return true;
			});
	}
        
	var event ={
		fill: function(el){ // fill to the current mouse position.
			var index = stars.index(el) + 1;
			stars
				.children('a').css('width', '100%').end()
				.slice(0,index).addClass('ratinghover').end();
		},
		drain: function() { // drain all the stars.
			stars
				.filter('.ratingon').removeClass('ratingon').end()
				.filter('.ratinghover').removeClass('ratinghover').end();
		},
		reset: function(){ // Reset the stars to the default index.
			stars.slice(0,settings.curvalue / settings.increment).addClass('ratingon').end();
		}
	};    
	event.reset();
	
	return(this);	

};
