﻿var gameOnTurnID = 0;
var CurrentGamesSortedBy = "ID"; // sorted by id number
var IsAscendingSorted    = true; // sort order 
var DeleteInProgress     = -1;
var saveddata;
var userIsIdle = false;

function ShowHistoryGame(GameID, GameType)
{
var newwin
newwin = window.open("Pages/Members/game" + GameType + ".aspx?id=" + GameID + "&History=true",
"Game" + GameID,
"width=819,height=650,scrollbars=no,menubar=no,toolbar=no,status=no,resizable=yes,locationbar=no");
newwin.resizeTo(819, 650);
newwin.focus();
}

function showPopup(url, windowName, sizeX, sizeY)
{
var newwin=window.open (url,windowName,"width=" + sizeX + ",height="
+ sizeY + ",menubar=no,toolbar=no,status=no,locationbar=no,resizable=yes,scrollbars=yes");
newwin.resizeTo(sizeX,sizeY);
newwin.focus();
}

function showImpressum(theFileName)
{
  $('#divImpressum').remove();
  $("<div id='divImpressum'>").load("Impressum.aspx?").dialog({ width: 750, title: StrEditorialTitle, position: [100, 30] });
}   
function ShowSendMessage(name)
{
    if (name)
  {
    showPopup('ShowPortlet.aspx?ascx=Sendmessage&Title=controls.sendmessage.title&target='+name, "SendMessage", 560,430);
  }
  else
  {
    showPopup('ShowPortlet.aspx?ascx=Sendmessage&Title=controls.sendmessage.title', "SendMessage", 560,430);
  }
}
function ShowPlayerInfo(name)
{
  showPopup('ShowPortlet.aspx?ascx=PlayerInfo&PName=' + name,
  "PlayerInfo", 500, 600); 
}
function ShowCreateGame(type, name)
{
  showPopup('ShowPortlet.aspx?ascx=NewGame&GameType=' + type,
  "CreateGame", 560, 380);
}

/* Context Menu */

$(document).ready
{
    // Delete buttons in chat
    $('.jDeleteableChatMessage').live('hover', function(event) {
        $('#aDelete' + this.id).toggle();
        return false;
    });

    // User mouseovers

    $('.jPlayerInfo').live('mouseover mouseout', function(event) {
        if (event.type == 'mouseover') {
            var classes = $(this).attr("class").split(" ");
            var pid = 0;
            var moderatorAction = 0;
            for (var i = 0; i < classes.length; i++) {
                if (classes[i].substring(0, 9) == 'jPlayerID') {
                    pid = classes[i].substring(9);
                }
            }
            if ($(this).hasClass('jModeratorAction')) {
                moderatorAction = 1;
            }
            if (pid > 0) {
                if (moderatorAction > 0) {
                    InitShowPlayerContextMenuChat(pid);
                }
                else {
                    InitShowPlayerContextMenu(pid);
                }
            }
            else {
                nd();
            }
        }
        else {
            nd();
        }
        return false;
    });

    /* The mouseout does not work when the user hovers over a username...
    $("#tblSentInvitations tr").live("hover", function(event) {
    $(this).toggleClass("overviewHighlightRow");
    });
    */
}

function CreateChatMessageContextMenu(ctrl, messageID, message, sender) {
    if (!UserIsModerator && (UserLogin != sender)) return;
    ctrl.id = 'ChatMessage' + messageID;
    var deleteString = 'Diese Chatnachricht löschen';
    if (UserLang == '1') deleteString = 'Delete this chat message';
    
    var a = document.createElement("a");
    a.href = "javascript:RemoveChatMessage(" + messageID + ");"
    a.id = 'aDeleteChatMessage' + messageID;
    a.style.display = 'none';
    var img = document.createElement("span");
    img.className = "sprite-common messages-image sprite-common-btnDelete";
    img.alt = deleteString;
    img.title = deleteString;
    a.appendChild(img);
    ctrl.appendChild(a);

    $(ctrl).addClass('jDeleteableChatMessage');
}

var FlairCache = [];
var LastFlairRequestID = 0;
var LastFlairRequestLogin = '';

function SaveFlair(userID, flair) {
    if (GetFlairById(userID) != null) return;

    FlairCache.push({ UserID: userID, Login: flair.Login, Flair: flair });
}

function GetFlairById(userID) {
    for (var i = 0; i < FlairCache.length; i++) {
        if (FlairCache[i].UserID == userID) return FlairCache[i].Flair;
    }
    return null;
}

function InitShowPlayerContextMenu(userID) {
    var flair = GetFlairById(userID);
    LastFlairRequestID = userID;
    if (flair == null) {
        Services.MainPageFunctions.GetUserFlairById(userID, FlairForContextCB);
    }
    else {
        FlairForContextCB(flair);
    }
}

function InitShowPlayerContextMenuChat(userID) {
    var flair = GetFlairById(userID);
    LastFlairRequestID = userID;
    if (flair == null) {
        Services.MainPageFunctions.GetUserFlairById(userID, FlairForContextChatCB);
    }
    else {
        FlairForContextChatCB(flair);
    }
}

function FlairForContextCB(data) {
    if (data == null) return;
    SaveFlair(data.ID, data);
    if (LastFlairRequestID != data.ID) return; 
    overlib(RenderContextMenuWithFlair(data, false), FULLHTML, FOLLOWMOUSE, MOUSEOFF, NOCLOSE, OFFSETX, 15, OFFSETY, 0, HAUTO, VAUTO, DELAY, 200, TIMEOUT, 3000);
}

function FlairForContextChatCB(data) {
    if (data == null) return;
    SaveFlair(data.ID, data);
    if (LastFlairRequestID != data.ID) return; 
    overlib(RenderContextMenuWithFlair(data, UserIsModerator), FULLHTML, FOLLOWMOUSE, MOUSEOFF, NOCLOSE, OFFSETX, 15, OFFSETY, 0, HAUTO, VAUTO, DELAY, 200, TIMEOUT, 3000);
}

function RenderContextMenuWithFlair(flairData, withMute) {
    var content =
      '<table class="tablecontext" cellpadding="2" cellspacing="0"><tr><td class="ctxspcol"></td><td class="ctxtitrow">' + RenderFlair(flairData).html() + '</td></tr><tr><td class="ctxspcol"></td><td class="ctxrow"><a href="javascript:nd();ShowPlayerInfo(\'' + flairData.Login + '\')" class="ctxrow">' + stringInfo + '</a></td></tr>';
    if ((flairData.ID != '') && (flairData.ID > 0)) {
        content += '<tr><td class="ctxspcol"></td><td class="ctxrow"><a href="Default.aspx?PageID=10&ID=' + flairData.ID + '" class="ctxrow">' + stringRanking + '</a></td></tr>';
        if (IsBuddy(flairData.ID)) {
            content += '<tr><td class="ctxspcol"></td><td class="ctxrow"><a class="ctxrow" href="javascript:nd();RemoveFromBuddyList(' + flairData.ID + ');">' + StrRemoveFromBuddyList + '</a></td></tr>';
        }
        else {
            content += '<tr><td class="ctxspcol"></td><td class="ctxrow"><a class="ctxrow" href="javascript:nd();AddToBuddyList(' + flairData.ID + ');">' + StrAddToBuddyList + '</a></td></tr>';
        }
    }
    content += '<tr><td class="ctxspcol"></td><td class="ctxrow"><a href="javascript:nd();ShowSendMessage(\'' + flairData.Login + '\')" class="ctxrow">' + stringSendMessage + '</a></td></tr>';
    if (withMute && (flairData.Login != UserLogin)) {
        var ten = 'Moderator: 10 Minuten stummschalten';
        var sixty = "Moderator: 60 Minuten stummschalten";
        if (UserLang == '1');
        {
            var ten = 'Moderator: Mute user for 10 minutes';
            var sixty = "Moderator: Mute user for 60 minutes";
        }
        content += '<tr><td class="ctxspcol"></td><td class="ctxrow"><a href="javascript:nd();MuteUser(\'' + flairData.Login + '\', 10)" class="ctxrow">' + ten + '</a></td></tr>';
        content += '<tr><td class="ctxspcol"></td><td class="ctxrow"><a href="javascript:nd();MuteUser(\'' + flairData.Login + '\', 60)" class="ctxrow">' + sixty + '</a></td></tr>';
    }
    content += '</table>';
    return content;
}

/* END: Context Menu */

function RenderFlair(flairData) {
    var t = $("<table>")
        .attr("cellpadding", "0px")
        .attr("cellspacing", "0px");
    var r = $("<tr>").appendTo(t);
    $("<td>").appendTo(r)
            .append($("<img>")
                .attr("src", flairData.GravatarLink + "&" + "s=32")
                .attr("alt", "Gravatar")
                .attr("title", "Gravatar")
                .css("paddingRight", "5px"));
    $("<td>")
    .appendTo(r)
    .append($("<div>").css("font-weight", "bold").append(flairData.Login))
    .append($("<div>").css("white-space", "nowrap").css("font-weight", "normal").append(flairData.RankName));

    return $("<div>").append(t);
}

