function makeModalWin() {
  var modalWin = document.createElement('div');
  modalWin.className = 'modal-window';
  modalWin.style.display = 'none';

  var modalWinBg = document.createElement('div');
  modalWinBg.className = 'modal-window-bg';
  modalWin.appendChild(modalWinBg);

  var modalWinInner = document.createElement('div');
  modalWinInner.className = 'modal-window-inner';
  modalWin.appendChild(modalWinInner);

  var modalWinHeader = document.createElement('div');
  modalWinHeader.className = 'modal-window-header';
  modalWinHeader.innerHTML = 'Header';
  modalWinInner.appendChild(modalWinHeader);

  var modalWinContent = document.createElement('div');
  modalWinContent.className = 'modal-window-content';
  modalWinInner.appendChild(modalWinContent);

  var modalWinFooter = document.createElement('div');
  modalWinFooter.className = 'modal-window-footer';

  var modalWinClose = document.createElement('a');
  modalWinClose.innerHTML = 'Close window';
  modalWinClose.href = '#';
  modalWinClose.onclick = function() {
    modalWin.close();
    return false;
  };

  modalWinFooter.appendChild(modalWinClose);
  modalWinInner.appendChild(modalWinFooter);

  var onscroll = function() {
    var modalWinSize = {width: 500, height: 580};
    var bodySize = my.dom.winSize();
    var bodyScroll = my.dom.bodyScroll();

    var left = bodyScroll.x + Math.round(bodySize.width / 2) - Math.round(modalWinSize.width / 2);
    var top = bodyScroll.y + Math.round(bodySize.height / 2) - Math.round(modalWinSize.height / 2);

    modalWinInner.style.left = left + 'px';
    modalWinInner.style.top = top + 'px';
  };

  var onresize = function() {
    modalWinBg.style.display = 'none';
    onscroll();

    var bodySize = my.dom.bodySize();
    modalWinBg.style.width = bodySize.width + 'px';
    modalWinBg.style.height = bodySize.height + 'px';

    modalWinBg.style.display = 'block';
  };

  modalWin.open = function() {
    var bodySize = my.dom.bodySize();
    modalWinBg.style.width = bodySize.width + 'px';
    modalWinBg.style.height = bodySize.height + 'px';

    modalWin.style.display = 'block';

    onscroll();

    addEvent(window, 'scroll', onscroll);
    addEvent(window, 'resize', onresize);
    modalWinBg.onclick = function() {
      modalWin.close();
    };
  };

  modalWin.close = function() {
    modalWin.style.display = 'none';
    removeEvent(window, 'scroll', onscroll);
    removeEvent(window, 'resize', onresize);
  };

  modalWin.clear = function() {
    if (modalWinContent.hasChildNodes())
      modalWinContent.removeChild(modalWinContent.childNodes[0]);
  };

  modalWin.getContentDiv = function() {
    return modalWinContent;
  };

  modalWin.setHeader = function(header) {
    modalWinHeader.innerHTML = header.toString();
  };
  
  modalWin.setClose = function(close){
    modalWinClose.innerHTML = close.toString();
  }; 
  
  $tag('body')[0].appendChild(modalWin);

  return modalWin;
}

function sprintf(s) {
	var bits = s.split('%');
	var out = bits[0];
	var re = /^([ds])(.*)$/;
	for (var i=1; i<bits.length; i++) {
		p = re.exec(bits[i]);
		if (!p || arguments[i]==null) continue;
		if (p[1] == 'd') {
			out += parseInt(arguments[i], 10);
		} else if (p[1] == 's') {
			out += arguments[i];
		}
		out += p[2];
	}
	return out;
}

