// 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( '
Spinko Casino, een relatief nieuwkomer op de online gokmarkt sinds begin 2026, heeft aangekondigd dat het zijn uitgebreide spelcatalogus verder uitbreidt door een strategische samenwerking aan te gaan met spelontwikkelaar BGaming. Deze samenwerking is bedoeld om spelers een nog breder en diverser spelaanbod te bieden, met de nadruk op de populaire crash games en innovatieve slots waar BGaming bekend om staat. Spinko Casino
De nieuwe integratie voegt honderden titels toe aan het reeds indrukwekkende portfolio van Spinko Casino, dat momenteel tussen de 8.000 en 9.000 spellen telt van meer dan 70 providers. Spelers kunnen nu genieten van BGaming’s unieke creaties, waaronder de populaire ‘Bonanza’ serie en klassiekers als ‘Fruit Million’. Deze uitbreiding onderstreept de ambitie van Spinko Casino om een toonaangevend platform te zijn voor spelers die op zoek zijn naar zowel kwantiteit als kwaliteit in hun gokervaring. Met licenties van zowel Curaçao als Anjouan, en een focus op moderne spelerservaringen, positioneert Spinko Casino zich stevig in de markt.
Voor Nederlandse spelers betekent dit een directe toegang tot een reeks games die bekend staan om hun grafische stijl en toegankelijkheid, vaak zonder complexe bonusrondes maar met hoge potentie. De integratie van BGaming past perfect bij de strategie van Spinko Casino om snelle, moderne games aan te bieden, naast de traditionele slots en live casino opties. Als je op zoek bent naar een frisse gokervaring, is Spinko Casino nu een nog interessantere bestemming.
Spinko Casino breidt mobiele spelaanbod uit met meer dan 500 nieuwe titels
Het casino, beheerd door Fortuna Games N.V., onderscheidt zich door een schat aan spelopties. Naast de nieuw toegevoegde BGaming-titels, biedt Spinko Casino een breed scala aan slots, crash games en live dealer ervaringen. Populaire providers zoals Pragmatic Play, Hacksaw Gaming, NetEnt en Evolution Gaming zijn al vertegenwoordigd, wat de kwaliteit van het aanbod garandeert.
De focus ligt duidelijk op het leveren van een uitgebreide bibliotheek. Met meer dan 70 spelproviders aan boord, is Spinko Casino erin geslaagd om een indrukwekkende verzameling te creëren die voldoet aan de wensen van een breed publiek. De slotsectie, die het grootste deel van de catalogus vormt, bevat hoge volatiliteitsspellen, bonus buy opties en Megaways-titels. Crash games, zoals het bekende Aviator, en diverse Plinko-variaties, bieden snelle actie en instant win potentieel. Ook het live casino is goed vertegenwoordigd, met honderden tafels en game shows, voornamelijk van Evolution Gaming en Live88.
Deze samenwerking met BGaming versterkt niet alleen de diversiteit, maar voegt ook een specifieke speelstijl toe. BGaming staat bekend om spellen die vaak directer aanvoelen en een breed scala aan spelers aanspreken, wat goed past bij de missie van Spinko om een toegankelijk platform te zijn.
Mijn Spinko Casino Ervaring Hoe Speelde Het Op Mobiel
Naast het uitgebreide spelaanbod, biedt Spinko Casino ook aantrekkelijke bonussen en een uitgebreid loyaliteitsprogramma. Nieuwe spelers kunnen profiteren van een welkomstpakket dat kan oplopen tot €2.200 en 350 gratis spins verspreid over de eerste vijf stortingen. Een minimum storting van €25 is vereist per bonusniveau, met standaard inzetvereisten van 40x voor bonusgeld en 35x voor winsten uit gratis spins. De maximale inzet tijdens het rondspelen van bonusgeld is €5.
Voor sportweddenschappen is er een apart welkomstpakket van 350% tot €1.000 over de eerste drie stortingen, of een ‘No Risk Bet’ tot €200. Dagelijkse cashback tot 35%, afhankelijk van je VIP-niveau, en wekelijkse reload bonussen maken het promotionele aanbod compleet. Het VIP-programma telt maar liefst 30 niveaus, waarbij spelers escalerende voordelen ontvangen, zoals hogere cashbackpercentages, verbeterde opnamelimieten en zelfs persoonlijke VIP-managers vanaf niveau 16.
Deze gestructureerde promoties, gecombineerd met de brede spelbibliotheek die nu ook BGaming-titels omvat, bieden spelers veel waarde en redenen om terug te keren. De loyaliteitspunten die via dagelijkse missies en quests verdiend kunnen worden, dragen bij aan de VIP-progressie en kunnen ingewisseld worden voor beloningen in de Bonus Shop, wat het gamification-aspect van het casino verder versterkt.
Spinko Casino ondersteunt een breed scala aan betalingsmethoden, wat het voor spelers uit diverse regio’s, waaronder Nederland en andere EU-landen, eenvoudig maakt om geld te storten en op te nemen. Je kunt gebruikmaken van gangbare creditcards zoals Visa en MasterCard, diverse e-wallets zoals Skrill, Neteller en MiFinity, en zelfs populaire opties zoals Apple Pay en Google Pay. Ook cryptovaluta zoals Bitcoin, Litecoin en Ethereum worden geaccepteerd, wat de moderne aanpak van het casino onderstreept.
De minimale storting is €20, hoewel voor het claimen van de meeste bonussen €25 vereist is. Opnames starten vanaf €10. De dagelijkse opnamelimiet is €3.000, met een maandelijkse limiet van €10.000, hoewel deze limieten kunnen variëren afhankelijk van je VIP-niveau. E-wallets en crypto-transacties worden doorgaans binnen 24 uur verwerkt, terwijl bankoverschrijvingen 2 tot 3 werkdagen in beslag kunnen nemen. Het casino ondersteunt diverse fiatvaluta’s zoals EUR, CAD, NOK en PLN, wat het gebruiksgemak voor internationale spelers verder vergroot.
De technische infrastructuur van Spinko Casino is ook het vermelden waard. Het platform is geoptimaliseerd voor mobiel gebruik via een Progressive Web App (PWA), wat snelle laadtijden en een naadloze ervaring op zowel iOS als Android garandeert zonder extra app-installatie. De interface is standaard in donkere modus, wat prettig is voor langdurige spelsessies. Deze aandacht voor detail in zowel betalingsverwerking als gebruikerservaring draagt bij aan het algemene imago van Spinko Casino als een betrouwbaar en spelergericht platform.
]]>