/* START: Resizable CENTERCOL */
$(document).ready(function()
{
  if (window.PageID != "002") return; // resize of centercol only for overview page
  var portlet = $("#CENTERCOL");
  portlet.resizable({
    alsoResize: '#toolbar',
    handles: 'e',
    minWidth: 400,
    resize: function() { CenterColResizing() },
    stop: function() { CenterColResized() }
  });

  var resizebar = $("#CENTERCOL .ui-resizable-e");
  // add the green resizerbar
  resizebar.addClass("ui-resizable-e-special");
  resizebar.css('zIndex', 5);
}
);

function CenterColResized()
{
  //$("#toolbar").css("width", $("#CENTERCOL").width() + "px");
  Services.MainPageFunctions.SetWindowSize(1001, $("#CENTERCOL").width(), 0);
}

function CenterColResizing()
{
  //var portlet = $(".controls_chat_ascx");
  //$("#divChat").height(portlet.height() - 53);
}
/* END: Resizeable CENTERCOL */


/* START: STATUS */
var updateStatusTimeout = null;
function UpdateStatusPortlet()
{
  if (updateStatusTimeout != null) clearTimeout(updateStatusTimeout);
  if (userIsIdle)
  {
    return;
  }
  Services.MainPageFunctions.GetStatus(UpdateStatusPortletCB, UpdateStatusPortletError, UpdateStatusPortletError);
}

function UpdateStatusPortletError(data)
{
  updateStatusTimeout = setTimeout(UpdateStatusPortlet, 60000);
}

function UpdateStatusPortletCB(data) {
    updateStatusTimeout = setTimeout(UpdateStatusPortlet, 60000);

    $('#StatusUnreadMessages').html(data.UnreadMessages);
    $('#StatusNeededScenarios').html(data.NeededScenarios);
    $('#StatusNeededOpponents').html(data.NeededOpponents);

    var div = $('#StatusCurrentOpponents');
    div.html(data.CurrentOpponents);
    if (data.CurrentOpponents > data.NeededOpponents) {
        div.css("color", 'green');
    }
    else {
        div.css("color", 'black');
    }

    var div = $('#StatusCurrentScenarios');
    div.html(data.CurrentScenarios);
    if (data.CurrentScenarios > data.NeededScenarios) {
        div.css("color", 'green');
    }
    else {
        div.css("color", 'black');
    }
    $('#statusRowCurrentScenarios')
    .bind('mouseover', function(event) {
        ShowWonGames();
    })
    .bind('mouseout', function(event) { nd(); });

    var pointsNode = document.createTextNode(data.CurrentPoints);
    $('#StatusPoints')
    .empty()
    .append(pointsNode)
    .css("color", data.PointColour);
}

var GettingWonGames = false;

function ShowWonGames() {
    if (GettingWonGames) return;
    GettingWonGames = true;
    Services.MainPageFunctions.GetWonGames(GetWonGamesCB);
}

function GetWonGamesCB(data) {
    GettingWonGames = false;
    if (data == null) return; // some error occurred on the server
    var title = "You won these games:";
    if (UserLang == 0) title = "Diese Spiele hast Du gewonnen:";

    var none = "None since your last promotion";
    if (UserLang == 0) none = "Keines seit der letzten Beförderung";
    
    var content =
      '<table class="tablecontext" cellpadding="2" cellspacing="0"><tr><td class="ctxspcol"></td><td class="ctxtitrow">' + title + '</td></tr>';

    if (data.length == 0) {
        content += '<tr><td class="ctxspcol"></td><td class="ctxrow">' + none + '</td></tr>';
    }
    else {
        for (var i = 0; i < data.length; i++) {
            content += '<tr><td class="ctxspcol"></td><td class="ctxrow">' + data[i] + '</td></tr>';
        }
    }

    content += '</table>';
    overlib(content, FULLHTML, FOLLOWMOUSE, MOUSEOFF, NOCLOSE, OFFSETX, 20, OFFSETY, 0, HAUTO, VAUTO, DELAY, 200);
}

/* END: STATUS */

/* START: BUDDYLIST */

var updateBuddyTimeout = null;
function UpdateBuddyList()
{
  if (updateBuddyTimeout != null) clearTimeout(updateBuddyTimeout);
  if (userIsIdle)
  {
    return;
  }
  Services.MainPageFunctions.GetBuddies(UpdateBuddyListCB, UpdateBuddyListError, UpdateBuddyListError);
}

function UpdateBuddyListError(data)
{
  updateBuddyTimeout = setTimeout(UpdateBuddyList, 60000);
}

var currentBuddies = null;
function UpdateBuddyListCB(data)
{
  currentBuddies = data;
  RefreshBuddies();
}

function IsBuddy(userID) {
    if (currentBuddies == null) return false;
    for (var i = 0; i < currentBuddies.length; i++) {
        if (currentBuddies[i].UserID == userID) return true;
    }
    return false;
}

function RefreshBuddies()
{
  var data = currentBuddies;
  if (data == null) return;
  
  var div = $("#BuddyList");
  if (data.length == 0) {
  
    div.html("<p>" + StrNoBuddies + "</p>");
    return;
}
div.empty();

  var bFirst = true;
  for (i = 0; i < data.length; i++)
  {
    var login = data[i].Login;
    var isOnline = IsOnline(login);
  // Context menu
    if (bFirst)
    {
      bFirst = false;
    }
    else {
        div.append(document.createTextNode(", "));
    }
    var span = $("<span>").appendTo(div);
    var a = $("<a>")
        .attr("href", "javascript:BuddyClick('" + login + "');")
        .appendTo(span);
    var userspan =
    $("<span>")
    .append(document.createTextNode(login))
    .appendTo(a)
    .addClass('jPlayerInfo')
    .addClass('jPlayerID' + data[i].UserID);
    if (isOnline)
    {
      userspan.css("font-weight", "bold");
    }
  }
}


function AddToBuddyList(userID)
{
  Services.MainPageFunctions.AddBuddy(userID, UpdateBuddyList, null, null);
}

function RemoveFromBuddyList(userID)
{
  Services.MainPageFunctions.RemoveBuddy(userID, UpdateBuddyList, null, null);
}

function BuddyClick(buddy)
{
  var edt = document.getElementById('edtChatMsg');
  if (edt)
  {
    edt.value = '/msg [' + buddy +'] ';
    edt.focus();
  }
}

/* END: BUDDYLIST */

/* START: ONLINEUSERS */
var onlineUserList = new Array();
var onlineUserIDList = new Array();

function IsOnline(login)
{
  for (var i = 0; i < onlineUserList.length; i++)
  {
    if (onlineUserList[i] == login) return true;
  }
  return false;
}

function IsOnlineID(id)
{
  for (var i = 0; i < onlineUserIDList.length; i++)
  {
    if (onlineUserIDList[i] == id) return true;
  }
  return false;
}

var updateOnlineUsersTimeout = null;
function UpdateOnlineUsers()
{
  if (updateOnlineUsersTimeout != null) clearTimeout(updateOnlineUsersTimeout);
  if (userIsIdle)
  {
    return;
  }

  Services.MainPageFunctions.GetOnlineUsers(UpdateOnlineUsersCB, UpdateOnlineUsersError, UpdateOnlineUsersError);
}

function UpdateOnlineUsersError(data)
{
  updateOnlineUsersTimeout = setTimeout(UpdateOnlineUsers, 60000);
}

function UpdateOnlineUsersCB(data)
{
  updateOnlineUsersTimeout = setTimeout(UpdateOnlineUsers, 60000);
  onlineUserList = new Array();
  onlineUserIDList = new Array();
  
  var table = $("<table>")
    .attr("cellPadding", 0)
    .attr("cellSpacing", 0)
    .addClass("OnlineUsersTable");
    
  for (i = data.length - 1; i >=0 ; i--)
  {
    onlineUserList.push(data[i].Login);
    onlineUserIDList.push(data[i].UserID);
    var tr = $("<tr>");
    table.prepend(tr);
    
    // flag
    tr.append($("<td>")
        .css("width", "22px")
        .append(
        $('<img>')
        .attr("src", ImagePath + "c/spacer.gif")
        .addClass("flag onlineusers-image flag-" + data[i].Country + "-flag")
        .attr("title", GetCountryName(data[i].Country))
        .attr("alt", data[i].Country)));

    // icon cell
        var cell1 = $("<td>")
        .css("width", "40px");
        cell1.appendTo(tr);
    if (data[i].IsAdmin) {
        cell1.append(
        $('<span>')
        .addClass("sprite-common onlineusers-image sprite-common-admin")
        .attr("title", 'Administrator')
        .attr("alt", 'Admin'))
    }
    if (data[i].IsModerator) {
        cell1.append(
        $('<span>')
        .addClass("sprite-common moderator-image sprite-common-moderator")
        .attr("title", 'Moderator')
        .attr("alt", 'Moderator'))
    }
    var donationlevel = 0;
    if (data[i].DonationAmount >= 5) donationlevel = 1;
    if (data[i].DonationAmount >= 15) donationlevel = 2;
    if (data[i].DonationAmount >= 30) donationlevel = 3;
    if (data[i].DonationAmount >= 50) donationlevel = 4;
    
    if (donationlevel > 0) {
        cell1.append(
        $('<span>')
        .addClass("sprite-common onlineusers-image sprite-common-don_level" + donationlevel)
        .attr("title", stringSupporter + donationlevel)
        .attr("alt", ''))
    }
    // Login cell
    $("<td>")
        
        .css("width", "120px")
        .addClass("OnlineUsersLoginCell")
        .appendTo(tr)
        .append(
            $("<a>")
            .attr("href", "javascript:BuddyClick('" + data[i].Login + "');")
            .append(document.createTextNode(data[i].Login)))


    tr.attr("UserID", data[i].UserID)
    .addClass('jPlayerInfo')
    .addClass('jPlayerID' + data[i].UserID);

    // Time cell
    $("<td>")

        .css("width", "36px")
        .addClass("OnlineUsersTimeCell")
        .appendTo(tr)
        .append(document.createTextNode(data[i].Minutes + ":" + data[i].Seconds));
  }
  var div = $("#OnlineUsers");
  div.empty();
  var idiv = $('<div>')
    .addClass("OnlineUsersTimeCell")
    .append(document.createTextNode(data.length + " " + StrPlayersOnline));
  div.append(idiv);
  div.append(table);

  if (window.location.toString().search(/localhost/i) == -1 && !IsOnlineID(UserID))
  {
    HandleIdleUser();
  }

  RefreshBuddies();
}
/* END: ONLINEUSERS */

