// 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( '
Willkommen in der aufregenden Welt von Tipwin de, wo das Spielerlebnis auf ein neues Level gehoben wird! Dieses Online-Casino bietet eine Vielzahl von Spielen, großen Jackpots und ein Benutzererlebnis, das selbst die anspruchsvollsten Spieler begeistert. In diesem Artikel erfährst du alles, was du über Tipwin Casino wissen musst, um das Maximum aus deinem Spielerlebnis herauszuholen.
Das Tipwin Casino hat sich als einer der führenden Anbieter im Bereich Online-Glücksspiel etabliert. Mit einer benutzerfreundlichen Oberfläche und einer Vielzahl von Spielen erfüllt es alle Anforderungen von Spielern, die auf der Suche nach erstklassigen Unterhaltungsmöglichkeiten sind. Egal, ob du ein erfahrener Spieler oder ein Neuling bist, hier findest du alles, was dein Herz begehrt.
Das Spielangebot bei Tipwin de ist unvergleichlich. Von klassischen Tischspielen bis hin zu modernen Spielautomaten – hier ist für jeden Geschmack etwas dabei. Im Folgenden siehst du eine Übersicht über die verschiedenen Kategorien von Spielen:
| Kategorie | Beispiele | Besonderheiten |
| Spielautomaten | Starburst, Gonzo’s Quest | Hohe Auszahlungsquoten |
| Tischspiele | Blackjack, Roulette | Live Dealer Optionen verfügbar |
| Jackpot-Spiele | Mega Moolah, Divine Fortune | Lebensverändernde Jackpots |
| Sportwetten | Fußball, Basketball | Live-Wetten möglich |
Bei Tipwin de wird der Spieler mit zahlreichen Bonusaktionen und Promotions belohnt. Diese Angebote helfen dir, dein Budget zu maximieren und mehr aus deinem Spielerlebnis herauszuholen. Hier sind einige der beliebtesten Bonusarten:
Die Auswahl an Zahlungsoptionen bei Tipwin Casino ist vielfältig und sicher. Spieler können zwischen verschiedenen Methoden wählen, um Einzahlungen und Auszahlungen vorzunehmen. Hier sind einige der gängigsten Zahlungsmethoden:
| Zahlungsmethode | Einzahlungszeit | Auszahlungszeit |
| Visa/Mastercard | Sofort | 1-3 Werktage |
| Skrill | Sofort | 24 Stunden |
| Neteller | Sofort | 24 Stunden |
| Banküberweisung | 1-3 Werktage | 2-5 Werktage |
Der Kundensupport von Tipwin de ist stets bereit, dir bei Fragen oder Problemen zu helfen. Das Support-Team ist rund um die Uhr verfügbar und kann über verschiedene Kanäle kontaktiert werden:
Die mobile Plattform von Tipwin Casino ermöglicht es dir, jederzeit und überall zu spielen. Egal, ob du ein Smartphone oder ein Tablet verwendest, die mobile Webseite ist benutzerfreundlich gestaltet und bietet eine nahezu identische Spielerfahrung wie die Desktop-Version.
Die Sicherheit der Spieler hat bei Tipwin de höchste Priorität. Das Casino verwendet moderne Verschlüsselungstechnologien, um deine Daten zu schützen und ein sicheres Spielumfeld zu gewährleisten. Zudem sind alle Spiele von unabhängigen Institutionen getestet, um die Fairness zu garantieren.
Zusammenfassend lässt sich sagen, dass Tipwin Casino ein herausragendes Online-Glücksspielerlebnis bietet. Mit einer Vielzahl von Spielen, attraktiven Bonusaktionen, flexiblen Zahlungsmethoden und exzellentem Kundensupport ist es der perfekte Ort für alle Glücksspiel-Enthusiasten. Probier es aus und entdecke die unendlichen Möglichkeiten, die Tipwin de zu bieten hat!
]]>