// GLOBALS {{{
// reference to the currently displayed overlay container
var currentOverlayObject;
// holds the current user status data
var currentUserStatus = userStatus;
// holds the current daily tournament data
var currentDailyTournamentData;
// defines whether the currently displayed page containers previous (history) tournament
var tournamentIsPrevious = false;
// name of the currently loaded game
var currentGame;
// holds callback to invoke when a form is being cancelled
var callbackAfterCancelledForm;
// holds additional form list items data which are generated separately for performance reasons
var formLists;
// the webmaster ID
var webmasterId = 0;

// define and initialize tournament expiration related variables {{{
var dailyTournamentUpdateDisabled = false;
var updateTournamentInterval;
var tournamentExpiresIn = clientSettings.TOURNAMENT_EXPIRES_IN;
var tournamentGameNameId = clientSettings.TOURNAMENT_GAME_NAME_ID;
var tournamentSystemId = clientSettings.TOURNAMENT_SYSTEM_ID;
var tournamentExpiresInInterval;
var tournamentExpiresInAlert = false;
var tournamentExpiresInAlertBlinkInterval;
var tournamentExpiresInCallbacks = new Array();
// }}}

// define the texts
var texts = {"ERROR:CLIENT:LOADING_FAILED": "Lamentamos las molestias ocasionadas. Se ha producido un problema en la comunicaci\u00f3n con el servidor. Comprueba la conexi\u00f3n a Internet e int\u00e9ntalo de nuevo.", "FORM:ADDRESS:FIELD:STATE_CODE:LABEL": "Estado", "BUTTON:CREATE_ACCOUNT:LABEL": "Crear cuenta", "OVERLAY:TOURNAMENT_POSITION:REGISTER_SCORE": "\u00bfDeseas registrar tu puntuaci\u00f3n ahora? \u00danicamente podr\u00e1n optar a los premios las puntuaciones registradas.", "FORM:ADDRESS:FIELD:TITLE:LABEL": "Tratamiento", "FORM:PASSWORD_RECOVERY_REQUEST:INFO:TITLE": "RECUPERAR CONTRASE\u00d1A PERDIDA", "OVERLAY:TOP_THREE_POSITION:NO_RESETS_TODAY": "Has agotado todas las posibilidades de reinicio del d\u00eda de hoy.", "FORM:CLIENT_VALIDATION:MIN_LENGTH": "Introduce al menos {0} caracteres.", "FACEBOOK:SHARE_POSITION:BUTTON:TEXT": "Compartir", "FORM:ADDRESS:FIELD:EMAIL:LABEL": "Direcci\u00f3n de correo electr\u00f3nico", "PAGE:GAME:RESETS": "POSIB. DE REINICIO", "ERROR:CLIENT:FORM": "El formulario contiene errores. Revisa los campos destacados en rojo.", "BUTTON:LOGOUT:LABEL": "Cerrar sesi\u00f3n", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:BIRTH_DATE:LABEL": "Fecha de nacimiento", "OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:RESET_CREDITS_AND_ROUNDS": "Ahora, puedes reiniciar los cr\u00e9ditos y las rondas del torneo, y volver a probar suerte.", "FORM:ACCOUNT:INFO:LOGIN_PASSWORD:ABOUT:2": "Si no deseas modificar la contrase\u00f1a, deja el campo vac\u00edo.", "BUTTON:TRY_AGAIN:LABEL": "Intentar de nuevo", "FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD2:ERROR:INVALID": "Los campos de la nueva contrase\u00f1a no coinciden.", "BUTTON:RELOAD:LABEL": "Volver a cargar", "FORM:FULL_REGISTRATION:LOGIN_PASSWORD:ABOUT": "Detalles de la cuenta", "FORM:CLIENT_VALIDATION:EMAIL": "Introduce una direcci\u00f3n de correo electr\u00f3nico v\u00e1lida.", "FORM:LOGIN:INFO:TITLE": "INICIAR SESI\u00d3N", "FORM:CLIENT_VALIDATION:DIGITS": "Introduce n\u00fameros \u00fanicamente.", "PAGE:PLAYER_PROGRESS:2:ALT": "REGISTRA tu puntuaci\u00f3n", "OVERLAY:NO_RESETS_UNKNOWN_PLAYER:PLAY_OTHER_SLOTS": "Haz clic en otro juego para seguir disfrutando de nuestras tragaperras gratis.", "OVERLAY:NO_RESETS_REGISTERED_PLAYER:HEADER:2": "en el torneo", "FORM:CLIENT_VALIDATION:DATE_ISO": "Introduce una fecha v\u00e1lida (ISO).", "BUTTON:SAVE_SCORE:LABEL": "Guardar puntuaci\u00f3n", "FORM:PASSWORD_RECOVERY:INFO:TITLE": "CAMBIAR CONTRASE\u00d1A", "ERROR:CLIENT:CONTACT_EMAIL_MUST_BE_CHANGED": "La direcci\u00f3n de correo electr\u00f3nico de contacto no es v\u00e1lida. Actual\u00edzala para que podamos ofrecerte un servicio de apoyo adecuado para tu cuenta.", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD1:LABEL": "Contrase\u00f1a", "FORM:CLIENT_VALIDATION:MAX": "Introduce un valor inferior o igual a {0}.", "OVERLAY:LOWER_BETS:HEADER": "REDUCE TU APUESTA O FINALIZA LA RONDA DEL TORNEO", "FORM:ADDRESS:FIELD:COUNTRY_CODE:LABEL": "Pa\u00eds", "OVERLAY:TOURNAMENT_POSITION:TRY_AGAIN": "Puedes volver a intentarlo ahora.", "FORM:ACCOUNT:INFO:ADDRESS:SUCCESS": "Los datos del perfil se han actualizado correctamente.", "OVERLAY:NO_RESETS_UNKNOWN_PLAYER:HEADER:1": "HAS AGOTADO TODAS LAS POSIBILIDADES DE REINICIO DEL D\u00cdA DE HOY", "PAGE:MAIN:CLIENT_COPYRIGHT": "Copyright \u00a9 2020 MPC Media Ltd., Todos los derechos reservados.", "BUTTON:CHANGE_PASSWORD:LABEL": "Cambiar contrase\u00f1a", "FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD1:LABEL": "Nueva contrase\u00f1a", "FORM:FULL_REGISTRATION_CONDITIONS:FIELD:AGREE:LABEL": "\nHe le\u00eddo y acepto los <a target=\"_blank\" href=\"/es/terms-and-conditions\">T\u00e9rminos\ny condiciones</a>.\n\n", "PAGE:LOGO:ALT": "\u00a1Juega GRATIS a las m\u00e1quinas tragaperras!", "FORM:PASSWORD_CHANGE:FIELD:CURRENT_PASSWORD:LABEL": "Contrase\u00f1a", "OVERLAY:NO_RESETS_UNKNOWN_PLAYER:HEADER:2": "Vuelve ma\u00f1ana y participa en otro torneo lleno de emoci\u00f3n.", "OVERLAY:TOURNAMENT_POSITION:PLAY_OTHER_SLOTS": "Haz clic en otro juego para seguir disfrutando de nuestras tragaperras gratis.", "PAGE:PLAYER_PROGRESS:0:ALT": "Juega GRATIS a las m\u00e1quinas tragaperras", "BUTTON:CANCEL_REGISTRATION:LABEL": "cancelar el registro", "OVERLAY:LOWER_BETS:LOWER_BETS_OR_FINISH": "Disminuye la apuesta si deseas continuar o finaliza la ronda del torneo ahora.", "FACEBOOK:SHARE_POSITION:TITLE": "\u00a1Juega gratis a las tragaperras en l\u00ednea en FreeSlotsLand.eu!", "PAGE:TOURNAMENT_BANNER:TITLE": "Finaliza en", "OVERLAY:RESET_FREE_GAME:WIN_IN_DAILY_TOURNAMENT_OR_RESET_CREDITS": "Todav\u00eda puedes ganar el torneo diario. Tambi\u00e9n puedes reiniciar los cr\u00e9ditos ahora mismo y seguir jugando a nuestras tragaperras gratuitas.", "OVERLAY:RESET_FREE_GAME:RESET_CREDITS_AND_CONTINUE": "Reinicia los cr\u00e9ditos ahora y sigue jugando a nuestras tragaperras gratuitas.", "ERROR:CLIENT:CONTACT_EMAIL_IN_VERIFICATION_PROCESS:TITLE": "DEBES VERIFICAR LA DIRECCI\u00d3N DE CORREO ELECTR\u00d3NICO", "BUTTON:RESET_CREDITS:LABEL": "Reiniciar cr\u00e9ditos", "FORM:ACCOUNT:INFO:ADDRESS:ABOUT": "Modifica los datos del perfil", "OVERLAY:TOURNAMENT_POSITION:HEADER:1:THANK_YOU": "GRACIAS POR PARTICIPAR", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:LOGIN:LABEL": "Nombre de la cuenta", "FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD2:LABEL": "Nueva contrase\u00f1a", "OVERLAY:TOP_TEN_POSITION:HEADER:2": "Con tu puntuaci\u00f3n te has situado en la LISTA DE LOS 10 MEJORES JUGADORES.", "ERROR:CLIENT:COOKIES_DISABLED": "Las cookies no est\u00e1n habilitadas. Habilita las cookies en el navegador para poder disfrutar plenamente de todas las funciones de Free Slots Land.", "OVERLAY:TOURNAMENT_POSITION:TRY_OTHER_SLOTS_OR_SAVE_SCORE": "Prueba a jugar a otras tragaperras gratuitas o guarda la puntuaci\u00f3n actual.", "OVERLAY:NO_RESETS_REGISTERED_PLAYER:HEADER:1": "GRACIAS POR PARTICIPAR", "FORM:PASSWORD_RECOVERY:FIELD:PASSWORD:LABEL": "Contrase\u00f1a temporal", "BUTTON:PLAY_TOURNAMENT:LABEL": "Participar en un torneo", "FORM:PASSWORD_RECOVERY_REQUEST:FIELD:EMAIL:LABEL": "Direcci\u00f3n de correo electr\u00f3nico", "OVERLAY:TOP_THREE_POSITION:TRY_AGAIN": "Puedes volver a intentarlo ahora.", "OVERLAY:LOG_IN_OR_REGISTER:HEADER": "INICIA SESI\u00d3N O REG\u00cdSTRATE", "ERROR:CLIENT:CONTACT_EMAIL_IN_VERIFICATION_PROCESS": "\nEnv\u00eda un correo electr\u00f3nico a nuestro servicio de atenci\u00f3n al\ncliente a trav\u00e9s de <a href=\"mailto:support@freeslotsland.eu?Subject=E-mail\nconfirmation (XXLOGINXX)&amp;Body=Please verify my e-mail address\nand reactivate my account!\">support@freeslotsland.eu</a> para confirmar tu\ndirecci\u00f3n de correo electr\u00f3nico. La cuenta funcionar\u00e1 de modo\nlimitado hasta que confirmes la direcci\u00f3n de correo electr\u00f3nico.\n\n<p><a href=\"mailto:support@freeslotsland.eu?Subject=E-mail confirmation\n(XXLOGINXX)&amp;Body=Please verify my e-mail address and\nreactivate my account!\">Enviar correo electr\u00f3nico</a></p>\n\n", "FORM:PASSWORD_RECOVERY:INFO:ABOUT": "Define la contrase\u00f1a ahora. Necesitar\u00e1s la contrase\u00f1a temporal que te hemos enviado al correo electr\u00f3nico.", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD1:ERROR:INVALID": "Las contrase\u00f1as no coinciden.", "ERROR:CLIENT:CONTACT_EMAIL_MUST_BE_CHANGED:TITLE": "LA DIRECCI\u00d3N DE CORREO ELECTR\u00d3NICO NO ES V\u00c1LIDA", "FORM:FULL_REGISTRATION:INFO:TITLE": "CREA TU CUENTA AHORA MISMO PARA REGISTRAR", "ERROR:CLIENT:UPGRADE_BROWSER": "Actualiza el navegador a una versi\u00f3n m\u00e1s reciente para poder jugar en Free Slots Land.", "OVERLAY:TOP_TEN_POSITION:HEADER:1": "\u00a1ENHORABUENA!", "FORM:CLIENT_VALIDATION:DATE": "Introduce una fecha v\u00e1lida.", "ERROR:CLIENT:UNSUPPORTED_BROWSER": "Tu navegador no es compatible. Utiliza uno de los siguientes navegadores: Firefox, Chrome, Internet Explorer, Opera o Safari.", "FORM:ACCOUNT:INFO:TITLE": "ACTUALIZA LOS DATOS DE TU CUENTA", "BUTTON:NO_THANK_YOU:LABEL": "No, gracias", "ERROR:CLIENT:FLASH:RELOAD": "Please reload this page.", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:MONTH:LABEL": "Mes", "OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:HEADER:2": "TODAV\u00cdA PUEDES GANAR 50 USD", "OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:HEADER:1": "JUEGA OTRA VEZ;", "BUTTON:LOWER_BETS:LABEL": "Reducir la apuesta", "PAGE:GAME:INSTALL_FLASH": "\nClick continue to <b>ALLOW</b> or install latest Flash to play at Free Slots Land!\n\n", "FORM:CLIENT_VALIDATION:EQUAL_TO": "Introduce de nuevo el mismo valor.", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:5": "El torneo diario de tragaperras gratuitas de FreeSlotsLand.eu es muy divertido. Hoy llegu\u00e9 al puesto n.\u00b0 XXPOSITIONXX en la lista de los mejores jugadores. Int\u00e9ntalo t\u00fa tambi\u00e9n.", "OVERLAY:TOURNAMENT_POSITION:HEADER:2:THANK_YOU": "en el torneo", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:6": "Hoy particip\u00e9 en el torneo de tragaperras gratuitas de FreeSlotsLand.eu y ahora estoy en el puesto n.\u00b0 XXPOSITIONXX. \u00bfQui\u00e9n se atreve a ganarme?", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:1": "\u00a1Incre\u00edble! En este momento, estoy en el puesto n.\u00b0 XXPOSITIONXX en el torneo de tragaperras gratuitas de FreeSlotsLand.eu. T\u00fa tambi\u00e9n puedes ganar premios en dinero real gracias a los torneos diarios.", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:3": "Participo en el torneo diario de tragaperras gratuitas de FreeSlotsLand.eu y he llegado al puesto n.\u00b0 XXPOSITIONXX en la lista de los mejores jugadores. \u00a1\u00danete y juega conmigo!", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:2": "\u00a1Fant\u00e1stico! He alcanzado el puesto n.\u00b0 XXPOSITIONXX en el torneo diario de tragaperras gratuitas de FreeSlotsLand.eu. T\u00fa tambi\u00e9n puedes jugar y conseguir premios.", "BUTTON:CANCEL_LOGIN:LABEL": "cancelar inicio de sesi\u00f3n", "PAGE:GAME:UPGRADE_FLASH": "\nClick continue to <b>ALLOW</b> or install latest Flash to play at Free Slots Land!\n\n", "OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:RESET_CREDITS_AND_ROUNDS": "Ahora, puedes reiniciar los cr\u00e9ditos y las rondas del torneo, y volver a probar suerte.", "OVERLAY:TOP_THREE_POSITION:RESET_AND_TRY_AGAIN": "Ahora, puedes reiniciar los cr\u00e9ditos y las rondas del torneo, y volver a probar suerte.", "FORM:CLIENT_VALIDATION:URL": "Introduce una URL v\u00e1lida.", "BUTTON:RECOVER_PASSWORD:LABEL": "Recuperar contrase\u00f1a", "ERROR:CLIENT:ERROR:TITLE": "Se ha producido un error.", "FORM:LOGIN:FIELD:PASSWORD:LABEL": "Contrase\u00f1a", "PAGE:MAIN:CLIENT_PRE_LOADING": "Free Slots Land se est\u00e1 cargando", "ERROR:CLIENT:CONTACT_ADDRESS_MUST_BE_CHANGED": "There is a problem with your contact details. Can you please take a moment to update your contact information?", "PAGE:GAME:CREDITS": "CR\u00c9DITOS", "FORM:ADDRESS:FIELD:CITY:LABEL": "Ciudad", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:YEAR:LABEL": "A\u00f1o", "FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD1:LABEL": "Nueva contrase\u00f1a", "BUTTON:CANCEL:LABEL": "cancelar", "OVERLAY:TOURNAMENT_POSITION:HEADER:2:NO_RESETS": "Vuelve ma\u00f1ana y participa en otro torneo lleno de emoci\u00f3n.", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD2:LABEL": "Introduce la contrase\u00f1a de nuevo", "FORM:ACCOUNT:INFO:LOGIN_PASSWORD:ABOUT:1": "Cambiar la contrase\u00f1a", "OVERLAY:TOP_THREE_POSITION:HEADER3": "EN EL TORNEO DE HOY", "BUTTON:FINISH_ROUND:LABEL": "Finalizar la ronda", "BUTTON:LOGIN:LABEL": "Iniciar sesi\u00f3n", "OVERLAY:TOURNAMENT_POSITION:HEADER:2:PLAY_AGAIN": "TODAV\u00cdA PUEDES GANAR 50 USD", "OVERLAY:LOG_IN_OR_REGISTER:SAVE_SCORE": "Inicia sesi\u00f3n o reg\u00edstrate ahora para guardar la puntuaci\u00f3n y poder optar al premio. \u00danicamente podr\u00e1n optar a los premios los usuarios registrados.", "FORM:ACCOUNT:INFO:ERROR": "El formulario contiene errores. Revisa los campos destacados en rojo.", "FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD2:ERROR:INVALID": "Je nieuwe wachtwoorden komen niet met elkaar overeen.", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:DAY:LABEL": "D\u00eda", "FORM:ADDRESS:FIELD:APT_SUITE:LABEL": "Apartamento", "FORM:ADDRESS:FIELD:STATE_CODE:ERROR:NOT_SPECIFIED": "El campo estado est\u00e1 vac\u00edo, pero es obligatorio.", "OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:HEADER:2": "TODAV\u00cdA PUEDES GANAR 50 USD", "BUTTON:LOST_PASSWORD:LABEL": "contrase\u00f1a perdida", "OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:HEADER:1": "JUEGA OTRA VEZ;", "FORM:CLIENT_VALIDATION:MIN": "Introduce un valor superior o igual a {0}.", "OVERLAY:TOP_THREE_POSITION:RESET_AND_STRENGTHEN_POSITION": "Puedes reiniciar los cr\u00e9ditos y las rondas del torneo, y seguir mejorando tu posici\u00f3n. \u00a1Hay 50 USD esperando al vencedor!", "OVERLAY:TOP_TEN_POSITION:PLAY_OTHER_SLOTS": "Haz clic en otro juego para seguir disfrutando de nuestras tragaperras gratis.", "FORM:FULL_REGISTRATION:INFO:ABOUT": "todas las puntuaciones de los torneos autom\u00e1ticamente", "BUTTON:UPDATE_ACCOUNT:LABEL": "Actualizar cuenta", "OVERLAY:TOURNAMENT_POSITION:RESET_AND_TRY_AGAIN": "Ahora, puedes reiniciar los cr\u00e9ditos y las rondas del torneo, y volver a probar suerte.", "BUTTON:OK:LABEL": "Aceptar", "FORM:CLIENT_VALIDATION:REQUIRED": "El campo est\u00e1 vac\u00edo, pero es obligatorio.", "OVERLAY:TOURNAMENT_POSITION:HEADER:1:PLAY_AGAIN": "JUEGA OTRA VEZ;", "OVERLAY:TOP_TEN_POSITION:REGISTER_SCORE": "\u00bfDeseas registrar tu puntuaci\u00f3n ahora? \u00danicamente podr\u00e1n optar a los premios las puntuaciones registradas.", "OVERLAY:TOP_THREE_POSITION:SAVE_SCORE": "Guarda la puntuaci\u00f3n ahora para poder conseguir un premio. \u00danicamente podr\u00e1n optar a los premios los usuarios registrados.", "OVERLAY:TOP_THREE_POSITION:HEADER:1": "\u00a1AS\u00cd SE HACE!", "OVERLAY:TOP_THREE_POSITION:HEADER:2": "EN ESTE MOMENTO, EST\u00c1S EN LA POSICI\u00d3N N.\u00b0", "PAGE:PLAYER_PROGRESS:1:ALT": "PARTICIPA en los torneos", "FORM:CLIENT_VALIDATION:NUMBER": "Introduce un n\u00famero v\u00e1lido.", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:4": "Ven y participa conmigo en el torneo diario de tragaperras gratuitas de FreeSlotsLand.eu. Juntos podremos conseguir premios en efectivo todos los d\u00edas. En este momento, estoy en el puesto n.\u00b0 XXPOSITIONXX.", "FORM:LOGIN:FIELD:LOGIN:LABEL": "Nombre de la cuenta", "FORM:FULL_REGISTRATION:ADDRESS:ABOUT": "Direcci\u00f3n de contacto", "FORM:ADDRESS:FIELD:STREET_ADDRESS:LABEL": "Domicilio", "OVERLAY:TOURNAMENT_POSITION:HEADER:1:NO_RESETS": "HAS AGOTADO TODAS LAS POSIBILIDADES DE REINICIO DEL D\u00cdA DE HOY", "FORM:CLIENT_VALIDATION:MAX_LENGTH": "Introduce un m\u00e1ximo de {0} caracteres.", "FORM:CLIENT_VALIDATION:RANGE": "Introduce un valor entre {0} y {1}.", "PAGE:GAME:ROUNDS": "RONDAS", "BUTTON:LANGUAGE:LABEL": "Lengua", "BUTTON:CLOSE:LABEL": "cerrar", "BUTTON:ALL_GAMES:LABEL": "Todos los juegos", "FORM:CLIENT_VALIDATION:RANGE_LENGTH": "Introduce un valor que tenga entre {0} y {1} caracteres.", "FORM:PASSWORD_RECOVERY_REQUEST:INFO:ABOUT": "Introduce tu direcci\u00f3n de correo electr\u00f3nico. Recibir\u00e1s, en esa direcci\u00f3n, el nombre de usuario y la contrase\u00f1a temporal.", "PAGE:PLAYER_PROGRESS:3:ALT": "GANA 50\u00a0USD al d\u00eda", "FORM:ADDRESS:FIELD:POSTAL_CODE:LABEL": "C\u00f3digo postal", "ERROR:CLIENT:FLASH:TITLE": "YOUR FLASH IS NOT WORKING :-(", "PAGE:MAIN:CLIENT_LOADING": "Cargando", "OVERLAY:TOP_TEN_POSITION:TRY_OTHER_SLOTS_OR_SAVE_SCORE": "Prueba a jugar a otras tragaperras gratuitas o guarda la puntuaci\u00f3n actual.", "FORM:ADDRESS:FIELD:PHONE_NUMBER:LABEL": "N\u00famero de tel\u00e9fono", "BUTTON:EXIT_TOURNAMENT:LABEL": "Abandonar el torneo", "OVERLAY:TOP_TEN_POSITION:RESET_AND_TRY_AGAIN": "Ahora, puedes reiniciar los cr\u00e9ditos y las rondas del torneo, y volver a probar suerte.", "FORM:ADDRESS:FIELD:LAST_NAME:LABEL": "Apellidos", "OVERLAY:RESET_FREE_GAME:HEADER": "TE HAS QUEDADO SIN CR\u00c9DITOS", "FORM:PASSWORD_RECOVERY_REQUEST:INFO:SUCCESS": "Hemos enviado el nombre de usuario y la contrase\u00f1a temporal a tu direcci\u00f3n de correo electr\u00f3nico. Comprueba la bandeja de entrada de tu correo.", "OVERLAY:NO_RESETS_REGISTERED_PLAYER:TEXT": "Prueba a jugar a otras tragaperras gratuitas o guarda la puntuaci\u00f3n actual.", "FORM:ADDRESS:FIELD:FIRST_NAME:LABEL": "Nombre", "OVERLAY:TOP_TEN_POSITION:TRY_AGAIN": "Puedes volver a intentarlo ahora.", "FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD2:LABEL": "Nueva contrase\u00f1a"}

// initialize login and password variables {{{
var login = "";
var password = "";
// }}}

// create container for storing ajax request options
var ajaxRequestOptions = new Object();
// initialize counter for ajax requests
var ajaxRequestId = 0;

// countries which require state to be selected {{{
var stateCodeRequiredCountries = {
    'country_224'       : true, // US
    'country_13'        : true, // AUSTRALIA
    'country_38'        : true  // CANADA
}
// }}}

// define known search engines
var searchEngines = ['googlebot', 'msnbot', 'yahoo'];

// initialize dynamic promotion variables {{{
var currentPromotionId = 0;
var displayedPromotionId;
// }}}

// tag templates for individual promotion types {{{
imageTagTemplate    = '<a href="targetURI" target="_blank" onclick="promotionClick(\'targetURI\');"><img src="imageURI"></a>'

swfTagTemplate      = '<object style="z-index: 1;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="600" height="75" id="banner" align="middle">'
                    + '<param name="allowScriptAccess" value="always" />'
                    + '<param name="swLiveConnect" value="true" />'
                    + '<param name="allowFullScreen" value="false" />'
                    + '<param name="movie" value="swfURI?build=mediaBuild&CT=targetURI" />'
                    + '<param name="wmode" value="transparent" />'
                    + '<param name="bgcolor" value="#000000" />'
                    + '<embed src="swfURI?build=mediaBuild&CT=targetURI"'
                    + 'quality="high" bgcolor="#000000"'
                    + 'swLiveConnect="true" wmode="transparent"'
                    + 'width="600" height="75" name="banner" align="middle"'
                    + 'allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash"'
                    + 'pluginspage="http://www.adobe.com/go/getflashplayer" />'
                    + '</object>';
// }}}

// available game stand variations {{{
var gameStandRollOverClasses = {
    big         : {
        background      : '.game_preview_big_roll_over_background',
        foreground      : '.game_preview_big_roll_over_foreground'
    },
    medium      : {
        background      : '.game_preview_medium_roll_over_background',
        foreground      : '.game_preview_medium_roll_over_foreground'
    },
    small       : {
        background      : '.game_preview_small_roll_over_background',
        foreground      : '.game_preview_small_roll_over_foreground'
    }
};
// }}}

// setup messages for client form validation {{{
$.extend($.validator.messages, {
    required                : texts["FORM:CLIENT_VALIDATION:REQUIRED"],
    email                   : texts["FORM:CLIENT_VALIDATION:EMAIL"],
    url                     : texts["FORM:CLIENT_VALIDATION:URL"],
    date                    : texts["FORM:CLIENT_VALIDATION:DATE"],
    dateISO                 : texts["FORM:CLIENT_VALIDATION:DATE_ISO"],
    number                  : texts["FORM:CLIENT_VALIDATION:NUMBER"],
    digits                  : texts["FORM:CLIENT_VALIDATION:DIGITS"],
    equalTo                 : texts["FORM:CLIENT_VALIDATION:EQUAL_TO"],
    maxlength               : $.validator.format(texts["FORM:CLIENT_VALIDATION:MAX_LENGTH"]),
    minlength               : $.validator.format(texts["FORM:CLIENT_VALIDATION:MIN_LENGTH"]),
    rangelength             : $.validator.format(texts["FORM:CLIENT_VALIDATION:RANGE_LENGTH"]),
    range                   : $.validator.format(texts["FORM:CLIENT_VALIDATION:RANGE"]),
    max                     : $.validator.format(texts["FORM:CLIENT_VALIDATION:MAX"]),
    min                     : $.validator.format(texts["FORM:CLIENT_VALIDATION:MIN"])
});
// }}}

// supported html enginse and engine versions {{{
var supportedBrowsers = {
    webkit      : 533,
    msie        : 8,
    opera       : 11.10,
    mozilla     : 2.0
};
// }}}

// }}}

function onDocumentReady() {
    /* DOC {{{
        Invoked when document is ready. This means we can setup javascript
        events etc but not everything is loaded at this moment.

    }}} */

    // CODE {{{
    // add 'noDefault' validation rule to invalidate fields which the user did not change {{{
    jQuery.validator.addMethod("noDefault", function(value, element) {
        return (this.optional(element) || value != $('[name=' + element.name + ']').attr('defaultValue'));
    }, "");
    // }}}

    // override default 'required' error message for form validation
    jQuery.validator.messages.required = "";


    // abort if unsupported browser version was found {{{
    if (!checkSupportedBrowser()) {
        return false;
    }
    // }}}

    // make sure the user has cookies enabled, if not, display error and abort further execution {{{
    if(!testCookie()) {
        showError(texts["ERROR:CLIENT:COOKIES_DISABLED"], true);
        return;
    }
    // }}}

    // determine name of the currently loaded game
    currentGame = $('meta[name=gamePage]').attr("content");

    // if login, password were found in query string, display the login window {{{
    // get the login and password values from query parameter {{{
    login = getQueryParameter("login");
    password = getQueryParameter("password");
    // }}}
    // }}}

    // process the initial user status
    onUserStatus(currentUserStatus);

    // if tournamentExpiresIn is set for the page, search for updatable tournament count down displays {{{
    if (tournamentExpiresIn != "") {
        if ($("#tournament_banner_countdown").length > 0) {
            tournamentExpiresInCallbacks.push(createCallback(updateBannerExpiresIn));
        }

        if ($("#tournament_column_header").length > 0) {
            tournamentExpiresInCallbacks.push(createCallback(updateTournamentResultsExpiresIn, '#tournament_column_header h2'));
        }

        if ($("#tournament_header").length > 0) {
            tournamentExpiresInCallbacks.push(createCallback(updateTournamentResultsExpiresIn, '#tournament_header h2'));
        }
    }
    // }}}

    // if there are tournament count down displays, setup the update interval {{{
    if (tournamentExpiresInCallbacks.length > 0) {
        // update the the tournament displays immediately
        updateTournamentExpiresIn();

        // setup interval which updates the count down displays every second
        setInterval(createCallback(updateTournamentExpiresIn), 1000);
    }
    // }}}

    // preload button roll over images {{{
    $('<img />').attr('src', clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/buttonRollOver.png');
    $('<img />').attr('src', clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png');
    // }}}

    // setup events on the rounded buttons
    setupRoundedButtons();
    // CODE }}}
}

function onWindowLoad() {
    /* DOC {{{
        The main page execution takes place in here where the basic support for
        browser, cookies is determined. Additionally setups banner rotation on
        game page, tournament countdown interval etc.

    }}} */

    // CODE {{{
    // save the webmaster ID
    webmasterId = getWebmasterId();

    // randomize the promotion order
    promotions = shuffle(promotions);

    // if on game page, display random promotion {{{
    if (currentGame != undefined) {
        rotatePromotions();
    }
    // }}}

    // if homepage promotions element exists in page, set homepage promotions {{{
    if ($("#homepage_promotions").length !== 0) {
        setHomepagePromotions();
    }
    // }}}

    // get the info on daily running tournament
    getDailyTournament();
    // CODE }}}
}

// set the page onload callback {{{
$(document).ready(function() {
    onDocumentReady();
});
// }}}

// set the page onload callback {{{
$(window).load(function() {
    onWindowLoad();
});
// }}}

function getWebmasterId() {
    /* DOC {{{
        Returns the webmaster ID (integer) using the associated cookie.
    }}} */

    // CODE {{{
    // get whole campaign string from the cookie
    var campaignString  = getCookie("p");

    // get the first part of the campaign ID (webmaster ID string)
    var webmasterString = campaignString.split("_")[0].trim();

    // parse the string to get the numeric webmaster ID (or NaN)
    var webmasterId = parseInt(webmasterString);

    // if the webmaster ID string is not a number, return 0 as webmaster ID {{{
    if (isNaN(webmasterId)) {
        return 0;
    }
    // }}}
    // otherwise return the parsed webmaster ID {{{
    else {
        return webmasterId;
    }
    // }}}
    // CODE }}}
}

function checkSupportedBrowser() {
    /* DOC {{{
        Determines whether the user's browser is supported or needs to be
        upgraded.

    }}} */

    // CODE {{{
    // always return 'true' for search engine bots {{{
    if (isClientSearchEngine()) {
        return true;
    }
    // }}}

    // whether we found a browser we actually can supported
    var browserFound = false;
    // whether the browser version is supported
    var browserOK = true;

    // check for supported browsers {{{
    for (var browser in supportedBrowsers) {
        // if the browser found, set 'browserFound' and check version {{{
        if ($.browser[browser]) {
            // browser was found
            browserFound = true;

            // mark the browser as not ok if too low version {{{
            if ($.browser.version < supportedBrowsers[browser]) {
                browserOK = false;
            }
            // }}}
        }
        // }}}
    }
    // }}}

    // if browser is not ok, display hard error and tell the user to ugprade {{{
    if (!browserOK) {
        var browserError_HTML = '<div id="browser_error">' +
            '    <a href="/es/">' +
            '        <img class="logo" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/freeSlotLogo.png" alt="' + texts["PAGE:LOGO:ALT"] + '">' +
            '        <img class="description_text" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/freeSlotLogoText.png" alt="' + texts["PAGE:LOGO:ALT"] + '">' +
            '    </a></div>' +
            '<div id="unsupported_browser" class="basic_error_container">' +
            '    <div class="overlay_header">' +
            '        <h2>' + texts['ERROR:CLIENT:UPGRADE_BROWSER'] + '</h2>' +
            '        <p></p>' +
            '    </div>' +
            '</div>';

        $('#page').before(browserError_HTML);

        // hide the page contents {{{
        $("#page").remove();
        $("#page_game").remove();
        // }}}

        // do not allow further execution
        return false;
    }
    // }}}
    // if an unknown browser found, suggest switching to one of the supported ones {{{
    else if (!browserFound) {
        showError(texts["ERROR:CLIENT:UNSUPPORTED_BROWSER"]);
    }
    // }}}

    // allow page execution if we dont know anything about the browser or the browser is good
    return true;
    // CODE }}}
}

function isClientSearchEngine() {
    // get the navigator value
    var userAgent = navigator.userAgent.toLowerCase();

    // check if the client is a search engine {{{
    for (var a = 0; a < searchEngines.length; a++) {
        // a search engine was found {{{
        if (userAgent.indexOf(searchEngines[a]) > -1) {
            return true;
        }
        // }}}
    }
    // }}}

    // no search engine found
    return false;
}

function testCookie() {
    /* DOC {{{
        Tests whether the browser has cookies enabled and returns the test
        result.

    }}} */

    // CODE {{{
    // set the testing cookie
    setCookie("__verify", "1");

    // if the cookie was created, cookies are enabled {{{
    if (getCookie("__verify") == "1") {
        return true;
    }
    // }}}

    // cookie was not created
    return false;
    // CODE }}}
}

function setCookie(name, value, days) {
    /* DOC {{{
        Stores the cookie with the specified name, value and expiration.

        name            : name of the cookie
        value           : cookie value
        days            : (optional) expiration length in days
    }}} */

    // CODE {{{
    // ensure there is always value for optional 'days' parameter
    var days = (days == undefined) ? 0: parseInt(days, 10);

    // default expiration string
    var expiration = '';

    // if days are specified, create proper expiration date string {{{
    if(days > 0) {
        // create the date object
        var expirationDate = new Date();

        // set the expiration in the date object
        expirationDate.setTime(expirationDate.getTime() + (days * 24 * 60 * 60 * 1000))

        // create expiration string for the cookie
        expiration = '; expires=' + expirationDate.toGMTString();
    }
    // }}}

    // save the cookie
    document.cookie = name + "=" + escape(String(value)) + '; path=/' + expiration;
    // CODE }}}
}

function getCookie(name) {
    /* DOC {{{
        Retrieves the value for the specified cookie name and returns it.

        name            : name of the cookie
    }}} */

    // CODE {{{
    // initialize the return variable
    var cookieValue = new String();

    // save the current cookie data
    var documentCookie = document.cookie;

    // find the cookie {{{
    if(documentCookie.length > 0) {
        // create the cookie identifier
        var cookieName = name + '=';

        // determine starting index of the cookie definition
        var cookieBegin = documentCookie.indexOf(cookieName);

        // if cookie was found, extract its value {{{
        if(cookieBegin > -1) {
            // get starting index for the cookie value
            var valueBegin = cookieBegin + cookieName.length;

            // get the ending index for the cookie value
            var valueEnd = documentCookie.indexOf(";", valueBegin);

            // if were unable to determine cookies end index, fallback to the length of the whole cookie string {{{
            if (valueEnd < valueBegin) {
                valueEnd = documentCookie.length;
            }
            // }}}

            // retrieve the cookie value
            cookieValue = documentCookie.substring(valueBegin, valueEnd);
        }
        // }}}
    }
    // }}}

    // return the cookie value
    return unescape(cookieValue);
    // CODE }}}
}

function setInitialLanguage() {
    /* DOC {{{
        Reads the initial language setting from cookie and displays it.

    }}} */

    // CODE {{{
    // get the language code from cookie
    var languageCode = getCookie("language");

    // show the language flag
    $("#language_menu").find("img").attr('src' , '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/flags/' + languageCode + '.png').css("display", "inline-block");
    // CODE }}}
}

function toggleLanguageMenu() {
    /* DOC {{{
        Toggles the language menu.

    }}} */

    // CODE {{{
    // get reference to the language selection menu
    var chooseLanguage = $("#choose_language");

    // if it doesn't exist, create it now {{{
    if (chooseLanguage.length == 0) {
        chooseLanguage = this.createLanguageMenu();
    }
    // }}}

    // show the menu if its not visible {{{
    if (chooseLanguage.css('display') == 'none') {
        this.showLanguageMenu();
    }
    // }}}
    // otherwise hide it {{{
    else {
        this.hideLanguageMenu();
    }
    // }}}
    // CODE }}}
}

function showLanguageMenu() {
    /* DOC {{{
        Shows the language menu and preselects the currently chosen language.

    }}} */

    // CODE {{{
    // activate the menu item
    $("#language_menu").addClass("active");

    // get reference to the language selection menu
    var chooseLanguage = $("#choose_language");

    // show the language menu
    chooseLanguage.css("display", "block");

    // hide the language menu when the mouse cursor leaves it
    chooseLanguage.mouseleave(createCallback(hideLanguageMenu));

    // get the currently selected language code
    var languageCode = getCookie("language");

    // highlight the selected language menu item
    chooseLanguage.find("#language_" + languageCode).addClass("active");
    // CODE }}}
}

function hideLanguageMenu() {
    /* DOC {{{
        Hides the language menu.

    }}} */

    // CODE {{{
    // get reference to the language selection menu
    var chooseLanguage = $("#choose_language");

    // hide the language menu
    chooseLanguage.css("display", "none");

    // remove all events since we don't need them anymore
    chooseLanguage.unbind();

    // remove highlight from the selected language menu item
    $("#language_menu").removeClass("active");
    // CODE }}}
}

function createLanguageMenu() {
    /* DOC {{{
        Creates the language menu using the LANGUAGES setting.

    }}} */

    // CODE {{{
    // create the main element {{{
    var chooseLanguage = $("<div/>", {
        'id'        : 'choose_language'
    });
    // }}}

    // create element for individual language items {{{
    var languageItems = $("<div/>", {
        'id'        : 'language_items'
    });
    // }}}

    // populate language items {{{
    for (var a = 0; a < clientSettings.LANGUAGES.length; a++) {
        // get the language definition
        var languageDefinition = clientSettings.LANGUAGES[a];

        // get the language name
        var languageName = languageDefinition[0];

        // get the language code
        var languageCode = languageDefinition[1];

        // create and setup the language element {{{
        // create the language element
        var language = $("<a/>", {'id' : 'language_' + languageCode, 'href' : '#'});

        // fill the language name
        language.html(languageName + '&nbsp;&nbsp;');

        // show the language flag {{{
        var image = $("<img/>", {
            'class'     : 'language_icon',
            'src'       : '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/flags/' + languageCode + '.png',
        }).css('display', 'inline-block');
        // }}}

        // setup the click event which selects the desired language
        language.click(createCallback(setLanguage, languageCode));

        // add image to the language element
        language.append(image);
        // }}}

        // add language element to the items list
        languageItems.append(language);
    }
    // }}}

    // add the created items to the base container
    chooseLanguage.append(languageItems);

    // add the base container to the document
    $("#main_container").append(chooseLanguage);

    // return the reference to the main container
    return chooseLanguage;
    // CODE }}}
}

function setLanguage(languageCode) {
    /* DOC {{{
        Takes the current location path, replaces the language code and
        redirects to it.

        languageCode            : new language code to set
    }}} */

    // CODE {{{
    // get current location path
    var currentPath = window.location.pathname;

    // construct the location for new language
    var newPath = "/" + languageCode + "/" + currentPath.slice(4);

    // redirect to the new path (language)
    window.location = newPath;
    // CODE }}}
}

function rotatePromotions() {
    /* DOC {{{
        Displays rotating banners.

    }}} */

    // CODE {{{
    // set the initial promotion container
    var promotionContainer = promotions;

    // rotate system banners only
    var rotateSystemBannersOnly = false;

    // otherwise if the user came via an affiliate link, rotate only internal promotions {{{
    if (webmasterId != 0) {
        promotionContainer = internalPromotions;
    }
    // }}}

    // rotate the promotion counter
    currentPromotionId = (currentPromotionId >= promotionContainer.length) ? 0 : currentPromotionId;

    // get the promotion definition
    var promotionDefinition = promotionContainer[currentPromotionId++];

    // skip promotion if it is system specific, but not for this currently displayed system {{{
    if ((rotateSystemBannersOnly == true) && ((promotionDefinition.systemId == undefined) || (promotionDefinition.systemId != tournamentSystemId))) {
        rotatePromotions();
        return;
    }
    // }}}

    // do nothing if the same promotion is already displayed {{{
    if (displayedPromotionId == currentPromotionId) {
        return;
    }
    // }}}

    // remember the displayed promotion id
    displayedPromotionId = currentPromotionId;

    // display the promotion {{{
    if (promotionDefinition.hasOwnProperty('promotionTag')) {
        $('#promotion').fadeOut("fast", function() {
            $(this).delay(400)
            .html(promotionDefinition.promotionTag)
            .fadeIn();
        });
    }
    else if (promotionDefinition.hasOwnProperty('swfURI')) {
        $('#promotion').fadeOut("fast", function() {
            promotionDisplay(promotionDefinition.targetURI);
            $(this).delay(400)
            .html(swfTagTemplate.replace(/swfURI/g, promotionDefinition.swfURI)
                                .replace(/mediaBuild/g, clientSettings.FLASH_CLIENT_BUILD)
                                .replace(/targetURI/g, promotionDefinition.targetURI))
            .fadeIn();
        });
    }
    else {
        $('#promotion').fadeOut("fast", function() {
            promotionDisplay(promotionDefinition.targetURI);
            $(this).delay(400)
            .html(imageTagTemplate.replace(/imageURI/g, promotionDefinition.imageURI)
                                  .replace(/targetURI/g, promotionDefinition.targetURI))
            .fadeIn();
        });
    }
    // }}}

    // setup rotation interval
    setTimeout('rotatePromotions()', 60000);
    // CODE }}}
}

function setHomepagePromotions() {
    /* DOC {{{
        Sets two promotion banners on homepage based on webmasterId which
        defines if user came via an affiliate or not. If the user came via
        an affiliate link, show Slotland and Winaday promotion banners.
        Otherwise use CoolCat and Winaday promotions banners.

    }}} */

    // CODE {{{
    // create empty array that will be filled with required promotion banners
    var promotions = [];

    // if the user came via an affiliate link, use Slotland banner as the 1st promotion banner {{{
    if (webmasterId != 0) {
        promotions.push(homepagePromotions.slotland);
    }
    // }}}
    // otherwise, use cryptoslots banner as 1st promotion banner {{{
    else {
        promotions.push(homepagePromotions.cryptoslots);
    }
    // }}}

    // as the 2nd banner always use Winaday
    promotions.push(homepagePromotions.winaday);

    for (var index = 0; index < promotions.length; index++) {
        promotionDisplay(promotions[index].targetURI);
        $("#homepage_promotions").append(
            imageTagTemplate.replace(/imageURI/g, promotions[index].imageURI)
                            .replace(/targetURI/g, promotions[index].targetURI)
        );
    }
    // CODE }}}
}

function promotionDisplay(targetURI) {
    // send the even when promotion banner is displayed
    eventTracker('promotion', 'display', targetURI);
}

function promotionClick(targetURI) {
    // track the click as an event
    eventTracker('promotion', 'click', targetURI);

    // track the click as a pageview
    pageTracker(targetURI);
}

function gameStandRollOver(gameStandName, style) {
    /* DOC {{{
        Creates the roll over effect on game stands. The effect is unified
        accross the whole site but is using different styles to differentiate
        efect sizes.

        gameStandName           : id of the game stand to perform the effect on
        style                   : style of the game stand (big, medium, small)
    }}} */

    // CODE {{{
    // get reference to the roll over background container
    var gameStandBackground = $("#" + gameStandName + " " + gameStandRollOverClasses[style].background);

    // if the background image was not yet loaded for this game stand, load it now {{{
    if (gameStandBackground.find('img').length == 0) {
        gameStandBackground.html('<img width="100%" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/games/gameRollOverBackground.png">');
    }
    // }}}

    // display the background container
    gameStandBackground.css("display", "block");

    // get reference to the roll over foreground container
    var gameStandForeground = $("#" + gameStandName + " " + gameStandRollOverClasses[style].foreground);

    // if the foreground image was not yet loaded for this game stand, load it now {{{
    if (gameStandForeground.find('img').length == 0) {
        gameStandForeground.html('<img width="100%" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/games/gameRollOverForeground.png">');
    }
    // }}}

    // display the foreground container
    gameStandForeground.css("display", "block");
    // CODE }}}
}

function gameStandRollOut() {
    /* DOC {{{
        Hides the roll over effect containers for all game stand buttons.

    }}} */

    // CODE {{{
    // hides all the roll over background and foreground containers upon roll out {{{
    for (var style in gameStandRollOverClasses) {
        $(gameStandRollOverClasses[style].background).css("display", "none");
        $(gameStandRollOverClasses[style].foreground).css("display", "none");
    }
    // }}}
    // CODE }}}
}

function createCallback(callbackFunction) {
    /* DOC {{{
        Creates an anomymous function from the passed parameters and returns
        it.

        callbackFunction        : function to call when the callback is invoked
    }}} */

    // CODE {{{
    // intialize parameters container
    var callbackParameters = new Array();

    // if additional parameters are set, conver them to array {{{
    if (arguments[1] != undefined) {
        callbackParameters = Array.prototype.slice.call(arguments, 1);
    }
    // }}}

    // return the anonymous callback function {{{
    return (function () {
        callbackFunction.apply(null, callbackParameters);
        return false;
    });
    // }}}
    // CODE }}}
}

function setupForm(form, ajaxFormOptions, validateOptions) {
    /* DOC {{{
        Setups the validation, submit events and other settings on the
        specified form.

        form            : form to setup
        ajaxFormOptions : options for the ajax request
        validateOptions : options for the form's validator
    }}} */

    // CODE {{{
    // ensure there is always an object present for both ajax and validator options {{{
    ajaxFormOptions = (ajaxFormOptions == undefined) ? {}: ajaxFormOptions;
    validateOptions = (validateOptions == undefined) ? {}: validateOptions;
    // }}}

    // set the content type which will be enforced on all incoming data
    ajaxFormOptions.dataType = 'json';

    // determine whether there was a custom beforeSubmit callback set and remember it if so {{{
    // default before submit callback
    var originalBeforeSubmitCallback = function() {};

    // if there is a custom before submit callback, remember it (as we need to override it) {{{
    if (ajaxFormOptions.beforeSubmit != undefined) {
        originalBeforeSubmitCallback = ajaxFormOptions.beforeSubmit;
    }
    // }}}
    // }}}

    // ensure the form is valid before being sent to server {{{
    ajaxFormOptions.beforeSubmit = function(formData, form, options) {
        // remove any left over response status messages
        clearOverlayObjectResponseStatus();

        // validate the form
        var r = form.valid();

        // if the form is not valid, display the default 'error' message {{{
        if (!r) {
            setOverlayObjectResponseStatus(texts['ERROR:CLIENT:FORM'], true);
        }
        // }}}
        // form is valid, invoke the custom before submit callback {{{
        else {
            originalBeforeSubmitCallback();
        }
        // }}}

        // return the validation result (if false, form will not be sent)
        return r;
    }
    // }}}

    // create the error callback
    ajaxFormOptions.error = createCallback(showError, texts["ERROR:CLIENT:LOADING_FAILED"], false, false);

    // disable onkeyup validation
    validateOptions.onkeyup = false;

    // setup the validation on the form
    form.validate(validateOptions);

    // workaround for IE/Opera which uses ajaxRequest() for sending the form data {{{
    if ($.browser.msie || $.browser.opera) {
        // attach handler to form's submit event
        form.submit(function() {
            // if the form is not valid, abort {{{
            if (!form.valid()) {
                return false;
            }
            // }}}

            // try to execute custom 'beforeSerialize()' method {{{
            try {
                ajaxFormOptions.beforeSerialize();
            } catch (e) {
            }
            // }}}

            // form is valid, perform the ajax request {{{
            ajaxRequest({
                error           : ajaxFormOptions.error,
                url             : form.attr("action"),
                data            : form.serialize(),
                dataType        : 'json',
                context         : document.body,
                success         : function(response) {
                    ajaxFormOptions.success(response, null, null, form);
                }
            });
            // }}}

            // return false to prevent default browser submit and page navigation
            return false;
        });
    }
    // }}}
    // use jQuery form plugin for rest of the browsers {{{
    else {
        form.ajaxForm(ajaxFormOptions);
    }
    // }}}
    // CODE }}}
}

function ajaxRequest(options) {
    /* DOC {{{
        Transparent ajax proxy which supports different ways of making Ajax
        calls using a unified interface.

        options                 : jQuery ajax options
    }}} */

    // CODE {{{
    // if no error callback is set, create a default one {{{
    if (options.error == undefined) {
        options.error = createCallback(showError, texts["ERROR:CLIENT:LOADING_FAILED"], false, false)
    }
    // }}}

    // always use this content type for making ajax requests
    options.contentType = "application/x-www-form-urlencoded";

    // make the request to use POST method if 'data' are present {{{
    if (typeof options.data != 'undefined') {
        options.type = "POST";
    }
    // }}}

    // use iframe communicator for IE and Opera which fail to make HTTP to HTTPS xhr requests {{{
    if ($.browser.msie || $.browser.opera) {
        // generate unique request id
        var id = "r_" + ajaxRequestId++;

        // store the ajax options corresponding to this request
        ajaxRequestOptions[id] = options;

        // send a postMessage to ifram communicator to perform the request {{{
        pm({
            target      : window.frames["communicator"],
            type        : 'ajaxIframeRequest',
            data        : {
                url             : options.url,
                data            : options.data,
                requestId       : id,
                contentType     : options.contentType
            }
        });
        // }}}
    }
    // }}}
    // otherwise use jQuery ajax method directly {{{
    else {
        $.ajax(options);
    }
    // }}}
    // CODE }}}
}

function ajaxResponse(response) {
    /* DOC {{{
        Callback method invoked from iframe communicator which handles the
        response data.

        response                : data received from server
    }}} */

    // CODE {{{
    // try to process the response {{{
    try {
        // determien the request id for this response
        var requestId = response.requestId;

        // get the requests ajax options
        var requestOptions = ajaxRequestOptions[requestId];

        // if an error occured, invoke error callback {{{
        if (response.error == 1) {
            // try to invoke the error callback {{{
            try {
                requestOptions.error();
            }
            // }}}
            // otherwise fail silently {{{
            catch (e) {
            }
            // }}}
        }
        // }}}
        // otherwise invoke the success callback {{{
        else {
            // try to invoke the success callback {{{
            try {
                requestOptions.success(response.response);
            }
            // }}}
            // otherwise fail silently {{{
            catch (e) {
            }
            // }}}
        }
        // }}}
    }
    // }}}
    // otherwise fail silently {{{
    catch (e) {
    }
    // }}}
}

// register the callback for iframe communicator if user has IE or Opera {{{
if ($.browser.msie || $.browser.opera) {
    // register the ajaxIframeResponse to receive iframe communicator messages
    pm.bind("ajaxIframeResponse", ajaxResponse);
}
// }}}

function hasFlash(requiredFlashVersion) {
    /* DOC {{{
        Determines the browser has the specified flash version installed.

        requiredFlashVersion            : flash version to check for
    }}} */

    // CODE {{{
    // get the version numbers {{{
    // get version numbers for the required flash version {{{
    var requiredVersion = new String(requiredFlashVersion).split(".");
    var requiredMajor = Number(requiredVersion[0]);
    var requiredMinor = Number(requiredVersion[1]);
    var requiredRevision = Number(requiredVersion[2]);
    // }}}

    // get version numbers for the client flash version {{{
    var clientVersion = new String(getFlashVersion()).split(".");
    var clientMajor = Number(clientVersion[0]);
    var clientMinor = Number(clientVersion[1]);
    var clientRevision = Number(clientVersion[2]);
    // }}}
    // }}}

    // if major version is higher any other checks are not necessary so skip them and return true {{{
    if (clientMajor > requiredMajor) {
        return true;
    }
    // }}}
    // if same major versions, check the minor and revision numbers {{{
    else if (clientMajor == requiredMajor) {
        // if minor version is higher any other checks are not necessary so return true {{{
        if (clientMinor > requiredMinor) {
            return true;
        }
        // }}}
        // otherwise check revision {{{
        else if (clientMinor == requiredMinor) {
            // if revision equals or is higher, return true {{{
            if (clientRevision >= requiredRevision) {
                return true;
            }
            // }}}
        }
        // }}}
    }
    // }}}

    // otherwise return false as the client version is too low
    return false;
    // CODE }}}
}

function getFlashVersionString(pluginVersionString) {
    /* DOC {{{
        Determines and returns the flash version number from the string.

    }}} */

    // CODE {{{
    // get flash version out of the version string
    var version = pluginVersionString.match(/[\d]+/g);

    // limit the version length to 3 digits
    // (compatibility between IE and FF)
    version.length = 3;

    // return the version
    return version.join(".");
    // CODE }}}
}

function getFlashVersion() {
    /* DOC {{{
        Determines the flash version string for supported browsers

    }}} */

    // CODE {{{
    // initialize variable which will hold the flash version
    var flashVersion = '';

    // every browser except IE supports the plugins container {{{
    if ((navigator.plugins) && (navigator.plugins.length)) {
        // get the plugin object
        var plugin = navigator.plugins['Shockwave Flash'];

        // if the plugin is set, look for description and get the flash version {{{
        if (plugin) {
            if (plugin.description) {
                flashVersion = getFlashVersionString(plugin.description);
            }
        }
        // }}}
    }
    // }}}
    // if the first failed, next solution is to look up the mimeTypes container {{{
    else if ((navigator.mimeTypes) && (navigator.mimeTypes.length)) {
        // check if the flash MIME type can be found
        var mimeType = navigator.mimeTypes['application/x-shockwave-flash'];

        // if the MIME type was found and plugin is enabled, access the version
        // through MIME type plugin object {{{
        if (mimeType && mimeType.enabledPlugin) {
            flashVersion = getFlashVersionString(mimeType.enabledPlugin.description);
        }
        // }}}
    }
    // }}}
    // get version from Internet Explorer {{{
    else {
        // get the version from the ActiveX object for Flash plugin 7 and up {{{
        try {
            // try 7 first, since we know we can use GetVariable with it
            var ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.7');
            flashVersion = getFlashVersionString(ax.GetVariable('$version'));
        }
        // }}}
        // no valid version so try the default ActiveX object {{{
        catch (e) {
            // try the default activeX {{{
            try {
                var ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
                flashVersion = getFlashVersionString(ax.GetVariable('$version'));
            }
            // }}}
            // no flash {{{
            catch (e) {
                // No flash
            }
            // }}}
        }
        // }}}
    }
    // }}}

    // return the flash version
    return flashVersion;
    // CODE }}}
}

function pageTracker(page) {
    /* DOC {{{
        Creates the specified page tracker for google analytics.

        page            : page to track
    }}} */

    // CODE {{{
    // try to insert the tracker definition {{{
    try {
        _gaq.push(['_setAccount', 'UA-221160-6']);
        _gaq.push(['_trackPageview', page]);
    }
    // }}}
    // otherwise fail silently {{{
    catch (e) {
    }
    // }}}
    // CODE }}}
}

function eventTracker(category, action, label, value) {
    /* DOC {{{
        Creates the event tracker for google analytics.

        category            : event category
        action              : event action
        label               : optional action label
        value               : optional action value (int)
    }}} */

    // CODE {{{
    // create the event tracking request
    var trackEvent = ['_trackEvent', category, action];

    // if label is defined, add it to the event data {{{
    if (typeof label != "undefined") {
        trackEvent.push(label);
    }
    // }}}

    // if value is defined, add it to the event data {{{
    if (typeof value != "undefined") {
        trackEvent.push(value);
    }
    // }}}

    // try to insert the tracker definition {{{
    try {
        _gaq.push(['_setAccount', 'UA-221160-6']);
        _gaq.push(trackEvent);
    }
    // }}}
    // otherwise fail silently {{{
    catch (e) {
    }
    // }}}
    // CODE }}}
}

function getQueryParameter(name) {
    /* DOC {{{
        Determines and returns value for the specified query parameter.

        name            : name of the query parameter
    }}} */

    // CODE {{{
    // define the RegExp rules and create the regexp object {{{
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    // }}}

    // perform the RegExp
    var results = regex.exec(window.location.search);

    // if no results found, return empty string {{{
    if(results == null) {
        return "";
    }
    // }}}
    // otherwise return the value {{{
    else {
        return decodeURIComponent(results[1].replace(/\+/g, " "));
    }
    // }}}
    // CODE }}}
}

function showLogin(invokeCancelCallback) {
    invokeCancelCallback = (invokeCancelCallback == undefined) ? false: invokeCancelCallback;

    // abort if we don't have user status yet or the user is logged in already {{{
    if ((currentUserStatus == undefined) || (currentUserStatus.isRegistered == "1")) {
        return;
    }
    // }}}

    if (hideOverlayObject(createCallback(showLogin, invokeCancelCallback))) {
        return;
    }

    if (invokeCancelCallback) {
        cancelMethod = 'invokeFormCancelCallback()';
    } else {
        cancelMethod = 'hideOverlayObject()';
    }

    // html for the registration form {{{
    var loginForm_HTML= '' +
    '<div id="login_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header">' +
    '        <h2>' + texts["FORM:LOGIN:INFO:TITLE"] + '</h2>' +
    '    </div>' +
    '    <form id="login_form" class="overlay_form" method="post" action="https://' + clientSettings.HOSTNAME + '/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doLogin/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">' +
    '        <input type="hidden" name="registrationUSER" value="' + clientSettings.UNREGISTERED_LOGIN + '"/>' +
    '        <label for="login">' + texts["FORM:LOGIN:FIELD:LOGIN:LABEL"] + '</label><input type="text" name="login" tabindex="1" class="required" minlength="3"/>' +
    '        <label for="password">' + texts["FORM:LOGIN:FIELD:PASSWORD:LABEL"] + '</label><input type="password" id="password" name="password" tabindex="2" class="required" minlength="5"/>' +
    '        <div class="response_status"></div>' +
    '        <p class="center_buttons">' +
    '           <input type="submit" style="display: inline-block; margin: 20px 0px 10px 0px;" class="rounded_button" value="' + texts["BUTTON:OK:LABEL"] + '...">' +
    '           <br/><a href="#" class="overlay_form_text_link" onclick="' + cancelMethod + '; return false;">' + texts["BUTTON:CANCEL_LOGIN:LABEL"] + '</a> | <a href="#" class="overlay_form_text_link" onclick="overlayPasswordRecoveryRequest(); return false;">' + texts["BUTTON:LOST_PASSWORD:LABEL"] + '</a>' +
    '        </p>' +
    '    </form>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // if login form does not exist, show the login form {{{
    if ($('#login_container').length == 0) {
        // display the registration form
        showOverlayObject(loginForm_HTML, "login_container");

        $("input[name=login]").val(login);
        $("input[name=password]").val(password);

        setupForm($('#login_form'), {success: onUserLogin});
    }
    // }}}
    // otherwise remove the already displayed login form {{{
    else {
        hideOverlayObject();
    }
    // }}}
}

function invokeFormCancelCallback() {
    if (callbackAfterCancelledForm != undefined) {
        callbackAfterCancelledForm();
        callbackAfterCancelledForm = undefined;
    } else {
        hideOverlayObject();
    }
}

function overlayPasswordRecoveryRequest() {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayPasswordRecoveryRequest))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var form_HTML= '' +
    '<div id="password_recovery_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h2>' + texts['FORM:PASSWORD_RECOVERY_REQUEST:INFO:TITLE'] + '</h2>' +
    '        <h4>' + texts['FORM:PASSWORD_RECOVERY_REQUEST:INFO:ABOUT'] + '</h4>' +
    '    </div>' +
    '    <form id="password_recovery_request_form" class="overlay_form" method="post" action="https://' + clientSettings.HOSTNAME + '/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doPasswordRecoveryRequest/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">' +
    '        <input type="hidden" name="registrationUSER" value="' + clientSettings.UNREGISTERED_LOGIN + '"/>' +
    '        <label for="email">' + texts['FORM:PASSWORD_RECOVERY_REQUEST:FIELD:EMAIL:LABEL'] + '</label><input type="text" name="email" tabindex="1" class="required" minlength="6"/>' +
    '           <div class="response_status"></div>' +
    '           <p class="center_buttons">' +
    '               <input type="submit" class="rounded_button" value="' + texts['BUTTON:RECOVER_PASSWORD:LABEL'] + '...">' +
    '               <br/><a href="#" class="overlay_form_text_link" onclick="hideOverlayObject(); return false;">' + texts['BUTTON:CANCEL:LABEL'] + '</a>' +
    '           </p>' +
    '    </form>' +

    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(form_HTML, "password_recovery_container");

    setupForm($('#password_recovery_request_form'), {success: onPasswordRecoveryRequest});
    // }}}
}

function onPasswordRecoveryRequest(response, statusText, xhr, $form)  {
    /* DOC {{{
        Handle password recovery by showing button for login form on success.

    }}} */

    // CODE {{{
    if (isFormValid(response, $form)) {
        setOverlayObjectResponseStatus(texts['FORM:PASSWORD_RECOVERY_REQUEST:INFO:SUCCESS']);
        showContinueLoginButton();
    }
    // CODE }}}
}

function showContinueLoginButton() {
    /* DOC {{{
        Replace password recovery submit button by button for showing login form.

    }}} */

    // CODE {{{
    // get password recovery submit button
    var recoveryButton = $("#password_recovery_request_form .rounded_button");

    // create button for showing login form and bind on click {{{
    var button = $("<input>").attr({
        type: "button",
        class: "rounded_button",
        value: "Continue to login..."
    }).on(
        "click", function() {
            onContinueLoginButtonClicked(button, recoveryButton);
        }
    );
    // }}}

    // hide recovery button
    recoveryButton.hide();

    // insert button for showing login form before recovery button
    recoveryButton.before(button);
    // CODE }}}
}

function onContinueLoginButtonClicked(loginButton, recoveryButton) {
    /* DOC {{{
        Hide recovery password form and show login form.

        loginButton             : jQuery object reference for button showing login form
        recoveryButton          : jQyery object reference for recovery password submit button
    }}} */

    // CODE {{{
    // remove button for showing login form
    loginButton.remove();

    // show recovery password submit button
    recoveryButton.show();

    // hide password recovery form and show login form {{{
    hideOverlayObject();
    showLogin();
    // }}}
    // CODE }}}
}

function overlayPasswordRecovery() {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayPasswordRecovery))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var form_HTML= '' +
    '<div id="password_recovery_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h2>' + texts['FORM:PASSWORD_RECOVERY:INFO:TITLE'] + '</h2>' +
    '        <h4>' + texts['FORM:PASSWORD_RECOVERY:INFO:ABOUT'] + '</h4>' +
    '    </div>' +
    '    <form id="password_recovery_form" class="overlay_form" method="post" action="https://' + clientSettings.HOSTNAME + '/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doPasswordRecovery/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">' +
    '        <input type="hidden" name="registrationUSER" value="' + clientSettings.UNREGISTERED_LOGIN + '"/>' +
    '        <label for="password">' + texts['FORM:PASSWORD_RECOVERY:FIELD:PASSWORD:LABEL'] + '</label><input type="password" id="password" name="password" class="required" tabindex="2" minlength="5"/>' +
    '        <label for="newPassword1">' + texts['FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD1:LABEL'] + '</label><input type="password" id="newPassword1" name="newPassword1" class="required" tabindex="2" minlength="5"/>' +
    '        <label for="newPassword2">' + texts['FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD2:LABEL'] + '</label><input type="password" name="newPassword2" tabindex="3" class="required" minlength="5""/>' +
    '           <div class="response_status"></div>' +
    '           <p class="center_buttons">' +
    '               <input type="submit" style="display: inline-block; margin: 20px 0px 10px 0px;" class="rounded_button" value="' + texts['BUTTON:CHANGE_PASSWORD:LABEL'] + '...">' +
    '               <br/><a href="#" class="overlay_form_text_link" onclick="hideOverlayObject(); return false;">' + texts['BUTTON:CANCEL:LABEL'] + '</a>' +
    '           </p>' +
    '    </form>' +

    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(form_HTML, "password_recovery_container");

    $("input[name=password]").val(password);

    setupForm($('#password_recovery_form'), {success: onUserLogin},
        {
            rules: {
                newPassword2: {
                    equalTo: "#newPassword1"
                }
            },
            messages: {
                newPassword2: {
                    equalTo : texts['FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD2:ERROR:INVALID']
                }
            }
        }
    );
    // }}}
}