/* START: IDLEUSERHANDING */
var idleDialogHasBeenCreated = false;
function HandleIdleUser()
{
  userIsIdle = true;
  if (idleDialogHasBeenCreated)
  {
    if ($("#idleDialog").dialog('isOpen'))
    {
      return;
    }
    $("#idleDialog").dialog('open');
    return;
  }

  $("#idleDialog").dialog({
  modal: true,
  resizable: false,
    close: function() { StopIdling(); }
  });

  idleDialogHasBeenCreated = true;
  
}

function StopIdling()
{
  userIsIdle = false;
  Services.MainPageFunctions.Touch();

  UpdateChat();
  UpdateOnlineUsers();
  UpdateCurrentGames();
  UpdateReceivedInvitations();
  UpdateSentInvitations();
  UpdateMessages();
  UpdateBuddyList();
  UpdateStatusPortlet();

}
/* END: IDLEUSERHANDING */

/* START: CHAT */
var chatTimeout = false;
var gettingChat = false;
var updateChatTimeout = null;
var chatLastModeratorAction = -1;
function UpdateChat()
{ 
  //if (gettingChat) return;
  gettingChat = true;
  chatTimeout = false;
  if (updateChatTimeout != null) clearTimeout(updateChatTimeout);

  if (userIsIdle)
  {
    return;
  }
  
  var div = document.getElementById("divChat");
  var lastMessage = 0;
  if (typeof(div.lastMessage) != 'undefined')
  {
    lastMessage = div.lastMessage;
  }
  Services.MainPageFunctions.GetChatMessages(lastMessage, chatLogin, UpdateChatCB, UpdateChatError);
}

function UpdateChatExpress()
{
  if (gettingChat) return;
  gettingChat = true;

  var div = document.getElementById("divChat");
  var lastMessage = 0;
  if (typeof (div.lastMessage) != 'undefined')
  {
    lastMessage = div.lastMessage;
  }
  Services.MainPageFunctions.GetChatMessages(lastMessage, chatLogin, UpdateChatExpressCB, UpdateChatExpressError);
}

function UpdateChatError(data)
{
  gettingChat = false;
  if (data._message == "LostSession")
  {
    window.location = "http://www.yucata.de/default.aspx";
  }
  if (!chatTimeout)
  {
    updateChatTimeout= setTimeout(UpdateChat, 12000);
    chatTimeout = true;
  }
}


function UpdateChatCB(data)
{
    gettingChat = false;
    if (data.LastModeratorAction > chatLastModeratorAction) {
        chatLastModeratorAction = data.LastModeratorAction;
        var div = document.getElementById("divChat");
        try {
            div.innerHTML = "";
            div.lastMessage = 0;
        } catch (exp) { }
        UpdateChat();
        return;
    }
    
  if (!chatTimeout)
  {
    updateChatTimeout = setTimeout(UpdateChat, 12000);
    chatTimeout = true;
  }

  if (data.Messages.length > 0)
  {
    BuildChat(data.Messages, document.getElementById("divChat"), "tableChat");
  }
}

function UpdateChatExpressCB(data)
{
  gettingChat = false;

  if (data.Messages.length > 0)
  {
    BuildChat(data.Messages, document.getElementById("divChat"), "tableChat");
  }
}

function UpdateChatExpressError(data)
{
  gettingChat = false;
}

function DiscoverLinks(text) {
    text = text.replace(/<br\/>/g, "\n");

    while (text.search(/http\:/) != -1) {
        var link = /([\s\S]*)(http\:[^\s]*)([\s\S]*)/;
        link.exec(text);

        var left = RegExp.$1;
        var center = RegExp.$2;
        var right = RegExp.$3;
        center = center.replace(/http\:/, "hXtXtXp");
        text = left + "<a href='" + center + "' class='ChatLink'>" + center + "</a>" + right;
    }
    text = text.replace(/hXtXtXp/g, "http:");

    while (text.search(/https\:/) != -1) {
        var link = /([\s\S]*)(https\:[^\s]*)([\s\S]*)/;
        link.exec(text);

        var left = RegExp.$1;
        var center = RegExp.$2;
        var right = RegExp.$3;
        center = center.replace(/https\:/, "hXtXtXpXs");
        text = left + "<a href='" + center + "' class='ChatLink'>" + center + "</a>" + right;
    }
    text = text.replace(/hXtXtXpXs/g, "https:");

    while (text.search(/ftp\:/) != -1) {
        var link = /([\s\S]*)(ftp\:[^\s]*)([\s\S]*)/;
        link.exec(text);

        var left = RegExp.$1;
        var center = RegExp.$2;
        var right = RegExp.$3;
        center = center.replace(/ftp\:/, "fXtXp");
        text = left + "<a href='" + center + "' class='ChatLink'>" + center + "</a>" + right;
    }
    text = text.replace(/fXtXp/g, "https:");
    


    text = text.replace(/\n/g, "<br/>");
    return text;
}


function BuildChat(data, div, tableName)
{
  var oldLastID = div.lastMessage;
  var table = document.getElementById(tableName);
  if (!table)
  {
    table = document.createElement("table");
    table.cellPadding = 0;
    table.cellSpacing = 0;
    table.id = tableName;
    table.style.width="100%";
    table.className = "ChatTable";
    div.appendChild(table);
  }
  div.lastMessage = data[data.length-1].ID;
  for (i = 0; i < data.length; i++)
  {
    if (data[i].ID <= oldLastID) continue;
    var tr = table.insertRow(table.rows.length);
    var cell1 = tr.insertCell(0);
    cell1.className="ChatTimeCell";
    var text1 = document.createTextNode(data[i].SendTime);
    cell1.appendChild(text1);
    var cell2 = tr.insertCell(1);
    cell2.className="ChatLoginCell";
    if (data[i].Sender != chatLogin)
    {
      if (data[i].Sender != 'Yucata')
      {
        var text2 = "<a href='javascript:PreparePrivateMessage(\""+data[i].Sender+"\");' class='ChatSenderLink'>" + data[i].Sender + "</a>";
      }
      else
      {
        var text2 = " ";
      }
    }  
    else
    {
      var text2 = data[i].Sender;
      cell2.className += " OwnMessage";
    }
    cell2.innerHTML = text2;
    if (data[i].Sender != 'Yucata') {
        $(cell2).attr("chatsender", data[i].Sender)
        .addClass('jPlayerInfo')
        .addClass('jPlayerID' + data[i].SenderID)
        .addClass('jModeratorAction'); 
    }
    var cell3 = tr.insertCell(2);
    cell3.className="ChatMessageCell";
    cell3.style.verticalAlign = "top";

    if (data[i].Sender != 'Yucata') {
        CreateChatMessageContextMenu(cell3, data[i].ID, data[i].Message, data[i].Sender);
    }

    var text = decodeURI(data[i].Message);
    text = DiscoverLinks(text);

    text = Emoticon(text);
    if (data[i].Recipient == chatLogin)
    {
      if (data[i].Sender != 'Yucata')
      {
        cell3.className += " ChatPrivateMessage";
        cell2.className += " ChatPrivateMessage";
        text = "[PM] " + text;
      }
      else
      {
        cell3.className += " ChatSystemMessage";
      }
    }   
    else if (data[i].Recipient != "")
    {
      text = "[--> <em>" + data[i].Recipient + "</em>] " + text;
    }    
    
    if (text.search(/\/me/) != -1) 
    {
      text = "<em>" + text.replace(/\/me/, "") + "</em>";
      cell2.removeChild(cell2.firstChild);
    }

    cell3.innerHTML = cell3.innerHTML + text;
  }
  div.scrollTop = div.scrollHeight - div.clientHeight;
}



function ChatHandleReturn(e)
{
  if (!e) e = window.event;
  if (e.keyCode == 13)
  {
    document.getElementById("lnkSendChat").click();
    return false;
  }
}

function PreparePrivateMessage(recipient)
{
  var edt = document.getElementById('edtChatMsg');
  edt.focus();
  edt.value = "/msg [" + recipient + "] "; 
}

