﻿/* GameRooms class definition */
var GameRooms = function() {
    /* controls' ClientIDs */
    this.ClientId_BtnHiddenClosePromptPasswordPopup = null;
    this.ClientId_CurrentRoomLevelId = null;
    this.ClientId_HdnPrevIndex = null;
    this.ClientId_HdnNextIndex = null;
    this.ClientId_HdnOrderBy = null;
    this.ClientId_HdnOrderByAsc = null;
    this.ClientId_HdnGID = null;
    this.ClientId_HdnPageNumber = null;
    this.ClientId_HdnPageCount = null;
    this.ClientId_HdnTotalRecords = null;
    this.ClientId_ImgSortName = null;
    this.ClientId_ImgSortNbPlayers = null;
    this.ClientId_ImgSortOpenTo = null;
    this.ClientId_PromptPasswordPopup = null;
    this.ClientId_HdnRoomTableIdPrivate = null;

    /* controls' names */
    this.ClientName_XhrIframe = null;

    /* variables */
    this.Var_UserId = null;
    this.Var_GameType = null;
    this.Var_IsGuest = null;
    this.Var_MultiUrl = null;
    this.Var_GameServerIp = null;
    this.Var_GameServerPort = null;
    this.Var_CookieDetails = null;
    this.Var_GameId = null;
    this.Var_GameVersion = null;
    this.Var_Preload = null;
    this.Var_Language = null;
    this.Var_RoomsList = null;
    this.Var_GameName = null;
    this.Var_GameServerSuffix = null;

    /* images */
    this.Image_Spacer = null;
    this.Image_Lock = null;
    this.Image_JoinRoom = null;
    this.Image_Flkup = null;
    this.Image_Flkdw = null;
    this.Image_Fl2grey = null;

    /* config */
    this.Config_RoomsPerPage = null;

    /* resources */
    this.Resources_GameInPlay = null;
    this.Resources_RoomFull = null;
    this.Resources_WhosInRoom = null;
    this.Resources_OnlineNow = null;
    this.Resources_PagerPrevious = null;
    this.Resources_PagerNext = null;
    this.Resources_PagerInfo = null;
    this.Resources_WhosInRoomGuestNumber = null;
    this.Resources_RoomAccessSolo = null;
}

GameRooms.OnLeaveGame = function(popupToClose)
{
	$find(popupToClose).hide();
}

GameRooms.ClosePromptPasswordPopup = function()
{
	document.getElementById(this.ClientId_BtnHiddenClosePromptPasswordPopup).click();
}

GameRooms.Snapshot = function(objJson)
{
	GameRooms.SaveRooms(CometUtils.CreateObjectFromJson(objJson).CometUpdate);
}

GameRooms.Update = function(objJson)
{
	GameRooms.UpdateRooms(CometUtils.CreateObjectFromJson(objJson).CometUpdate);
}

GameRooms.UpdatePlayers = function(objJson)
{
	var nbPlayers = CometUtils.CreateObjectFromJson(objJson);
	document.getElementById('lblNbOnlineNow').innerHTML = nbPlayers + '&nbsp;' + this.Resources_OnlineNow;
	document.getElementById('lblOnlineNow').innerHTML = nbPlayers + '&nbsp;' + this.Resources_OnlineNow;
}

GameRooms.StartPoll = function()
{
	window.frames[this.ClientName_XhrIframe].xhrCross_StartPollFromParent();
}

GameRooms.SaveRooms = function(objRooms)
{
	var level = parseInt(document.getElementById(this.ClientId_CurrentRoomLevelId).value);

	GameRooms.ResetRooms();
	GameRooms.SetTopElements(objRooms);
	for (var i = 0; i < objRooms.Rooms.length; i++)
	{
		var room = objRooms.Rooms[i];

		var roomExists = GameRooms.FindRoom(room.RoomTableId);
		if (roomExists == undefined || roomExists == null)
			GameRooms.AddRoom(room);
		else
			GameRooms.UpdateRoom(room);

		if (((level != -1 && level == room.LevelId) || (level == -1)) && GameRooms.IsValidRoom(room))
			GameRooms.DrawRoom(room);
	}
}

GameRooms.ResetRooms = function()
{
	this.Var_RoomsList = new Array();
	CometUtils.Table_Clear('tblRooms', 6);
}