function overlayContactAddress() {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayContactAddress))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var form_HTML= '' +
    '<div id="change_contact_address" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h2>' + texts['FORM:ACCOUNT:INFO:TITLE'] + '</h2>' +
    '    </div>' +
    '    <div class="overlay_text">' + texts['ERROR:CLIENT:CONTACT_ADDRESS_MUST_BE_CHANGED'] + '</div>' +
    '       <p class="center_buttons">' +
    '           <input type="submit" onclick="showAccount();" class="rounded_button" value="' + texts['BUTTON:UPDATE_ACCOUNT:LABEL'] + '...">' +
    '       </p>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(form_HTML, "change_contact_address");
    // }}}
}

function overlayContactEmail() {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayContactEmail))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var form_HTML= '' +
    '<div id="change_contact_address" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h3>' + texts['ERROR:CLIENT:CONTACT_EMAIL_MUST_BE_CHANGED:TITLE'] + '</h3>' +
    '    </div>' +
    '    <div class="overlay_text">' + texts['ERROR:CLIENT:CONTACT_EMAIL_MUST_BE_CHANGED'] + '</div>' +
    '       <p class="center_buttons">' +
    '           <input type="submit" onclick="showAccount();" class="rounded_button" value="' + texts['BUTTON:UPDATE_ACCOUNT:LABEL'] + '...">' +
    '       </p>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(form_HTML, "change_contact_address");
    // }}}
}

