




// JavaScript Document
/*************************************************
Star Rating System
First Version: 21 November, 2006
Author: Ritesh Agrawal
Inspriation: Will Stuckey's star rating system (http://sandbox.wilstuckey.com/jquery-ratings/)
Demonstration: http://php.scripts.psu.edu/rja171/widgets/rating.php
Usage: $('#rating').rating('www.url.to.post.com', {maxvalue:5, curvalue:0});

arguments
url : required -- post changes to 
options
	maxvalue: number of stars
	curvalue: number of selected stars
	
************************************************/

jQuery.fn.rating = function(url, options, params, cb) {
	if (url == null) return null;

  cb = cb || {};

	var settings = {
    url       : url, // post changes to
    maxvalue  : 5,   // max number of stars
    curvalue  : 0,   // number of selected stars
    readonly  : false
  };

  if (options) {
    jQuery.extend(settings, options);
  }

  var container = jQuery(this);
	
	jQuery.extend(container, {
    averageRating: settings.curvalue,
    readonly: settings.readonly,
    url: settings.url,
    urlParams : params,
    callback : cb,
    setReadonly : function() {
      this.readonly = true;
      jQuery(this).children('.star').children('a').attr('title', 'You have already voted.');
      jQuery(this).children('.star').parent().find('.star:lt('+this.averageRating+')').addClass('on').end();
    }
  });

var svalue=new Array();
svalue[0] = "unknown";
svalue[1] = "crap";
svalue[2] = "bad";
svalue[3] = "average";
svalue[4] = "good";
svalue[5] = "excellent";

	for (var i = 1; i <= settings.maxvalue ; i++) {
	  var title = svalue[i];
	  if (container.readonly) {
      title = "You have already voted.";
    }
    var div = '<div class="star"><a href="#'+i+'" title="'+title+'">'+i+'</a></div>';
    container.append(div);
  }

	var stars = jQuery(container).children('.star');
  stars.mouseover(function() { if (!container.readonly) { event.drain(); event.fill(this); } })
       .mouseout(function() { if (!container.readonly) { event.drain(); event.reset();}})
       .focus(function() { if (!container.readonly) { event.drain(); event.fill(this);}})
       .blur(function() { if (!container.readonly) { event.drain(); event.reset();}});
  stars.click(function() {
    if (!container.readonly) { 
  	settings.curvalue = jQuery(this).children('a')[0].href.split('#')[1];

		$(this).toggleClass('on');
    var params = container.urlParams;
    jQuery.extend(params, { "vote" : jQuery(this).children('a')[0].href.split('#')[1] });
		jQuery.post(container.url, params, function(data) {
      container.callback(container, data);
    }, "json");
    }
		return false;
  });

	var event = {
		fill: function(el){ // fill to the current mouse position.
			var index = stars.index(el) + 1;
			stars.children('a').css('width', '100%').end().parent().find('.star:lt('+index+')').addClass('hover').end();
		},
		drain: function() { // drain all the stars.
			stars.filter('.on').removeClass('on').end().filter('.hover').removeClass('hover').end();
		},
		reset: function(){ // Reset the stars to the default index.
			stars.parent().find('.star:lt('+settings.curvalue+')').addClass('on').end();
		}
	}        
	event.reset();
	
	return(this);
}