GameRooms.UpdateRooms = function(objRooms)
{
	var level = parseInt(document.getElementById(this.ClientId_CurrentRoomLevelId).value);

	GameRooms.SetTopElements(objRooms);
	for (var i = 0; i < objRooms.Rooms.length; i++)
	{
		var room = objRooms.Rooms[i];
		var roomExists = GameRooms.FindRoom(room.RoomTableId);
		var toBeRemoved = false;

		if (roomExists == undefined || roomExists == null)
			GameRooms.AddRoom(room);
		else
		{
			toBeRemoved = GameRooms.RoomToBeRemoved(room);
			if (toBeRemoved)
				GameRooms.RemoveRoom(room);
			else
				GameRooms.UpdateRoom(room);
		}

		if (((level != -1 && level == room.LevelId) || (level == -1)) &&
			!toBeRemoved &&
			GameRooms.IsValidRoom(room))
			GameRooms.DrawRoom(room);
	}
}

GameRooms.FilterRoomsByLevelId = function(levelId)
{
	CometUtils.Table_Clear('tblRooms', 6);
	for (i in this.Var_RoomsList)
		if (levelId == this.Var_RoomsList[i].LevelId)
			GameRooms.DrawRoom(this.Var_RoomsList[i]);
}

GameRooms.FindRoom = function(RoomTableId)
{
	return this.Var_RoomsList[RoomTableId.toString()];
}

GameRooms.IsValidRoom = function(room)
{
	return room.RoomName != null &&
		room.RoomName != undefined &&
		room.RoomName != '' &&
		room.NoOfPlayers >= 0 &&
		room.MaxNoOfPlayers >= 0;
}

GameRooms.AddRoom = function(room)
{
	this.Var_RoomsList[room.RoomTableId.toString()] = room;
}

GameRooms.RemoveRoom = function(room)
{
	CometUtils.TableRow_DeleteRow('tblRooms', 'tr' + room.RoomTableId);
	CometUtils.TableRow_DeleteRow('tblRooms', 'tr' + room.RoomTableId + 'Spacer');
	delete this.Var_RoomsList[room.RoomTableId.toString()];
}

GameRooms.RoomToBeRemoved = function(room)
{
	return room.IsRemovable && room.RoomStatus == 1;
}

GameRooms.UpdateRoom = function(room)
{
	var roomTableId = room.RoomTableId.toString();
	this.Var_RoomsList[roomTableId].IsPrivate = room.IsPrivate;
	this.Var_RoomsList[roomTableId].NoOfPlayers = room.NoOfPlayers;
	this.Var_RoomsList[roomTableId].MaxNoOfPlayers = room.MaxNoOfPlayers;
	this.Var_RoomsList[roomTableId].OpenTo = room.OpenTo;
	this.Var_RoomsList[roomTableId].RoomTableId = room.RoomTableId;
	this.Var_RoomsList[roomTableId].RoomId = room.RoomId;
	this.Var_RoomsList[roomTableId].RoomStatus = room.RoomStatus;
	this.Var_RoomsList[roomTableId].LevelId = room.LevelId;
	this.Var_RoomsList[roomTableId].IsRemovable = room.IsRemovable;
	this.Var_RoomsList[roomTableId].Users = room.Users;
}

GameRooms.DrawRoom = function(room)
{
	var row = document.getElementById('tr' + room.RoomTableId);
	if (row == null)
	{
		row = CometUtils.Table_InsertRowEnd('tblRooms');
		row.id = 'tr' + room.RoomTableId;

		var cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.id = 'td' + room.RoomTableId + 'RoomName';

		cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.innerHTML = CometUtils.GetSpacer(this.Image_Spacer);

		cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.id = 'td' + room.RoomTableId + 'Players';

		cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.innerHTML = CometUtils.GetSpacer(this.Image_Spacer);

		cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.id = 'td' + room.RoomTableId + 'OpenTo';

		cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.innerHTML = CometUtils.GetSpacer(this.Image_Spacer);

		cell = cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.align = 'center';
		cell.height = '24px';
		cell.id = 'td' + room.RoomTableId + 'Join';

		row = CometUtils.Table_InsertRowEnd('tblRooms');
		row.id = 'tr' + room.RoomTableId + 'Spacer';
		cell = CometUtils.TableRow_InsertCellEnd(row);
		cell.colSpan = 7;
		cell.className = 'lined';
		cell.innerHTML = CometUtils.GetSpacer(this.Image_Spacer);
	}

	var cell = document.getElementById('td' + room.RoomTableId + 'RoomName');
	GameRooms.SetRoomName(cell, room);

	cell = document.getElementById('td' + room.RoomTableId + 'Players');
	GameRooms.SetFillPercentageInfo(cell, room);

	cell = document.getElementById('td' + room.RoomTableId + 'OpenTo');
	cell.innerHTML = '&nbsp;&nbsp;' + GameRooms.SetOpenToColumn(room);

	cell = document.getElementById('td' + room.RoomTableId + 'Join');
	GameRooms.SetJoinRoomAction(cell, room);
}