function PostChatMessage()
{
  var edt = document.getElementById('edtChatMsg');
  if (edt.value.length == 0) return;
  var text = edt.value;
  text = text.replace(new RegExp("&", "g"), "&amp;");
  text = text.replace(new RegExp("<", "g"), "&lt;");
  text = text.replace(new RegExp(">", "g"), "&gt;");
  text = text.replace(new RegExp('"', "g"), "&quot;");
  text = text.replace(new RegExp("'", "g"), "&rsquo;");

  if (text.search(/\/me/) != -1) 
  {
    text = text.replace(/\/me/, "/me" + chatLogin);
  }
  var pm = /^\s*\/msg\s*[\[](.*)[\]]\s*(.*)/;
  if (pm.test(text))
  {
      pm.exec(text);
      var theText = RegExp.$2;
      var receiver = RegExp.$1;
      theText = encodeURI(jQuery.trim(theText));
      if (CheckChatMessage(theText)) {
          Services.MainPageFunctions.SendChatMessage(theText, receiver, SendChatMessageCB, null, null);
      }
  }
  else {
      var textToSend = encodeURI(jQuery.trim(text));
      if (CheckChatMessage(textToSend)) {
          Services.MainPageFunctions.SendChatMessage(textToSend, "", SendChatMessageCB, null, null);
      }
  }
  
  if (pm.test(text))  // Keep Private Message recipient for next message
  {
	edt.value = "/msg [" + RegExp.$1 + "] ";	  
  }
  else
  {
	// Bei edt.value = "" gibt es einen XUL-Fehler
  	edt.value = " ";
  }

}

String.prototype.count = function(s1) {
    return (this.length - this.replace(new RegExp(s1, "g"), '').length) / s1.length;
}


function CheckChatMessage(message) {
    if (message.length == 0) return false;

    var smileys = Emoticon(message);
    var cnt = smileys.count('img');
    if (cnt > 3) return false;
    
    return true;
}

function SendChatMessageCB(res)
{
  UpdateChatExpress();
}

function DummyCallback(res)
{
}


function showChatSkript()
{
  Services.MainPageFunctions.GetChatMessages(0, chatLogin, UpdateChatSkriptCB, null, null);
}
function UpdateChatSkriptCB(data)
{
  var div = document.createElement("div");
  var d = new Date();
  BuildChat(data.Messages, div, "_newChatTable" + d.getMilliseconds());
  // TODO: Translate properly
  $(div).dialog({ height: 400, width: 600, title: 'Chat Transskript' });
}

$(document).ready(function()
{
  var portlet = $(".controls_chat_ascx");
  portlet.resizable({
    handles: 's',
    minHeight: 120,
    resize: function() { ChatResizing() },
    stop: function() { ChatResized() }
  });

  var resizebar = $(".controls_chat_ascx .ui-resizable-s");
  // add the green resizerbar
  resizebar.addClass("ui-resizable-s-special");
  resizebar.css('zIndex', 5);
}
);

function ChatResized()
{
  Services.MainPageFunctions.SetWindowSize(1000, 0, $("#divChat").height());
}

function ChatResizing()
{
  var portlet = $(".controls_chat_ascx");
  $("#divChat").height(portlet.height() - 53);
}
/* END: CHAT */

/* START: RECEIVEDMESSAGES */
var gettingMessages = false;
function HideShowMessage(id)
{
  var el = document.getElementById('MessageBody' + id);
  if (el.style.display == 'none')
  {
    el.style.display = '';
  }
  else
  {
    el.style.display = 'none';
  }
  
  Services.MainPageFunctions.HideMessage(id, null, null, null);
}

function DeleteMessage(id, msgType)
{
  var mess = document.getElementById("Message" + id);
  mess.style.display = "none";
  numMessages--;
  CheckNumMessages();
  Services.MainPageFunctions.DeleteMessage(id, msgType, null, null, null);
}

var lastMessageID = 0;
var numMessages = 0;
var updateMessagesTimeout = null;
function UpdateMessages()
{
  if (gettingMessages) return;
  if (updateMessagesTimeout != null) clearTimeout(updateMessagesTimeout);
  if (userIsIdle)
  {
    return;
  }
  gettingMessages = true;
  Services.MainPageFunctions.GetMessages(lastMessageID, UpdateMessagesCB, UpdateMessagesError, UpdateMessagesError);
}

function UpdateMessagesError(data)
{
  gettingMessages = false;
  updateMessagesTimeout = setTimeout(UpdateMessages, 80000);
}

function UpdateMessagesCB(data) {
    gettingMessages = false;
    updateMessagesTimeout = setTimeout(UpdateMessages, 80000);
    var num = data.length;
    if (num == 0) {
        CheckNumMessages();
        return;
    }
    var div = $('#Messages');

    for (i = num - 1; i >= 0; i--) {
        numMessages++;
        var row = $('<div>')
        .attr('id', "Message" + data[i].ID);
        if (data[i].ID > lastMessageID) {
            lastMessageID = data[i].ID;
        }

        var msgDelete = 'Diese Nachricht löschen';
        if (UserLang == 1) msgDelete = "Delete this message";
        
        // Delete button
        var a = $("<a>")
        .attr("href", "javascript:DeleteMessage(" + data[i].ID + ", " +
      data[i].MessageType + ")");
        var img = $("<span>")
        .addClass("sprite-common messages-image sprite-common-btnDelete")
        .attr("alt", msgDelete)
        .attr("title", msgDelete);
        a.append(img);
        row.append(a);

        // reply button
        var msgReply = 'Diese Nachricht löschen';
        if (UserLang == 1) msgReply = "Delete this message";
        
        var reply = $("<a>");
        var sender = data[i].Sender;
        if (sender != 'Yucata.de') {
            reply.attr("href", "javascript:ShowSendMessage('" + sender + "')");
            var img = $("<span>")
                .addClass("sprite-common messages-image sprite-common-reply")
                .attr('alt', msgReply)
                .attr('title', msgReply);
            reply.append(img);
            row.append(reply);
        }
        else {
            var img = $("<span>")
            .addClass("sprite-common messages-image");
            row.append(img)
        }

        // Title
        var t = $("<a>")
        .attr("href", "javascript:HideShowMessage('" + data[i].ID + "')")
        .addClass("MessageTitle");
        var s = $("<span>")
        .addClass("MessageTitle");

        if (data[i].SenderID > 0) {
            s.append(document.createTextNode(data[i].Rank + " "));
        }
        s.append(document.createTextNode(data[i].Sender + " (" +
      data[i].Date + ")"));
        t.append(s);
        t.append($("<br/>"));
        t.attr("SenderID", data[i].SenderID);
        if (data[i].SenderID > 0) {
            t.addClass('jPlayerInfo')
             .addClass('jPlayerID' + data[i].SenderID);
        }

        row.append(t);
        
        // Body
        var d = $("<div>")
        .addClass("MessageBody")
        .attr("id", "MessageBody" + data[i].ID);

        if (data[i].Visible) {
            d.show();
        }
        else {
            d.hide();
        }
        var messagetext = data[i].Text;
        messagetext = DiscoverLinks(messagetext);
        d.html(Emoticon(messagetext));
        row.append(d);

        div.prepend(row);
    }
    CheckNumMessages();
}

function CheckNumMessages() {
    var div = document.getElementById('Messages');
    var divNo = document.getElementById('NoMessages');
    if (numMessages == 0) {
        div.innerHTML = "";
        div.style.display = 'none';
        divNo.style.display = 'inline';
        return;
    }
    divNo.style.display = 'none';
    div.style.display = 'inline';

}
/* END: RECEIVEDMESSAGES */

/* START: SENTINVITATIONS */
var gettingSentInvitations = false;
var updateSentInvitationsTimeout = null;
function UpdateSentInvitations()
{
  if (gettingSentInvitations) return;
  if (updateSentInvitationsTimeout != null) clearTimeout(updateSentInvitationsTimeout);
  if (userIsIdle)
  {
    return;
  }
  gettingSentInvitations = true;
  Services.MainPageFunctions.GetSentInvitations(UpdateSentInvitationsCB, UpdateSentInvitationsError, UpdateSentInvitationsError);
}

function UpdateSentInvitationsError(data)
{
  gettingSentInvitations = false;
  updateSentInvitationsTimeout = setTimeout(UpdateSentInvitations, 240000);
}

function UpdateSentInvitationsCB(data)
{
  gettingSentInvitations = false;
  updateSentInvitationsTimeout = setTimeout(UpdateSentInvitations, 240000);
  
  var num = data.length;
  var div = $('#SentInvitations');
  var divSent = $('#NoSentInvitations');
  if (num == 0)
  {
      div.empty();
    div.hide();
    divSent.show();
    return;
  }
  divSent.hide();
  div.show();

  var newTable = $('<table>')
    .attr("id", "tblSentInvitations")
    .attr("cellPadding", 0)
    .attr("cellSpacing", 0);
    
  for (i = 0; i < num; i++)
  {
      var row = $("<tr>").appendTo(newTable);

      row.append($("<td>").append(getTakeBackInvitationLink(data[i].ID)));
    row.append($("<td>").append(document.createTextNode(data[i].GameName)));
    var cell3 = $("<td>").appendTo(row);

    if (data[i].NumPlayers > 2)
    {
      cell3.append(getPlayersImage(data[i].NumPlayers));
    }
    if (!data[i].IsRanking)
    {
      cell3.append(getGameTypeImage(data[i].IsRanking));
    }
    if (data[i].HasReturn)
    {
      cell3.append(getReturnImage(data[i].HasReturn));
    }
    cell3.append(getInvTypeImage(data[i].InvType));

    var cell4 = $("<td>").appendTo(row);
    cell4.append(getInvitationPlayers(data[i].Players, 0));
    if (data[i].InvType == 5 && data[i].InvitedPlayers) {
        cell4.append(document.createTextNode("["));
        cell4.append(getInvitationPlayers(data[i].InvitedPlayers, 0));
        cell4.append(document.createTextNode("]"));
  }
    
    if (data[i].UserText.length > 0)
    {
        var row2 = $("<tr>").appendTo(newTable);
        row2.append($("<td>").html("&nbsp;"));
        row2.append($("<td>").attr("colSpan", 3).append(getInvitationMessage(data[i].UserText, 40)));
    }    
  }
  div.empty();
  div.append(newTable);

}


