var rating_RatingSystem = {
	rateContentMethod: null,
	rateContentMethodCallback: null,
	rateContentRatingType: 'star',
	currentlyLoading: Array(),
	divToChange: null,
	ratingClass: "star_rating_",
	starRatings: Array(),
	
	rateContent: function(xrefId, xrefType, rating, divToChange, rememberRate)
	{
		if (rating_RatingSystem.currentlyLoading[xrefId]) {
			return false;
		}
		
		if (divToChange == undefined) {
			divToChange = '';
		}
		
		if (rating_RatingSystem.rateContentMethod != null) {
			return rating_RatingSystem.rateContentMethod(xrefId, xrefType, rating);
		}
		
		var params = new Array();
		
		params['xrefId'] = xrefId;
		params['xrefType'] = xrefType;
		params['responseFunction'] = rating_RatingSystem.rateContentSuccess;
		if (rating_RatingSystem.rateContentMethodCallback) {
			params['responseFunction'] = rating_RatingSystem.rateContentMethodCallback;
		}
		params['rating'] = rating;
		params['responseType'] = 'JSON';
		params['handlerName'] = 'one_ajax_Rating';
		params['action'] = 'rateContent';
		params['requestType'] = 'class';
		params['extraVars'] = {
			xrefId: xrefId, 
			div: divToChange, 
			xrefType: xrefType,
			rememberRating: rememberRate,
			rating: rating
		}
		
		rating_RatingSystem.currentlyLoading[xrefId] = true;
		
		OneAjax.request(params);
	},
	
	rateContentSuccess: function(o, extraParams)
	{
		rating_RatingSystem.currentlyLoading[extraParams['xrefId']] = false;
		
		if (!o['success']) {
			alert("Sorry the request failed: " + o['message']);
			return false;
		}
		
		if (!o['numRatings']) {
			return false;
		}
		
		var extras = {
			rememberRating: extraParams['rememberRating'],
			rating: extraParams['rating']
		};
			
		rating_RatingSystem.updateRatingDisplay(o['newRating'], o['numRatings'], 
			extraParams['xrefId'], extraParams['div'], o['system'], extras);
	},
	
	updateRatingDisplay: function(newRating, numRatings, xrefId, div, system, extra)
	{
		var ratings = numRatings.split(',');
		
		if (system == 'stars') {
			if (extra['rememberRating']) {
				rating_RatingSystem.hilightStars(xrefId, div, extra['rating']);
				rating_RatingSystem.starRatings[xrefId] = extra['rating'];
			} else {
				rating_RatingSystem.hilightStars(xrefId, div, newRating);
				rating_RatingSystem.starRatings[xrefId] = newRating;
			}
			
			var anotherID = 'num_of_ratings' + xrefId;
			// TODO: Translate and not make hard coded
			var rateStr = newRating + " (" + numRatings + " Ratings)";
			
			document.getElementById(anotherID).innerHTML = rateStr;
		} else if (system == 'thumbs') {
			document.getElementById('rating_up' + xrefId).innerHTML = ratings[0];
			document.getElementById('rating_down' + xrefId).innerHTML = ratings[1];
		} else if (system == 'props') {
			document.getElementById('num_of_ratings' + xrefId).innerHTML = ratings[0];
			
			var propButton = document.getElementById(div + xrefId);
			
			propButton.className = 'props_rating_button';
			propButton.onclick = '';
			propButton.onmouseover = '';
			propButton.onmouseout = '';
		}
	},
	
	hilightStars: function(xrefId, baseDivName, newRating)
	{
		var starChildren = document.getElementById('do_rating_div' + xrefId).childNodes;
		var skippedCount = 0;
		var iteration = 0;
		var theRemainder = newRating - Math.floor(newRating);
		
		for (i = 0; i < starChildren.length; i++) {
			if (!starChildren[i].id || starChildren[i].id.toString().indexOf('star_rating') == -1) {
				skippedCount++;
				continue;
			}
			
			iteration = i - skippedCount;
			
			var newID = (iteration + 1) + '_' + baseDivName + xrefId;
			var newClass = 'whole';
			
			if (iteration > newRating || iteration == Math.floor(newRating) && theRemainder < .25) {
				newClass = 'empty';
			} else if (iteration == Math.floor(newRating) && (theRemainder > .25 && theRemainder < .75)) {
				newClass = 'half';
			}
			
			YAHOO.util.Dom.removeClass(starChildren[i], "star_rating_whole");
			YAHOO.util.Dom.removeClass(starChildren[i], "star_rating_empty");
			YAHOO.util.Dom.removeClass(starChildren[i], "star_rating_half");
			
			YAHOO.util.Dom.addClass(starChildren[i], "star_rating_"+newClass);
		}
	},
	
	setRatingMethod: function(method)
	{
		rating_RatingSystem.rateContentMethod = method;
	},
	
	setRatingMethodCallback: function(method)
	{
		rating_RatingSystem.rateContentMethodCallback = method;
	},
	
	setRatingType: function(type)
	{
		rating_RatingSystem.rateContentRatingType = type;
	},
	
	/**
	 * Sets the star rating for a piece of content.
	 * 
	 * @param int id Identifier
	 */
	setStarRating : function (id, rating)
	{
		rating_RatingSystem.starRatings[id] = rating;
	}
};