GameRooms.SetJoinRoomAction = function(cell, room)
{
	if (room.RoomStatus == 2 || room.RoomStatus == 4)
		cell.innerHTML = this.Resources_GameInPlay;
	else if (room.NoOfPlayers == room.MaxNoOfPlayers)
		cell.innerHTML = this.Resources_RoomFull;
	else
	{
		var action;
		if (this.Var_GameType == 2 || room.IsPrivate)
		{
			var actionArgument = String.format('btnJoin${0}${1}${2}', room.RoomId, room.RoomTableId, room.IsPrivate);

			if (this.Var_IsGuest && (room.IsRemovable || room.IsPrivate))
				action = 'ShowAccessDeniedPopup(0, null); return false;';
			else if (this.Var_IsGuest && !room.IsRemovable && !room.IsPrivate)
				action = 'ShowAccessDeniedPopup(1, \'' + actionArgument + '\'); return false;';
			else
			{
				if (room.IsPrivate)
				{
					action = 'GameRooms.PromptRoomPassword(' + room.RoomTableId + ');';
				}
				else
					action = '__doPostBack(\'' + actionArgument + '\', \'\'); return false;';
			}

			cell.innerHTML = CometUtils.A_CreateEx(action, CometUtils.Img_Create(this.Image_JoinRoom, 100, 24));
		}
		else if (this.Var_GameType == 3)
		{
			action = 'javascript:GameRooms.JoinRoom(' + room.RoomTableId + ');';

			if (this.Var_IsGuest && room.IsRemovable)
				action = 'ShowAccessDeniedPopup(0, null); return false;';
			else if (this.Var_IsGuest && !room.IsRemovable)
				action = 'ShowAccessDeniedPopup(1, \'' + action + '\', 1); return false;';

			if (this.Var_IsGuest)
				cell.innerHTML = CometUtils.A_CreateEx(action, CometUtils.Img_Create(this.Image_JoinRoom, 100, 24));
			else
				cell.innerHTML = CometUtils.A_Create(action, CometUtils.Img_Create(this.Image_JoinRoom, 100, 24));
		}
	}

	var menuId = cell.id + 'Menu';
	var users = GameRooms.GetUsersInRoom(room);
	var whosInRoom = String.format(this.Resources_WhosInRoom, room.RoomName);
	if (users != '')
	{
		cell.innerHTML += String.format(document.getElementById('hdnDivUsersInRoom').innerHTML, menuId, whosInRoom, users);
		cell.onmouseover = function() { GameRooms.ShowUsersInRoom(true, menuId, cell.id); }
		cell.onmouseout = function() { GameRooms.ShowUsersInRoom(false, menuId, null); }
	}
}

GameRooms.PromptRoomPassword = function(roomTableId)
{
	document.getElementById(this.ClientId_HdnRoomTableIdPrivate).value = roomTableId;
	$find(this.ClientId_PromptPasswordPopup).show();
}

GameRooms.JoinRoom = function(roomTableId)
{
	var room = this.Var_RoomsList[roomTableId.toString()];

	var newHref = String.format(
		this.Var_MultiUrl,
		this.Var_GameServerIp,
		this.Var_GameServerPort,
		this.Var_CookieDetails,
		roomTableId,
		this.Var_GameId,
		room.CultureName,
		this.Var_GameVersion,
		0,
		0,
		this.Var_Preload,
		this.Var_GameName.replaceAll(' ', '-'),
		this.Var_GameServerSuffix);
	document.location.href = newHref;
}

GameRooms.GetUsersInRoom = function(room)
{
	var usersList = '';
	var nbGuests = 0;
	if (room.Users != null)
	{
		for (var i = 0; i < room.Users.length; i++)
		{
			if (room.Users[i][0] <= 0)
				nbGuests++;
			else
				usersList += '&nbsp;' + room.Users[i][1] + '<br>';
		}
		if (nbGuests != 0)
			usersList += '&nbsp;' + String.format(this.Resources_WhosInRoomGuestNumber, nbGuests);
	}
	return usersList;
}

GameRooms.SetTopElements = function(objRooms)
{
	document.getElementById('lblNbOnlineNow').innerHTML = objRooms.NoOfPlayers + '&nbsp;' + this.Resources_OnlineNow;
	document.getElementById('lblOnlineNow').innerHTML = objRooms.NoOfPlayers + '&nbsp;' + this.Resources_OnlineNow;
}

GameRooms.SetRoomName = function(cell, room)
{
	cell.innerHTML = '&nbsp;&nbsp;' + room.RoomName;
	if (room.IsPrivate)
		cell.innerHTML += '&nbsp;' + CometUtils.Img_Create(this.Image_Lock, 16, 16);
}