function getInvitationMessage(message, margin)
{
  //var br = document.createElement("br");
  var s2 = document.createElement("span");
  var em = document.createElement("em");
  em.innerHTML = message;
  //var t = document.createTextNode(message);
  //em.appendChild(t);
  var s = document.createElement("span");
  //s.appendChild(br);
  s.appendChild(s2);
  s2.appendChild(em);
  //s2.style.marginLeft = margin + 'px';
  return s;
}

function getTakeBackInvitationLink(id)
{
  var a = document.createElement("a");
  a.href = "javascript:CancelInvitation(" + id + ");";

  var img = document.createElement("span");
  img.className = "sprite-common invitation-image sprite-common-btnDelete";
  img.style.marginRight = "23px"; // TODO
  a.appendChild(img);
  return a;
}

function CancelInvitation(id)
{
  $('tr[invitationID=' + id + ']').css('display', 'none');
  Services.MainPageFunctions.DeleteInvitation(id, UserID,
    CancelInvitationCB, null, null)
}

function CancelInvitationCB(val)
{
  UpdateReceivedInvitations();
  UpdateSentInvitations();
}


function getInvTypeImage(invType)
{
  var img = document.createElement("span");
  img.className = "sprite-common invitation-image sprite-common-";
  
  if (invType == 1)
  {
    img.className += "invall";
  }
  if (invType == 5)
  {
    img.className += "invdirect";
  }
  img.style.marginRight = "10px";  //TODO
  return img;
}

function getReturnImage(hasReturn)
{
  var img = document.createElement("span");
  img.className = "sprite-common invitation-image sprite-common-";

  if (hasReturn)
  {
   img.className += "rueck";
  }
  else
  {
   /* img.className += "hin"; */
  }
  return img;
}

function getGameTypeImage(isRanking)
{
  var img = document.createElement("span");
  img.className = "sprite-common invitation-image sprite-common-";
  
  if (isRanking)
  {
   /* img.className += "wertung"; */
  }
  else 
  {
    img.className += "training";
  }
  return img;
}

function getPlayersImage(num)
{
  var img = document.createElement("span");
  img.className = "sprite-common invitation-image sprite-common-"
  if (num > 2 && num < 6) 
  {
      img.className += +num + "players";
  }
  return img;
}

/* END: SENTINVITATIONS */

/* START: RECEIVEDINVITATIONS */
var allowUpdateReceivedInvitations = true;

function StopReceivedInvitationUpdate()
{
  allowUpdateReceivedInvitations = false;
}

function AllowReceivedInvitationUpdate()
{
  allowUpdateReceivedInvitations = true;
}

var gettingReceivedInvitations = false;
var updateReceivedInvitationsTimeout = null;
function UpdateReceivedInvitations()
{
  if (gettingReceivedInvitations) return;
  if (updateReceivedInvitationsTimeout != null) clearTimeout(updateReceivedInvitationsTimeout);
  if (userIsIdle)
  {
    return;
  }
  gettingReceivedInvitations = true;
  Services.MainPageFunctions.GetReceivedInvitations(UpdateReceivedInvitationsCB, UpdateReceivedInvitationsError, UpdateReceivedInvitationsError);
}

function UpdateReceivedInvitationsError(data)
{
  gettingReceivedInvitations = false;
  updateReceivedInvitationsTimeout = setTimeout(UpdateReceivedInvitations, 60000);
}

function UpdateReceivedInvitationsCB(data)
{
  gettingReceivedInvitations = false;
  updateReceivedInvitationsTimeout = setTimeout(UpdateReceivedInvitations, 60000);
  if (!allowUpdateReceivedInvitations) return;

  var countPub = 0;
  var countPers = 0;
  var divPers = $('#ReceivedPersonalInvitations');
  var divNoPers = $('#NoReceivedPersonalInvitations');
  var divPub = $('#ReceivedPublicInvitations');
  var divNoPub = $('#NoReceivedPublicInvitations');


  var tblPub = $('<table>')
   .attr("id", "tblPubInvitation")
   .attr("cellPadding",0) 
   .attr("cellSpacing",0) ;
   
   var tblPers = $('<table>')
   .attr("id", "tblPersInvitation")
   .attr("cellPadding",0) 
   .attr("cellSpacing",0) ;
   
  for (i = 0; i < data.length; i++)
  {
    var row;
    if (data[i].InvType == 1)
    {
        row = $("<tr>").appendTo(tblPub);
      countPub++;
    }
    if (data[i].InvType == 5) {
        row = $("<tr>").appendTo(tblPers);
      countPers++;
    }

    row.attr("id", "ReceivedInvitation" + data[i].ID)
    row.attr("invitationID", data[i].ID);

    $("<td>")
        .appendTo(row)
        .css("width", "50px")
        .append(getInvitationAccept(data[i].ID, data[i].Players, data[i].NumPlayers))
        .append(getInvitationDecline(data[i].ID, data[i].InvType, data[i].InvitedPlayers));

    $("<td>")
        .appendTo(row)
        .append(document.createTextNode(data[i].GameName));

    var cell3 = $("<td>")
        .appendTo(row)
        .css("width", "45px");
        
    if (data[i].NumPlayers > 2)
    {
      cell3.append(getPlayersImage(data[i].NumPlayers));
    }
    if (!data[i].IsRanking)
    {
      cell3.append(getGameTypeImage(data[i].IsRanking));
    }
    if (data[i].HasReturn)
    {
      cell3.append(getReturnImage(data[i].HasReturn));
  }

  $("<td>")
        .appendTo(row)
        .append(getInvitationPlayers(data[i].Players, 1));
    
    if (data[i].UserText.length > 0)
    {
      var row2;
      if (data[i].InvType == 1) {
          row2 = $("<tr>").appendTo(tblPub);
      }
      if (data[i].InvType == 5)
      {
          row2 = $("<tr>").appendTo(tblPers);
      }
      row2
        .attr("invitationID", data[i].ID)
        .append($("<td>").html("&nbsp;"))
        .append($("<td>")
                    .attr("colSpan", 3)
                    .append(getInvitationMessage(data[i].UserText, 40)));
    }
  }

  if (countPers == 0)
  {
      divPers.empty();
      divPers.hide();
      divNoPers.show();
  }
  else
  {
      divNoPers.hide();
      divPers.show();
      divPers.empty();
    divPers.append(tblPers);
  }

  if (countPub == 0)
  {
      divPub.empty();
      divPub.hide();
      divNoPub.show();
  }
  else
  {
      divNoPub.hide();
      divPub.show();
      divPub.empty();
    divPub.append(tblPub);
  }
  /*
  $("#tblPubInvitation tr").bind("mouseenter mouseleave", function(e)
  {
    $(this).toggleClass("overviewHighlightRow");
  });
  $("#tblPersInvitation tr").bind("mouseenter mouseleave", function(e)
  {
    $(this).toggleClass("overviewHighlightRow");
  });
*/
  
}


function getInvitationAccept(id, p, numplayers)
{
    var img = $("<span>");

  var found = false;
  var i;
  for (i = 0; i < p.length; i++)
  {
    if (p[i].PlayerID == UserID)
    {
      found = true;
      break;
    }
  }
  
  if (found || (numplayers > 2 && UserLogin.substr(0,5) == 'Guest')) 
  {
    return img;
}
        img.addClass("sprite-common invitation-image sprite-common-btnAccept");
return $("<a>")
    .attr("href", "javascript:AcceptInvitation(" + id + ");")
    .append(img);
}

function getInvitationDecline(id, invType, target)
{
    var img = $("<span>");
       
  if (invType != 5)
  {
    return img;
  }
  
   img.addClass("sprite-common invitation-image sprite-common-btnDecline")
     .css("marginRight", "5px");

return $("<a>")
    .attr("href", "javascript:CancelInvitation(" + id + ");")
    .append(img);
}

function getInvitationPlayers(p, includeSelf) {
  var em = $("<em>");
  var t = "";
  var first = true;
  var added = false;
    var num = p.length;
    var i;
    for (i = 0; i < num; i++)
    {
        if (p[i].PlayerID == UserID && !includeSelf) continue;
        if (!first)
        {
            em.append(document.createTextNode(", "));
        }
        var is = $("<span>")
        .append(document.createTextNode(p[i].Rank + " " + p[i].Login))
        .addClass('jPlayerInfo')
        .addClass('jPlayerID' + p[i].PlayerID);
        
        added = true;
        first = false;
        if (p[i].PlayerID != UserID && IsOnline(p[i].Login))
        {
          is.addClass("onlinePlayer");
        }
        em.append(is);
    }
    var s = $("<span>")
       .append(em);
  return s;
}

