(function ($) { 

$.fn.ratingsUtils = function() {

	var ClientSide = {
	
		/* Client State Variables */
		clientState : {
			loginState : false,
			userCont : ".user-rating",
			avgCont : ".average-rating",
			productID : null,
			rater : 1,
			finalRating : 0,
			userSaved : null
		},
	
		/* Class Methods */
		initialize : function () { 
		
			if (typeof(window["globalProductID"]) != "undefined") {
				$.Ratings.clientState.productID = globalProductID;
			}
			if(globalUser.customer){
				$.Ratings.clientState.loginState = true;
			} else {
				$.Ratings.clientState.loginState = false;
			}
		}, // Initialize
		
		buildAll: function(){
			$.Ratings.build.UserSet();
			$.Ratings.build.AvgSet();
		}, //buildAll
	
		build : {
	
			UserSet : function () {

				if ($.Ratings.clientState.loginState==false) {
					var loginLink = $('a#login-link').attr('href');
					$($.Ratings.clientState.userCont).html("<a href=" + loginLink + ">Log in to rate this item</a>");
				}
				/* If Logged In */
				else {
	
					/* Step 1 */
					var set = 1;
					var type = "user";
					var rater = 1;
	
					/* Build Series of Empty Stars */
					for (var i = 1; i <= 8; i++) {
						if (i%2) { starHalf = "lstar"; }
						else { starHalf = "rstar"; }
						if (i < 3) { ender = " Star' />"; }
						else { ender = " Stars' />"; }
						$("span.stars", $.Ratings.clientState.userCont).append("<img border='0' src='../skins/graphics/70/elements/" + starHalf + "_" + set + ".png' class='stars off' name='star" + set + "_" + i + "' alt='" + type + rater + ": star" + set + "_" + i + "' title='" + i/2 + ender);
					}
					
					
					/* Step 2 (handle zero) */				
					$("span.stars",$.Ratings.clientState.userCont).prepend("<span class='cancel-rating'><img border='0' src='../skins/graphics/70/elements/0stars.png' class='zerostars off' alt='0 stars' title='Cancel rating' /></span>");
					$(".zerostars").hover( function() { $(this).addClass("on"); $(this).removeClass("off"); },
											function() { $(this).addClass("off"); $(this).removeClass("on"); })
									.css("cursor", "pointer")
									.click( function() { $.Ratings.clientState.userSaved = 0; $.Ratings.setUserRating(0); });
	
					$("img[ @alt *= '" + type + rater + ":']", $.Ratings.clientState.userCont).each( function() {
						$(this).css("cursor", "pointer");
						var starAlt = $(this).attr("alt");
						var starBuild = starAlt.substring(4, 5);
						var rating = starAlt.substring((starAlt.length-1), starAlt.length);
	
						$(this).mouseover( function() { $.Ratings.stars.empty(starBuild); $.Ratings.stars.lightUsers(rating); });
						$(this).mouseout( function() { $.Ratings.stars.empty(starBuild); $.Ratings.stars.lightUsers($.Ratings.clientState.userSaved); });
						$(this).click( function() { $.Ratings.clientState.userSaved = rating; $.Ratings.setUserRating(rating); });
	
					});
	
					$.Ratings.getUserRating();
					
				}
				
			}, // UserSet
			
			AvgSet : function () {
	
				$("span.avg-stars", $.Ratings.clientState.avgCont).empty();
	
				var set = 2;
				var type = "avg";
				var rater = 1;
	
				for (var i = 1; i <= 8; i++) {
					if (i%2) { starHalf = "lstar"; }
					else { starHalf = "rstar"; }
					if (i < 3) { ender = " Star' />"; }
					else { ender = " Stars' />"; }
			
					var appendStr = "<img border='0' src='../skins/graphics/70/elements/" + starHalf + "_" + set;
					appendStr += ".png' class='stars off' name='star" + set + "_" + i + "' alt='" + type + rater;
					appendStr += ": star" + set + "_" + i + "' title='" + i/2 + ender;
					
					$("span.avg-stars", $.Ratings.clientState.avgCont).append(appendStr);
					}
				
				$.Ratings.getAvgRating();
				
			} // Initial Avg Set
		
		},
	
		getAvgRating : function() {
			$.ajax({
				type: "GET",
				dataType: "html",
				cache: false,
				url: "../ajax/ajax_UserRatings.cfm?output=true&random=" + (Math.random() * Date.parse(new Date())),
				data: { method: "getAvgRating", id: $.Ratings.clientState.productID },
				complete: function(request) {
					var integer = Math.round(request.responseText);
					$.Ratings.stars.lightAvg(integer);
					}
			});
			
		}, // getAvg

		stars : {
		
			lightAvg : function(rating) {
	
				var set = 2;
				var type = "avg";
				var build = 1;
	
				for (var i = 1; i <= rating; i++) {
					var tempStar = "avg" + build + ": star" + set + "_" + i;
					$("img[ @alt = " + tempStar + " ]").removeClass("off").addClass("on").end();
				}
				
			}, // lightAvgStars
	
			lightUsers : function(rating) {
	
				var set = 1;
				var type = "user";
				var build = 1;
	
				for (var i = 1; i <= rating; i++) {
					if (set == 1) { var tempStar = "user" + build + ": star" + set + "_" + i; }
					else { var tempStar = "avg" + build + ": star" + set + "_" + i; }
					$("img[ @alt = " + tempStar + " ]").removeClass("off").addClass("on").end();
				}
				
			}, // lightUserStars
	
			empty : function(rater) {
	
				$("img[ @alt *= 'user" + rater + "' ]").removeClass("on").addClass("off").end();
	
			} // empty
			
		},

		getUserRating : function() {
			if ($.Ratings.clientState.userSaved != undefined) {
				var userSavedRating = $.Ratings.clientState.userSaved;
				$.Ratings.stars.lightUsers(userSavedRating);
			} else {
				$.ajax({
					type: "GET",
					dataType: "html",
					cache: false,
					url: "../ajax/ajax_UserRatings.cfm?output=true&random=" + (Math.random() * Date.parse(new Date())),
					data: { method: "getUserRating", id: $.Ratings.clientState.productID },
					complete: function(request) {
						var integer = Math.round(request.responseText);
						var labelText="Rate This:";
						if(integer){
							labelText="Your Rating:"
						}
						$.Ratings.clientState.userSaved = integer;
						$("label",$.Ratings.clientState.userCont).html(labelText);
						$.Ratings.stars.lightUsers(integer);
					}
				});
			}
		}, // getUser
	
		setUserRating : function (rated) {
			$("span.stars", $.Ratings.clientState.userCont).html("Saving...");
			var finalRating = rated;
			$.ajax({
				type: "GET",
				cache: false,
				url: "../ajax/ajax_UserRatings.cfm?output=true&random=" + (Math.random() * Date.parse(new Date())),
				data: { method: "setUserRating", id: $.Ratings.clientState.productID, rating: finalRating },
				complete: function() {
					$("span.stars", $.Ratings.clientState.userCont).html("");
					$.Ratings.buildAll();
				}
	
			});
		} // setUser
	
	} // End

	$.Ratings = $.extend( true, {}, ClientSide );



	/**********************************************/

	return this.each( function(i) { /* Empty Iteration */}
	
	/**********************************************/

	)};

})(jQuery);


/* ************************************************************************************** */

$(document).ready( function () {
	initializeRating();
});

/* Initialize Plugin */
function initializeRating(){

	$("body").ratingsUtils();
	$.Ratings.initialize();
	if (!($.Ratings.clientState.productID === null)) {
		if (!$.Ratings.clientState.loginState) {
			$.Ratings.buildAll();
		}
		else {
			/* After Cached Page */
			$.ajax({
				type: "GET",
				cache: false,
				url: "../ajax/ajax_UserRatings.cfm?output=true&random=" + (Math.random() * Date.parse(new Date())),
				data: {
					method: "dspUserRating",
					id: $.Ratings.clientState.productID
				},
				complete: function(request){
					var cacheBypass = request.responseText;
					$(".user-rating").html(cacheBypass);
					$.Ratings.buildAll();
				}
			});
		}
	}
}