function overlayContactEmailVerfication() {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayContactEmailVerfication))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var form_HTML= '' +
    '<div id="email_verification" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h3>' + texts['ERROR:CLIENT:CONTACT_EMAIL_IN_VERIFICATION_PROCESS:TITLE'] + '</h3>' +
    '    </div>' +
    '    <div class="overlay_text">' + (texts['ERROR:CLIENT:CONTACT_EMAIL_IN_VERIFICATION_PROCESS']).split('XXLOGINXX').join(clientSettings.LOGIN) + '</div>' +
    '       <p class="center_buttons">' +
    '           <input type="submit" onclick="hideOverlayObject();" class="rounded_button" value="' + texts["BUTTON:OK:LABEL"] + '...">' +
    '       </p>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(form_HTML, "email_verification");
    // }}}
}

function overlayOnlineBonus(message) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayOnlineBonus))) {
        return;
    }
    // }}}

    // html for online bonus {{{
    var form_HTML= '' +
    '<div id="online_bonus_container" class="overlay_content">' +
    '   <div id="overlay_form_container" class="gradient_container online_bonus">' +
    '       <div class="online_bonus_message">' +
                message +
    '           <p class="center_buttons">' +
    '               <input type="submit" onclick="hideOverlayObject();" class="rounded_button" value="' + texts["BUTTON:OK:LABEL"] + '...">' +
    '           </p>' +
    '       </div>' +
    '   </div>' +
    '   <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/onlineBonuses/presentsAvailable.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the HTML
    showOverlayObject(form_HTML, "online_bonus_container");
    // }}}
}


