// noinspection JSUnresolvedReference /** * Field Google Map */ /* global jQuery, document, redux_change, redux, google */ (function ( $ ) { 'use strict'; redux.field_objects = redux.field_objects || {}; redux.field_objects.google_maps = redux.field_objects.google_maps || {}; /* LIBRARY INIT */ redux.field_objects.google_maps.init = function ( selector ) { if ( ! selector ) { selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' ); } $( selector ).each( function ( i ) { let delayRender; const el = $( this ); let parent = el; if ( ! el.hasClass( 'redux-field-container' ) ) { parent = el.parents( '.redux-field-container:first' ); } if ( parent.is( ':hidden' ) ) { return; } if ( parent.hasClass( 'redux-field-init' ) ) { parent.removeClass( 'redux-field-init' ); } else { return; } // Check for delay render, which is useful for calling a map // render after JavaScript load. delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) ); // API Key button. redux.field_objects.google_maps.clickHandler( el ); // Init our maps. redux.field_objects.google_maps.initMap( el, i, delayRender ); } ); }; /* INIT MAP FUNCTION */ redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) { let delayed; let scrollWheel; let streetView; let mapType; let address; let defLat; let defLong; let defaultZoom; let mapOptions; let geocoder; let g_autoComplete; let g_LatLng; let g_map; let noLatLng = false; // Pull the map class. const mapClass = el.find( '.redux_framework_google_maps' ); const containerID = mapClass.attr( 'id' ); const autocomplete = containerID + '_autocomplete'; const canvas = containerID + '_map_canvas'; const canvasId = $( '#' + canvas ); const latitude = containerID + '_latitude'; const longitude = containerID + '_longitude'; // Add map index to data attr. // Why, say we want to use delay_render, // and want to init the map later on. // You'd need the index number in the // event of multiple map instances. // This allows one to retrieve it // later. $( mapClass ).attr( 'data-idx', idx ); if ( true === delayRender ) { return; } // Map has been rendered, no need to process again. if ( $( '#' + containerID ).hasClass( 'rendered' ) ) { return; } // If a map is set to delay render and has been initiated // from another scrip, add the 'render' class so rendering // does not occur. // It messes things up. delayed = Boolean( mapClass.data( 'delay-render' ) ); if ( true === delayed ) { mapClass.addClass( 'rendered' ); } // Create the autocomplete object, restricting the search // to geographical location types. g_autoComplete = await google.maps.importLibrary( 'places' ); g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} ); // Data bindings. scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) ); streetView = Boolean( mapClass.data( 'street-view' ) ); mapType = Boolean( mapClass.data( 'map-type' ) ); address = mapClass.data( 'address' ); address = decodeURIComponent( address ); address = address.trim(); // Set default Lat/lng. defLat = canvasId.data( 'default-lat' ); defLong = canvasId.data( 'default-long' ); defaultZoom = canvasId.data( 'default-zoom' ); // Eval whether to set maps based on lat/lng or address. if ( '' !== address ) { if ( '' === defLat || '' === defLong ) { noLatLng = true; } } else { noLatLng = false; } // Can't have empty values, or the map API will complain. // Set default for the middle of the United States. defLat = defLat ? defLat : 39.11676722061108; defLong = defLong ? defLong : -100.47761000000003; if ( noLatLng ) { // If displaying a map based on an address. geocoder = new google.maps.Geocoder(); // Set up Geocode and pass address. geocoder.geocode( {'address': address}, function ( results, status ) { let latitude; let longitude; // Function results. if ( status === google.maps.GeocoderStatus.OK ) { // A good address was passed. g_LatLng = results[0].geometry.location; // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); // Get and set lat/long data. latitude = el.find( '#' + containerID + '_latitude' ); latitude.val( results[0].geometry.location.lat() ); longitude = el.find( '#' + containerID + '_longitude' ); longitude.val( results[0].geometry.location.lng() ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } else { // No data found, alert the user. alert( 'Geocode was not successful for the following reason: ' + status ); } } ); } else { // If displaying map based on an lat/lng. g_LatLng = new google.maps.LatLng( defLat, defLong ); // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, // Start off far unless an item is selected, set by php. streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create the map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } }; redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) { let markerTooltip; let infoWindow; let g_marker; let geoAlert = mapClass.data( 'geo-alert' ); // Get HTML. const input = document.getElementById( autocomplete ); // Set objects into the map. g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input ); // Bind objects to the map. g_autoComplete = new google.maps.places.Autocomplete( input ); g_autoComplete.bindTo( 'bounds', g_map ); // Get the marker tooltip data. markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Create infoWindow. infoWindow = new google.maps.InfoWindow(); // Create marker. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), draggable: true, title: markerTooltip, animation: google.maps.Animation.DROP } ); geoAlert = decodeURIComponent( geoAlert ); // Place change. google.maps.event.addListener( g_autoComplete, 'place_changed', function () { let place; let address; let markerTooltip; infoWindow.close(); // Get place data. place = g_autoComplete.getPlace(); // Display alert if something went wrong. if ( ! place.geometry ) { window.alert( geoAlert ); return; } console.log( place.geometry.viewport ); // If the place has a geometry, then present it on a map. if ( place.geometry.viewport ) { g_map.fitBounds( place.geometry.viewport ); } else { g_map.setCenter( place.geometry.location ); g_map.setZoom( 17 ); // Why 17? Because it looks good. } markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Set the marker icon. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), title: markerTooltip, clickable: true, draggable: true, animation: google.maps.Animation.DROP } ); // Set marker position and display. g_marker.setPosition( place.geometry.location ); g_marker.setVisible( true ); // Form array of address components. address = ''; if ( place.address_components ) { address = [( place.address_components[0] && place.address_components[0].short_name || '' ), ( place.address_components[1] && place.address_components[1].short_name || '' ), ( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' ); } // Set the default marker info window with address data. infoWindow.setContent( '
Dans l’univers illimité des casinos en ligne, Space Fortuna Casino se distingue par son ambiance galactique et ses offres alléchantes. Que vous soyez un novice ou un joueur aguerri, cet établissement promet une expérience immersive qui pourrait bien vous mener vers des gains stellaires. Préparez-vous à explorer les mystères de l’espace tout en jouant à vos jeux préférés.
Lorsqu’il s’agit de choisir un casino en ligne, la réputation et les avis des utilisateurs jouent un rôle crucial. Space Fortuna Casino a réussi à capter l’attention de nombreux joueurs grâce à son interface conviviale et son vaste choix de jeux. Voici quelques éléments clés à considérer :
Le cœur de chaque casino réside dans sa bibliothèque de jeux. Space Fortuna Casino ne déçoit pas sur ce front. Avec une gamme variée allant des machines à sous aux jeux de table, chaque joueur trouvera de quoi satisfaire ses envies. Voici un aperçu des catégories de jeux disponibles :
| Type de Jeu | Exemples | Taux de Retour au Joueur (TRJ) |
| Machines à Sous | Starburst, Gonzo’s Quest | 95% – 97% |
| Jeux de Table | Blackjack, Roulette | 94% – 99% |
| Jeux en Direct | Live Blackjack, Live Roulette | 93% – 98% |
Les machines à sous sont sans aucun doute les stars de Space Fortuna Casino. Avec des graphismes époustouflants et des thèmes captivants, ces jeux offrent non seulement du divertissement mais aussi des opportunités de gains impressionnants.
Pour les amateurs de stratégie, les jeux de table comme le blackjack et la roulette sont incontournables. Chaque partie est une nouvelle chance de tester vos compétences et spacefortunacasinofrance.com de remporter des cagnottes intéressantes.
L’expérience des jeux en direct vous plonge au cœur de l’action avec des croupiers en temps réel. Cette option est idéale pour ceux qui recherchent l’authenticité d’un casino physique tout en restant chez eux.
Les bonus sont un facteur décisif dans le choix d’un casino en ligne. Space Fortuna Casino propose une variété de promotions attractives pour accueillir ses nouveaux joueurs et encourager les joueurs fidèles. Voici un aperçu des principales offres :
La sécurité est primordiale lorsqu’il s’agit de jeux d’argent en ligne. Space Fortuna Casino utilise des technologies de cryptage avancées pour protéger les données personnelles et bancaires de ses joueurs. De plus, il est licencié par des autorités de régulation respectées, garantissant des jeux équitables et responsables.
Un casino digne de confiance doit être réglementé. Space Fortuna Casino est sous la juridiction d’organismes de régulation reconnus, assurant ainsi la transparence et la légitimité de ses opérations.
Les méthodes de dépôt et de retrait sont variées, allant des cartes de crédit aux portefeuilles électroniques. Cela permet aux joueurs de choisir l’option qui leur convient le mieux. Voici quelques méthodes populaires :
Les retours des joueurs sont souvent révélateurs de la qualité d’un casino. Les avis sur Space Fortuna Casino mettent en avant plusieurs points positifs :
Voici quelques témoignages de joueurs :
“J’adore jouer sur Space Fortuna Casino ! Les machines à sous sont incroyables et j’ai déjà gagné plusieurs fois !” – Marie, Paris
“Le service client est très réactif, ce qui est un gros plus pour moi.” – Pierre, Lyon
En résumé, Space Fortuna Casino s’affirme comme une destination incontournable pour les amateurs de jeux en ligne. Avec sa gamme variée de jeux, ses promotions attractives et son engagement envers la sécurité, il est évident que cet établissement a su créer un environnement de jeu agréable et fiable. Que vous souhaitiez explorer les étoiles ou simplement vous divertir, Space Fortuna Casino a quelque chose à offrir à chaque joueur. N’attendez plus pour tenter votre chance et découvrir les mystères qu’il recèle !
]]>