function AcceptInvitation(id)
{
  $('tr[invitationID=' + id + ']').css('display', 'none');
  Services.MainPageFunctions.AcceptInvitation(id, 
    AcceptInvitationCB, null, null)
}

function AcceptInvitationCB(val)
{
  UpdateReceivedInvitations();
  UpdateCurrentGames();
}

/* END: RECEIVEDINVITATIONS */

/* BEGIN: CURRENT GAMES */
var gettingCurrentGames = false;
function startGame(event)
{
  var newwin
  
  if (DeleteInProgress > 0) {
    DeleteInProgress = -1;
    return;
  }
  newwin=window.open ("Pages/Members/game"+event.data.gameType+".aspx?ID="+event.data.gameID,"Game"+event.data.gameID,"width=819,height=650,scrollbars=no,menubar=no,toolbar=no,status=no,resizable=yes,locationbar=no");
  newwin.resizeTo(819,650);
  newwin.focus();
}

var updateCurrentGamesTimeout = null;
function UpdateCurrentGames()
{
  if (gettingCurrentGames) return;
  if (updateCurrentGamesTimeout != null) clearTimeout(updateCurrentGamesTimeout);
  if (userIsIdle)
  {
    return;
  }
  gettingCurrentGames = true;
  Services.MainPageFunctions.GetNextGameOnTurn(UpdateNextGameOnTurnCB, UpdateNextGameOnTurnError, UpdateNextGameOnTurnError);
}

function UpdateNextGameOnTurnCB(data)
{
  gameOnTurnID = data;
  Services.MainPageFunctions.GetCurrentGames(UpdateCurrentGamesCB, UpdateCurrentGamesError,UpdateCurrentGamesError);
} 

function UpdateNextGameOnTurnError()
{
  Services.MainPageFunctions.GetCurrentGames(UpdateCurrentGamesCB, UpdateCurrentGamesError,UpdateCurrentGamesError);
}

function UpdateCurrentGamesError()
{
  gettingCurrentGames = false;
  updateCurrentGamesTimeout = setTimeout(UpdateCurrentGames, 60000);
}


function UpdateCurrentGamesCB(data)
{
  gettingCurrentGames = false;
  updateCurrentGamesTimeout = setTimeout(UpdateCurrentGames, 60000);
  saveddata = data;
  ShowCGT(saveddata);
}

function ShowCGT(data) {
  var OnTurnGame = -1;
  var div = $('#CurrentGames');
  var divSent = $('#NoCurrentGames');
  var num = data.length;
  if (num == 0)
  {
      div.empty();
      div.hide();
      divSent.show();
    return;
  }
  
  // read cookies for the current game table
  if ((CurrentGamesSortedBy = readCookie('cgtSortedBy')) == null) {
    CurrentGamesSortedBy = "ID"; // sorted by number
    IsAscendingSorted    = true; // sort order 
  }
  else
  {
    IsAscendingSorted = (readCookie('cgtAscending') == 'true');
  }
  // sort the games
  data.sort(SortFunction);
  divSent.hide();
  div.show();

  var dataTable = $("<table>")
    .css("width", "100%")
    .attr("cellSpacing", 0)
    .attr("cellPadding", 0);

  //header
  var headRow = $("<tr>")
    .appendTo(dataTable)
    .css("cursor", "pointer");
    
  // head
  cgthCreateTD(headRow, "cgth00", " ", "Current", 26);
  cgthCreateTD(headRow, "cgth01", "ID", "ID");
  cgthCreateTD(headRow, "cgth02", StrCgtGame, "GameName");
  cgthCreateTD(headRow, "cgth03", StrCgtOpponents, "Opponent");
  cgthCreateTD(headRow, "cgth04", "", "NumPlayers", 15); // 2 pixel space between the icons
  cgthCreateTD(headRow, "cgth05", "", "IsRanking", 15);
  cgthCreateTD(headRow, "cgth06", "", "IsReturn", 15);
  cgthCreateTD(headRow, "cgth07", "", "IsTournament", 15);
  
  for (var i = 0; i < num ; i++)
  {
    if (data[i].PlayerOnTurn == UserID)
    {
      CurrentClassName = "currentGameOnTurn";
    }
    else
    { 
      CurrentClassName = "currentGameNotOnTurn";
    }
    
    var row = cgtrCreateTR(dataTable, data[i], CurrentClassName);
    
    // col for delete current game and on turn sign + trash can
    var s = $('<span>');
    if (data[i].MayDelete)
    {
        s
        .addClass("sprite-common invitation-image sprite-common-btnDelete")
        .attr("id", "DeleteID' + data[i].ID +'")
        .attr("gameID", data[i].ID)
        .bind('click', {id: data[i].ID}, DeleteCurrentGame);
    }
    if (data[i].ID == gameOnTurnID && data[i].PlayerOnTurn == UserID)
    {
        s
        .addClass("sprite-common link-image sprite-common-link")
        .bind('mouseover', function(event) { overlib(StrYouMayMoveHere); })
        .bind('mouseout', function(event) { nd(); });
      OnTurnGame = i;
    }
    
    cgtrCreateTD(row, s);
    cgtrCreateTD(row, data[i].ID + '&nbsp;', CurrentClassName);
    cgtrCreateTD(row, data[i].GameName, CurrentClassName + ' noWrap ');
    
    // add list of players
    var pspan = $("<span>");
    var j;
    var first = true;
    for (j = 0; j < data[i].Players.length; j++) {
        if (first) {
            first = false;
        } else {
            pspan.append(document.createTextNode(", "));
        }

        var pspan2 = $('<span>')
        .appendTo(pspan);
        // s3 += ' onmouseover="overlib(GetContextContent(' + "'" + data[i].Players[j].Login + "','" +  data[i].Players[j].EMail + "'," + data[i].Players[j].PlayerID + ",'" + data[i].Players[j].Rank + "')" + ', FULLHTML, FOLLOWMOUSE, MOUSEOFF, NOCLOSE, OFFSETX, 0, OFFSETY, 0, RIGHT, VAUTO, DELAY, 200, TIMEOUT, 3000);"';
        if (data[i].Players[j].PlayerID == UserID) {
            pspan2
            .addClass("sprite-common sprite-common-poeppel")
            .append($("<img>")
                .attr("src", ImagePath + "c/spacer.gif")
                .css("width", "13px")
                .css("height", "13px"));
        }
        else {
            if (data[i].Players[j].PlayerID == data[i].PlayerOnTurn) {
                pspan2.addClass("playerOnTurn");
            }
            if (IsOnline(data[i].Players[j].Login)) {
                pspan2.addClass("onlinePlayer");
            }
            pspan2
        .css("white-space", "nowrap")
        .append(document.createTextNode(data[i].Players[j].Rank + ' ' + data[i].Players[j].Login));
        }
        pspan2.addClass('jPlayerInfo')
        .addClass('jPlayerID' + data[i].Players[j].PlayerID);
    }
    
    $("<td>")
        .addClass("cgtCell")
        .addClass(CurrentClassName)
        .append(pspan)
        .appendTo(row);

    var imgNumPlayer = $("<span>")
        .addClass("sprite-common currentgame-image sprite-common-" + data[i].Players.length + 'players');
        
    cgtrCreateTD(row, imgNumPlayer);

    var imgGameType = $("<span>")
        .addClass("sprite-common currentgame-image");
    if (data[i].IsRanking) {
      imgGameType.addClass('sprite-common-wertung');
    } else {
      imgGameType.addClass('sprite-common-training');
    }
    cgtrCreateTD(row, imgGameType);

    var imgReturn = $("<span>")
        .addClass("sprite-common currentgame-image");
    if (data[i].HasReturn)
    {
      if (data[i].IsReturn) {
          imgReturn.addClass('sprite-common-rueckspiel');
      } else {
      imgReturn.addClass('sprite-common-hinspiel');
      }
    }
    else {
        imgReturn.addClass('sprite-common-hin');
    }
    cgtrCreateTD(row, imgReturn);

    if (data[i].IsTournament) {
    var imgTournament = $("<span>")
        .addClass("sprite-common currentgame-image sprite-common-tunier");
      cgtrCreateTD(row, imgTournament);
    }
  }
  div.empty();
  div.append(dataTable);
  
  if (OnTurnGame >= 0) {
    // link for the fast start of the current on turn game
    $("<input type='button'>")
        .appendTo(div)
        .addClass("button")
        .attr("value", StrCgtStartGame + ': ' + data[OnTurnGame].ID)
        .attr("gameID", data[OnTurnGame].ID)
        .attr("gameType", data[OnTurnGame].GameType)
        .bind("click", {gameType: data[OnTurnGame].GameType, gameID: data[OnTurnGame].ID}, startGame);
  }
  else {
      $("<input type='button'>")
        .appendTo(div)
        .addClass("button")
        .attr("disabled", "disabled")
        .attr("value", StrCgtStartGame + ': ---')
  }
}

// create one td for the head of the current game table
function cgthCreateTD(ctrl, HtmlID, Text, SortKind, width) {
    var td = $("<td>")
        .appendTo(ctrl)
        .addClass("cgtCell")
        .attr("id", HtmlID)
        .attr("sortkind", SortKind)
        .bind('mouseover', function(event) { cgtHeadOn(this.id); })
        .bind('mouseout', function(event) { cgtHeadOff(this.id); })
        .bind('click', {sortkind: SortKind}, SetSortCol);


    if (width > 0) {
        td.css("width", width + "px");
  }
  // show the current sort order by an arrow
  if (CurrentGamesSortedBy == SortKind) {
    if (IsAscendingSorted) {
      td.append('&darr;');
    }
    else
    {
        td.append('&uarr;');
    }
  }
  td.append($("<span>").css("font-weight", "bold").append(document.createTextNode(Text)));
}