function overlayOnlineBonusNotAvailable(message) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayOnlineBonusNotAvailable))) {
        return;
    }
    // }}}

    // html online bonus not available {{{
    var form_HTML= '' +
    '<div id="online_bonus_container" class="overlay_content">' +
    '   <div id="overlay_form_container" class="gradient_container online_bonus_not_available">' +
    '       <div class="online_bonus_message">' +
                message +
    '           <p class="center_buttons">' +
    '               <input type="submit" class="rounded_button" onclick="hideOverlayObject();" value ="' + texts["BUTTON:OK:LABEL"] + '...">' +
    '           </p>' +
    '       </div>' +
    '   </div>' +
    '   <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/onlineBonuses/presentsNotAvailable.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the HTML
    showOverlayObject(form_HTML, "online_bonus_container");
    // }}}
}

function loadFormLists(callback) {
    // get the dynamically generated form lists data {{{
    ajaxRequest({
        url: '/' + clientSettings.LANGUAGE + '/' + clientSettings.THEME + '/scriptFormLists/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID,
        dataType: 'json',
        context: document.body,
        success: function (response, textStatus, jqXHR) {
            formLists = response;
            callback();
        }
    });
    // }}}
}

function showRegistration(invokeCancelCallback) {
    invokeCancelCallback = (invokeCancelCallback == undefined) ? false: invokeCancelCallback;

    // abort if we don't have user status yet or the user is logged in already {{{
    if ((currentUserStatus == undefined) || (currentUserStatus.isRegistered == "1")) {
        return;
    }
    // }}}

    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(showRegistration, invokeCancelCallback))) {
        return;
    }
    // }}}

    // load the dynamic form lists data if needed {{{
    if (formLists == undefined) {
        loadFormLists(createCallback(showRegistration, invokeCancelCallback));
        return;
    }
    // }}}

    if (invokeCancelCallback) {
        cancelMethod = 'invokeFormCancelCallback()';
    } else {
        cancelMethod = 'hideOverlayObject()';
    }

    pageTracker('/registrationRPHit');

    // html for the registration form {{{
    var registrationForm_HTML = '' +
    '<div id="registration_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header">' +
    '        <h3>' + texts['FORM:FULL_REGISTRATION:INFO:TITLE'] + '</h3>' +
    '        <h4>' + texts['FORM:FULL_REGISTRATION:INFO:ABOUT'] + '</h4>' +
    '    </div>' +
    '    <form id="registration_form" class="overlay_form" action="https://' + clientSettings.HOSTNAME + '/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doFullRegistration/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '" method="POST">' +
    '        <div class="form_section_title">' + texts['FORM:FULL_REGISTRATION:LOGIN_PASSWORD:ABOUT'] + '</div>' +
    '        <label for="login">' + texts['FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:LOGIN:LABEL'] + '</label><input type="text" name="login" tabindex="1" class="required" minlength="3"/>' +
    '        <label for="password1">' + texts['FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD1:LABEL'] + '</label><input type="password" id="password1" name="password1" tabindex="2" class="required" minlength="5"/>' +
    '        <label for="password2">' + texts['FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD2:LABEL'] + '</label><input type="password" name="password2" tabindex="3" class="required" minlength="5""/>' +
    '        <div class="form_section_title">' + texts['FORM:FULL_REGISTRATION:ADDRESS:ABOUT'] + '</div>' +
    '        <label for="email">' + texts['FORM:ADDRESS:FIELD:EMAIL:LABEL'] + '</label><input type="text" name="email" tabindex="4" class="required email" minlength="6"/>' +
    '        <label for="title">' + texts['FORM:ADDRESS:FIELD:TITLE:LABEL'] + '</label><div class="styled-select"><select id="title" name="title" tabindex="5" class="required noDefault" defaultValue="0">' + formLists.titles + '</select></div><div id="error_title"></div>' +
    '        <label for="firstName">' + texts['FORM:ADDRESS:FIELD:FIRST_NAME:LABEL'] + '</label><input type="text" name="firstName" tabindex="6" class="required" minlength="2"/>' +
    '        <label for="lastName">' + texts['FORM:ADDRESS:FIELD:LAST_NAME:LABEL'] + '</label><input type="text" name="lastName" tabindex="7" class="required" minlength="2"/>' +
    '        <div id="birthDateLabelContainer"><span class="birthDateLabel">' + texts['FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:MONTH:LABEL'] + '</span><span class="birthDateLabel">' + texts['FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:DAY:LABEL'] + '</span><span class="birthDateLabel">' + texts['FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:YEAR:LABEL'] + '</span></div>'+
    '        <label for="birthDateMonth">' + texts['FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:BIRTH_DATE:LABEL'] + '</label><div id="selectBirthDateMonth" class="styled-select"><select id="birthDateMonth" name="birthDateMonth" tabindex="8" class="required noDefault" defaultValue="0">' + formLists.months + '</select></div>' +
    '        <div id="selectBirthDateDay" class="styled-select"><select id="birthDateDay" name="birthDateDay" tabindex="9" class="required noDefault" defaultValue="0">' + formLists.days + '</select></div>' +
    '        <div id="selectBirthDateYear" class="styled-select"><select id="birthDateYear" name="birthDateYear" tabindex="10" class="required noDefault" defaultValue="0">' + formLists.years + '</select></div>' +
    '        <input type="hidden" id="birthDate" name="birthDate" value="">' +
    '        <label for="phoneNumber">' + texts['FORM:ADDRESS:FIELD:PHONE_NUMBER:LABEL'] + '</label><input type="text" name="phoneNumber" tabindex="11" class="required" minlength="9"/>' +
    '        <label for="streetAddress">' + texts['FORM:ADDRESS:FIELD:STREET_ADDRESS:LABEL'] + '</label><input type="text" name="streetAddress" tabindex="12" class="required" minlength="2"/>' +
    '        <label for="aptSuite">' + texts['FORM:ADDRESS:FIELD:APT_SUITE:LABEL'] + '</label><input type="text" name="aptSuite" tabindex="13" minlength="0"/>' +
    '        <label for="city">' + texts['FORM:ADDRESS:FIELD:CITY:LABEL'] + '</label><input type="text" name="city" tabindex="14" class="required" minlength="2"/>' +
    '        <label for="stateCode">' + texts['FORM:ADDRESS:FIELD:STATE_CODE:LABEL'] + '</label><div class="styled-select"><select id="stateCode" name="stateCode" tabindex="15" defaultValue="0">' + formLists.states + '</select></div><div id="error_stateCode"></div>' +
    '        <label for="postalCode">' + texts['FORM:ADDRESS:FIELD:POSTAL_CODE:LABEL'] + '</label><input type="text" name="postalCode" tabindex="16" class="required" minlength="4"/>' +
    '        <label for="countryCode">' + texts['FORM:ADDRESS:FIELD:COUNTRY_CODE:LABEL'] + '</label><div class="styled-select"><select id="countryCode" name="countryCode" tabindex="17" class="required noDefault" defaultValue="0">' + formLists.countries + '</select></div><div id="error_countryCode"></div>' +
    '        <br/><br/>' +
    '        <label class="labelCheckBox" for="agree"><input type="checkbox" name="agree" value="1" class="required" tabindex="18"/>&nbsp;&nbsp;' + texts['FORM:FULL_REGISTRATION_CONDITIONS:FIELD:AGREE:LABEL'] + '</label>' +
    '        <input type="hidden" id="registrationSID" name="registrationSID" value=""/>' +
    '        <input type="hidden" name="registrationUSER" value="' + clientSettings.UNREGISTERED_LOGIN + '"/>' +
    '        <div class="response_status"></div>' +
    '        <p class="center_buttons">' +
    '           <input type="submit" class="rounded_button" value="' + texts['BUTTON:CREATE_ACCOUNT:LABEL'] + '...">' +
    '           <br/><a href="#" class="overlay_form_text_link"  onclick="' + cancelMethod + '; return false;">' + texts['BUTTON:CANCEL_REGISTRATION:LABEL'] + '</a>' +
    '        </p>' +
    '    </form>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(registrationForm_HTML, "registration_container", createCallback(setupScrollingArrow, "[name=login]", "[name=agree]"));

    // pre-select the country and state {{{
    // since multiple state code values can be '0', ensure we select the first index if the value is zero {{{
    if (formLists.presetState == 0) {
        $('#stateCode option').eq(0).attr('selected', 'selected');
    }
    // }}}
    // otherwise use the pre-set value {{{
    else {
        $("#stateCode").val(formLists.presetState);
    }
    // }}}

    $("#countryCode").val(formLists.presetCountry);
    // }}}

    setupForm($('#registration_form'),
        {
            success: onUserRegistration,

            beforeSerialize: function($form, options) {
                if ($('#registration_helper').get(0) && (typeof $('#registration_helper').get(0).getRegistration == "function")) {
                    $("#registrationSID").val($('#registration_helper').get(0).getRegistration());
                }

                var birthDate = $("#birthDateYear").val() + $("#birthDateMonth").val() + $("#birthDateDay").val();
                $("#birthDate").val(birthDate);
            },

            beforeSubmit: createCallback(pageTracker, "/registrationRPSubmit")

        },
        {
            errorPlacement: function(error, element) {
                var elementName = $(element).attr('name');
                var errorElement = $("#error_" + elementName);

                if (errorElement.length == 0) {
                    element.after(error);
                } else {
                    errorElement.html(error);
                }
            },
            rules: {
                stateCode: {
                    noDefault: {
                        depends: function() {
                            if (stateCodeRequiredCountries["country_" + ($('#countryCode').val())]) {
                                return true;
                            }

                            return false;
                        }
                    },
                    required: {
                        depends: function() {
                            if (stateCodeRequiredCountries["country_" + ($('#countryCode').val())]) {
                                return true;
                            }

                            return false;
                        }
                    }
                },
                password2: {
                    equalTo: "#password1"
                }
            },
            messages: {
                stateCode: {
                    required : texts['FORM:ADDRESS:FIELD:STATE_CODE:ERROR:NOT_SPECIFIED']
                },
                password2: {
                    equalTo : texts['FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD1:ERROR:INVALID']
                }
            }
        }
    );
    // }}}

    $("#countryCode").change(function() {
        if (stateCodeRequiredCountries["country_" + ($('#countryCode').val())] != true) {
            $('#stateCode option').eq(0).attr('selected', 'selected');
        }

        $("#stateCode").valid();
    });
    // }}}
}

function setupScrollingArrow(positionReferenceElement, stopScrollingDivElement) {
    var stopScrollingDiv = $(stopScrollingDivElement);

    var positionReference = $(positionReferenceElement);

    $("#page").before('<div id="registration_arrow"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/registrationArrow.png"></div>');

    // get reference to the scrolling element
    var scrollingDiv = $("#registration_arrow");

    // compute the maximum scroll
    var maxScroll = stopScrollingDiv.offset().top - 75;

    // compute the initial position {{{
    var top = ($(window).scrollTop() + ($(window).height() - scrollingDiv.height())) - 10;
    var left = (positionReference.offset().left + positionReference.width()) + 30;
    // }}}

    if (top > maxScroll) {
        $("#registration_arrow").remove();
        return;
    }

    scrollingDiv.fadeIn();

    // position the arrow {{{
    scrollingDiv.css("top", top);
    scrollingDiv.css("left", left);
    // }}}

    // setup scroll listener to handle scrolling div positioning {{{
    $(window).scroll(function() {
        // get the current scroll value
        var viewTop = $(window).scrollTop();

        var topPosition = viewTop + ($(window).height() - scrollingDiv.height()) - 10;

        // fixate the element's position on page to ensure its always visible when srolling down {{{
        if (topPosition < maxScroll) {
            scrollingDiv.css("top", topPosition + "px");
        } else {
            scrollingDiv.css("top", maxScroll + "px");
        }
        // }}}
    });
    // }}}
}

