// 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( '
' + place.name + '
' + address ); infoWindow.open( g_map, g_marker ); // Run Geolocation. redux.field_objects.google_maps.geoLocate( g_autoComplete ); // Fill in address inputs. redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete ); } ); // Marker drag. google.maps.event.addListener( g_marker, 'drag', function ( event ) { document.getElementById( latitude ).value = event.latLng.lat(); document.getElementById( longitude ).value = event.latLng.lng(); } ); // End marker drag. google.maps.event.addListener( g_marker, 'dragend', function () { redux_change( el.find( '.redux_framework_google_maps' ) ); } ); // Zoom Changed. g_map.addListener( 'zoom_changed', function () { el.find( '.google_m_zoom_input' ).val( g_map.getZoom() ); } ); // Marker Info Window. infoWindow = new google.maps.InfoWindow(); google.maps.event.addListener( g_marker, 'click', function () { const marker_info = containerID + '_marker_info'; const infoValue = document.getElementById( marker_info ).value; if ( '' !== infoValue ) { infoWindow.setContent( infoValue ); infoWindow.open( g_map, g_marker ); } } ); }; /* FILL IN ADDRESS FUNCTION */ redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) { // Set variables. const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' ); // What if someone only wants city, or state, ect... // gotta do it this way to check for the address! // Need to check each of the returned components to see what is returned. const componentForm = { street_number: 'short_name', route: 'long_name', locality: 'long_name', administrative_area_level_1: 'short_name', country: 'long_name', postal_code: 'short_name' }; // Get the place details from the autocomplete object. const place = g_autoComplete.getPlace(); let component; let i; let addressType; let _d_addressType; let val; let len; document.getElementById( latitude ).value = place.geometry.location.lat(); document.getElementById( longitude ).value = place.geometry.location.lng(); for ( component in componentForm ) { if ( componentForm.hasOwnProperty( component ) ) { // Push in the dynamic form element ID again. component = containerID + '_' + component; // Assign to proper place. document.getElementById( component ).value = ''; document.getElementById( component ).disabled = false; } } // Get each component of the address from the place details // and fill the corresponding field on the form. len = place.address_components.length; for ( i = 0; i < len; i += 1 ) { addressType = place.address_components[i].types[0]; if ( componentForm[addressType] ) { // Push in the dynamic form element ID again. _d_addressType = containerID + '_' + addressType; // Get the original. val = place.address_components[i][componentForm[addressType]]; // Assign to proper place. document.getElementById( _d_addressType ).value = val; } } }; redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) { if ( navigator.geolocation ) { navigator.geolocation.getCurrentPosition( function ( position ) { const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude ); const circle = new google.maps.Circle( { center: geolocation, radius: position.coords.accuracy } ); g_autoComplete.setBounds( circle.getBounds() ); } ); } }; /* API BUTTON CLICK HANDLER */ redux.field_objects.google_maps.clickHandler = function ( el ) { // Find the API Key button and react on click. el.find( '.google_m_api_key_button' ).on( 'click', function () { // Find message wrapper. const wrapper = el.find( '.google_m_api_key_wrapper' ); if ( wrapper.is( ':visible' ) ) { // If the wrapper is visible, close it. wrapper.slideUp( 'fast', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } else { // If the wrapper is visible, open it. wrapper.slideDown( 'medium', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } } ); el.find( '.google_m_autocomplete' ).on( 'keypress', function ( e ) { if ( 13 === e.keyCode ) { e.preventDefault(); } } ); // Auto select autocomplete contents, // since Google doesn't do this inherently. el.find( '.google_m_autocomplete' ).on( 'click', function ( e ) { $( this ).trigger( 'focus' ); $( this ).trigger( 'select' ); e.preventDefault(); } ); }; } )( jQuery ); Casino Extra Avis 2024 – Bonus Exclusif 600 € et 100 Tours Gratuits – Orchid Group
Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Casino Extra Avis 2024 – Bonus Exclusif 600 € et 100 Tours Gratuits

