
com.ag.ratingsModule = {
	goodVotes: 0,
	badVotes: 0,
	userRating: '0',
	ratingsChildContainer: '.rateInner',
	init: function() {
		if (LoginModule.isUserLoggedIn()){
			com.ag.ratingsModule.getAlreadyRated();
		}else{
			com.ag.ratingsModule.showDefaultPod();
		}
		com.ag.ratingsModule.getVotesFromServer();
		AgEvent.LOGIN.subscribe(com.ag.ratingsModule.getAlreadyRated);
		AgEvent.LOGOUT.subscribe(com.ag.ratingsModule.restoreDefaultPod);
	},
	showDefaultPod: function() {
		$(com.ag.ratingsModule.ratingsChildContainer).css("visibility", "visible");
		$('.rateUp').click(function() {
			com.ag.ratingsModule.userRating = 'G';
			com.ag.ratingsModule.userVote();
		});
		$('.rateDown').click(function() {
			com.ag.ratingsModule.userRating = 'B';
			com.ag.ratingsModule.userVote();
		});
	},
	printRatedPod: function(){
		if(com.ag.ratingsModule.userRating != 'G' && com.ag.ratingsModule.userRating != 'B'){
			com.ag.ratingsModule.showDefaultPod();
			return;
		}
		$('.rateTitle').html('<img src="/static/images/rated-check.png" />Rated!');
		$('.ratings').html('You rated it: ' + '<span class="rating-thumb-' + com.ag.ratingsModule.userRating + '">&nbsp;</span>(<a class="changeRating">change</a>)');
		$('.changeRating').click( function() {
			com.ag.ratingsModule.restoreDefaultPod();
		});
		$(com.ag.ratingsModule.ratingsChildContainer).css("visibility", "visible");

	},
	restoreDefaultPod: function(){
		$('.rateTitle').text('Rate It!');
		$('.ratings').html('' +
			'<a class="rateUp rating-thumb-G"> I like it!</a>' +
			'<a class="rateDown rating-thumb-B"> I don\'t like it!</a>');
		com.ag.ratingsModule.recalculateVotesOnChange();
	},
	recalculateVotesOnChange: function() {
		$('.ratings .rating-thumb-G').click(function() {
			if (com.ag.ratingsModule.userRating === 'B'){
				com.ag.ratingsModule.badVotes =- 1;
			}
			com.ag.ratingsModule.userRating = 'G';
			com.ag.ratingsModule.userVote();
		});
		$('.ratings .rating-thumb-B').click(function() {
			if (com.ag.ratingsModule.userRating === 'G'){
				com.ag.ratingsModule.goodVotes =- 1;
			}
			com.ag.ratingsModule.userRating = 'B';
			com.ag.ratingsModule.userVote();
		});
	},
	getRatingToPost: new com.ag.jsonRequest(),
	getAlreadyRated: function() {
		var postUrl = "/dynamic/services";
		var message = com.ag.ratingsModule.getRatingToPost; // stub the context for readability
		message.method = "gameRatingService.get";
		message.params[0] = {
					gameId: com.ag.gamePageGameId,
					uuid: LoginModule.loginCookie.cookie(LoginModule.USER_UUID_SESSION_COOKIE)
				};
		$.post( postUrl, JSON.stringify(message), function(data) { // Callback
			var obj = data;
			com.ag.ratingsModule.userRating = obj.result.rating;
			if(com.ag.ratingsModule.userRating == 'G' || com.ag.ratingsModule.userRating == 'B'){
				com.ag.ratingsModule.printRatedPod();
			}else{
				com.ag.ratingsModule.showDefaultPod();
			}
		});
	},
	getVotesFromServer: function () {
		var requestUrl = "/json/ratings/" + com.ag.gamePageGameId + "?comment=false";
		$.getJSON( requestUrl, function(data) {
			com.ag.ratingsModule.goodVotes = data.good;
			com.ag.ratingsModule.badVotes = data.bad;

			com.ag.ratingsModule.updateVoteCount();
		});
	},
	updateVoteCount: function() {
		var totalVotes =  com.ag.ratingsModule.goodVotes + com.ag.ratingsModule.badVotes;

		$("#totalVotes").text( totalVotes );

		if(totalVotes > 0) {
			var percentVotes = Math.round((com.ag.ratingsModule.goodVotes / totalVotes)*100) + '%';
		$(".votesCount").text(percentVotes);
		$(".good").css('width', percentVotes);
		}
	},
	userVote: function(){
		if (LoginModule.isUserLoggedIn()){
			com.ag.ratingsModule.postRating();
			return;
		}
		AgEvent.LOGIN.subscribeOnce(bindContext(this,com.ag.ratingsModule.postRating));
		AgEvent.REGISTER.subscribeOnce(bindContext(this, com.ag.ratingsModule.postRating));
		LoginModule.showLogin({'headerMessage':'<i>You must be logged in to access this feature.</i>'});
	},
	ratingToPost: new com.ag.jsonRequest(),
	postRating: function() {
		com.ag.ratingsModule.postUrl = "/dynamic/services";
		var message = com.ag.ratingsModule.ratingToPost; // stub the context for readability
		message.method = "gameRatingService.save";
		message.params[0] = {
					gameId: com.ag.gamePageGameId,
					uuid: LoginModule.loginCookie.cookie(LoginModule.USER_UUID_SESSION_COOKIE),
					rating: com.ag.ratingsModule.userRating
				};
		$.post( this.postUrl, JSON.stringify(message), function(data) { // Callback
			if(data.result){
				com.ag.ratingsModule.rateGameCallback();
			}
		});
	},
	rateGameCallback: function() {
		if (com.ag.ratingsModule.userRating === 'G'){
			com.ag.ratingsModule.goodVotes =+ 1;
		} else if (com.ag.ratingsModule.userRating === 'B') {
			com.ag.ratingsModule.badVotes =+ 1;
		}
		com.ag.ratingsModule.printRatedPod();
		com.ag.ratingsModule.updateVoteCount();
		if (com.ag.loginFB.isFBLoggedIn) {
			FacebookRegisterModule.facebookPostToWall("GameRating", com.ag.gamePageGameId, com.ag.ratingsModule.userRating);
		}
		com.ag.ratingsModule.getVotesFromServer();
	}
};
$(document).ready( function () {
	com.ag.ratingsModule.init();
	});