function showAccount(addressData) {
    if (addressData == undefined) {
        getUserAddress(showAccount);
        return;
    }

    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(showAccount))) {
        return;
    }
    // }}}

    // load the dynamic form lists data if needed {{{
    if (formLists == undefined) {
        loadFormLists(createCallback(showAccount, addressData));
        return;
    }
    // }}}

    // html for the registration form {{{
    var accountForm_HTML = '' +
    '<div id="registration_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header">' +
    '        <h3>' + texts['FORM:ACCOUNT:INFO:TITLE'] + '</h3>' +
    '    </div>' +
    '    <form id="registration_form" class="overlay_form" action="https://' + clientSettings.HOSTNAME + '/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doChangeContactAddress/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '" method="POST">' +
    '    <div class="form_section_title">' + texts['FORM:ACCOUNT:INFO:ADDRESS:ABOUT'] + '</div>' +
    '        <label for="email">' + texts['FORM:ADDRESS:FIELD:EMAIL:LABEL'] + '</label><input type="text" id="email" name="email" tabindex="4" class="required email" minlength="6"/>' +
    '        <label for="title">' + texts['FORM:ADDRESS:FIELD:TITLE:LABEL'] + '</label><div class="styled-select"><select id="title" name="title" tabindex="5" class="required noDefault" defaultValue="0">' + formLists.titles + '</select></div><div id="error_title"></div>' +
    '        <label for="firstName">' + texts['FORM:ADDRESS:FIELD:FIRST_NAME:LABEL'] + '</label><input type="text" id="firstName" name="firstName" tabindex="6" class="required" minlength="2"/>' +
    '        <label for="lastName">' + texts['FORM:ADDRESS:FIELD:LAST_NAME:LABEL'] + '</label><input type="text" id="lastName" name="lastName" tabindex="7" class="required" minlength="2"/>' +
    '        <div id="birthDateLabelContainer"><span class="birthDateLabel">' + texts['FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:MONTH:LABEL'] + '</span><span class="birthDateLabel">' + texts['FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:DAY:LABEL'] + '</span><span class="birthDateLabel">' + texts['FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:YEAR:LABEL'] + '</span></div>'+
    '        <label for="birthDateMonth"></label><div id="selectBirthDateMonth" class="styled-select"><select id="birthDateMonth" name="birthDateMonth" tabindex="8" class="required noDefault" defaultValue="0">' + formLists.months + '</select></div>' +
    '        <div id="selectBirthDateDay" class="styled-select"><select id="birthDateDay" name="birthDateDay" tabindex="9" class="required noDefault" defaultValue="0">' + formLists.days + '</select></div>' +
    '        <div id="selectBirthDateYear" class="styled-select"><select id="birthDateYear" name="birthDateYear" tabindex="10" class="required noDefault" defaultValue="0">' + formLists.years + '</select></div>' +
    '        <input type="hidden" id="birthDate" name="birthDate" value="">' +
    '        <label for="phoneNumber">' + texts['FORM:ADDRESS:FIELD:PHONE_NUMBER:LABEL'] + '</label><input type="text" id="phoneNumber" name="phoneNumber" tabindex="8" class="required" minlength="9"/>' +
    '        <label for="streetAddress">' + texts['FORM:ADDRESS:FIELD:STREET_ADDRESS:LABEL'] + '</label><input type="text" id="streetAddress" name="streetAddress" tabindex="9" class="required" minlength="2"/>' +
    '        <label for="aptSuite">' + texts['FORM:ADDRESS:FIELD:APT_SUITE:LABEL'] + '</label><input type="text" id="aptSuite" name="aptSuite" tabindex="10" minlength="0"/>' +
    '        <label for="city">' + texts['FORM:ADDRESS:FIELD:CITY:LABEL'] + '</label><input type="text" id="city" name="city" tabindex="11" class="required" minlength="2"/>' +
    '        <label for="stateCode">' + texts['FORM:ADDRESS:FIELD:STATE_CODE:LABEL'] + '</label><div class="styled-select"><select id="stateCode" name="stateCode" tabindex="15" defaultValue="0">' + formLists.states + '</select></div><div id="error_stateCode"></div>' +
    '        <label for="postalCode">' + texts['FORM:ADDRESS:FIELD:POSTAL_CODE:LABEL'] + '</label><input type="text" id="postalCode" name="postalCode" tabindex="13" class="required" minlength="4"/>' +
    '        <label for="countryCode">' + texts['FORM:ADDRESS:FIELD:COUNTRY_CODE:LABEL'] + '</label><div class="styled-select"><select id="countryCode" name="countryCode" tabindex="17" class="required noDefault" defaultValue="0">' + formLists.countries + '</select></div><div id="error_countryCode"></div>' +
    '    <div class="form_section_title">' + texts['FORM:ACCOUNT:INFO:LOGIN_PASSWORD:ABOUT:1'] + '</div>' +
    '    <div class="form_section_subtitle">' + texts['FORM:ACCOUNT:INFO:LOGIN_PASSWORD:ABOUT:2'] + '</div>' +
    '        <label for="password">' + texts['FORM:PASSWORD_CHANGE:FIELD:CURRENT_PASSWORD:LABEL'] + '</label><input type="password" id="password" name="password" tabindex="2" minlength="5"/>' +
    '        <label for="newPassword1">' + texts['FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD1:LABEL'] + '</label><input type="password" id="newPassword1" name="newPassword1" tabindex="2" minlength="5"/>' +
    '        <label for="newPassword2">' + texts['FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD2:LABEL'] + '</label><input type="password" name="newPassword2" tabindex="3" minlength="5""/>' +
    '        <br/><br/>' +
    '    <div class="response_status"></div>' +
    '           <input type="hidden" name="registrationUSER" value="' + clientSettings.UNREGISTERED_LOGIN + '"/>' +
    '        <p class="center_buttons">' +
    '           <input type="submit" class="rounded_button" value="' + texts['BUTTON:UPDATE_ACCOUNT:LABEL'] + '...">' +
    '           <br/><a href="#" class="overlay_form_text_link" onclick="hideOverlayObject(); return false;">' + texts['BUTTON:CLOSE:LABEL'] + '</a>' +
    '        </p>' +
    '    </form>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(accountForm_HTML, "registration_container", createCallback(setupScrollingArrow, "[name=email]", "[name=newPassword2]"));

    $.each(addressData, function(i, value){
        $("#" + i).val(value);
    });

    var birthDate = addressData['birthDate'].toString();

    $("#birthDateYear").val(birthDate.slice(0,4));
    $("#birthDateMonth").val(birthDate.slice(4,6));
    $("#birthDateDay").val(birthDate.slice(6));

    if (addressData['stateCode'] == 0) {
        $('#stateCode option').eq(0).attr('selected', 'selected');
    }

    setupForm($('#registration_form'),
        {
            success: onAccountUpdate,

            beforeSerialize: function($form, options) {
                var birthDate = $("#birthDateYear").val() + $("#birthDateMonth").val() + $("#birthDateDay").val();

                $("#birthDate").val(birthDate);
            }
        },
        {
            errorPlacement: function(error, element) {
                var elementName = $(element).attr('name');
                var errorElement = $("#error_" + elementName);

                if (errorElement.length == 0) {
                    element.after(error);
                } else {
                    errorElement.html(error);
                }
            },
            rules: {
                stateCode: {
                    noDefault: {
                        depends: function() {
                            if (stateCodeRequiredCountries["country_" + ($('#countryCode').val())]) {
                                return true;
                            }

                            return false;
                        }
                    },
                    required: {
                        depends: function() {
                            if (stateCodeRequiredCountries["country_" + ($('#countryCode').val())]) {
                                return true;
                            }

                            return false;
                        }
                    }
                },
                password: {
                    required: {
                        depends : function() {
                            return (($('#newPassword1').val().length > 0) ? true: false);
                        }
                    }
                },
                newPassword1: {
                    required: {
                        depends: function() {
                            return (($('#password').val().length > 0) ? true: false);
                        }
                    }
                },
                newPassword2: {
                    equalTo: "#newPassword1",
                    required: {
                        depends: function() {
                            return (($('#password').val().length > 0) ? true: false);
                        }
                    }
                }
            },
            messages: {
                stateCode: {
                    required : texts['FORM:ADDRESS:FIELD:STATE_CODE:ERROR:NOT_SPECIFIED']
                },
                newPassword2: {
                    equalTo : texts['FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD2:ERROR:INVALID']
                }
            }
        }
    );
    // }}}

    $("#countryCode").change(function() {
        if (stateCodeRequiredCountries["country_" + ($('#countryCode').val())] != true) {
            $('#stateCode option').eq(0).attr('selected', 'selected');
        }

        $("#stateCode").valid();
    });
    // }}}
}

function getDailyTournament() {
    // do not update daily tournament if udpate is disabled {{{
    if (dailyTournamentUpdateDisabled == true) {
        return;
    }
    // }}}

    // URI for retrieving the user status

    var getDailyTournamentURI = '/' + clientSettings.LANGUAGE + '/shared/' + clientSettings.THEME + '/getDailyTournamentTopPlayers/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID;

    if (currentGame != undefined) {
        // URI for retrieving the user status
        getDailyTournamentURI = '/' + clientSettings.LANGUAGE + '/shared/' + clientSettings.THEME + '/getDailyTournament/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID;
    }

    if (updateTournamentInterval != undefined) {
        clearTimeout(updateTournamentInterval);
    }

    // get the user status {{{
    ajaxRequest({
        url: getDailyTournamentURI,
        dataType: 'json',
        context: document.body,
        success: updateDailyTournament
    });
    // }}}
}

function getPreviousDailyTournament() {
    tournamentIsPrevious = true;

    // URI for retrieving the user status
    var getPreviousDailyTournamentURI = '/' + clientSettings.LANGUAGE + '/shared/' + clientSettings.THEME + '/getPreviousDailyTournament/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID;

    if (updateTournamentInterval != undefined) {
        clearTimeout(updateTournamentInterval);
    }

    // get the user status {{{
    ajaxRequest({
        url: getPreviousDailyTournamentURI,
        dataType: 'json',
        context: document.body,
        success: updateDailyTournament
    });
    // }}}
}

function updateDailyTournament(response, textStatus, jqXHR) {
    if (currentGame != undefined) {
        updateInGameDailyTournament(response);
    } else {
        updatePageDailyTournament(response);
    }
}

function updatePageDailyTournament(response) {
    // get the ranking board data
    var rankingBoard = response.rankingBoard;

    // variable to hold current user's full name
    var playerFullName = "";

    // set new tournamentExpiresIn value from server's response
    tournamentExpiresIn = Math.max(0, parseInt(response.expiresIn, 10));

    // display the ranking board data {{{
    for (var a = 0; a < 8; a++) {
        // get reference to the position div element
        var lineDiv = $("#position_" + (a + 1));

        // get references to the login and points containers {{{
        var loginDiv = lineDiv.find(".tournament_line_login");
        var positionDiv = lineDiv.find(".tournament_line_position");
        var pointsDiv = lineDiv.find(".tournament_line_points");
        // }}}

        if (rankingBoard[a] == undefined) {
            lineDiv.removeClass("tournament_line_player_position");
            loginDiv.html("");
            positionDiv.html("");
            pointsDiv.html("");
        } else {
            // get the ranking data
            var rankData = rankingBoard[a];

            // get reference to the position div element
            var lineDiv = $("#position_" + (a + 1));

            var fullName = rankData.fullName;

            // highlight current user's position if it was found {{{
            if ((response.playerRank != undefined && response.playerRank != null) && (rankData.rank == response.playerRank)) {
                playerFullName = fullName;

                lineDiv.addClass("tournament_line_player_position");
            }
            // }}}
            // otherwise ensure the highlight class is removed {{{
            else {
                lineDiv.removeClass("tournament_line_player_position");
            }
            // }}}

            if (fullName == "") {
                fullName = "PLAYER";
            }

            // show the user's rank, login and points {{{
            loginDiv.html(fullName);
            positionDiv.html(rankData.rank + ".")
            pointsDiv.html(rankData.score);
            // }}}
        }
    }
    // }}}

    // setup update interval
    updateTournamentInterval = setTimeout('getDailyTournament()', 30000);
}

function updateInGameDailyTournament(response) {
    // update game graphic and label if it has changed {{{
    if ((tournamentIsPrevious == false) && (currentDailyTournamentData == undefined || response.game.nameId != currentDailyTournamentData.game.nameId)) {
        // get reference to the game preview container
        var gamePreviewDiv = $(".game_preview_current_tournament");

        // retrieve game's nameId and name {{{
        var nameId = response.game.nameId;
        var name = response.game.name;
        // }}}

        // construct the HTML to be inserted into game preview container
        var gamePreview_HTML = '' +
            '    <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/games/' + nameId + '.png">' +
            '    <div class="game_preview_tournament_label shadow">' + name + '</div>';

        // insert the HTML
        gamePreviewDiv.html(gamePreview_HTML);

        $("#tournament_system_icon").html('<img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentGameIconSystem' + response.game.systemId + '.png">');

        // fade in the container {{{
        gamePreviewDiv.css('display', 'none');
        gamePreviewDiv.fadeIn("slow");
        // }}}
    }
    // }}}

    $(".tournament_game").attr("href", response.game.link);

    if (currentGame != undefined) {
        if ((tournamentIsPrevious == false) && (currentGame == response.game.nameId)) {
            $("#tournament_game_button").css("display", "none");
        } else {
            $("#tournament_game_button").css("display", "block");
        }

        showGameUserInfo();
        updateGameUserInfo(response);
    }

    // get reference to the game preview container
    var tournamentTableDiv = $("#game_sidebar_tournament_table");

    // get the ranking board data
    var rankingBoard = response.rankingBoard;

    // variable to hold current user's full name
    var playerFullName = "";

    // display the ranking board data {{{
    for (var a = 0; a < 8; a++) {
        // get reference to the position div element
        var lineDiv = $("#position_" + (a + 1));

        // get references to the login and points containers {{{
        var loginDiv = lineDiv.find(".game_sidebar_tournament_line_login");
        var pointsDiv = lineDiv.find(".game_sidebar_tournament_line_points");
        // }}}

        if (rankingBoard[a] == undefined) {
            lineDiv.removeClass("game_sidebar_tournament_line_player_position");
            loginDiv.html("");
            pointsDiv.html("");
        } else {
            // get the ranking data
            var rankData = rankingBoard[a];

            // get reference to the position div element
            var lineDiv = $("#position_" + (a + 1));

            var fullName = rankData.fullName;

            // highlight current user's position if it was found {{{
            if ((response.playerRank != undefined && response.playerRank != null) && (rankData.rank == response.playerRank)) {
                playerFullName = fullName;

                lineDiv.addClass("game_sidebar_tournament_line_player_position");
            }
            // }}}
            // otherwise ensure the highlight class is removed {{{
            else {
                lineDiv.removeClass("game_sidebar_tournament_line_player_position");
            }
            // }}}

            if (fullName == "") {
                fullName = "PLAYER";
            }

            // show the user's rank, login and points {{{
            loginDiv.html(rankData.rank + ". " + fullName);
            pointsDiv.html(rankData.score);
            // }}}
        }
    }
    // }}}

    // if best score is available, show the user's best score information {{{
    if (response.bestScore != undefined && response.bestScore != null) {
        var bestDiv = $(".game_sidebar_tournament_line_best");

        var loginDiv = bestDiv.find(".game_sidebar_tournament_line_login");
        var pointsDiv = bestDiv.find(".game_sidebar_tournament_line_points");

        loginDiv.html(response.bestRank + ". " + playerFullName);
        pointsDiv.html(response.bestScore);

        $('#player_best_position').css('display', 'inline-block');
    }
    // }}}
    // otherwise hide the best score information {{{
    else {
        $('#player_best_position').css('display', 'none');
    }
    // }}}

    // set new tournamentExpiresIn value from server's response
    tournamentExpiresIn = Math.max(0, parseInt(response.expiresIn, 10));

    // remvoe previous expires in update interval if it existed {{{
    if (tournamentExpiresInInterval != undefined) {
        clearInterval(tournamentExpiresInInterval);
    }
    // }}}

    // show initial expires in value and setup interval in which it will be updated {{{
    $("#expires_in span").html(getHumanReadableTime(tournamentExpiresIn));

    if ((tournamentExpiresIn > 0) && (tournamentIsPrevious == false)) {
        tournamentExpiresInInterval = setInterval(updateExpiresIn, 1000);
    } else {
        removeExpiresInAlert();
    }
    // }}}

    // remember the current tournament data so we can compare what has changed later
    currentDailyTournamentData = response;

    if ((tournamentExpiresIn > 0) && (tournamentIsPrevious == false)) {
        // setup update interval
        updateTournamentInterval = setTimeout('getDailyTournament()', 30000);
    }
}

function updateExpiresIn() {
    // decrease the expires by 1 second
    tournamentExpiresIn -= 1;

    // get reference to the 'expires_in' container
    var tournamentExpiresInDiv = $("#expires_in span");

    // if the tournament expired, clear the interval and set expires in to zero {{{
    if (tournamentExpiresIn <= 0) {
        clearTimeout(updateTournamentInterval);
        clearInterval(tournamentExpiresInInterval);

        setTimeout('getPreviousDailyTournament()', 2000);

        tournamentExpiresIn = 0;
    }
    // }}}

    // setup blinking animation if there's only one hour left in tournament
    if ((tournamentExpiresIn < 300) && (tournamentExpiresIn > 0)) {
        setupExpiresInAlert();
    } else if ((tournamentExpiresInDiv > 300) || (tournamentExpiresIn <= 0)) {
        removeExpiresInAlert();
    }

    // display the time remaining
    tournamentExpiresInDiv.html(getHumanReadableTime(tournamentExpiresIn));
}

function setupExpiresInAlert() {
    if (!tournamentExpiresInAlert) {
        tournamentExpiresInAlert = true;

        blinkExpiresIn();
    }
}

function blinkExpiresIn() {
    if (tournamentExpiresInAlert) {
        // get reference to the expires in div
        var tournamentExpiresInDiv = $("#expires_in div");

        tournamentExpiresInDiv.css('display', 'block');
        tournamentExpiresInDiv.css('opacity', 1);

        // fade-out the background color
        tournamentExpiresInDiv.stop().delay(100).animate({ opacity: 0}, 1500);

        // setup timeout for next animation
        tournamentExpiresInAlertBlinkInterval = setTimeout('blinkExpiresIn()', 2200);
    }
}

function removeExpiresInAlert() {
    if (tournamentExpiresInAlert) {
        if (tournamentExpiresInAlertBlinkInterval != undefined) {
            clearTimeout(tournamentExpiresInAlertBlinkInterval);
        }

        tournamentExpiresInAlert = false;

        // get reference to the 'expires_in' container
        var tournamentExpiresInDiv = $("#expires_in div");

        if (tournamentExpiresIn > 0) {
            tournamentExpiresInDiv.stop()
            tournamentExpiresInDiv.css('display', 'none');
        }
    }
}

function updateTournamentExpiresIn() {
    // decrease the expires by 1 second
    tournamentExpiresIn -= 1;

    // if the tournament expired, clear the interval and set expires in to zero {{{
    if (tournamentExpiresIn <= 0) {
        tournamentExpiresIn = 0;
    }
    // }}}

    for (var a = 0; a < tournamentExpiresInCallbacks.length; a++) {
        tournamentExpiresInCallbacks[a](tournamentExpiresIn);
    }
}

function updateBannerExpiresIn() {
    // get reference to the 'expires_in' container
    var tournamentExpiresInDiv = $("#tournament_banner_countdown");

    // display the time remaining
    tournamentExpiresInDiv.html('<div id="tournament_banner_countdown_label">' + texts['PAGE:TOURNAMENT_BANNER:TITLE'] + ' </div> ' + getHumanReadableTime(tournamentExpiresIn, false));
}

function updateTournamentResultsExpiresIn(element) {
    var time = getHumanReadableTime(tournamentExpiresIn, true);

    $(element).html(time);
}

function getHumanReadableTime(seconds, includeTimeLiterals) {
    if (includeTimeLiterals == undefined) {
        includeTimeLiterals = true;
    }

    // compute hours, minutes and seconds left {{{
    var h = Math.floor(seconds / 3600);
    var m = Math.floor((seconds % 3600) / 60);
    var s = Math.floor((seconds % 3600) % 60);
    // }}}

    var th = "h";
    var tm = "m";
    var ts = "s";

    if (!includeTimeLiterals) {
        th = "";
        tm = "";
        ts = "";
    }

    // construct the humana readable time string and return it
    return (h == 0 ? "": ( h < 10 ? "0" + h.toString() + th + ":" : h.toString() + th + ":")) + ( m < 10 ? "0" + m.toString() : m.toString()) + tm + ":" + ( s < 10 ? "0" + s.toString() : s.toString()) + ts;
}