// create the tr for one row of the current game table   
function cgtrCreateTR(ctrl, data) {
    return $("<tr>")
        .appendTo(ctrl)
        .css("cursor", "pointer")
        .css("height", "14px")
        .attr("id", "tr" + data.ID)
        .bind('mouseover', function(event) { cgtRowOn(this.id); })
        .bind('mouseout', function(event) { cgtRowOff(this.id); })
        .bind("click", { gameType: data.GameType, gameID: data.ID }, startGame);
}

// create one td for a row of the current game table
function cgtrCreateTD(ctrl, content, classname) 
{
    var td = $("<td>")
        .appendTo(ctrl)
        .addClass("cgtCell")
        .append(content);
        
  if (typeof(classname) != 'undefined') {
    td.addClass(classname);
  }  
}

function cgtHeadOn(x) {
 document.getElementById(x).style.backgroundColor="#b6cbe1";
}

function cgtHeadOff(x) {
 document.getElementById(x).style.backgroundColor="transparent";
}

function cgtRowOn(x) {
 document.getElementById(x).style.backgroundColor="#fadea8";
}

function cgtRowOff(x) {
 document.getElementById(x).style.backgroundColor="transparent";
}

    
function SetSortCol(event)
{
  if (CurrentGamesSortedBy == event.data.sortkind) {
    IsAscendingSorted = ! IsAscendingSorted;
  }  
  else  
  {
    CurrentGamesSortedBy = event.data.sortkind;
    IsAscendingSorted = true;
  }
  
  // save current choices in the cookie box
  createCookie('cgtSortedBy', CurrentGamesSortedBy, 1000);
  createCookie('cgtAscending', IsAscendingSorted, 1000);
  ShowCGT(saveddata);
}

function SortFunction(a, b) {
  var aa, bb, j;

  switch (CurrentGamesSortedBy)
  {
    case "Current":
      aa = 2;
      if (a.PlayerOnTurn == UserID)
      {
        aa = 1;
        if (a.ID == gameOnTurnID)
          aa = 0;
      }
      bb = 2;
      if (b.PlayerOnTurn == UserID)
      {
        bb = 1;
        if (b.ID == gameOnTurnID)
          bb = 0;
      }
      break;
    case "GameName":
      aa = a.GameName;
      bb = b.GameName;
      break;
    case "Opponent":
      // search first opponent of each game
      for (j = 0; j < a.Players.length; j++) {
        if (a.Players[j].PlayerID != UserID) {
          aa = a.Players[j].Login.toUpperCase();
          break;
        }  
      }  
      for (j = 0; j < b.Players.length; j++) {
        if (b.Players[j].PlayerID != UserID) {
          bb = b.Players[j].Login.toUpperCase();
          break;
        }  
      }  
      break;
    case "NumPlayers":
      aa = a.Players.length;
      bb = b.Players.length;
      break;
    case "IsRanking":
      aa = a.IsRanking;
      bb = b.IsRanking;
      break;
    case "IsReturn":
      aa = 0;
      if (a.HasReturn)
      { 
        if (a.IsReturn)
        {
          aa = 2;
        }
        else
        {
          aa = 1;
        }
      }  
      bb = 0;
      if (b.HasReturn)
      { 
        if (b.IsReturn)
        {
          bb = 2;
        }
        else
        {
          bb = 1;
        }
      }  
      break;
    default:  // GameID is standard
      aa = a.ID;
      bb = b.ID;
      break;
  }  
  if (aa == bb) return  0;
  if (IsAscendingSorted)
  {
    if (aa < bb) 
    {
      return -1;
    }
    else  
    {
      return 1;
    }
  }  
  else  
  {
    if (aa < bb) 
    {
      return 1;
    }
    else  
    {
      return -1;
    }
  }  
  return 0; // never used...
}

/* COOKIE HELPERS */
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    try
    {
  	  var nameEQ = name + "=";
  	  var ca = document.cookie.split(';');
	  for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	  }
	}
	catch(exp){}
	return null;
}
/* END COOKIE HELPERS */

function getIsReturnImage(isReturn)
{
  var img = document.createElement("span");
  img.className = "sprite-common invitation-image sprite-common-";
  if (isReturn)
  {
    img.className = "rueckspiel";
  }
  else
  {
    img.className = "hinspiel";
  }
  return img;
}

function DeleteCurrentGame(event) {
    DeleteInProgress = 1;
    Services.MainPageFunctions.CancelGame(event.data.id, DeleteCurrentGameCB, null, null);
}

function DeleteCurrentGameCB(res)
{
  UpdateCurrentGames();
}

/* END: CURRENT GAMES */

/* HELPERS */
function GetCountryName(isoCode)
{
switch (isoCode)
	{
	  case "de":
		return (UserLang == "0") ? "Deutschland" : "Germany";
	    break;
	  case "fr":
		return (UserLang == "0") ? "Frankreich" : "France";
	    break;
	  case "ca":
		return (UserLang == "0") ? "Kanada" : "Canada";
	    break;
	  case "jp":
		return (UserLang == "0") ? "Japan" : "Japan";
	    break;	    
	  case "nl":
		return (UserLang == "0") ? "Niederlande" : "Netherlands";
	    break;	    
	  case "no":
		return (UserLang == "0") ? "Norwegen" : "Norway";
	    break;		
	  case "pl":
		return (UserLang == "0") ? "Polen" : "Poland";
	    break;		    
	  case "es":
		return (UserLang == "0") ? "Spanien" : "Spain";
	    break;		    
	  case "se":
		return (UserLang == "0") ? "Schweden" : "Sweden";
	    break;		    
	  case "ch":
		return (UserLang == "0") ? "Schweiz" : "Switzerland";
	    break;		    
	  case "gb":
		return (UserLang == "0") ? "Grossbritannien" : "United Kingdom";
	    break;	
	  case "us":
		return (UserLang == "0") ? "USA" : "USA";
	    break;		    
	  case "at":
		return (UserLang == "0") ? "Oesterreich" : "Austria";
	    break;		    
	  case "eu":
		return (UserLang == "0") ? "Europa" : "Europe";
	    break;		    
	  case "un":
		return (UserLang == "0") ? "Welt" : "World";
	    break;	
	  case "hu":
		return (UserLang == "0") ? "Ungarn" : "Hungary";
	    break;		    
	  case "br":
		return (UserLang == "0") ? "Brasilien" : "Brazil";
	    break;		    
	  case "be":
		return (UserLang == "0") ? "Belgien" : "Belgium";
	    break;		    
	  case "cz":
		return (UserLang == "0") ? "Tschechien" : "Czech Republic";
	    break;		    
	  case "it":
		return (UserLang == "0") ? "Italien" : "Italy";
	    break;		    
	  case "fi":
		return (UserLang == "0") ? "Finnland" : "Finland";
	    break;	
	  case "pt":
		return "Portugal";
	    break;		
	  case "sk":
		return (UserLang == "0") ? "Slovakei" : "Slovakia";
	    break;	 
	  case "au":
		return (UserLang == "0") ? "Australien" : "Australia";
	    break;	   
	  case "mx":
		return (UserLang == "0") ? "Mexiko" : "Mexico";
	    break;	   
	  case "ar":
		return (UserLang == "0") ? "Argentinien" : "Argentina";
		break;
case "ad": return "Andorra"; break;
case "bs": return "Bahamas"; break;
case "cl": return "Chile"; break;
case "cn": return "China"; break;
case "cr": return "Costa Rica"; break;
case "en": return "England"; break;
case "ec": return "Ecuador"; break;
case "gt": return "Guatemala"; break;
case "hk": return "Hong Kong"; break;
case "il": return "Israel"; break;
case "li": return "Lichtenstein"; break;
case "mt": return "Malta"; break;
case "ni": return "Nicaragua"; break;
case "py": return "Paraguay"; break;
case "pe": return "Peru"; break;
case "pr": return "Puerto Rico"; break;
case "ua": return "Ukraine"; break;
case "ve": return "Venezuela"; break;
case "am": return (UserLang == "0") ? "Armenien" : "Armenia"; break;
case "az": return (UserLang == "0") ? "Aserbaidschan" : "Azerbaijan"; break;
case "by": return (UserLang == "0") ? "Weißrussland" : "Belarus"; break;
case "bo": return (UserLang == "0") ? "Bolivien" : "Bolivia"; break;
case "bg": return (UserLang == "0") ? "Bulgarien" : "Bulgaria"; break;
case "co": return (UserLang == "0") ? "Kolumbien" : "Colombia"; break;
case "hr": return (UserLang == "0") ? "Kroatien" : "Croatia"; break;
case "cu": return (UserLang == "0") ? "Kuba" : "Cuba"; break;
case "cy": return (UserLang == "0") ? "Zypern" : "Cyprus"; break;
case "dk": return (UserLang == "0") ? "Dänemark" : "Denmark"; break;
case "do": return (UserLang == "0") ? "Dominikanische Republik" : "Dominican Republik"; break;
case "ee": return (UserLang == "0") ? "Estland" : "Estonia"; break;
case "gr": return (UserLang == "0") ? "Griechenland" : "Greece"; break; 
case "is": return (UserLang == "0") ? "Island" : "Iceland"; break;
case "in": return (UserLang == "0") ? "Indien" : "India"; break;
case "id": return (UserLang == "0") ? "Indonesien" : "Indonesia"; break;
case "ie": return (UserLang == "0") ? "Irland" : "Ireland"; break;
case "jm": return (UserLang == "0") ? "Jamaika" : "Jamaica"; break;
case "lv": return (UserLang == "0") ? "Litauen" : "Latvia"; break;
case "lt": return (UserLang == "0") ? "Lettland" : "Lithuania"; break; 
case "lu": return (UserLang == "0") ? "Luxemburg" : "Luxembourg"; break;
case "nz": return (UserLang == "0") ? "Neuseeland" : "New Zealand"; break;
case "ru": return (UserLang == "0") ? "Russland" : "Russia"; break;
case "ro": return (UserLang == "0") ? "Rumänien" : "Romania"; break;
case "sd": return (UserLang == "0") ? "Schottland" : "Scotland"; break;
case "sg": return (UserLang == "0") ? "Singapur" : "Singapore"; break;
case "sl": return (UserLang == "0") ? "Slowenien" : "Slovenia"; break;
case "za": return (UserLang == "0") ? "Südafrika" : "South Africa"; break;
case "kr": return (UserLang == "0") ? "Südkorea" : "South Korea"; break;
case "tr": return (UserLang == "0") ? "Türkei" : "Turkey"; break;
	  default:
	    return isoCode.toUpperCase();
	    break;
	}

}