Bonus exclusif + 600 € & 100 FS – Profitez dès maintenant de cette offre exceptionnelle sur Casino Extra !

Connectez-vous via casino extra connexion ou casinoextra2 pour découvrir un monde de divertissement inégalé.

Avec casino extra 2 connexion, accédez à des jeux exclusifs et à des croupiers professionnels sur casino extra dealer.

Ne manquez pas cette opportunité unique sur extracasino et casinoextra !

Bienvenue sur Casino Extra Avis 2024

Découvrez l’expérience ultime de jeu en ligne avec Casino Extra Avis 2024. Profitez de nos offres exclusives et de nos bonus exceptionnels pour une aventure sans pareil.

  • Bonus exclusif de 600 € et 100 tours gratuits pour tous les nouveaux joueurs.
  • Accès rapide et sécurisé via casino extra connexion.
  • Des jeux variés et des machines à sous de renommée mondiale.
  • Un service clientèle disponible 24/7 pour répondre à toutes vos questions.

Rejoignez-nous dès maintenant et profitez de l’expérience casinoextra2 et casino extra 2 qui vous attendent. Ne manquez pas cette opportunité unique de vivre des moments inoubliables avec casino extra dealer et extra casino.

Pour une connexion rapide et sécurisée, utilisez casino extra 2 connexion. Préparez-vous à une aventure de jeu sans limite avec Casino Extra Avis 2024!

Bonus exclusif de 600 €

Profitez d’une offre incroyable avec le bonus exclusif de 600 € sur Casino Extra 2. Ce bonus est une occasion unique de découvrir les jeux de casino extra dealer avec un capital supplémentaire. Pour accéder à cette promotion, il vous suffit de vous connecter via Casino Extra 2 connexion ou Casino Extra connexion. Une fois connecté, vous pourrez profiter de cette somme exceptionnelle pour explorer les tables de jeux et les machines à sous de Casino Extra. Ne manquez pas cette opportunité de jouer avec un avantage supplémentaire sur Casino Extra 2 ou Casino Extra. Rejoignez-nous dès maintenant et découvrez l’expérience de jeu ultime sur Extracasino.

100 Tours Gratuits

Découvrez l’expérience ultime avec 100 Tours Gratuits offerts par Casino Extra. Profitez de cette incroyable opportunité pour explorer notre vaste sélection de jeux sans dépenser un centime. Que vous soyez un habitué de casinoextra ou un nouveau venu, ces tours gratuits sont votre passeport vers des heures de divertissement inoubliables.

Connectez-vous dès maintenant sur casino extra connexion et accédez à votre bonus exclusif. Ne manquez pas cette chance de jouer avec casino extra dealer et de découvrir les secrets de casino extra 2 connexion. Avec casinoextra2 et extracasino, vous êtes assuré d’une expérience de jeu sans pareille.

Rejoignez-nous et laissez-vous séduire par les 100 Tours Gratuits qui vous attendent. C’est le moment idéal pour tenter votre chance et peut-être repartir avec des gains exceptionnels. Préparez-vous à vivre une aventure passionnante avec Casino Extra !

Jeux de Casino en Ligne

Découvrez une expérience de jeu inégalée avec Casino Extra. Que vous soyez un passionné de machines à sous ou un amateur de jeux de table, notre plateforme offre une variété sans précédent.

  • Casino Extra Dealer : Vivez l’excitation des tables de jeux avec nos croupiers en direct.
  • Casino Extra 2 : Explorez notre nouvelle interface améliorée pour une navigation fluide et intuitive.
  • Casino Extra 2 Connexion : Accédez facilement à votre compte depuis n’importe quel appareil.
  • Casino Extra Connexion : Connexion sécurisée garantie pour une expérience sans souci.
  • Extra Casino : Profitez de promotions exclusives et de bonus attrayants.
  • Casino Extra2 : Découvrez des jeux innovants et des fonctionnalités avancées.