function showOverlayObject(elementHTML, elementContainerName, onShowCallback) {
    /* DOC {{{
        Generic method for displaying some HTML element in a modal overlay.

        elementHTML             : HTML to display in the overlay
        elementContainer        : main container to reference when displaying the element
    }}} */

    // CODE {{{
    if ($("#login_container").length > 0) {
        $("#login_container").fadeOut(
            "fast",
            function() {
                $("#login_container").remove();
            }
        );
    }

    scroll(0,0);

    // remember the displayed overlay object
    currentOverlayObject = elementContainerName;

    // show the overlay background {{{
    // generate the HTML for overlay background container
    var overlayBox_HTML = '<div id="overlay"></div>';

    // insert the form into document
    $("#main_container").before(overlayBox_HTML);
    // }}}

    // remove any previous instances of the element
    $("#" + elementContainerName).remove();

    // insert the overlay logo (if not already in overlay) {{{
    if ($("#overlay_logo").length == 0) {
        $("#header").before(
            '<div id="overlay_logo">' +
                '<img class="logo" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/freeSlotLogo.png">' +
                '<img class="description_text" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/freeSlotLogoText.png">' +
            '</div>'
        );
    }
    // }}}

    // insert HTML for the new element into DOM
    $("#header").before(elementHTML);

    // display the new element
    $('#' + elementContainerName).css('display', 'none');
    $('#overlay').css('display', 'none');

    $('#' + elementContainerName).waitForImages({
        finished : function() {
            $("#overlay").fadeIn();

            $('#' + currentOverlayObject).delay(300, function () {
                $('#' + currentOverlayObject).stop().fadeIn();
                if (onShowCallback != undefined) {
                    onShowCallback()
                }
            });
        }
    });

    $("#" + elementContainerName).focus();

    setupRoundedInputButtons();
    setupRoundedButtons();

    updateUserProgress();
    // CODE }}}
}


function initializeFacebookSDK() {
    /* DOC {{{
        Initializes the Facebook SDK.
    }}} */

    // CODE {{{
    // initialize the Facebook SDK {{{
    $(window).load(function() {
        (function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) return;
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/" + clientSettings.LOCALE + "/all.js#xfbml=1&appId=745830778774105";
          fjs.parentNode.insertBefore(js, fjs);
          }(document, 'script', 'facebook-jssdk'));
    });
    // }}}
    // CODE }}}
}

function sharePositionOnFacebook(position) {
    /* DOC {{{
        Shares a post on tournament position on Facebook. Tracks opening of popup and successful share.
     }}} */

    // CODE {{{
    // track the user opened popup
    eventTracker("share", "popup");

    // get the random variation (1 - 6)
    descriptionVariaton = Math.floor((Math.random() * 6) + 1);

    // get the random description
    description = texts['FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:' + descriptionVariaton];

    // set the current position to description
    description = description.replace('XXPOSITIONXX', position);

    // zero-fill the position text {{{
    if (position < 10) {
        positionText = "0" + position;
    } else {
        positionText = position;
    }
    // }}}

    // display Facebook share dialog {{{
    FB.ui(
      {
        method: 'feed',
        name: texts['FACEBOOK:SHARE_POSITION:TITLE'],
        link: 'https://' + clientSettings.HOSTNAME + '/?p=73091480_76',
        picture: 'https://' + clientSettings.MEDIAHOSTNAME + '/' + clientSettings.LANGUAGE +  '/file/' + clientSettings.THEME + '/image/facebook/shareIcon' + positionText + '.png',
        caption: clientSettings.HOSTNAME,
        description: description,
      },
      function(response) {
        // if the post was shared, track it {{{
        if (response && response.post_id) {
            eventTracker("share", "sent");
        }
        // }}}
      }
    );
    // }}}
    // CODE }}}
}

function hideOverlayObject(callback) {
    /* DOC {{{
        Hides/removes the specified overlay object and also removes the overlay
        background container.

        objectName              : name of the overlay object to hide
    }}} */

    // CODE {{{
    // if no object is displayed, abort {{{
    if (typeof(currentOverlayObject) == 'undefined') {
        return false;
    }
    // }}}

    if ($("#registration_arrow").length > 0) {
        $("#registration_arrow").remove();
    }

    // remove the overlay logo
    $("#overlay_logo").fadeOut(function() {$(this).remove();});

    // remove the overlay object
    $("#" + currentOverlayObject).fadeOut("fast", function() {
        $(this).remove();
    });

    // reset the currentOverlayObject variable
    currentOverlayObject = undefined;


    // remove the overlay background container
    $("#overlay").delay(100).fadeOut("fast", function() {
        $("#overlay").remove();

        if (callback != undefined) {
            callback();
        }
    });

    return true;
    // CODE }}}
}

function clearOverlayObjectResponseStatus() {
    $("#" + currentOverlayObject + " .response_status").fadeOut("fast");
}

function setOverlayObjectResponseStatus(message, isError) {
    if (isError) {
        message = "<span class=\"response_status_error\">" + message + "</span>";
    }

    $("#" + currentOverlayObject + " .response_status").html(message);
    $("#" + currentOverlayObject + " .response_status").fadeIn("slow");
}

function showError(errorMessage, buttonDisabled, forceReload) {
    /* DOC {{{
        Displays an error to the user.

        errorMessage            : (optional) error message to display in the error box
    }}} */

    // CODE {{{
    buttonDisabled = (buttonDisabled == undefined) ? false: buttonDisabled;

    forceReload = (forceReload == undefined) ? false: forceReload;

    // parse the XXLOGINXX which can occur in error messages
    errorMessage = errorMessage.split('XXLOGINXX').join(clientSettings.LOGIN);

    // html for the registration form {{{
    var overlay_HTML= '' +
    '    <div id="error" class="gradient_error_container">' +
    '    <div class="overlay_header">' +
    '        <h2>' + texts['ERROR:CLIENT:ERROR:TITLE'] + '</h2>' +
    '    <p>' + errorMessage + '</p>' +
    '    </div>';
    // }}}

    if (!buttonDisabled) {
        if (forceReload) {
            overlay_HTML += '    <p class="center_buttons">' +
                            '        <input id="error_button" type="submit" class="rounded_button" onclick="window.location=\'https://' + clientSettings.HOSTNAME + '/es/\';" value="' + texts['BUTTON:RELOAD:LABEL'] + '...">' +
                            '    </p>';
        } else {
            overlay_HTML += '    <p class="center_buttons">' +
                            '        <input id="error_button" type="submit" class="rounded_button" onclick="hideError();" value="' + texts["BUTTON:OK:LABEL"] + '...">' +
                            '    </p>';
        }
    }
    // }}}

    overlay_HTML += '</div>';

    // show the overlay background {{{
    // generate the HTML for overlay background container
    var overlayBox_HTML = '<div id="overlay_error"></div>';

    // insert the form into document
    $("#main_container").before(overlayBox_HTML);
    // }}}

    // insert HTML for the new element into DOM
    $("#header").before(overlay_HTML);

    // display the new element
    $('#error').css('display', 'none');
    $('#overlay_error').css('display', 'none');

    $('#error').waitForImages({
        finished : function() {
            $("#overlay_error").fadeIn();

            $('#error').delay(300, function () {
                $('#error').stop().fadeIn();
            });
        }
    });

    setupRoundedInputButtons();

    setupRoundedButtons();
    // CODE }}}
}

function showFlashError(errorMessage) {
    /* DOC {{{
        Displays Flash problem dialog to the user.

        errorMessage            : (optional) error message to display in the error box
    }}} */

    // CODE {{{
    // parse the XXLOGINXX which can occur in error messages
    errorMessage = errorMessage.split('XXLOGINXX').join(clientSettings.LOGIN);

    // html for the registration form {{{
    var overlay_HTML= '' +
    '    <div id="error" class="gradient_error_container">' +
    '    <div class="overlay_header">' +
    '        <h2>' + texts['ERROR:CLIENT:FLASH:TITLE'] + '</h2>' +
    '    <p>' + errorMessage + '</p>' +
    '    </div>';
    // }}}

    // add continue button, with on click callback action {{{
    overlay_HTML += '    <p class="center_buttons">' +
                    '        <input id="error_button" type="submit" class="rounded_button" onclick="gotoFlashSite();" value="' + 'CONTINUE' + '">' +
                    '    </p>';
    // }}}

    overlay_HTML += '</div>';

    // show the overlay background {{{
    // generate the HTML for overlay background container
    var overlayBox_HTML = '<div id="overlay_error"></div>';

    // insert the form into document
    $("#main_container").before(overlayBox_HTML);
    // }}}

    // insert HTML for the new element into DOM
    $("#header").before(overlay_HTML);

    // display the new element
    $('#error').css('display', 'none');
    $('#overlay_error').css('display', 'none');

    $('#error').waitForImages({
        finished : function() {
            $("#overlay_error").fadeIn();

            $('#error').delay(300, function () {
                $('#error').stop().fadeIn();
            });
        }
    });

    setupRoundedInputButtons();
    setupRoundedButtons();
    // CODE }}}
}

function showReloadPage() {
    /* DOC {{{
        Displays reload page dialog to the user.

    }}} */

    // CODE {{{
    // html for the registration form {{{
    var overlay_HTML= '' +
    '    <div id="error" class="gradient_error_container">' +
    '    <div class="overlay_header">' +
    '        <h2>' + texts['ERROR:CLIENT:FLASH:RELOAD'] + '</h2>' +
    '    </div>';
    // }}}

    // add continue button, with on click callback action {{{
    overlay_HTML += '    <p class="center_buttons">' +
                    '        <input id="error_button" type="submit" class="rounded_button" onclick="window.location=\'https://' + clientSettings.HOSTNAME + '/es/\';" value="' + texts['BUTTON:RELOAD:LABEL'] + '...">' +
                    '    </p>';
    // }}}

    overlay_HTML += '</div>';

    // show the overlay background {{{
    // generate the HTML for overlay background container
    var overlayBox_HTML = '<div id="overlay_error"></div>';

    // insert the form into document
    $("#main_container").before(overlayBox_HTML);
    // }}}

    // insert HTML for the new element into DOM
    $("#header").before(overlay_HTML);

    // display the new element
    $('#error').css('display', 'none');
    $('#overlay_error').css('display', 'none');

    $('#error').waitForImages({
        finished : function() {
            $("#overlay_error").fadeIn();

            $('#error').delay(300, function () {
                $('#error').stop().fadeIn();
            });
        }
    });

    setupRoundedInputButtons();
    setupRoundedButtons();
    // CODE }}}
}

function gotoFlashSite() {
    /* DOC {{{
        Requests opening Adobe Flash install/update site in new tab, hides
        current error dialog and forces displaying reload page dialog, to make
        sure that this type of error always ends reloading the page.

    }}} */

    // CODE {{{
    // go to Adobe's flash install site in new window
    window.open("http://get.adobe.com/flashplayer/", '_blank');

    // hide current error
    hideError();

    // show reload page dialog
    showReloadPage();
    // CODE }}}
}

function hideError() {
    /* DOC {{{
        Hides/removes the specified overlay object and also removes the overlay
        background container.

        objectName              : name of the overlay object to hide
    }}} */

    // CODE {{{
    // remove the overlay object
    $("#error").fadeOut("fast", function() {
        $(this).remove();
    });

    // remove the overlay background container
    $("#overlay_error").delay(100).fadeOut("fast", function() {
        $("#overlay_error").remove();
    });

    return true;
    // CODE }}}
}

function getUserStatus() {
    // URI for retrieving the user status
    var statusURI = "https://" + clientSettings.HOSTNAME + "/" + clientSettings.LANGUAGE + "/user/" + clientSettings.THEME + '/status/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID;

    ajaxRequest({
        url: statusURI,
        dataType: 'json',
        context: document.body,
        success: onUserStatus,
        data: {registrationUSER: clientSettings.UNREGISTERED_LOGIN},
        error: createCallback(showError, texts["ERROR:CLIENT:LOADING_FAILED"], false, true)
    });
    // }}}
}

function onUserStatus(response, textStatus, jqXHR) {
    // save current user status
    currentUserStatus = response;

    updateUserProgress();

    // if 'login' is set, show the login screen {{{
    if (login != "") {
        showLogin();
        login = "";
        password = "";
    }
    // }}}
    // if there's no event action, hide currently displayed overlay {{{
    else if (!invokeEventAction(response)) {
        hideOverlayObject();
    }
    // }}}

    // show the bonus popup if possible {{{
    var now = (new Date()).getTime();

    // if the request has failed, display error {{{
    if (response.status == "0" || response.isRegistered == "0") {
        // insert the registration helper (if needed) {{{
        if ($("#registration_helper").length == 0) {
            // create the container for helper {{{
            var registrationHelper = $("<div/>", {
                id      : "registration_helper"
            });
            // }}}

            // append the container to document
            $("body").append(registrationHelper);

            // load the helper {{{
            registrationHelper.flash({
                id                      : 'registration_helper',
                src                     : 'https://' + clientSettings.MEDIAHOSTNAME + "/" + clientSettings.LANGUAGE + "/flash/" + clientSettings.THEME + "/boot/registrationHelper.swf?build=" + clientSettings.FLASH_CLIENT_BUILD,
                width                   : 1,
                height                  : 1,
                allowscriptaccess       : 'always',
                wmode                   : 'transparent',
                swliveconnect           : 'true',
                availparams             : ['swliveconnect', 'src', 'allowscriptaccess', 'wmode']
            });
            // }}}
        }
        // }}}

        showUserInfo(response);
        return;
    }
    // }}}

    // otherwise show user's
    showUserInfo(response, true);

    // game needs to be refreshed only if user processing was a result of call to server {{{
    if (typeof textStatus !== "undefined") {
        window.location.reload(true);
    }
    // }}}
    // }}}
}

function updateUserProgress() {
    if (currentUserStatus.tournamentScore != undefined && currentUserStatus.tournamentScore > 0) {
        $(".user_progress_1").css('display', 'block');

        if (currentUserStatus.isRegistered == "1") {
            $(".user_progress_2").css('display', 'block');
        }
    }
}

function invokeEventAction(response) {
    if (response.eventAction != undefined) {
        var eventAction = (response.eventAction[0]);

        if (typeof(window["eventAction_" + eventAction[0]]) == "function") {
            window["eventAction_" + eventAction[0]].apply(null, eventAction.slice(1));
            return true;
        }
    }

    return false;
}

function eventAction_FRE_PASSWORD_RECOVERY() {
    overlayPasswordRecovery();
}

function eventAction_FRE_CONTACT_ADDRESS() {
    // if the action was already invoked in this session, abort {{{
    if (getCookie("__FRE_CONTACT_ADDRESS") == "1") {
        return;
    }
    // }}}

    // remember that we already invoked this action
    setCookie("__FRE_CONTACT_ADDRESS", "1");

    overlayContactAddress();
}

function eventAction_FRE_CONTACT_EMAIL() {
    // if the action was already invoked in this session, abort {{{
    if (getCookie("__FRE_CONTACT_EMAIL") == "1") {
        return;
    }
    // }}}

    // remember that we already invoked this action
    setCookie("__FRE_CONTACT_EMAIL", "1");

    overlayContactEmail();
}

function eventAction_FRE_CONTACT_EMAIL_VERIFICATION() {
    // if the action was already invoked in this session, abort {{{
    //if (getCookie("__FRE_CONTACT_EMAIL_VERIFICATION") == "1") {
    //    return;
    //}
    // }}}

    // remember that we already invoked this action
    // setCookie("__FRE_CONTACT_EMAIL_VERIFICATION", "1");

    overlayContactEmailVerfication();
}

function eventAction_FRE_ONLINE_BONUS(message) {
    overlayOnlineBonus(message);
}

function eventAction_FRE_ONLINE_BONUS_NOT_AVAILABLE(message) {
    overlayOnlineBonusNotAvailable(message);
}

function updateUserStatus(cash, remainingTournamentResets, remainingTournamentRounds, tournamentCredits, tournamentScore) {
    // udpate the
    currentUserStatus.cash = cash;
    currentUserStatus.remainingTournamentResets = remainingTournamentResets;
    currentUserStatus.remainingTournamentRounds = remainingTournamentRounds;
    currentUserStatus.tournamentCredits = tournamentCredits;
    currentUserStatus.tournamentScore = tournamentScore;

    getDailyTournament();

    updateGameUserInfo(currentDailyTournamentData);
}

function getUserAddress(callback) {
    // URI for retrieving the user status
    var statusURI = "https://" + clientSettings.HOSTNAME + "/" + clientSettings.LANGUAGE + "/user/" + clientSettings.THEME + "/contactAddress/json?" + clientSettings.SESSION_ID_URL_NAME + "=" + clientSettings.SID;

    // get the user status {{{
    ajaxRequest({
        url: statusURI,
        dataType: 'json',
        context: document.body,
        success: function(response, textStatus, jqXHR) {
            if (onUserAddress(response)) {
                callback(response.address);
            }
        },
        data: {registrationUSER: clientSettings.UNREGISTERED_LOGIN},
        error: createCallback(showError, texts["ERROR:CLIENT:LOADING_FAILED"], false, true)
    });
    // }}}
}

function onUserAddress(response) {
    // if the request has failed, display error {{{
    if (response.status == "0") {
        showError(texts["ERROR:CLIENT:LOADING_FAILED"]);
        return false;
    }
    // }}}

    // all good
    return true;
}

function logOut() {
    // URI for retrieving the user status
    var statusURI = "https://" + clientSettings.HOSTNAME + "/" + clientSettings.LANGUAGE + "/user/" + clientSettings.THEME + "/doLogout/json?" + clientSettings.SESSION_ID_URL_NAME + "=" + clientSettings.SID;

    // get the user status {{{
    ajaxRequest({
        url: statusURI,
        dataType: 'json',
        context: document.body,
        data: {registrationUSER: clientSettings.UNREGISTERED_LOGIN},
        success: onUserLogout
    });
    // }}}
}

function onUserLogout() {
    // unset user flags cookies {{{
    setCookie("__FRE_CONTACT_ADDRESS", "0");
    setCookie("__FRE_CONTACT_EMAIL", "0");
    setCookie("__FRE_CONTACT_EMAIL_VERIFICATION", "0");
    // }}}

    // invoke hard reload
    window.location.reload(true);
}

function onUserLogin(response, statusText, xhr, $form)  {
    // if login was successful, continue with loading user's status {{{
    if (isFormValid(response, $form)) {
        // update the registration helper, if there any new login data {{{
        if(typeof response.login !== "undefined") {
            // update the registration data in helper swf
            if ($('#registration_helper').get(0) && (typeof $('#registration_helper').get(0).updateRegistration == "function")) {
                $('#registration_helper').get(0).updateRegistration(response.login.nameId);
            }

            // store new login in settings data
            clientSettings.LOGIN = response.login.nameId;
        }
        // }}}

        // hide the overlay object (login / recovery form)
        hideOverlayObject();

        // invoke to update user's status and tournament data {{{
        getUserStatus();
        getDailyTournament();
        // }}}
    }
    // }}}
}