GameRooms.SetFillPercentageInfo = function(cell, room)
{
	if (room.NoOfPlayers > room.MaxNoOfPlayers)
		room.NoOfPlayers = room.MaxNoOfPlayers;

	var availableSeats = room.MaxNoOfPlayers - room.NoOfPlayers;

	if (this.Var_GameType == 2)
	{
		cell.innerHTML = room.NoOfPlayers;
		cell.align = 'center';
	}
	else
	{
		var percentageFill = 100 / room.MaxNoOfPlayers * (room.MaxNoOfPlayers - availableSeats);
		if (percentageFill > 0)
			cell.innerHTML = String.format(
				document.getElementById('hdnDivPercentageFill').innerHTML,
				room.NoOfPlayers + '/' + room.MaxNoOfPlayers,
				"width='" + ((room.MaxNoOfPlayers - availableSeats) * 100 / room.MaxNoOfPlayers) + "%'",
				''
			);
		else
			cell.innerHTML = String.format(
				document.getElementById('hdnDivPercentageFill').innerHTML,
				room.NoOfPlayers + '/' + room.MaxNoOfPlayers,
				0,
				"style='visibility:hidden;'"
			);
	}
}

GameRooms.SortRooms = function(obj, orderBy)
{
	var asc = parseInt(document.getElementById(this.ClientId_HdnOrderByAsc).value);
	asc = (asc == 1) ? 0 : 1;

	document.getElementById(this.ClientId_HdnOrderByAsc).value = asc;
	document.getElementById(this.ClientId_HdnOrderBy).value = orderBy;
}

GameRooms.UpdateSortButtons = function()
{
	var orderBy = parseInt(document.getElementById(this.ClientId_HdnOrderBy).value);
	var asc = parseInt(document.getElementById(this.ClientId_HdnOrderByAsc).value);

	if (orderBy == 1)
	{
		document.getElementById(this.ClientId_ImgSortName).src = (asc == 1) ? this.Image_Flkup : this.Image_Flkdw;
		document.getElementById(this.ClientId_ImgSortNbPlayers).src = this.Image_Fl2grey;
		document.getElementById(this.ClientId_ImgSortOpenTo).src = this.Image_Fl2grey;
	}
	else if (orderBy == 2)
	{
		document.getElementById(this.ClientId_ImgSortName).src = this.Image_Fl2grey;
		document.getElementById(this.ClientId_ImgSortNbPlayers).src = (asc == 1) ? this.Image_Flkup : this.Image_Flkdw;
		document.getElementById(this.ClientId_ImgSortOpenTo).src = this.Image_Fl2grey;
	}
	else if (orderBy == 3)
	{
		document.getElementById(this.ClientId_ImgSortName).src = this.Image_Fl2grey;
		document.getElementById(this.ClientId_ImgSortNbPlayers).src = this.Image_Fl2grey;
		document.getElementById(this.ClientId_ImgSortOpenTo).src = (asc == 1) ? this.Image_Flkup : this.Image_Flkdw;
	}
}

GameRooms.ShowUsersInRoom = function(show, menuId, cellId)
{
	var menu = document.getElementById(menuId);

	if (menu != null)
	{
		if (show)
		{
			var relativeX = getElementLeft(document.getElementById(cellId));
			var relativeY = getElementTop(document.getElementById(cellId));
			document.getElementById(menuId).style.left = relativeX - 205 + 'px';
			document.getElementById(menuId).style.top = relativeY + 'px';
			document.getElementById(menuId).style.display = '';
		}
		else
			document.getElementById(menuId).style.display = 'none';
	}
}

GameRooms.SetOpenToColumn = function(room)
{
	var opento = null;
	if (room.MaxNoOfPlayers == 1 && room.IsRemovable == 1)
	{
		opento = this.Resources_RoomAccessSolo;
	}
	else
	{
		var hdnOpenToList = document.getElementById('hdnOpenToList');
		for (var i = 0; i < hdnOpenToList.options.length; i++)
		{
			var option = hdnOpenToList.options[i];
			if (option.value == room.OpenTo)
				return option.label;
		}
	}
	return opento;
}

GameRooms.LaunchGame = function(mode)
{
	var newHref = String.format(
		this.Var_MultiUrl,
		this.Var_GameServerIp,
		this.Var_GameServerPort,
		this.Var_CookieDetails,
		this.Var_GameId * -1,
		this.Var_GameId,
		this.Var_Language,
		this.Var_GameVersion,
		mode,
		0,
		this.Var_Preload,
		this.Var_GameName.replaceAll(' ', '-'),
		this.Var_GameServerSuffix);

	document.location.href = newHref;
}
