/*
Name		:	Content - Game Poster - Game Players
Author/s	:	Yang Wong
Related		:	php, css, js
*/

// CLASS //

var COM_CIPHERCITIES_GAMEPLAYERS = Class.create();
COM_CIPHERCITIES_GAMEPLAYERS.prototype =
{

	// CONSTRUCTOR //

	initialize: function()
	{
		// CONSTANTS //

		this.PLAYERS_SORT_ID			= COM_CIPHERCITIES_GLOBALS.SORT_EARLIEST;
		this.PLAYERS_SHOW_TOTAL			= 50;
		this.PLAYERS_ROW_TOTAL			= 7;
		this.PLAYERS_TYPE_TOTAL			= 2;
		this.PLAYERS_PAGE_TOTAL			= 5;

		this.ERROR_PLAYERS_NOTRETRIEVED	= 'Player(s) could not be retrieved. Please try again later.';
	},

	// INITIALISATION //

	init: function()
	{
		// Tooltips
		var options = {
						contentClass: 'tooltip_content_1',
						maxWidth: 250
						//mouseFollow: false
						};
		$$('.gp_p_tooltip').each(function(element) { new Tooltip(element, options); });

		// End if game player summary
		if ($('gp_p_status') == null) return;

		// Status
		$('gp_p_status').hide();
		$('gp_p_status').removeClassName('com_hidden');

		// Pages
		if ($('gp_p_pages_total'))
		{
			var i = 1;
			while ($('gp_p_page_'+i))
			{
				Event.observe('gp_p_page_'+i, 'click', this.getPlayers.bind(this, i));
				i++;
			}
			var numPages = Math.ceil($('gp_p_pages_total').value / this.PLAYERS_SHOW_TOTAL);
			if (numPages > i)
			{
				Event.observe('gp_p_page_'+numPages, 'click', this.getPlayers.bind(this, numPages));
			}
		}
	},

	// HELPER //

	showStatusError: function(message)
	{
		COM_CIPHERCITIES_COMMON.showStatusError('gp_p_status', message);
	},

	showStatusSuccess: function(message)
	{
		COM_CIPHERCITIES_COMMON.showStatusSuccess('gp_p_status', message);
	},

	showStatusLoading: function(message)
	{
		COM_CIPHERCITIES_COMMON.showStatusLoading('gp_p_status', message);
	},

	clearStatus: function()
	{
		COM_CIPHERCITIES_COMMON.clearStatus('gp_p_status');
	},

	// ACTIONS //

	getPlayers: function(page)
	{
		// Hide players
		// Show loading status
		$('gp_p_players').hide();
		$('gp_p_pages').hide();
		this.showStatusLoading();

		// Get Game Players
		var target = 'getGamePlayers';
		var data = new Object();
		data.gameID = $('gp_p_value_game_id').value;
		data.sortID = this.PLAYERS_SORT_ID;
		data.start = (page-1)*this.PLAYERS_SHOW_TOTAL;
		data.size = this.PLAYERS_SHOW_TOTAL;
		var args =
		{
			method: 'get',
			parameters: {target: target, data: Object.toJSON(data), v: Date()},
			onSuccess: this.processGetPlayers.bindAsEventListener(this, page)
		}
		new Ajax.Request(COM_CIPHERCITIES_GLOBALS.HANDLER_MAIN, args);
	},

	processGetPlayers: function(data, page)
	{
		// Evaluate data
		var response = data.responseText.evalJSON(true);

		if (!response.success)
		{
			this.showStatusError(this.ERROR_PLAYERS_NOTRETRIEVED);
			$('gp_p_messages').show();
			return;
		}

		// Draw players
		this.clearStatus();
		this.drawPlayers(response.data, page);
	},

	drawPlayers: function(data, page)
	{
		// Draw Players
		var html = '';
		if (data.players.length < 1)
		{
			html += '<div class="gp_p_players_none">No Players</div>';
		}
		else
		{
			for (var i=0; i<this.PLAYERS_SHOW_TOTAL; i++)
			{
				var player = data.players[i];

				if (player == null)
				{
					if ((i % this.PLAYERS_ROW_TOTAL) != 0) html += '</div>';
					break;
				}

				var urlUser = COM_CIPHERCITIES_COMMON.getURLUserProfile(player.username);

				// Row <
				if ((i % this.PLAYERS_ROW_TOTAL) == 0)
				{
					html += '<div class="gameplayersplayerrow">';
				}

					// Player <
					html += '<div class="gameplayers_lplayer'+(i % this.PLAYERS_TYPE_TOTAL)+'">';

						/* Remember to include status.js in php
						// Status <
						var status = COM_CIPHERCITIES_STATUS.getStatus(parseInt(player.statusID));
						html += '<div class="gameplayersplayerstatus">';
							html += status;
						html += '</div>';
						// > Status
						*/

						// Image <
						html += '<div class="gameplayersplayerimage">';
							html += '<a href="'+urlUser+'">';
								html += '<img src="'+COM_CIPHERCITIES_COMMON.getImageUserMedium(player.image)+'" alt="User Image" class="com_img_frame" />';
							html += '</a>';
						html += '</div>';
						// > Image

						// Ratings <
						var builderRating = new Number(parseFloat(player.builderRating));
						builderRating = builderRating.toFixed(1);
						html += '<div class="gameplayersplayerratings">';
							html += '['+player.playerRating+'] ['+builderRating+']';
						html += '</div>';
						// > Ratings

						// Username <
						var username = COM_CIPHERCITIES_COMMON.insertIntoWordsOfLength(player.username, '<br />', 10);
						html += '<div class="gameplayersplayerusername">';
							html += '<a href="'+urlUser+'">'+username+'</a>';
						html += '</div>';
						// > Username

					html += '</div>';
					// > Player

				if ((i % this.PLAYERS_ROW_TOTAL) == this.PLAYERS_ROW_TOTAL-1)
				{
					html += '</div>';
				}
				// > Row

				if (i == this.PLAYERS_SHOW_TOTAL-1 && (i % this.PLAYERS_ROW_TOTAL) != this.PLAYERS_ROW_TOTAL-1)
				{
					html += '</div>';
				}
			}
		}
		$('gp_p_players').update(html);
		$('gp_p_players').show();

		// Draw Pages
		var html = '';
		if (data.totalPlayers > 0)
		{
			var numPages = Math.ceil(data.totalPlayers / this.PLAYERS_SHOW_TOTAL);
			html += '<div class="gp_p_pages">';

				// Values <
				html += '<input type="hidden" id="gp_p_pages_total" value="'+data.totalPlayers+'" />';
				// > Values

				// List <
				html += '<ul>';
					html += '<li>Total Players |</li>';
					html += '<li><span id="gp_p_pages_total_label">'+data.totalPlayers+'</span></li>';
					html += '<li>| Page |</li>';

					// Determine which page counters to draw
					var pageCounters = new Array();
					if (numPages > this.PLAYERS_PAGE_TOTAL)
					{
						var edge = 1;
						pageCounters.push(1);
						pageCounters.push(numPages);
						if (page != 1 && page != numPages) pageCounters.push(page);
						while (pageCounters.length < this.PLAYERS_PAGE_TOTAL)
						{
							if (page + edge < numPages) pageCounters.push(page + edge);
							if (page - edge > 1) pageCounters.push(page - edge);
							edge++;
						}
						pageCounters.sort(COM_CIPHERCITIES_COMMON.sortNumber);
					}
					else
					{
						for (var i=1; i<=numPages; i++) pageCounters.push(i);
					}

					// Draw page counters
					var last = 0;
					var pageNum;
					for (var i=0; i<pageCounters.length; i++)
					{
						pageNum = pageCounters[i];
						if (pageNum > last + 1) html += '<li>...</li>';
						html += '<li><a href="#" onclick="return false;" id="gp_p_page_'+pageNum+'"';
						if (pageNum == page) html += ' class="gp_p_pages_current"';
						html += '>'+pageNum+'</a></li>';
						last = pageNum;
					}

					html += '<li>|</li>';
				html += '</ul>';
				// > List

			html += '</div>';
		}
		$('gp_p_pages').update(html);
		$('gp_p_pages').show();

		// Initialise Pages
		for (var i=0; i<pageCounters.length; i++)
		{
			pageNum = pageCounters[i];
			Event.observe('gp_p_page_'+pageNum, 'click', this.getPlayers.bind(this, pageNum));
		}
	}

}

// MAIN //

var content = new COM_CIPHERCITIES_GAMEPLAYERS();
Event.observe(window, 'load', content.init.bind(content));