function showUserInfo(response, animate) {
    // retrieve the first name from server's response
    var login = response.login;

    // shorten the first name if its too long for account info widget {{{
    if (login.length > 11) {
        login = login.slice(8) + "..";
    }
    // }}}

    if (response.isRegistered == "0") {
        login = "PLAYER";
    }

    // handle static update {{{
    if (animate == false) {
        // otherwise display logged in player {{{
        if ((response.isRegistered == "1")) {
            // do nothing if already displaying user info {{{
            if (($("#registered_player").length > 0)) {
                return;
            }
            // }}}

            // hide the unknown player block
            $("#unknown_player").css('display', 'none');

            // html for the login form {{{
            var accountInfoHTML = '<div id="registered_player" style="display: block;">' +
                    '<a href="#" onclick="showAccount(); return false;">' + login + '</a>' +
                    '<a href="#" onclick="logOut(); return false;">' + texts['BUTTON:LOGOUT:LABEL'] + '</a>' +
                    '<a id="language_menu" href="#" onclick="toggleLanguageMenu(); return false;">' + texts['BUTTON:LANGUAGE:LABEL'] + '&nbsp;&nbsp;<img class="language_icon" src=""></a>' +
                    '</div>';
            // }}}

            // registered player info
            $("#unknown_player").before(accountInfoHTML);
        }
        // }}}
        // display the unknown player block
        else if ((response.isRegistered == "0")) {
            $("#registered_player").remove();
            $("#unknown_player").css('display', 'block');
        }
        // }}}
    }
    // }}}
    // handle animated update {{{
    else {
        // otherwise display logged in player {{{
        if (response.isRegistered == "1") {
            // do nothing if already displaying user info {{{
            if (($("#registered_player").length > 0)) {
                return;
            }
            // }}}

            // html for the login form {{{
            var accountInfoHTML = '<div id="registered_player" style="display: none;">' +
                    '<a href="#" onclick="showAccount(); return false;">' + login + '</a>' +
                    '<a href="#" onclick="logOut(); return false;">' + texts['BUTTON:LOGOUT:LABEL'] + '</a>' +
                    '<a id="language_menu" href="#" onclick="toggleLanguageMenu(); return false;">' + texts['BUTTON:LANGUAGE:LABEL'] + '&nbsp;&nbsp;<img class="language_icon" src=""></a>' +
                    '</div>';
            // }}}

            // insert the login form
            $("#unknown_player").before(accountInfoHTML);

            // replace the unknown with registered player info {{{
            $("#unknown_player").fadeOut("slow");
            $("#registered_player").delay(500).fadeIn("slow");
            // }}}
        }
        // }}}
        // display the unknown player block {{{
        else if ((response.isRegistered == "0")) {
            $("#unknown_player").delay(500).fadeIn("slow");
            $("#registered_player").fadeOut("slow", function() {
                $("#registered_player").remove();
            });
        }
        // }}}

    }
    // }}}

    // show the initial language (set in cookie)
    setInitialLanguage();
}

function showGameUserInfo(response) {
    // abort if account info is already visible {{{
    if ($("#account_info").length != 0) {
        return;
    }
    // }}}

    // html for the login form {{{
    var accountInfoHTML = '<div id="account_info">' +
            '<div id="account_name"></div>' +
            '<div id="account_rounds" class="account_line"></div>' +
            '<div id="account_credits" class="account_line"></div>' +
            '<div id="account_resets" class="account_line"></div>' +
            '</div>';
    // }}}

    // insert the login form
    $("#header").before(accountInfoHTML);

    $("#account_info").delay(1000).fadeIn("slow");
}

function updateGameUserInfo(tournamentData) {
    var login = currentUserStatus.login;

    // shorten the first name if its too long for account info widget {{{
    if (login.length > 11) {
        login = login.slice(8) + "..";
    } else if (login == "") {
        login = "PLAYER";
    }
    // }}}

    if (currentUserStatus.isRegistered == "0") {
        login = "PLAYER";
    }

    var resets = "";
    var credits = "";
    var rounds = "";

    if ((currentGame == tournamentData.tournamentGameNameId) || (currentGame == tournamentData.game.nameId)) {
        resets = texts["PAGE:GAME:RESETS"] + " " + currentUserStatus.remainingTournamentResets;
        credits = texts["PAGE:GAME:CREDITS"] + " " + parseFloat(currentUserStatus.tournamentCredits);
        rounds = texts["PAGE:GAME:ROUNDS"] + " " + currentUserStatus.remainingTournamentRounds;
    } else {
        credits = texts["PAGE:GAME:CREDITS"] + " " + parseFloat(currentUserStatus.cash);
    }

    $("#account_name").html(login);

    $("#account_credits").html(credits);
    $("#account_resets").html(resets);
    $("#account_rounds").html(rounds);
}

function onUserRegistration(response, statusText, xhr, $form) {
    // if the registration was successful log in the user and clean up the registration form {{{
    if (isFormValid(response, $form)) {
        pageTracker('/registrationRPSuccess');

        hideOverlayObject();

        onUserLogin(response, statusText, xhr, $form);
    }
    // }}}
}

function onAccountUpdate(response, statusText, xhr, $form) {
    // if the registration was successful log in the user and clean up the registration form {{{
    if (isFormValid(response, $form)) {
        setOverlayObjectResponseStatus(texts['FORM:ACCOUNT:INFO:ADDRESS:SUCCESS']);
        setTimeout('getUserStatus()', 1000);
    }
    // }}}
}

function setupRoundedButtons() {
    var buttons = $('.rounded_button').find('a');

    buttons.unbind('mouseover');
    buttons.unbind('mouseout');

    buttons.mouseover(
        function() {
            onRoundedButtonRollOver($(this).parent());
        }
    );

    buttons.mouseout(
        function() {
            onRoundedButtonRollOut($(this).parent());
        }
    );
}

function setupRoundedInputButtons() {
    var buttons = $('input[type=submit].rounded_button');

    buttons.unbind('mouseover');
    buttons.unbind('mouseout');

    buttons.mouseover(
        function() {
            onRoundedButtonRollOver($(this));
        }
    );

    buttons.mouseout(
        function() {
            onRoundedButtonRollOut($(this));
        }
    );
}

function onRoundedButtonRollOver(element) {
    var position = element.offset();

    var isRelative = false;

    if (element.css('position') == "relative") {
        position = element.position();
        isRelative = true;
    }

    var marginTop = isNaN(parseInt(element.css('marginTop'), 10)) ? 0: parseInt(element.css('marginTop'), 10);
    var marginLeft = isNaN(parseInt(element.css('marginLeft'), 10)) ? 0: parseInt(element.css('marginLeft'), 10);

    var top = (position.top - 30) + marginTop;
    var left = (position.left - 30) + marginLeft;

    var width = element.width() + 80;
    var height = element.height() + 80;

    var elementZIndex = parseInt(element.css('z-index'));

    var zIndex = parseInt(element.css('z-index')) - 1;

    var buttonOver_HTML = '<div id="rounded_button_over" ' +
                          'style="z-index: ' + zIndex + ';' +
                          'left: ' + left + 'px;' +
                          'top: ' + top + 'px;' +
                          'width: ' + width + 'px; ' +
                          'height: ' + height + 'px; ' +
                          '"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/buttonRollOver.png"></div>';
    if (isRelative) {
        element.before(buttonOver_HTML);
    } else {
        // insert the form into document
        $("#main_container").before(buttonOver_HTML);
    }
}

function onRoundedButtonRollOut() {
    $("#rounded_button_over").remove();
}

function isFormValid(response, form) {
    var hasInvalidFields = false;

    for (var prop in response.invalidFields) {
        hasInvalidFields = true;
        break;
    }

    // if the returned response is not valid, report server erros in fields and return false {{{
    if (response.status == "0" && hasInvalidFields) {
        setOverlayObjectResponseStatus(texts['FORM:ACCOUNT:INFO:ERROR'], true);

        // get the validator object for the form
        var validator = form.validate();

        // report the errors in form
        validator.showErrors(response.invalidFields);

        // return the validation result
        return false;
    }
    // }}}
    // otherwise if there was some other error reported by server, display it {{{
    else if (response.status == "0" && response.error.length > 0) {
        setOverlayObjectResponseStatus(response.error, true);

        return false;
    }
    // }}}
    // form is valid, return true {{{
    else if (response.status == "1") {
        // return the validation result
        return true;
    }
    // }}}
}

function setInitialSettings() {
    // determine reference to the flash movie
    var flashObject = $("#game").get(0);

    // set client settings in the flash movie {{{
    flashObject.SetVariable("chatURI", "http://chat.livechatinc.net/licence/1032156/open_chat.cgi?lang=en&groups=1");
    flashObject.SetVariable("settingsURI", "**SECURE**://**HOSTNAME**/**LANGUAGE**/shared/**THEME**/settings/**EXTENSION**?" + clientSettings.SESSION_ID_URL_NAME + "=" + clientSettings.SID);
    flashObject.SetVariable("bootLoader", "https://" + clientSettings.MEDIAHOSTNAME + "/" + clientSettings.LANGUAGE + "/flash/" + clientSettings.THEME + "/boot/bootLoader.swf?build=" + clientSettings.FLASH_CLIENT_BUILD);
    flashObject.SetVariable("chatEnabled", "0");
    // flashObject.SetVariable("browserType", getBrowserType());
    flashObject.SetVariable("build", clientSettings.FLASH_CLIENT_BUILD);
    flashObject.SetVariable("clientCopyright", texts["PAGE:MAIN:CLIENT_COPYRIGHT"]);
    flashObject.SetVariable("extension", clientSettings.EXTENSION);
    flashObject.SetVariable("hostname", clientSettings.HOSTNAME);
    flashObject.SetVariable("swfHostname", clientSettings.MEDIAHOSTNAME);
    flashObject.SetVariable("language", clientSettings.LANGUAGE);
    flashObject.SetVariable("loadingText", texts["PAGE:MAIN:CLIENT_LOADING"]);
    flashObject.SetVariable("preLoadingText", texts["PAGE:MAIN:CLIENT_PRE_LOADING"]);
    flashObject.SetVariable("loadingFailedText", texts["ERROR:CLIENT:LOADING_FAILED"]);
    // flashObject.SetVariable("overlayOffsets", getFlashOverlayOffsets());
    flashObject.SetVariable("theme", clientSettings.THEME);
    // flashObject.SetVariable("windowSize", dimensions.width + "x" + dimensions.height);
    // }}}

    // set flag to inform flash client that all initialization variables were set
    flashObject.SetVariable("initialSettings", 1);
}

function displayFormErrors (errorMap, errorList) {
    for (var a = 0; a < this.errorList.length; a++) {
        var errorData = this.errorList[a];

        var errorElement = $(errorData.element);

        var errorMessage = errorData.message;

        if (errorMessage == "") {
            this.errorList.splice(a, 1);
            a--;
        }

        // errorElement.css("color", "#FF0000");


        // alert("errorElement: " + errorElement);
        /*
            l += p + " > " + errorList[prop][p] + "\n";
        }
        */
        //l += prop + ":" + errorList[prop] + "\n";
    }


    this.defaultShowErrors();
}

function eventAction_FRE_NOT_ENOUGH_TOURNAMENT_ROUNDS_OR_CREDITS(tournamentRank) {
    if (currentUserStatus.isRegistered == "1") {
        overlayResetTournamentForRegisteredPlayer(tournamentRank);
    } else {
        overlayResetTournamentForUnknownPlayer(tournamentRank);
    }
}

function eventAction_FRE_NOT_ENOUGH_CASH() {
    overlayResetFreeGame();
}

function eventAction_FRE_TOURNAMENT_ROUND_FINISHED(tournamentRank, isTournamentFinished, mustResetTournamentCounters) {
    var method = "";

    isTournamentFinished = Boolean(parseInt(isTournamentFinished));
    mustResetTournamentCounters = Boolean(parseInt(mustResetTournamentCounters));

    if (tournamentRank < 4) {
        overlayTopThreeTournamentPosition(tournamentRank, isTournamentFinished, mustResetTournamentCounters);
    } else if (tournamentRank < 11) {
        overlayTopTenTournamentPosition(tournamentRank, isTournamentFinished, mustResetTournamentCounters);
    } else {
        overlayTournamentPosition(tournamentRank, isTournamentFinished, mustResetTournamentCounters);
    }
}

function eventAction_FRE_TOURNAMENT_LOWER_BETS_OR_FINISH(tournamentRank, tournamentResets) {
    overlayTournamentLowerBetsOrFinish(tournamentRank, parseInt(tournamentResets, 10));
}

function overlayTournamentLowerBetsOrFinish(tournamentRank, tournamentResets) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayTournamentLowerBetsOrFinish, tournamentRank, tournamentResets))) {
        return;
    }
    // }}}

    var positionColor = "silver";

    if (tournamentRank < 4) {
        positionColor = "gold";
    }

    var finishRoundURI = '/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doFinishTournamentRound/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID;

    if (tournamentResets <= 0) {
        finishRoundURI = '/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doFinishTournament/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID;
    }

    // html for the registration form {{{
    var overlay_HTML= '' +
    '<div id="reset_tournament_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h3>' + texts['OVERLAY:LOWER_BETS:HEADER'] + '</h3>' +
    '    </div>' +
    '    <div class="overlay_text">' + texts['OVERLAY:LOWER_BETS:LOWER_BETS_OR_FINISH'] + '</div>' +
    '    <form id="reset_tournament_form" method="post" action="' + finishRoundURI + '">' +
    '        <p class="center_buttons">' +
    '           <input type="submit" class="rounded_button" onclick="hideOverlayObject(); return false;" value="' + texts['BUTTON:LOWER_BETS:LABEL'] + '...">' +
    '           <input type="submit" class="rounded_button" value="' + texts['BUTTON:FINISH_ROUND:LABEL'] + '...">' +
    '        </p>' +
    '    </form>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/overlayTournamentPosition.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '    <div class="tournament_winner_overlay_position_rotated">' + createImageSequenceFromNumber(tournamentRank, positionColor) + '</div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "reset_tournament_container");

    setupForm($('#reset_tournament_form'), {success: onResetTournament});
    // }}}
}

function overlayResetFreeGame() {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayResetFreeGame))) {
        return;
    }
    // }}}

    var additionalText_HTML = '    <div class="overlay_text">' + texts['OVERLAY:RESET_FREE_GAME:RESET_CREDITS_AND_CONTINUE'] + '</div>';

    var buttons_HTML = '    <form id="reset_free_game_form" method="post" action="/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doResetRealPlay/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">' +
                       '        <p class="center_buttons">' +
                       '            <input type="submit" class="rounded_button" onclick="window.location = \'/' + clientSettings.LANGUAGE + '/games\'; return false;" value="' + texts['BUTTON:ALL_GAMES:LABEL'] + '...">' +
                       '            <input type="submit" class="rounded_button" class="rounded_button" value="' + texts['BUTTON:RESET_CREDITS:LABEL'] + '...">' +
                       '        </p>' +
                       '    </form>';

    // if user can still play tournament, suggest to play tournament {{{
    if (currentUserStatus.remainingTournamentResets > 0 || currentUserStatus.remainingTournamentRounds > 0) {
        buttons_HTML = '    <form id="reset_free_game_form" method="post" action="/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doResetRealPlay/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">' +
                       '        <p class="center_buttons">' +
                       '            <input type="submit" class="rounded_button" tournament_game_link" onclick="window.location = \'/es/\'; return false;" value="' + texts['BUTTON:PLAY_TOURNAMENT:LABEL'] + '...">' +
                       '            <input type="submit" class="rounded_button" class="rounded_button" value="' + texts['BUTTON:RESET_CREDITS:LABEL'] + '...">' +
                       '        </p>' +
                       '    </form>';


        additionalText_HTML = '    <div class="overlay_text">' + texts['OVERLAY:RESET_FREE_GAME:WIN_IN_DAILY_TOURNAMENT_OR_RESET_CREDITS'] + '</div>';
    }
    // }}}

    // html for the registration form {{{
    var overlay_HTML= '' +
    '<div id="reset_free_game_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h2>' + texts['OVERLAY:RESET_FREE_GAME:HEADER'] + '</h2>' +
    '    </div>' +
            additionalText_HTML + buttons_HTML +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "reset_free_game_container");

    setupForm($('#reset_free_game_form'), {success: onResetFreeGame});
    // }}}
}

function onResetFreeGame(response, statusText, xhr, $form) {
    if (isFormValid(response, $form)) {
        eventTracker("game", "resetFreeGame", window.gameNameId);

        updateUserStatus(
            response.cash,
            response.remainingTournamentResets,
            response.remainingTournamentRounds,
            response.tournamentCredits,
            response.tournamentScore
        )

        hideOverlayObject();

        // invoke hard reload
        window.location.reload(true);
    }
}

function overlayLoginOrRegister() {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayLoginOrRegister))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var overlay_HTML= '' +
    '<div id="log_in_or_register" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '           <div class="overlay_header" style="margin-top: 50px;">' +
    '                   <h2>' + texts['OVERLAY:LOG_IN_OR_REGISTER:HEADER'] + '</h2>' +
    '           </div>' +
    '           <div class="overlay_text">' + texts['OVERLAY:LOG_IN_OR_REGISTER:SAVE_SCORE'] + '</div>' +
    '           <p class="center_buttons">' +
    '               <input type="submit" class="rounded_button" onclick="showLogin(true); return false;" value="' + texts['BUTTON:LOGIN:LABEL'] + '...">' +
    '               <input type="submit" class="rounded_button" onclick="showRegistration(true); return false;" value="' + texts['BUTTON:CREATE_ACCOUNT:LABEL'] + '...">' +
    '               <br/><a class="overlay_form_text_link" href="#" onclick="invokeFormCancelCallback(); return false;">' + texts['BUTTON:NO_THANK_YOU:LABEL'] + '</a>' +
    '           </p>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the overlay
    showOverlayObject(overlay_HTML, "log_in_or_register");
    // }}}
}

function overlayResetTournamentForRegisteredPlayer(tournamentRank) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayResetTournamentForRegisteredPlayer, tournamentRank))) {
        return;
    }
    // }}}

    var positionColor = "silver";

    if (tournamentRank < 4) {
        positionColor = "gold";
    }

    // initialize the variable for Facebook share button
    shareOnFacebookHTML = "";

    // if the player in first ten, prepare Facebook share button {{{
    if (tournamentRank <= 10) {
        // prepare the DIV for Facebook share button
        shareOnFacebookHTML = '        <br/><br/><a href="#" class="share_link" onclick="sharePositionOnFacebook(' + tournamentRank + '); return false;">' +
            '<img src="' + clientSettings.MEDIAURL+ '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/facebook/shareButton.png" ' +
            'alt="' + texts['FACEBOOK:SHARE_POSITION:BUTTON:TEXT'] + '"/></a> ';
    }
    // }}}

    // html for the registration form {{{
    var overlay_HTML= '' +
    '<div id="reset_tournament_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h2>' + texts['OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:HEADER:1'] + '</h2>' +
    '        <h3>' + texts['OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:HEADER:2'] + '</h3>' +
    '    </div>' +
    '    <div class="overlay_text">' + texts['OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:RESET_CREDITS_AND_ROUNDS'] + '</div>' +
    '    <form id="reset_tournament_form" class="overlay_form" method="post" action="/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doResetTournamentCounters/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">' +
    '       <p class="center_buttons">' +
    '           <input type="submit" class="rounded_button" value="' + texts['BUTTON:TRY_AGAIN:LABEL'] + '...">' +
    '           <br/><a class="overlay_form_text_link" href="/' + clientSettings.LANGUAGE + '/games">' + texts['BUTTON:EXIT_TOURNAMENT:LABEL'] + '</a>' +
    shareOnFacebookHTML +
    '       </p>' +
    '    </form>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/overlayTournamentPosition.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '    <div class="tournament_winner_overlay_position_rotated">' + createImageSequenceFromNumber(tournamentRank, positionColor) + '</div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "reset_tournament_container");

    $('#reset_tournament_form').find("input[type=submit]").click(function(e) {
        e.preventDefault();
        $(this).prop('disabled', true);
        $('#reset_tournament_form').submit();
    });

    setupForm($('#reset_tournament_form'), {success: onResetTournament});
    // }}}
}

function overlayResetTournamentForUnknownPlayer(tournamentRank) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayResetTournamentForUnknownPlayer, tournamentRank))) {
        return;
    }
    // }}}

    var positionColor = "silver";

    if (tournamentRank < 4) {
        positionColor = "gold";
    }

    // initialize the variable for Facebook share button
    shareOnFacebookHTML = "";

    // if the player in first ten, prepare Facebook share button {{{
    if (tournamentRank <= 10) {
        // prepare the DIV for Facebook share button
        shareOnFacebookHTML = '        <br/><br/><a href="#" class="share_link" onclick="sharePositionOnFacebook(' + tournamentRank + '); return false;">' + 
            '<img src="' + clientSettings.MEDIAURL+ '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/facebook/shareButton.png" ' +
            'alt="' + texts['FACEBOOK:SHARE_POSITION:BUTTON:TEXT'] + '"/></a> ';
    }
    // }}}

    callbackAfterCancelledForm = createCallback(overlayResetTournamentForUnknownPlayer, tournamentRank);

    // html for the registration form {{{
    var overlay_HTML= '' +
    '<div id="reset_tournament_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 50px;">' +
    '        <h2>' + texts['OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:HEADER:1'] + '</h2>' +
    '        <h3>' + texts['OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:HEADER:2'] + '</h3>' +
    '    </div>' +
    '    <div class="overlay_text">' + texts['OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:RESET_CREDITS_AND_ROUNDS'] + '</div>' +
    '    <form id="reset_tournament_form" method="post" action="/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doResetTournamentCounters/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">' +
    '    <p class="center_buttons">' +
    '        <input type="submit" class="rounded_button" onclick="overlayLoginOrRegister(); return false;" value="' + texts['BUTTON:SAVE_SCORE:LABEL'] + '...">' +
    '        <input type="submit" class="rounded_button" value="' + texts['BUTTON:TRY_AGAIN:LABEL'] + '...">' +
    '        <br/><a class="overlay_form_text_link" href="/' + clientSettings.LANGUAGE + '/games">' + texts['BUTTON:EXIT_TOURNAMENT:LABEL'] + '</a>' +
    shareOnFacebookHTML +
    '    </p>' +
    '    </form>' +
    '    </div>' +
    '    <div class="clear"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/overlayTournamentPosition.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +

    '    <div class="tournament_winner_overlay_position_rotated">' + createImageSequenceFromNumber(tournamentRank, positionColor) + '</div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "reset_tournament_container");

    $('#reset_tournament_form').find("input[type=submit]").click(function(e) {
        e.preventDefault();
        $(this).prop('disabled', true);
        $('#reset_tournament_form').submit();
    });

    setupForm($('#reset_tournament_form'), {success: onResetTournament});
    // }}}
}

