// 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": "Nous nous excusons pour le d\u00e9sagr\u00e9ment, mais il y a eu un probl\u00e8me de communication avec le serveur. Veuillez v\u00e9rifier votre connexion \u00e0 Internet et r\u00e9essayer.", "FORM:ADDRESS:FIELD:STATE_CODE:LABEL": "\u00c9tat", "BUTTON:CREATE_ACCOUNT:LABEL": "Cr\u00e9er un compte", "OVERLAY:TOURNAMENT_POSITION:REGISTER_SCORE": "Voulez-vous enregistrer votre score maintenant? Seuls les scores enregistr\u00e9s peuvent gagner des prix!", "FORM:ADDRESS:FIELD:TITLE:LABEL": "Titre", "FORM:PASSWORD_RECOVERY_REQUEST:INFO:TITLE": "R\u00c9CUP\u00c9RER LE MOT DE PASSE PERDU", "OVERLAY:TOP_THREE_POSITION:NO_RESETS_TODAY": "Vous n\u2019avez plus de remises \u00e0 z\u00e9ro disponibles aujourd\u2019hui.", "FORM:CLIENT_VALIDATION:MIN_LENGTH": "Veuillez saisir au moins {0} caract\u00e8res.", "FACEBOOK:SHARE_POSITION:BUTTON:TEXT": "Partager", "FORM:ADDRESS:FIELD:EMAIL:LABEL": "Adresse e-mail", "PAGE:GAME:RESETS": "REMISES \u00c0 Z\u00c9RO", "ERROR:CLIENT:FORM": "Ce formulaire contient des erreurs! Veuillez examiner les champs en surbrillance en rouge.", "BUTTON:LOGOUT:LABEL": "D\u00e9connexion", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:BIRTH_DATE:LABEL": "Date de naissance", "OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:RESET_CREDITS_AND_ROUNDS": "Vous pouvez remettre vos cr\u00e9dits et parties du tournoi \u00e0 z\u00e9ro maintenant pour participer de nouveau au tournoi.", "FORM:ACCOUNT:INFO:LOGIN_PASSWORD:ABOUT:2": "Laissez vide si vous ne souhaitez pas changer de mot de passe.", "BUTTON:TRY_AGAIN:LABEL": "R\u00e9essayer", "FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD2:ERROR:INVALID": "Vos nouveaux mots de passe ne correspondent pas.", "BUTTON:RELOAD:LABEL": "Recharger", "FORM:FULL_REGISTRATION:LOGIN_PASSWORD:ABOUT": "D\u00e9tails de votre compte", "FORM:CLIENT_VALIDATION:EMAIL": "Veuillez saisir une adresse e-mail valide.", "FORM:LOGIN:INFO:TITLE": "CONNEXION", "FORM:CLIENT_VALIDATION:DIGITS": "Veuillez saisir uniquement des chiffres.", "PAGE:PLAYER_PROGRESS:2:ALT": "ENREGISTREZ votre score", "OVERLAY:NO_RESETS_UNKNOWN_PLAYER:PLAY_OTHER_SLOTS": "Cliquez sur Tous les jeux pour continuer \u00e0 jouer \u00e0 nos autres machines \u00e0 sous gratuites!", "OVERLAY:NO_RESETS_REGISTERED_PLAYER:HEADER:2": "au tournoi!", "FORM:CLIENT_VALIDATION:DATE_ISO": "Veuillez saisir une date valide (ISO).", "BUTTON:SAVE_SCORE:LABEL": "Enregistrer le score", "FORM:PASSWORD_RECOVERY:INFO:TITLE": "CHANGER LE MOT DE PASSE", "ERROR:CLIENT:CONTACT_EMAIL_MUST_BE_CHANGED": "Votre adresse email de contact n\u2019est pas valide. Veuillez la mettre \u00e0 jour pour nous permettre de fournir une assistance appropri\u00e9e \u00e0 votre compte.", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD1:LABEL": "Mot de passe", "FORM:CLIENT_VALIDATION:MAX": "Veuillez saisir une valeur inf\u00e9rieure ou \u00e9gale \u00e0 {0}.", "OVERLAY:LOWER_BETS:HEADER": "R\u00c9DUISEZ VOS MISES OU TERMINEZ LA PARTIE DU TOURNOI", "FORM:ADDRESS:FIELD:COUNTRY_CODE:LABEL": "Pays", "OVERLAY:TOURNAMENT_POSITION:TRY_AGAIN": "Vous pouvez participer de nouveau au tournoi maintenant.", "FORM:ACCOUNT:INFO:ADDRESS:SUCCESS": "Vous avez bien mis \u00e0 jour les informations de votre profil.", "OVERLAY:NO_RESETS_UNKNOWN_PLAYER:HEADER:1": "VOUS N\u2019AVEZ PLUS DE REMISES \u00c0 Z\u00c9RO DISPONIBLES AUJOURD\u2019HUI", "PAGE:MAIN:CLIENT_COPYRIGHT": "Copyright \u00a9 2020 MPC Media Ltd., Tous droits r\u00e9serv\u00e9s.", "BUTTON:CHANGE_PASSWORD:LABEL": "Changer le mot de passe", "FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD1:LABEL": "Nouveau mot de passe", "FORM:FULL_REGISTRATION_CONDITIONS:FIELD:AGREE:LABEL": "\nJ\u2019ai lu et j\u2019approuve les <a target=\"_blank\" href=\"/fr/terms-and-conditions\">Conditions\ng\u00e9n\u00e9rales</a>.\n\n", "PAGE:LOGO:ALT": "Jouez GRATUITEMENT \u00e0 des machines \u00e0 sous", "FORM:PASSWORD_CHANGE:FIELD:CURRENT_PASSWORD:LABEL": "Mot de passe", "OVERLAY:NO_RESETS_UNKNOWN_PLAYER:HEADER:2": "Revenez demain pour participer \u00e0 un autre tournoi passionnant!", "OVERLAY:TOURNAMENT_POSITION:PLAY_OTHER_SLOTS": "Cliquez sur Tous les jeux pour continuer \u00e0 jouer \u00e0 nos autres machines \u00e0 sous gratuites!", "PAGE:PLAYER_PROGRESS:0:ALT": "Jouez GRATUITEMENT \u00e0 des machines \u00e0 sous", "BUTTON:CANCEL_REGISTRATION:LABEL": "annuler l\u2019inscription", "OVERLAY:LOWER_BETS:LOWER_BETS_OR_FINISH": "Veuillez r\u00e9duire vos mises pour continuer ou bien terminez la partie du tournoi maintenant.", "FACEBOOK:SHARE_POSITION:TITLE": "Jouez gratuitement \u00e0 des machines \u00e0 sous en ligne \u00e0 FreeSlotsLand.eu!", "PAGE:TOURNAMENT_BANNER:TITLE": "Se termine dans", "OVERLAY:RESET_FREE_GAME:WIN_IN_DAILY_TOURNAMENT_OR_RESET_CREDITS": "Vous pouvez encore gagner au tournoi quotidien ou bien vous pouvez remettre vos cr\u00e9dits \u00e0 z\u00e9ro maintenant et continuer \u00e0 jouer \u00e0 nos jeux gratuits.", "OVERLAY:RESET_FREE_GAME:RESET_CREDITS_AND_CONTINUE": "Vous pouvez remettre vos cr\u00e9dits \u00e0 z\u00e9ro maintenant et continuer \u00e0 jouer \u00e0 nos jeux gratuits.", "ERROR:CLIENT:CONTACT_EMAIL_IN_VERIFICATION_PROCESS:TITLE": "L\u2019ADRESSE E-MAIL DOIT \u00caTRE V\u00c9RIFI\u00c9E", "BUTTON:RESET_CREDITS:LABEL": "Remettre les cr\u00e9dits \u00e0 z\u00e9ro", "FORM:ACCOUNT:INFO:ADDRESS:ABOUT": "Modifier les informations de votre profil", "OVERLAY:TOURNAMENT_POSITION:HEADER:1:THANK_YOU": "MERCI POUR VOTRE PARTICIPATION", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:LOGIN:LABEL": "Nom du compte", "FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD2:LABEL": "Nouveau mot de passe", "OVERLAY:TOP_TEN_POSITION:HEADER:2": "Votre score du tournoi a atteint le TOP 10!", "ERROR:CLIENT:COOKIES_DISABLED": "Les cookies sont d\u00e9sactiv\u00e9s. Veuillez activer les cookies dans votre navigateur pour profiter pleinement de toutes les fonctionnalit\u00e9s de Free Slots Land.", "OVERLAY:TOURNAMENT_POSITION:TRY_OTHER_SLOTS_OR_SAVE_SCORE": "Essayez nos autres machines \u00e0 sous gratuites ou enregistrez votre score actuel.", "OVERLAY:NO_RESETS_REGISTERED_PLAYER:HEADER:1": "MERCI POUR VOTRE PARTICIPATION", "FORM:PASSWORD_RECOVERY:FIELD:PASSWORD:LABEL": "Mot de passe temp.", "BUTTON:PLAY_TOURNAMENT:LABEL": "Participer au tournoi", "FORM:PASSWORD_RECOVERY_REQUEST:FIELD:EMAIL:LABEL": "Adresse e-mail", "OVERLAY:TOP_THREE_POSITION:TRY_AGAIN": "Vous pouvez participer de nouveau au tournoi maintenant.", "OVERLAY:LOG_IN_OR_REGISTER:HEADER": "CONNECTEZ-VOUS OU INSCRIVEZ-VOUS", "ERROR:CLIENT:CONTACT_EMAIL_IN_VERIFICATION_PROCESS": "\nVeuillez envoyer un e-mail \u00e0 notre service clients \u00e0 l\u2019adresse\n<a href=\\\"mailto:support@freeslotsland.eu?Subject=E-mail confirmation\n(XXLOGINXX)&amp;Body=Please verify my e-mail address and reactivate\nmy account!\\\">support@freeslotsland.eu</a> pour confirmer votre adresse\ne-mail. Votre compte fonctionnera en mode limit\u00e9 tant que votre\nadresse e-mail n\u2019aura pas \u00e9t\u00e9 confirm\u00e9e.\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!\\\">Envoyer un e-mail</a></p>\n\n", "FORM:PASSWORD_RECOVERY:INFO:ABOUT": "Bonjour, veuillez configurer votre mot de passe maintenant. Vous aurez besoin du mot de passe temporaire qui vous a \u00e9t\u00e9 envoy\u00e9 par e-mail.", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD1:ERROR:INVALID": "Les mots de passe ne correspondent pas.", "ERROR:CLIENT:CONTACT_EMAIL_MUST_BE_CHANGED:TITLE": "L\u2019ADRESSE E-MAIL N\u2019EST PAS VALIDE", "FORM:FULL_REGISTRATION:INFO:TITLE": "CR\u00c9EZ UN COMPTE MAINTENANT POUR ENREGISTRER", "ERROR:CLIENT:UPGRADE_BROWSER": "Veuillez mettre \u00e0 jour votre navigateur vers une version plus r\u00e9cente pour jouer \u00e0 Free Slots Land.", "OVERLAY:TOP_TEN_POSITION:HEADER:1": "BIEN JOU\u00c9!", "FORM:CLIENT_VALIDATION:DATE": "Veuillez saisir une date valide.", "ERROR:CLIENT:UNSUPPORTED_BROWSER": "Votre navigateur n\u2019est pas compatible. Veuillez utiliser l\u2019un des navigateurs suivants\u00a0: Firefox, Chrome, Internet Explorer, Opera, Safari.", "FORM:ACCOUNT:INFO:TITLE": "METTRE \u00c0 JOUR LES INFORMATIONS DE VOTRE COMPTE", "BUTTON:NO_THANK_YOU:LABEL": "Non, merci", "ERROR:CLIENT:FLASH:RELOAD": "Please reload this page.", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:MONTH:LABEL": "Mois", "OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:HEADER:2": "POUR POUVOIR ENCORE GAGNER $50!", "OVERLAY:RESET_TOURNAMENT_UNKNOWN_PLAYER:HEADER:1": "REJOUEZ", "BUTTON:LOWER_BETS:LABEL": "R\u00e9duire les mises", "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": "Veuillez saisir la m\u00eame valeur de nouveau.", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:5": "Le tournoi quotidien de machines \u00e0 sous gratuites sur FreeSlotsLand.eu est tellement amusant. Je suis arriv\u00e9 XXPOSITIONXX dans le classement d\u2019aujourd\u2019hui! Essayez vous aussi.", "OVERLAY:TOURNAMENT_POSITION:HEADER:2:THANK_YOU": "au tournoi!", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:6": "Aujourd\u2019hui, j\u2019ai particip\u00e9 au tournoi de machine \u00e0 sous gratuite sur FreeSlotsLand.eu et je suis actuellement XXPOSITIONXX! Qui peut me battre?", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:1": "Ouah! Je suis actuellement XXPOSITIONXX au tournoi de machines \u00e0 sous gratuites sur FreeSlotsLand.eu! Vous pouvez gagner de vraies sommes d\u2019argent dans les tournois quotidiens \u00e9galement!", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:3": "Je participe au tournoi de machines \u00e0 sous gratuites sur FreeSlotsLand.eu et je suis arriv\u00e9 XXPOSITIONXX dans le classement.  Venez jouer avec moi!", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:2": "Super! Je suis arriv\u00e9 XXPOSITIONXX au tournoi quotidien de machines \u00e0 sous gratuites sur FreeSlotsLand.eu! Vous pouvez jouer et \u00e9galement gagner des prix!", "BUTTON:CANCEL_LOGIN:LABEL": "annuler la connexion", "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": "Vous pouvez remettre vos cr\u00e9dits et parties du tournoi \u00e0 z\u00e9ro maintenant pour participer de nouveau au tournoi.", "OVERLAY:TOP_THREE_POSITION:RESET_AND_TRY_AGAIN": "Vous pouvez remettre vos cr\u00e9dits et parties du tournoi \u00e0 z\u00e9ro maintenant pour participer de nouveau au tournoi.", "FORM:CLIENT_VALIDATION:URL": "Veuillez saisir une URL valide.", "BUTTON:RECOVER_PASSWORD:LABEL": "R\u00e9cup\u00e9rer le mot de passe", "ERROR:CLIENT:ERROR:TITLE": "Oups une erreur s\u2019est produite!", "FORM:LOGIN:FIELD:PASSWORD:LABEL": "Mot de passe", "PAGE:MAIN:CLIENT_PRE_LOADING": "Free Slots Land est en cours de chargement", "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\u00c9DITS", "FORM:ADDRESS:FIELD:CITY:LABEL": "Ville", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:YEAR:LABEL": "Ann\u00e9e", "FORM:PASSWORD_CHANGE:FIELD:NEW_PASSWORD1:LABEL": "Nouveau mot de passe", "BUTTON:CANCEL:LABEL": "annuler", "OVERLAY:TOURNAMENT_POSITION:HEADER:2:NO_RESETS": "Revenez demain pour participer \u00e0 un autre tournoi passionnant!", "FORM:FULL_REGISTRATION_LOGIN_PASSWORD:FIELD:PASSWORD2:LABEL": "Mot de passe encore une fois", "FORM:ACCOUNT:INFO:LOGIN_PASSWORD:ABOUT:1": "Changer votre mot de passe", "OVERLAY:TOP_THREE_POSITION:HEADER3": "AU TOURNOI D\u2019AUJOURD\u2019HUI", "BUTTON:FINISH_ROUND:LABEL": "Terminer la partie", "BUTTON:LOGIN:LABEL": "Connexion", "OVERLAY:TOURNAMENT_POSITION:HEADER:2:PLAY_AGAIN": "POUR POUVOIR ENCORE GAGNER $50!", "OVERLAY:LOG_IN_OR_REGISTER:SAVE_SCORE": "Connectez-vous ou inscrivez-vous maintenant pour enregistrer votre score afin d\u2019avoir une chance de gagner un prix. Seuls les utilisateurs inscrits gagnent des prix.", "FORM:ACCOUNT:INFO:ERROR": "Ce formulaire contient des erreurs! Veuillez examiner les champs en surbrillance en rouge.", "FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD2:ERROR:INVALID": "Vos nouveaux mots de passe ne correspondent pas.", "FORM:FULL_REGISTRATION_BIRTHDATE:FIELD:DAY:LABEL": "Jour", "FORM:ADDRESS:FIELD:APT_SUITE:LABEL": "Num\u00e9ro de la suite", "FORM:ADDRESS:FIELD:STATE_CODE:ERROR:NOT_SPECIFIED": "Le champ \u00e9tat n\u2019a pas \u00e9t\u00e9 renseign\u00e9, mais il est requis.", "OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:HEADER:2": "POUR POUVOIR ENCORE GAGNER $50!", "BUTTON:LOST_PASSWORD:LABEL": "mot de passe perdu", "OVERLAY:RESET_TOURNAMENT_REGISTERED_PLAYER:HEADER:1": "REJOUEZ", "FORM:CLIENT_VALIDATION:MIN": "Veuillez saisir une valeur sup\u00e9rieure ou \u00e9gale \u00e0 {0}.", "OVERLAY:TOP_THREE_POSITION:RESET_AND_STRENGTHEN_POSITION": "Vous pouvez remettre vos cr\u00e9dits et vos parties de tournoi \u00e0 z\u00e9ro maintenant et renforcer davantage votre position au tournoi. $50 attendent le gagnant!", "OVERLAY:TOP_TEN_POSITION:PLAY_OTHER_SLOTS": "Cliquez sur Tous les jeux pour continuer \u00e0 jouer \u00e0 nos autres machines \u00e0 sous gratuites!", "FORM:FULL_REGISTRATION:INFO:ABOUT": "automatiquement tous vos scores de tournoi", "BUTTON:UPDATE_ACCOUNT:LABEL": "Mettre \u00e0 jour le compte", "OVERLAY:TOURNAMENT_POSITION:RESET_AND_TRY_AGAIN": "Vous pouvez remettre vos cr\u00e9dits et parties du tournoi \u00e0 z\u00e9ro maintenant pour participer de nouveau au tournoi.", "BUTTON:OK:LABEL": "OK", "FORM:CLIENT_VALIDATION:REQUIRED": "Ce champ est obligatoire.", "OVERLAY:TOURNAMENT_POSITION:HEADER:1:PLAY_AGAIN": "REJOUEZ", "OVERLAY:TOP_TEN_POSITION:REGISTER_SCORE": "Voulez-vous enregistrer votre score maintenant? Seuls les scores enregistr\u00e9s peuvent gagner des prix!", "OVERLAY:TOP_THREE_POSITION:SAVE_SCORE": "Enregistrez votre score maintenant pour avoir une chance de gagner un prix. Seuls les utilisateurs inscrits gagnent des prix.", "OVERLAY:TOP_THREE_POSITION:HEADER:1": "BRAVO!", "OVERLAY:TOP_THREE_POSITION:HEADER:2": "VOUS \u00caTES ACTUELLEMENT", "PAGE:PLAYER_PROGRESS:1:ALT": "JOUEZ au jeu du tournoi", "FORM:CLIENT_VALIDATION:NUMBER": "Veuillez saisir un nombre valide.", "FACEBOOK:SHARE_POSITION:DESCRIPTION:VARIANT:4": "Rejoignez-moi au tournoi de machines \u00e0 sous gratuites sur FreeSlotsLand.eu. Nous pouvons gagner chaque jour ensemble des prix sous forme de sommes d\u2019argent! Je suis actuellement XXPOSITIONXX!", "FORM:LOGIN:FIELD:LOGIN:LABEL": "Nom du compte", "FORM:FULL_REGISTRATION:ADDRESS:ABOUT": "Votre adresse de contact", "FORM:ADDRESS:FIELD:STREET_ADDRESS:LABEL": "Num\u00e9ro et rue", "OVERLAY:TOURNAMENT_POSITION:HEADER:1:NO_RESETS": "VOUS N\u2019AVEZ PLUS DE REMISES \u00c0 Z\u00c9RO DISPONIBLES AUJOURD\u2019HUI", "FORM:CLIENT_VALIDATION:MAX_LENGTH": "Veuillez saisir pas plus de {0} caract\u00e8res.", "FORM:CLIENT_VALIDATION:RANGE": "Veuillez saisir une valeur comprise entre {0} et {1}.", "PAGE:GAME:ROUNDS": "PARTIES", "BUTTON:LANGUAGE:LABEL": "Langue", "BUTTON:CLOSE:LABEL": "fermer", "BUTTON:ALL_GAMES:LABEL": "Tous les jeux", "FORM:CLIENT_VALIDATION:RANGE_LENGTH": "Veuillez saisir une valeur d\u2019une longueur comprise entre {0} et {1} caract\u00e8res.", "FORM:PASSWORD_RECOVERY_REQUEST:INFO:ABOUT": "Veuillez saisir votre adresse e-mail. Votre nom d\u2019utilisateur et un mot de passe temporaire vous seront envoy\u00e9s \u00e0 cette adresse.", "PAGE:PLAYER_PROGRESS:3:ALT": "GAGNEZ $50 chaque jour", "FORM:ADDRESS:FIELD:POSTAL_CODE:LABEL": "Code postal", "ERROR:CLIENT:FLASH:TITLE": "YOUR FLASH IS NOT WORKING :-(", "PAGE:MAIN:CLIENT_LOADING": "En cours de chargement", "OVERLAY:TOP_TEN_POSITION:TRY_OTHER_SLOTS_OR_SAVE_SCORE": "Essayez nos autres machines \u00e0 sous gratuites ou enregistrez votre score actuel.", "FORM:ADDRESS:FIELD:PHONE_NUMBER:LABEL": "Num\u00e9ro de t\u00e9l\u00e9phone", "BUTTON:EXIT_TOURNAMENT:LABEL": "Quitter le tournoi", "OVERLAY:TOP_TEN_POSITION:RESET_AND_TRY_AGAIN": "Vous pouvez remettre vos cr\u00e9dits et parties du tournoi \u00e0 z\u00e9ro maintenant pour participer de nouveau au tournoi.", "FORM:ADDRESS:FIELD:LAST_NAME:LABEL": "Nom", "OVERLAY:RESET_FREE_GAME:HEADER": "VOUS N\u2019AVEZ PLUS DE CR\u00c9DITS", "FORM:PASSWORD_RECOVERY_REQUEST:INFO:SUCCESS": "Votre nom d\u2019utilisateur et un mot de passe temporaire vous ont \u00e9t\u00e9 envoy\u00e9s \u00e0 votre adresse e-mail. Veuillez v\u00e9rifier votre bo\u00eete de r\u00e9ception.", "OVERLAY:NO_RESETS_REGISTERED_PLAYER:TEXT": "Essayez nos autres machines \u00e0 sous gratuites ou enregistrez votre score actuel.", "FORM:ADDRESS:FIELD:FIRST_NAME:LABEL": "Pr\u00e9nom", "OVERLAY:TOP_TEN_POSITION:TRY_AGAIN": "Vous pouvez participer de nouveau au tournoi maintenant.", "FORM:PASSWORD_RECOVERY:FIELD:NEW_PASSWORD2:LABEL": "Nouveau mot de passe"}

// 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="/fr/">' +
            '        <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 + '/fr/\';" 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 + '/fr/\';" 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 = \'/fr/\'; 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;
}