Rejoignez-nous dès maintenant et vivez l’aventure du jeu en ligne avec Casino Extra !

Sécurité et Confidentialité

Chez Casino Extra, votre sécurité et votre confidentialité sont notre priorité absolue. Nous utilisons des protocoles de sécurité avancés pour protéger vos données personnelles et financières. Avec CasinoExtra, vous pouvez être sûr que vos informations restent confidentielles et sécurisées.

Notre plateforme, Casino Extra2, est équipée des dernières technologies de cryptage pour garantir que toutes vos transactions sont sécurisées. Que vous utilisiez Casino Extra Dealer ou Casino Extra 2 Connexion, vous bénéficiez d’une expérience de jeu sans souci.

En choisissant CasinoExtra2, vous accédez à un environnement de jeu sécurisé et fiable. Nous nous engageons à maintenir les normes les plus élevées de sécurité pour vous offrir une expérience de jeu en ligne exceptionnelle.

Méthodes de Paiement Sécurisées

Chez Casino Extra, nous accordons une importance primordiale à la sécurité de vos transactions. Pour garantir une expérience de jeu sans souci, nous avons mis en place des méthodes de paiement hautement sécurisées.

Que vous choisissiez de vous connecter via Casino Extra 2 ou Extra Casino, vous bénéficierez de la tranquillité d’esprit offerte par nos systèmes de paiement robustes. Notre plateforme accepte une variété de méthodes, y compris les cartes bancaires, les portefeuilles électroniques, et les transferts bancaires, toutes vérifiées pour leur sécurité.

En optant pour Casino Extra 2 Connexion, vous accédez à un environnement où chaque transaction est protégée par des protocoles de sécurité avancés. Nous collaborons avec des fournisseurs de services de paiement de confiance pour assurer que chaque dépôt et retrait se déroule en toute sécurité.

Pour ceux qui préfèrent une expérience plus personnalisée, Casino Extra Dealer offre des options de paiement adaptées à vos besoins. Qu’il s’agisse de Casino Extra ou Extra Casino, la sécurité de vos transactions est notre priorité absolue.

Rejoignez-nous dès aujourd’hui et profitez d’une expérience de jeu en ligne sécurisée et sans tracas avec Casino Extra.

Service Clientèle 24/7

Chez Casino Extra 2, votre satisfaction est notre priorité absolue. Que vous soyez un joueur chevronné ou un débutant, notre équipe de support clientèle est disponible 24 heures sur 24, 7 jours sur 7, pour répondre à toutes vos questions et résoudre vos problèmes en temps réel.

Grâce à notre service clientèle 24/7, vous pouvez profiter de votre expérience sur Extra Casino sans aucune interruption. Que vous rencontriez des difficultés avec Casino Extra 2 Connexion ou que vous ayez besoin d’assistance pour maximiser vos bonus exclusifs, notre équipe est là pour vous guider.

N’hésitez pas à contacter notre service clientèle via chat en direct, e-mail ou téléphone. Avec Casino Extra Dealer, votre divertissement est entre de bonnes mains, et notre équipe est prête à vous offrir une assistance de qualité supérieure à tout moment.

Rejoignez Casino Extra 2 dès aujourd’hui et découvrez une expérience de jeu sans pareille, soutenue par un service clientèle exceptionnel 24/7.

Comment Profiter du Bonus Exclusif

Pour profiter pleinement du bonus exclusif de 600 € et 100 tours gratuits, suivez ces étapes simples:

Étape
Action

1 Visitez le site officiel d’Extra Casino. 2 Créez un compte en utilisant le lien de connexion spécial. 3 Effectuez votre premier dépôt pour activer le bonus. 4 Profitez des 600 € et 100 tours gratuits sur les jeux sélectionnés.

N’oubliez pas de consulter les conditions spécifiques du bonus sur le site d’Extra Casino pour maximiser vos gains.

Design and Develop by Ovatheme