function overlayTopThreeTournamentPosition(position, isTournamentFinished, mustResetTournamentCounters) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayTopThreeTournamentPosition, position, isTournamentFinished, mustResetTournamentCounters))) {
        return;
    }
    // }}}

    // always use 'gold' numbers for the top three players
    var positionColor = "gold";

    var genericContent = prepareGenericContentForTournamentOverlay(position, isTournamentFinished, mustResetTournamentCounters, overlayTopThreeTournamentPosition);

    var buttons_HTML = genericContent['buttons_HTML'];
    var formObject = genericContent['formObject'];

    // determine what text will be display as an additional info for registered/unregistered player {{{
    // by default do not display anyhing (registered player)
    var additionalText_HTML = "";

    if (isTournamentFinished) {
        additionalText_HTML = '<div class=\"overlay_text\">' + texts['OVERLAY:TOP_THREE_POSITION:NO_RESETS_TODAY'] + '</div>';
    }
    // construct the additional text for unregistered player {{{
    else {
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            additionalText_HTML = '<div class=\"overlay_text\">' + texts['OVERLAY:TOP_THREE_POSITION:SAVE_SCORE'] + '</div>';
        } else {
            if (position == "1") {
                additionalText_HTML = '<div class=\"overlay_text\">' + texts['OVERLAY:TOP_THREE_POSITION:RESET_AND_STRENGTHEN_POSITION'] + '</div>';
            } else {
                if (mustResetTournamentCounters) {
                    additionalText_HTML = '<div class=\"overlay_text\">' + texts['OVERLAY:TOP_THREE_POSITION:RESET_AND_TRY_AGAIN'] + '</div>';
                } else {
                    additionalText_HTML = '<div class=\"overlay_text\">' + texts['OVERLAY:TOP_THREE_POSITION:TRY_AGAIN'] + '</div>';
                }
            }
        }
    }
    // }}}
    // }}}

    // prepare the DIV for Facebook share button
    shareOnFacebookHTML = '    <br/><a href="#" class="share_link" onclick="sharePositionOnFacebook(' + position + '); return false;">' +
        '<img src="' + clientSettings.MEDIAURL+ '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/facebook/shareButton.png" ' +
        'alt="' + texts['FACEBOOK:SHARE_POSITION:BUTTON:TEXT'] + '"/></a> ';

    // create the final HTML code for the overlay concatening all things together {{{
    var overlay_HTML= '' +
    '<div id="overlay_container" class="tournament_winner_overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_winner_image_container">' +
    '    <div class="overlay_header">' +
    '        <h2>' + texts['OVERLAY:TOP_THREE_POSITION:HEADER:1'] + '</h2>' +
    '        <h3>' + texts['OVERLAY:TOP_THREE_POSITION:HEADER:2'] + '</h3>' +
    '        <div class="tournament_winner_overlay_position" style="width:400px;">' + createImageSequenceFromNumber(position, positionColor) + '</div>' +
    '        <h3>' + texts['OVERLAY:TOP_THREE_POSITION:HEADER3'] + '</h3>' +
    '    </div>' +
    '    <div class="clear"></div>' + additionalText_HTML + buttons_HTML +
    shareOnFacebookHTML +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/overlayTournamentPosition.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '    <div class="tournament_winner_overlay_position_rotated">' + createImageSequenceFromNumber(position, positionColor) + '</div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "overlay_container");

    if (formObject != "") {
        $(formObject).find("input[type=submit]").click(function(e) {
            e.preventDefault();
            $(this).prop('disabled', true);
            $(formObject).submit();
        });

        setupForm($(formObject), {success: onResetTournament});
    }
    // }}}
}

function overlayTopTenTournamentPosition(position, isTournamentFinished, mustResetTournamentCounters) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayTopTenTournamentPosition, position, isTournamentFinished, mustResetTournamentCounters))) {
        return;
    }
    // }}}

    // always use 'gold' numbers for the top three players
    var positionColor = "silver";

    var genericContent= prepareGenericContentForTournamentOverlay(position, isTournamentFinished, mustResetTournamentCounters, overlayTopTenTournamentPosition);

    var buttons_HTML = genericContent['buttons_HTML'];
    var formObject = genericContent['formObject'];

    // determine what text will be display as an additional info for registered/unregistered player {{{
    // by default do not display anyhing (registered player)
    var additionalText_HTML = "";

    if (isTournamentFinished) {
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOP_TEN_POSITION:TRY_OTHER_SLOTS_OR_SAVE_SCORE'] + '</div>';
        } else {
            additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOP_TEN_POSITION:PLAY_OTHER_SLOTS'] + '</div>';
        }
    }
    // construct the additional text for unregistered player {{{
    else {
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOP_TEN_POSITION:REGISTER_SCORE'] + '</div>';
        } else {
            if (mustResetTournamentCounters) {
                additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOP_TEN_POSITION:RESET_AND_TRY_AGAIN'] + '</div>';
            } else {
                additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOP_TEN_POSITION:TRY_AGAIN'] + '</div>';
            }
        }
    }
    // }}}
    // }}}

    // prepare the DIV for Facebook share button
    shareOnFacebookHTML = '    <br/><a href="#" class="share_link" onclick="sharePositionOnFacebook(' + position + '); return false;">' +
        '<img src="' + clientSettings.MEDIAURL+ '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/facebook/shareButton.png" ' +
        'alt="' + texts['FACEBOOK:SHARE_POSITION:BUTTON:TEXT'] + '"/></a> ';

    // create the final HTML code for the overlay concatening all things together {{{
    var overlay_HTML= '' +
    '<div id="overlay_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header">' +
    '        <h1>' + texts['OVERLAY:TOP_TEN_POSITION:HEADER:1'] + '</h1>' +
    '        <h2>' + texts['OVERLAY:TOP_TEN_POSITION:HEADER:2'] + '</h2>' +
    '    </div>' +
    '    <div class="clear"></div>' + additionalText_HTML + buttons_HTML +
    shareOnFacebookHTML +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/overlayTournamentPosition.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '    <div class="tournament_winner_overlay_position_rotated">' + createImageSequenceFromNumber(position, positionColor) + '</div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "overlay_container");

    if (formObject != "") {
        $(formObject).find("input[type=submit]").click(function(e) {
            e.preventDefault();
            $(this).prop('disabled', true);
            $(formObject).submit();
        });

        setupForm($(formObject), {success: onResetTournament});
    }
}

function overlayTournamentPosition(position, isTournamentFinished, mustResetTournamentCounters) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayTournamentPosition, position, isTournamentFinished, mustResetTournamentCounters))) {
        return;
    }
    // }}}

    // always use 'gold' numbers for the top three players
    var positionColor = "silver";

    // determine buttons to display based on whether the user is registered or not {{{
    // determine header text to display {{{
    var headerText_HTML = "";

    var genericContent = prepareGenericContentForTournamentOverlay(position, isTournamentFinished, mustResetTournamentCounters, overlayTournamentPosition);

    var buttons_HTML = genericContent['buttons_HTML'];
    var formObject = genericContent['formObject'];

    // {{{
    if (isTournamentFinished) {
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            headerText_HTML = '<h1>' + texts['OVERLAY:TOURNAMENT_POSITION:HEADER:1:THANK_YOU'] + '</h1>' +
                              '<h2>' + texts['OVERLAY:TOURNAMENT_POSITION:HEADER:2:THANK_YOU'] + '</h2>';
        } else {
            headerText_HTML = '<h2 class=\"bold\" style=\"margin-bottom: 10px;\">' + texts['OVERLAY:TOURNAMENT_POSITION:HEADER:1:NO_RESETS'] + '</h2>' +
                              '<h3>' + texts['OVERLAY:TOURNAMENT_POSITION:HEADER:2:NO_RESETS'] + '</h3>';
        }
    }
    // }}}
    // {{{
    else {
        headerText_HTML = '<h1>' + texts['OVERLAY:TOURNAMENT_POSITION:HEADER:1:PLAY_AGAIN'] + '</h2>' +
                          '<h2>' + texts['OVERLAY:TOURNAMENT_POSITION:HEADER:2:PLAY_AGAIN'] + '</h3>';
    }
    // }}}
    // }}}

    // determine what text will be display as an additional info for registered/unregistered player {{{
    // by default do not display anyhing (registered player)
    var additionalText_HTML = "";

    if (isTournamentFinished) {
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOURNAMENT_POSITION:TRY_OTHER_SLOTS_OR_SAVE_SCORE'] + '</div>';
        } else {
            additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOURNAMENT_POSITION:PLAY_OTHER_SLOTS'] + '</div>';
        }
    }
    // construct the additional text for unregistered player {{{
    else {
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOURNAMENT_POSITION:REGISTER_SCORE'] + '</div>';
        } else {
            if (mustResetTournamentCounters) {
                additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOURNAMENT_POSITION:RESET_AND_TRY_AGAIN'] + '</div>';
            } else {
                additionalText_HTML = '<div class="overlay_text">' + texts['OVERLAY:TOURNAMENT_POSITION:TRY_AGAIN'] + '</div>';
            }
        }
    }
    // }}}
    // }}}

    // create the final HTML code for the overlay concatening all things together {{{
    var overlay_HTML= '' +
    '<div id="overlay_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header">' + headerText_HTML +
    '    </div>' +
    '    <div class="clear"></div>' + additionalText_HTML + buttons_HTML +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/overlayTournamentPosition.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '    <div class="tournament_winner_overlay_position_rotated">' + createImageSequenceFromNumber(position, positionColor) + '</div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "overlay_container");

    if (formObject != "") {
        $(formObject).find("input[type=submit]").click(function(e) {
            e.preventDefault();
            $(this).prop('disabled', true);
            $(formObject).submit();
        });

        setupForm($(formObject), {success: onResetTournament});
    }
}

function prepareGenericContentForTournamentOverlay(position, isTournamentFinished, mustResetTournamentCounters, caller) {
    // initialize variable to hold the buttons HTML
    var buttons_HTML = "";

    var formObject = "";

    if (isTournamentFinished) {
        callbackAfterCancelledForm = createCallback(overlayTournamentPosition, position, isTournamentFinished, mustResetTournamentCounters);
        buttons_HTML += '<p class="center_buttons">';

        // setup buttons for unregistered player {{{
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            buttons_HTML += '   <input type="submit" class="rounded_button" onclick="overlayLoginOrRegister(); return false;" value="' + texts['BUTTON:SAVE_SCORE:LABEL'] + '...">';
            buttons_HTML += '   <br/><a href="#" class="overlay_form_text_link" onclick="hideOverlayObject(); return false;">' + texts['BUTTON:NO_THANK_YOU:LABEL'] + '</a>';
        }
        // }}}
        else {
            buttons_HTML += '   <input type="submit" class="rounded_button" onclick="window.location = \'/' + clientSettings.LANGUAGE + '\'; return false;" value="' + texts['BUTTON:ALL_GAMES:LABEL'] + '...">';
        }

        buttons_HTML += "</p>";
    }
    // setup buttons for registered player {{{
    else {
        if (currentUserStatus == undefined || currentUserStatus.isRegistered != "1") {
            callbackAfterCancelledForm = createCallback(overlayTournamentPosition, position, isTournamentFinished, mustResetTournamentCounters);

            buttons_HTML += '<p class="center_buttons">';
            buttons_HTML += '   <input type="submit" class="rounded_button" onclick="overlayLoginOrRegister(); return false;" value="' + texts['BUTTON:SAVE_SCORE:LABEL'] + '">';
            buttons_HTML += '   <br/><a class="overlay_form_text_link" href="#" onclick="overlayResetTournamentForUnknownPlayer(' + position + '); return false;">' + texts['BUTTON:NO_THANK_YOU:LABEL'] + '</a>';
            buttons_HTML += '</p>';
        } else {
            if (mustResetTournamentCounters) {
                buttons_HTML += '<form id="reset_tournament_form" method="post" action="/' + clientSettings.LANGUAGE + '/user/' + clientSettings.THEME + '/doResetTournamentCounters/json?' + clientSettings.SESSION_ID_URL_NAME + '=' + clientSettings.SID + '">';
                buttons_HTML += '<p class="center_buttons">';
                buttons_HTML += '   <input type="submit" class="rounded_button" onclick="window.location = \'/' + clientSettings.LANGUAGE + '/games\'; return false;" value="' + texts['BUTTON:ALL_GAMES:LABEL'] + '...">';
                buttons_HTML += '   <input type="submit" class="rounded_button" class="rounded_button" value="' + texts['BUTTON:TRY_AGAIN:LABEL'] + '...">';
                buttons_HTML += '</p>';
                buttons_HTML += '</form>';

                formObject = "#reset_tournament_form";
            } else {
                buttons_HTML += '<p class="center_buttons">';
                buttons_HTML += '   <input type="submit" class="rounded_button" onclick="window.location = \'/' + clientSettings.LANGUAGE + '\'; return false;" value="' + texts['BUTTON:ALL_GAMES:LABEL'] + '...">';
                buttons_HTML += '   <input type="submit" class="rounded_button" onclick="hideOverlayObject(); return false;" class="rounded_button" value="' + texts['BUTTON:TRY_AGAIN:LABEL'] + '...">';
                buttons_HTML += '</p>';
            }
        }
    }
    // }}}

    return {
        'buttons_HTML'                  : buttons_HTML,
        'formObject'                    : formObject
    }
}


function createImageSequenceFromNumber(number, numberColor) {
    // initialize container to hold image items
    var imgSequenceItems = new Array();

    // convert the position to string
    number = number.toString();

    // insert the hash tag image
    imgSequenceItems.push('<div class="number"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/numbers/' + numberColor + 'HashTag.png"></div>');

    // create image sequence out of the number {{{
    for (var a = 0; a < number.length; a++) {
        imgSequenceItems.push('<div class="number"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/numbers/' + numberColor + number.charAt(a) + '.png"></div>');
    }
    // }}}

    // return the image sequence
    return imgSequenceItems.join("");
}

function onResetTournament(response, statusText, xhr, $form) {
    // if the registration was successful log in the user and clean up the registration form {{{
    if (isFormValid(response, $form)) {
        updateUserStatus(
            response.cash,
            response.remainingTournamentResets,
            response.remainingTournamentRounds,
            response.tournamentCredits,
            response.tournamentScore
        )

        // determine tournament reset value for page tracking {{{
        // user is doing 9 resets (1st is
        var resetTracker = 9 - (parseInt(response.remainingTournamentResets, 10));

        if (resetTracker < 10) {
            resetTracker = "0" + resetTracker;
        }
        // }}}

        eventTracker("game", "resetTournament", window.gameNameId, resetTracker);

        invokeEventAction(response);

        hideOverlayObject();
    }
    // }}}
}

function eventAction_FRE_NOT_ENOUGH_TOURNAMENT_RESETS(tournamentRank) {
    if (currentUserStatus.isRegistered == "1") {
        overlayNoTournamentResetsAvailableForRegisteredPlayer(tournamentRank);
    } else {
        overlayNoTournamentResetsAvailableForUnknownPlayer(tournamentRank);
    }
}

function overlayNoTournamentResetsAvailableForRegisteredPlayer(tournamentRank) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayNoTournamentResetsAvailableForRegisteredPlayer, tournamentRank))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var overlay_HTML= '' +
    '<div id="no_tournament_reset_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 40px;">' +
    '        <h3 class="bold" style="margin-bottom: 10px;">' + texts['OVERLAY:NO_RESETS_REGISTERED_PLAYER:HEADER:1'] + '</h3>' +
    '        <h4>' + texts['OVERLAY:NO_RESETS_REGISTERED_PLAYER:HEADER:2'] + '</h4>' +
    '    </div>' +
    '    <div class="overlay_text">' + texts['OVERLAY:NO_RESETS_REGISTERED_PLAYER:TEXT'] + '</div>' +
    '    <p class="center_buttons">' +
    '        <input type="submit" class="rounded_button" onclick="window.location = \'/' + clientSettings.LANGUAGE + '/games\'; return false;" value="' + texts['BUTTON:ALL_GAMES:LABEL'] + '...">' +
    '        <br/><a class="overlay_form_text_link" href="#" onclick="hideOverlayObject(); return false;">close</a>' +
    '    </p>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "no_tournament_reset_container");
    // }}}
}

function overlayNoTournamentResetsAvailableForUnknownPlayer(tournamentRank) {
    // wait until the current overlay object is hidden {{{
    if (hideOverlayObject(createCallback(overlayNoTournamentResetsAvailableForUnknownPlayer, tournamentRank))) {
        return;
    }
    // }}}

    // html for the registration form {{{
    var overlay_HTML= '' +
    '<div id="no_tournament_reset_container" class="overlay_content">' +
    '    <div id="overlay_form_container" class="gradient_container">' +
    '    <div class="overlay_header" style="margin-top: 40px;">' +
    '        <h1>' + texts['OVERLAY:NO_RESETS_UNKNOWN_PLAYER:HEADER:1'] + '</h1>' +
    '        <h2>' + texts['OVERLAY:NO_RESETS_UNKNOWN_PLAYER:HEADER:2'] + '</h2>' +
    '    </div>' +
    '    <div class="overlay_text">' + texts['OVERLAY:NO_RESETS_UNKNOWN_PLAYER:PLAY_OTHER_SLOTS'] + '</div>' +
    '    <p class="center_buttons">' +
    '        <input type="submit" class="rounded_button" onclick="window.location = \'/' + clientSettings.LANGUAGE + '/games\'; return false;" value="' + texts['BUTTON:ALL_GAMES:LABEL'] + '...">' +
    '        <input type="submit" class="rounded_button" onclick="overlayLoginOrRegister(); return false;" value="' + texts['BUTTON:SAVE_SCORE:LABEL'] + '...">' +
    '    </p>' +
    '    </div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120; top: 110px;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/tournamentPrizeCups.png"></div>' +
    '    <div class="div_image" style="position: absolute; z-index: 120;"><img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/win50InDailyTournament.png"></div>' +
    '    <div class="player_progress_overlay">' +
    '        <div class="player_progress">' +
    '            <img src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress0.png" alt="' + texts['PAGE:PLAYER_PROGRESS:0:ALT'] + '">' +
    '            <img class="user_progress_1 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress1.png" alt="' + texts['PAGE:PLAYER_PROGRESS:1:ALT'] + '">' +
    '            <img class="user_progress_2 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress2.png" alt="' + texts['PAGE:PLAYER_PROGRESS:2:ALT'] + '">' +
    '            <img class="user_progress_3 progress" src="' + clientSettings.MEDIAURL + '/' + clientSettings.LANGUAGE + '/file/' + clientSettings.THEME + '/image/playerProgress3.png" alt="' + texts['PAGE:PLAYER_PROGRESS:3:ALT'] + '">' +
    '        </div>' +
    '    </div>' +
    '</div>';
    // }}}

    // display the registration form
    showOverlayObject(overlay_HTML, "no_tournament_reset_container");
    // }}}
}

function shuffle(a) {
    var d, c, b = a.length;

    while (b) {
        c = Math.floor(Math.random() * b);
        d = a[--b];
        a[b] = a[c];
        a[c] = d
   }

   return a;
}

