// 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( '
Tervetuloa Lamabet-kasinon maailmaan, jossa jokainen pelikokemus on elämyksellinen ja jännittävä. Tässä artikkelissa käsittelemme Lamabetin tarjoamia ominaisuuksia, pelejä, bonuksia ja asiakaspalvelua. Sukelletaan syvemmälle ja tutkimme, miksi Lamabet on nouseva tähti nettikasinoiden joukossa.
Lamabet on innovatiivinen ja käyttäjäystävällinen nettikasino, joka on suunnattu niin uusille kuin kokeneille pelaajille. Kasino tarjoaa laajan valikoiman pelejä eri kategorioista, mukaan lukien kolikkopelit, pöytäpelit ja live-kasinopelit. Lamabetin tavoitteena on tarjota erinomaisia pelikokemuksia sekä houkuttelevia bonuksia, jotka tekevät pelaamisesta vieläkin mieluisampaa.
Lamabetin pelivalikoima on todella vaikuttava. Se sisältää satoja pelejä, joita tarjoavat tunnetut pelinvalmistajat. Katsotaanpa tarkemmin, mitä kaikkea Lamabet tarjoaa:
| Peli kategoria | Esimerkkejä peleistä |
| Kolikkopelit | Starburst, Book of Dead, Gonzo’s Quest |
| Pöytäpelit | Ruletti, Blackjack, Baccarat |
| Live-kasino | Live Roulette, Live Blackjack, Live Baccarat |
| Jackpot-pelit | Mega Moolah, Divine Fortune |
Pelivalikoima kattaa useita teemoja ja tyylejä, joten jokaiselle löytyy jotain mieleistä. Lamabet panostaa jatkuvasti uusien pelien lisäämiseen, mikä pitää pelivalikoiman tuoreena ja jännittävänä.
Lamabetin käyttöliittymä on suunniteltu niin, että pelaaminen on vaivatonta. Pelit latautuvat nopeasti, ja hakutoiminto helpottaa pelien löytämistä. Voit myös suodattaa pelejä tyyppien mukaan, mikä tekee hakemisesta vieläkin helpompaa.
Lamabet tarjoaa houkuttelevia bonuksia sekä uusille että olemassa oleville pelaajille. Tässä muutamia esimerkkejä saatavilla olevista tarjouksista:
Bonusten lunastaminen on helppoa ja vaatii vain muutaman yksinkertaisen vaiheen. Muista kuitenkin aina tutustua bonusehtoihin ennen niiden hyväksymistä.
Lamabet tukee useita turvallisia ja käteviä maksutapoja. Pelaajat voivat valita itselleen sopivimman vaihtoehdon tallettamiseen ja nostamiseen:
Talletukset ovat yleensä välittömiä, kun taas nostot saattavat kestää muutamasta tunnista muutamaan päivään riippuen valitusta maksutavasta. Lamabet takaa pelaajien tietoturvan ja yksityisyyden joka vaiheessa.
Lamabet tarjoaa erinomaista asiakaspalvelua, joka on saatavilla ympäri vuorokauden. Pelaajat voivat ottaa yhteyttä asiakaspalvelutiimiin useilla eri tavoilla:
Asiakaspalvelu on ystävällistä ja asiantuntevaa, ja se pyrkii ratkaisemaan pelaajien ongelmat mahdollisimman nopeasti.
Lamabetin turvallisuus on ensiarvoisen tärkeää. Kasino käyttää huipputeknologiaa pelaajien tietojen suojaamiseksi ja varautuu kaikilla tarvittavilla toimenpiteillä. Vastuullinen pelaaminen on myös keskiössä:
Lamabet ymmärtää, että pelaamisen tulisi olla hauskaa ja viihdyttävää, eikä koskaan uhkaavaa tai haitallista. Kasino kannustaa asiakkaitaan pelaamaan vastuullisesti.
Lamabet on monipuolinen ja houkutteleva nettikasino, joka tarjoaa erinomaisen pelikokemuksen. Laaja pelivalikoima, houkuttelevat bonukset, turvalliset maksutavat ja ystävällinen asiakaspalvelu tekevät siitä erinomaisen valinnan. Turvallisuus ja vastuullinen pelaaminen ovat myös keskeisiä arvoja, joita Lamabet noudattaa. Jos etsit luotettavaa ja viihdyttävää pelipaikkaa, Lamabet on ehdottomasti kokeilemisen arvoinen.
]]>