function openGameWindow(game, remoteServer) {
    var winWidth = game['win_width'] || 850;
    var winHeight = game['win_height'] || 600;

    var newWin = window.open('', '', 'width=' + winWidth + ',height=' + winHeight + ',statusbar=yes,scrollbars=no,resizable=yes', false);
    newWin.document.write('Please wait...');
    newWin.document.close();

    return {
        'close': function() {
            newWin.close();
        },
        'redirect': function(gid) {
            newWin.location.replace(remoteServer.address + remoteServer.launchScript + gid);
        }
    };
}



function createRemoteServer(serverAddress, serverScript, apiVersion, launchScript, processFunction) {

    // Check that global configuration is loaded
    if (serverAddress == '' || serverScript == '') return false;

    // All requests placed in the queue and then processed one at a time
    var reqQueue = [];

    var reqBusy = false;

    var reqCurrent = {};

    function parseRequest(name, params) {
        return {name: name, params: params};
    }

    function parseResponse(reqName, response, params) {

        var parsedResponse = {};

        if (response.status != 'ok') {
            parsedResponse.status = response.status;
            parsedResponse.error_message = response.error_message;
            return parsedResponse;
        }

        parsedResponse.status = 'ok';

        switch (reqName) {
        case 'get_balances':
            if (apiVersion == '2') {
                for (var i = 0; i < response.result.length; i++) {
                    switch (response.result[i].currency) {
                    case "EUR":
                        parsedResponse.eur = response.result[i].amount;
                        break;
                    case "FUN":
                        parsedResponse.fun = response.result[i].amount;
                        break;
                    case "BONUS":
                        parsedResponse.bns = response.result[i].amount;
                        break;
                    default:
                        break;
                    }
                }
            }
            else {
                parsedResponse.eur = response.eur;
                parsedResponse.fun = response.fun;
                parsedResponse.bns = response.bns;
            }
            break;
        case 'get_tables':
            if (apiVersion == '2') {
                parsedResponse.tables = {};
                for (var i = 0; i < response.result.length; i++) {
                    parsedResponse.tables[i] = response.result[i];
                    parsedResponse.tables[i]['GameID'] = params.game_id;
                    parsedResponse.tables[i]['ModGame'] = params.mod_game;
                    parsedResponse.tables[i]['currency'] = response.result[i].currency.toLowerCase();
                    parsedResponse.tables[i]['TableID'] = params.game_name + '-' + response.result[i].currency.toLowerCase();
                    parsedResponse.tables[i]['InUse'] = response.result[i].gid != 0 ? 'Y' : 'N';
                    parsedResponse.tables[i]['OpenGID'] = response.result[i].gid;
                }
            }
            else {
                parsedResponse.tables = response.tables;
            }
            break;
        case 'create_game':
            if (apiVersion == '2') {
                parsedResponse.game = response.result.gid;
                parsedResponse.currency = response.result.currency.toLowerCase();
                parsedResponse.amount = response.result.amount;
            }
            else {
                parsedResponse.game = response.game;
                parsedResponse.currency = response.currency;
                parsedResponse.amount = response.amount;
            }
            break;
        case 'get_demo_game':
            if (apiVersion == '1') {
                parsedResponse.game = response.game;
            }
        default:
            parsedResponse = response;
            break;
        }

        return parsedResponse;
    }

    // Push new request in request queue
    // Requests in queue processed once at a time by periodic function
    function placeRequest(reqName, params, callback) {
        var req = parseRequest(reqName, params);
        reqQueue.push({
            'name': req.name,
            'params': req.params,
            'callback': callback
        });
    }

    // Pop next request from request queue, send it and wait till server response
    function sendNextRequest() {
        var req = reqQueue.shift();
        if (!req) return;

        reqCurrent = req;

        reqBusy = true;

        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = makeRequestUri(req.name, req.params);
        document.body.appendChild(script);
    }

    // Create valid string to use with GET requests
    function makeRequestUri(reqName, params) {
        var result = serverAddress + serverScript;
        result += '?request=' + encodeURIComponent(reqName);
        result += '&callback=' + processFunction;
        for (var prop in params) {
            result += '&' + encodeURIComponent(prop) + '=' + encodeURIComponent(params[prop]);
        }
        result += '&uniq=' + Math.random();

        return encodeURI(result);
    }

    // Global function to be called by response scripts from remote server
    window[processFunction] = function(response) {
        reqCurrent.callback.call(null, parseResponse(reqCurrent.name, response, reqCurrent.params));
        reqCurrent = {};
        reqBusy = false;
    };

    // Periodically check status of the request queue
    setInterval(function() {
        if (reqBusy) return;
        if (reqQueue.length == 0) return;
        sendNextRequest();
    }, 1000);

    return {
        'address': serverAddress,
        'launchScript': launchScript,
        'sendRequest': function(reqName, params, callback) {
            placeRequest(reqName, params, callback);
        }
    };
};

(function () {

     var protocol = window.location.protocol + '//';

     for (var serverName in servers) {
         var server = servers[serverName];
         server['connection'] = createRemoteServer(protocol + server.domain, server.apiScript, server.apiVersion, server.launchScript, '_process' + serverName);
         server['demo_connection'] = createRemoteServer('http://' + server.domain, server.apiScript, server.apiVersion, server.launchScript, '_demoProcess' + serverName); 
     }

     for (var game in games) {
         if (!games[game].server) {
             games[game].server = 'default';
         }
         if (!games[game].demo_server) {
             games[game].demo_server = games[game].server;
         }
         games[game].server = servers[games[game].server];
         games[game].demo_server = servers[games[game].demo_server];
     }

     window.lotteryServer = createRemoteServer(protocol + servers['default'].domain, 'epic_game_api.php', '1', null, '_processLottery');
})();
