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

// CLASS //

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

	// CONSTRUCTOR //

	initialize: function()
	{
		// CONSTANTS //

		this.SNAPSHOTS_SORT_ID				= COM_CIPHERCITIES_GLOBALS.SORT_LATEST;
		this.SNAPSHOTS_SHOW_TOTAL			= 20;
		this.SNAPSHOTS_ROW_TOTAL			= 5;
		this.SNAPSHOTS_TYPE_TOTAL			= 2;
		this.SNAPSHOTS_PAGE_TOTAL			= 5;

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

	// INITIALISATION //

	init: function()
	{
		// If summary
		if ($('gs'))
		{
			this.initSummary();
			return;
		}

		// If main

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

		// Pages
		if ($('gss_pages_total'))
		{
			var i = 1;
			while ($('gss_page_'+i))
			{
				Event.observe('gss_page_'+i, 'click', this.getSnapshots.bind(this, i));
				i++;
			}
			var numPages = Math.ceil($('gss_pages_total').value / this.SNAPSHOTS_SHOW_TOTAL);
			if (numPages > i)
			{
				Event.observe('gss_page_'+numPages, 'click', this.getSnapshots.bind(this, numPages));
			}
		}
	},

	initSummary: function()
	{
		// Status
		$('gs_status').hide();
		$('gs_status').removeClassName('com_hidden');
	},

	// HELPER //

	// For gss_status only

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

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

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

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

	// ACTIONS //

	getSnapshots: function(page)
	{
		// Hide snapshots
		// Show loading status
		$('gss_snapshots').hide();
		$('gss_pages').hide();
		this.showStatusLoading();

		// Get Game Snapshots
		var target = 'getGameSnapshots';
		var data = new Object();
		data.gameID = $('gss_value_game_id').value;
		data.sortID = this.SNAPSHOTS_SORT_ID;
		data.start = (page-1)*this.SNAPSHOTS_SHOW_TOTAL;
		data.size = this.SNAPSHOTS_SHOW_TOTAL;
		var args =
		{
			method: 'get',
			parameters: {target: target, data: Object.toJSON(data), v: Date()},
			onSuccess: this.processGetSnapshots.bindAsEventListener(this, page)
		}
		new Ajax.Request(COM_CIPHERCITIES_GLOBALS.HANDLER_MAIN, args);
	},

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

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

		this.clearStatus();
		this.drawSnapshots(response.data, page);
	},

	drawSnapshots: function(data, page)
	{
		// Values
		var gameID = $('gss_value_game_id').value;

		// Draw Snapshots
		var html = '';
		if (data.snapshots.length < 1)
		{
			html += '<div class="com_empty_list">No Snapshots</div>';
		}
		else
		{
			for (var i=0; i<this.SNAPSHOTS_SHOW_TOTAL; i++)
			{
				var snapshot = data.snapshots[i];

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

				var urlUser = COM_CIPHERCITIES_COMMON.getURLUserProfile(snapshot.username);
				var urlSnapshot = COM_CIPHERCITIES_COMMON.getURLGameSnapshot(gameID, snapshot.snapshotID);

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

					// Snapshot <
					html += '<div class="gss_snapshot_'+(i % this.SNAPSHOTS_TYPE_TOTAL)+'">';

						// Image <
						html += '<div class="gss_snapshots_image">';
							html += '<a href="'+urlSnapshot+'">';
								html += '<img src="'+COM_CIPHERCITIES_COMMON.getImageGameMedium(snapshot.image)+'" />';
							html += '</a>';
						html += '</div>';
						// > Image

						// User <
						username = COM_CIPHERCITIES_COMMON.insertIntoWordsOfLength(snapshot.username, '<br />', 15);
						html += '<div class="gss_snapshots_user">';
							html += '<div class="gss_snapshots_user_label">Snapshot By</div>';
							html += '<div class="gss_snapshots_user_username">';
								html += '<a href="'+urlUser+'">'+username+'</a>';
							html += '</div>';
						html += '</div>';
						// > User

						// Posted <
						posted = COM_CIPHERCITIES_COMMON.formatDate(snapshot.posted);
						html += '<div class="gss_snapshots_posted">';
							html += posted;
						html += '</div>';
						// > Posted

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

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

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

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

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

				// List <
				html += '<ul>';
					html += '<li>Total Snapshots |</li>';
					html += '<li><span id="gss_pages_total_label">'+data.totalSnapshots+'</span></li>';
					html += '<li>| Page |</li>';

					// Determine which page counters to draw
					var pageCounters = new Array();
					if (numPages > this.SNAPSHOTS_PAGE_TOTAL)
					{
						var edge = 1;
						pageCounters.push(1);
						pageCounters.push(numPages);
						if (page != 1 && page != numPages) pageCounters.push(page);
						while (pageCounters.length < this.SNAPSHOTS_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="gss_page_'+pageNum+'"';
						if (pageNum == page) html += ' class="gss_pages_current"';
						html += '>'+pageNum+'</a></li>';
						last = pageNum;
					}

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

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

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

}

// MAIN //

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