/* Donation functionality */

$(document).ready(function()
{
  $('#LinkShowDonationInfo').click(
  function()
  {
    $("<div>").load("ShowPortlet.aspx?ascx=Donationinfo").dialog({ width: 750, title: StrDonationDetailTitle, position: [100, 30] });
  }
  );
});



/* Chat functions */
$(document).ready(function() {

    $('#BtnClearChatSkript').click(
    function() {
        RequestClearChat();
        return false;
    }
  );
    $('#BtnShowChatSkript').click(
    function() {
        showChatSkript();
        return false;
    }
  );
    $('#btnChatHelp').click(
    function() {
        $('<div>').load("ShowPortlet.aspx?ascx=ChatHelp").dialog({ width: 500, title: StrChatHelpTitle });
        return false;
    }
  )
});

function RequestClearChat() {
    var deleteChat;
    if (UserLang == '0') {
      deleteChat = window.confirm("Möchtest Du den Chat komplett löschen? Dies solltest Du tun, wenn er beleidigende oder sehr private Nachrichten enthält.");
    }
    else {
      deleteChat = window.confirm("Do you want to delete all chat messages? You should do that if the chat contains offensive or very private messages.");;
    }
    if (deleteChat) {
        Services.MainPageFunctions.ClearChat();
        UpdateChatExpress();
    }
}

function RemoveChatMessage(id) {
    Services.MainPageFunctions.DeleteChatMessage(id);
    UpdateChatExpress();
}

function MuteUser(login, minutes){
    Services.MainPageFunctions.MuteUser(login, minutes);
}


/* Player information */

function ShowPlayerInfo(name)
{
  $("<div>").attr("id", "OuterPlayerInfoPane")
    .load("ShowPortlet.aspx?ascx=PlayerInfo&Title=controls.playerinfo.title&PName=" + encodeURI(name))
    .dialog({ width: 530, height: 730, title: StrPlayerInfoTitle + ": " + name, position: [100, 30], close: OnClosePlayerInfo });
}

function OnClosePlayerInfo()
{
  // if it is not removed, the next shown dialog will create a second node of this and this crashes the rendering script
  $("#PlayerChart").remove();
}

/* Received Invitations */
$(document).ready(function()
{
  $("#ReceivedInvitations").bind("mouseover", function() { StopReceivedInvitationUpdate() });
  $("#ReceivedInvitations").bind("mouseout", null, AllowReceivedInvitationUpdate);
}
)


/*
* show the played games as bar chart 
* in the player info window
*
*/


function ShowChart()
{
  var div = $('#PlayerChart');
  var text = "";

  if (PlayedGames.length == 0)
  {
    if (Language == '0')
      div.attr("innerHTML", "Bisher keine Wertungsspiele beendet.");
    else
      div.attr("innerHTML", "No finished scored games.");
    return;
  }

  // div.style.backgroundColor="#faeec8";
  PlayedGames.sort(PicSortFunction);

  var allTogether = 0;
  var maxGames = 0;
  for (var c = 0; c < PlayedGames.length; c++)
  if ((PlayedGames[c][0] != "n/a") && (PlayedGames[c][0] != "Transfer"))
  {
    allTogether += PlayedGames[c][1] + PlayedGames[c][2] + PlayedGames[c][3];
    maxGames = Math.max(maxGames, PlayedGames[c][1] + PlayedGames[c][2] + PlayedGames[c][3]);
  }

  if (Language == '0') {
      text += "<br/>&nbsp;Gesamtzahl aller Wertungsspiele: " + allTogether + "<br/>\n";
      text += "&nbsp;Aktuell offene Spiele: " +  OpenGames + "<br/><br/>\n";
  }
  else {
      text += "<br/>&nbsp;Total number of scored games: " + allTogether + "<br/>\n";
      text += "&nbsp;Currently open games: " + OpenGames + "<br/><br/>\n";
  }

  text += '<table id="PlayedGameInfoChart" cellpadding="0" cellspacing="1">';
  text += "<tbody>";

  for (var c = 0; c < PlayedGames.length; c++)
  if ((PlayedGames[c][0] != "n/a") && (PlayedGames[c][0] != "Transfer"))
  {
    var allGames = PlayedGames[c][1] + PlayedGames[c][2] + PlayedGames[c][3];

    text += '<tr bgcolor="#faeec8" onmouseover="ShowDetails(' + c + ');" onmouseout="nd();">';
    text += '<td width="140">';
    text += "&nbsp;" + PlayedGames[c][0] + "&nbsp;"; // name
    text += "</td>";
    text += '<td align="right" width="35">';
    text += allGames + "&nbsp;"; // all
    text += "</td>";

    var cSize = Math.round(240 * allGames / maxGames);

    var ProzWon = Math.round(PlayedGames[c][1] / allGames * cSize);
    var ProzRemis = Math.round(PlayedGames[c][2] / allGames * cSize);
    var ProzLost = Math.round(PlayedGames[c][3] / allGames * cSize);

    text += '<td width = "' + (cSize + 10) + '">';

    text += '<table cellpadding="0" cellspacing="0" width = "' + (cSize + 10) + '" height = "10">';
    text += "<tbody>";
    text += '<tr>';

    text += '<td style="width:5px;height:5px;"></td>';
    text += '<td bgcolor="#d5b65a" width="' + ProzWon + '">';
    text += "</td>";
    text += '<td bgcolor="#9f8e7d" width="' + ProzRemis + '">';
    text += "</td>";
    text += '<td bgcolor="#69679f" width="' + ProzLost + '">';
    text += "</td>";
    text += '<td style="width:5px;height:5px;"></td>';

    text += "</tr>";
    text += "</tbody>";
    text += "</table>";


    text += "</td>"

    text += "</tr>\n";
  }
  text += "</tbody>";
  text += "</table>";
  if (Language == '0')
    text += "<br/>F&uuml;r mehr Infos die Maus &uuml;ber die Spiele bewegen.<br/>"
  else
    text += "<br/>For more details move the mouse over the games.<br/>";

  div.attr("innerHTML", text);
}

function ShowDetails(c)
{
  var text = "";
  if (Language == '0')
  {
    text += "<b>" + PlayedGames[c][0] + "</b><br/>";
    text += "Gesamt: " + (PlayedGames[c][1] + PlayedGames[c][2] + PlayedGames[c][3]) + "<br/>";
    text += "Gewonnen: " + PlayedGames[c][1] + "<br/>";
    text += "Remis: " + PlayedGames[c][2] + "<br/>";
    text += "Verloren: " + PlayedGames[c][3] + "<br/>";
  }
  else
  {
    text += "<b>" + PlayedGames[c][0] + "</b><br/>";
    text += "Total: " + (PlayedGames[c][1] + PlayedGames[c][2] + PlayedGames[c][3]) + "<br/>";
    text += "Won: " + PlayedGames[c][1] + "<br/>";
    text += "Tie: " + PlayedGames[c][2] + "<br/>";
    text += "Lost: " + PlayedGames[c][3] + "<br/>";
  }
  overlib(text, /* FULLHTML, */FOLLOWMOUSE, MOUSEOFF, NOCLOSE, OFFSETX, 20, OFFSETY, 0, HAUTO, VAUTO, DELAY, 200, TIMEOUT, 3000);
}

function PicSortFunction(a, b)
{
  if (a[0] < b[0]) // compare the game names
  {
    return -1;
  }
  return 1;
}

function ShowGame() {
    var newwin
    GameID = $("#edtShowGameID").val();
    newwin = window.open("Pages/Members/ShowGame.aspx?id=" + GameID,
"Game" + GameID,
"width=819,height=650,scrollbars=no,menubar=no,toolbar=no,status=no,resizable=yes,locationbar=no");
    newwin.resizeTo(819, 650);
    newwin.focus();
}