function createLobby(game, container) {

  if (!games[game])
    return null;

  var remoteServer = games[game].server.connection;

  var lobby = {};
  
  var lobbyState = {
    'gameName'  : games[game].name,
    'gameRules' : games[game].rules,
    'gameId'    : games[game].game_id,
    'gameMod'   : games[game].mod_game,
    'lang'      : games[game].lang ? games[game].lang : 'eng',  
    'player': {
      'eur': 0,
      'fun': 0
    }
  };
  
  var lobbyDiv = document.createElement('div');

  lobby.start = function() {
    container.clear();
    container.setHeader(lobbyState.gameName);
    container.getContentDiv().appendChild(lobbyDiv);
    container.setClose(lang[lobbyState.lang]['lobby_modalWindow_1']);
    container.open();
    init();
  };

  function init() {

    if ( !userInfo.sid || userInfo.sid == 0 ) {
      renderState('unauthorized');
      return;
    }

    renderState('check_balance');

    remoteServer.sendRequest('get_balances', {'sid': userInfo.sid}, function(response) {
      if (response.status != 'ok') {
        userInfo.sid = '0';
        userInfo.account.eur = '0';
        userInfo.account.fun = '0';
        userInfo.account.bns = '0';
        renderState('unauthorized');
        authBar.update();
        return;
      }
      userInfo.account.eur = lobbyState.player.eur = parseFloat(response.eur);
      userInfo.account.fun = lobbyState.player.fun = parseFloat(response.fun);
      userInfo.account.bns = lobbyState.player.bns = parseFloat(response.bns);
      renderState('check_tables');
      authBar.update();
    });

    lobbyState.tables = {};
    lobbyState.activeTables = {};
    lobbyState.totalServers = 0;
    lobbyState.respondedServers = 0;
    lobbyState.tablesOnServer = {};

    var serverConnection = {};
     
    for( var game_server in games[game].serverlist ){
        if( game_server != 'demo_server' ){    
          lobbyState.totalServers++;
          
          var address = encodeURIComponent( games[game][game_server].connection.address );

          serverConnection[address] = games[game][game_server].connection;   

          var request_params = {
                'game_name': game
              , 'game_id': games[game].game_id
              , 'mod_game': games[game].mod_game
              , 'sid': userInfo.sid  
          }
         
          //    request_params.sid = userInfo.sid;
     
          serverConnection[address].sendRequest('get_tables', request_params, function(response) {
              
              addr = encodeURIComponent(response.address);
              
              lobbyState.respondedServers++;
              if (response.status === 'ok') {
                updateTablesState(response.tables, serverConnection[addr]);
              }
              if (lobbyState.respondedServers === lobbyState.totalServers) {
                renderState('complete');
              }
          });
         
        }
    
    }
   
  }

  function renderState(state) {

    switch (state) {
    case 'unauthorized':
      beforeUpdateInfoHtml();
      beforeUpdateUnauthHtml();
      lobbyDiv.innerHTML = infoHtml + unauthHtml;
      afterUpdateInfoHtml();
      afterUpdateUnauthHtml();
      break;
    case 'check_balance':
      beforeUpdateInfoHtml();
      beforeUpdateWaitHtml();
      lobbyDiv.innerHTML = infoHtml + waitHtml;
      afterUpdateInfoHtml();
      break;
    case 'check_tables':
      beforeUpdateInfoHtml();
      beforeUpdateWaitHtml();
      updatePlayerHtml();
      lobbyDiv.innerHTML = infoHtml + playerHtml + waitHtml;
      afterUpdateInfoHtml();
      break;
    case 'complete':
      beforeUpdateInfoHtml();
      beforeUpdateTablesHtml();
      lobbyDiv.innerHTML = infoHtml + playerHtml + tablesHtml;
      afterUpdateInfoHtml();
      afterUpdateTablesHtml();
      break;
    default:
      break;
    };
  }
    
  var waitHtml = '';
    
  function beforeUpdateWaitHtml() {
      waitHtml = [ 
          lang[lobbyState.lang]['lobby_waitHtml_1']
      ].join('');
  }

  var infoHtml = '';

  function beforeUpdateInfoHtml() {
    
    infoHtml = [
      sprintf( lang[lobbyState.lang]['lobby_beforeUpdateInfoHtml_1'], (games[game].screenshot ? games[game].screenshot : game)),  
      sprintf( lang[lobbyState.lang]['lobby_beforeUpdateInfoHtml_2'], games[game].rules, game)
    ].join('');
  }

  function afterUpdateInfoHtml() {
    var demoLink = $tag('a', $class('rules-demo', lobbyDiv)[0])[1];

    demoLink.onclick = function() {
      openWin(demoLink.href, DECOR.NO, 850, 600);
      container.close();
      return false;
    };
  }
  
  var unauthHtml = '';
  function beforeUpdateUnauthHtml(){
      unauthHtml = [
          sprintf( lang[lobbyState.lang]['lobby_unauthHtml_1'], window.location.pathname ), 
          lang[lobbyState.lang]['lobby_unauthHtml_2']
      ].join('');    
  }
  

  function afterUpdateUnauthHtml() {
    try {
      var signinForm = $id('lobby-signin', lobbyDiv);
      var backUrlInput = signinForm['f_url'];
      var signinLink = $tag('a', signinForm)[0];
    } catch(e) {
      return;
    }
    backUrlInput.value = window.location.pathname;
    signinLink.onclick = function() {
      signinForm.submit();
      return false;
    };

    /*
     try {
     var formFromUrl = $tag('form', lobbyDiv)[0]['f_url'];
     var form = $tag('form', lobbyDiv)[0];
     } catch(e) {
     return;
     }
     formFromUrl.value = window.location.pathname;
     form.onsubmit = signinHook;
     */
  }

  var playerHtml = '';

  function updatePlayerHtml() {
    // Welcome %username%, your balance: Euro %X%, Fun %Y%, Bonus %Z%
    playerHtml = [sprintf( lang[lobbyState.lang]['lobby_updatePlayerHtml_1'], userInfo.nickname, userInfo.account.eur)];
    if (userInfo.show_fun) {
      playerHtml.push(sprintf( lang[lobbyState.lang]['lobby_updatePlayerHtml_2'], userInfo.account.fun) );
    }
    if (!isNaN(userInfo.account.bns)) {
      playerHtml.push(sprintf( lang[lobbyState.lang]['lobby_updatePlayerHtml_3'], userInfo.account.bns) );
    }
    playerHtml.push('</p>');
    playerHtml = playerHtml.join('');
  }

  var tablesHtml = '';


  function updateTablesState(tables, serverConnection) {
    
    for (var i in tables) {
        
        var table = tables[i];
        
        if (  ! ( (table['GameID']==games[game].game_id && table['ModGame']==games[game].mod_game ) || table['ModGame']==game  ) ) {
            continue;
        }
        
        if (serverConnection === games[game][table['currency'] + '_server'].connection) {
            lobbyState.tables[table['currency']] = {
              'currencyName': table['currency'],
              'id': table['TableID']
            };
        }
        
        if (table['InUse'] == 'Y') {
            if( lobbyState.activeTables[ table['currency'] ] ){
                if( serverConnection.priorityRestore < lobbyState.activeTables[ table['currency'] ]['serverConnection'].priorityRestore  ) {
                    lobbyState.activeTables[ table['currency'] ] = {
                          'restoreGid'       : table['OpenGID']
                        , 'Sum'              : table['Sum']  
                        , 'serverConnection' : serverConnection
                    };
                } 
            } else {
                lobbyState.activeTables[ table['currency'] ] = {
                      'restoreGid'       : table['OpenGID']
                    , 'Sum'              : table['Sum']                        
                    , 'serverConnection' : serverConnection
                };
            }
        }

        if( lobbyState.activeTables[ table['currency'] ] ){
            delete lobbyState.tables[ table['currency'] ];
        }
        
    } // for(tables)

  } // function updateTablesState

  function beforeUpdateTablesHtml() {
    tablesHtml = "";
    if (lobbyState.activeTables != {}) {

      for (var curr in ['eur', 'fun', 'bns']) {
        var currName = ['eur', 'fun', 'bns'][curr];
        if (!lobbyState.activeTables[currName]) continue;       
        if (!userInfo.show_fun && currName == 'fun') continue;
        var currHumanName = '';
        switch (currName) {
          case 'eur': currHumanName = lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_5']; break;
          case 'fun': currHumanName = lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_6']; break;
          case 'bns': currHumanName = lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_7']; break;
        }
        var tableNum = currName;
        var table = lobbyState.activeTables[currName];
        amountValue = table['Sum'] ? parseFloat(table['Sum']) : 0;

          tablesHtml += '<p class="restore-' + currName + '">';
//        tablesHtml +=     '<b style="display:block;">' + currHumanName + '</b>';
	      tablesHtml += sprintf( lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_1'], currHumanName); 
          tablesHtml += sprintf( lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_2'], amountValue, currName); // Continue button 
          tablesHtml += '</p>';
        
      }

	}

    if (lobbyState.tables && (lobbyState.tables.eur || (lobbyState.tables.fun && userInfo.show_fun) || lobbyState.tables.bns)) {
      var first = true;
      var amountValue = 0;
      for (var curr in ['eur', 'fun', 'bns']) {
        var currName = ['eur', 'fun', 'bns'][curr];
        if (!userInfo.show_fun && currName == 'fun') continue;
        if (!lobbyState.tables[currName]) continue;
        var currHumanName = '';
        switch (currName) {
          case 'eur': currHumanName = lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_5']; break;
          case 'fun': currHumanName = lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_6']; break;
          case 'bns': currHumanName = lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_7']; break;
        }
        var tableNum = currName;
        var table = lobbyState.tables[tableNum];
        amountValue = lobbyState.player[tableNum];
        if (lobbyState.tables.eur || (lobbyState.tables.fun && userInfo.show_fun) || lobbyState.tables.bns) {
          tablesHtml += '<p class="create-' + currName + '">';
          tablesHtml +=     '<b style="display:block;">' + currHumanName + '</b>';
          tablesHtml +=     sprintf( lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_3'], amountValue, currName); // Start button
          tablesHtml += '</p>';
        }
      }
    }
    else {
    	if (lobbyState.activeTables == {}) {	
     		tablesHtml += '<p>';
      		tablesHtml += lang[lobbyState.lang]['lobby_beforeUpdateTablesHtml_4'];
      		tablesHtml += '</p>';
      }
    }

  }

  function afterUpdateTablesHtml() {
    var form = $tag('form', lobbyDiv)[0];
    //form.onsubmit = submitHook;

    if (lobbyState.activeTables && (lobbyState.activeTables.eur || lobbyState.activeTables.fun || lobbyState.activeTables.bns)) {
      for (var tableNum in lobbyState.activeTables) {
        (function () {
           var table = lobbyState.activeTables[tableNum];
           var restoreCurrency = tableNum;
           var restoreGid = table.restoreGid;
           var restoreLink = $tag('input', $class('restore-' + restoreCurrency, lobbyDiv)[0])[1];
           restoreLink.onclick = function() {
             var win = openGameWindow(games[game], table.serverConnection);
             win.redirect(restoreGid);
             container.close();
             return false;
           };
         })();
      }
    }

    if (lobbyState.tables && (lobbyState.tables.eur || lobbyState.tables.fun || lobbyState.tables.bns)) {
      //var currencyAmount = $tag('input', $class('amount', lobbyDiv)[0])[0];
      //if (!currencyAmount) return;
      for (var tableNum in lobbyState.tables) {
        (function () {
           if (!userInfo.show_fun && tableNum == 'fun') return;
           var table = lobbyState.tables[tableNum];
           var currency = tableNum;
           var block = $class('create-'+currency, lobbyDiv)[0];
           var amount = $class('amount', block)[0] || {};
           var createLink = $tag('input', block)[1] || {};
           createLink.onclick = function(){
              lobbyState.selectedCurrency = currency;
              lobbyState.selectedTable = table.id;
              lobbyState.parsedAmount = amount.value;
              submitHook();
              return false;
           };
         })();
      }
      //currencyAmount.focus();
      //currencyAmount.select();
    }

  }

  function submitHook() {

    var params = {};
    params.sid = userInfo.sid;
    params.cv  = 'S';
    params.game_name = game;
    params.table = lobbyState.selectedTable;
    //params.amount = $class('amount', lobbyDiv)[0].firstChild.value;
    params.amount = lobbyState.parsedAmount;
    params.currency = lobbyState.selectedCurrency;

    var parsedAmount = parseFloat(params.amount);

    if (isNaN(parsedAmount) || parsedAmount == 0) {
      alert('Incorrect amount');
      return false;
    }

    if (parsedAmount > lobbyState.player[lobbyState.selectedCurrency]) {
      alert('Insufficient funds');
      return false;
    }

    params.amount = parsedAmount;

    var remoteServer = games[game][lobbyState.selectedCurrency + '_server'].connection;

    var win = openGameWindow(games[game], remoteServer);

    remoteServer.sendRequest('create_game', params, function(response) {
                               if (response.status != 'ok') {
                                 win.close();
                                 alert('Error creating new game\n' + response.error_message);
                                 return;
                               }
                               container.close();
                               win.redirect(response.game);
                             });

    return false;
  }

  function signinHook() {

    var form = $tag('form', lobbyDiv)[0];

    var params = {};
    params.login = form['f_login'].value;
    params.password = form['f_passwd'].value;

    remoteServer.sendRequest('authorize', params, function(response) {
      if (response.status != 'ok') {
        alert('Incorrect username or password');
        return;
      }
      userInfo = {
        'nickname': params.login,
        'sid': response['SID'],
        'account': {
          'eur': '0',
          'fun': '0'
        }
      };
      document.cookie = 'my_sess' + '=' + encodeURIComponent(response['SID']) + '; path=/';

      if (window.location.protocol == 'https:') {
        init();
      }
      else {
        document.cookie = 'startup_game=' + game + '; path=/';
        var redirectTo = 'https://' + window.location.hostname + window.location.pathname + '#' + game;
        window.location.href = redirectTo;
      }
    });

    return false;
  }

  return lobby;
}; // function createLobby



var buildLobbies = (function() {

  var mw = makeModalWin();
  var gameBlocks = [];

  var buildLobbies = function(){
    gameBlocks = $class('game-block');
    if (gameBlocks.length == 0)
      return;

    for (var i = 0; i < gameBlocks.length; i++) {
      (function() {
         var gameId = gameBlocks[i].id;
         var gameLobby = createLobby(gameId, mw);
         if (!gameLobby)
           return;
         var logoLink = $tag('a', gameBlocks[i])[0];
         var textLink = $tag('a', gameBlocks[i])[4];
         if (logoLink) {
           logoLink.onclick = function() {
             gameLobby.start();
             return false;
           };
         }
         if (textLink) {
           textLink.onclick = function() {
             gameLobby.start();
             return false;
           };
         }
       })();
    }
  };
  return buildLobbies;
})();



(function() {
   var preOnload = function() {};
   if (window.onload && typeof window.onload == 'function') {
     preOnload = window.onload;
   }

   my.dom.onReadyDo(function() {
     preOnload();
     authBar.init();
     buildLobbies();
   });
 })();

