// 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( '
Se você está em busca de uma experiência única e emocionante no universo dos cassinos online, o Woopwin Casino BR é definitivamente o lugar certo para você. Com uma vasta gama de jogos, promoções incríveis e um ambiente de jogo imersivo, Woopwin tem se destacado como uma das principais opções para os amantes de apostas no Brasil. Neste artigo, vamos explorar tudo que este cassino tem a oferecer, desde seus jogos mais populares até dicas valiosas para maximizar sua experiência.
O Woopwin Casino BR foi fundado com a missão de proporcionar uma plataforma de jogos online divertida e segura para jogadores brasileiros. Desde seu lançamento, o cassino tem investido em tecnologia de ponta e em parcerias com desenvolvedores renomados para garantir que cada jogador tenha acesso a uma experiência premium.
A visão do Woopwin é ser reconhecido como o cassino online favorito dos brasileiros, oferecendo não apenas jogos de qualidade, mas também um atendimento excepcional e um ambiente seguro. A missão é criar um espaço onde todos possam se divertir e, ao mesmo tempo, ter a chance de ganhar prêmios incríveis.
No Woopwin Casino BR, a variedade de jogos é impressionante. Os jogadores podem desfrutar de uma ampla gama de opções que vão desde as clássicas máquinas caça-níqueis até jogos de mesa e um cassino ao vivo emocionante. Aqui estão alguns dos principais tipos de jogos que você pode encontrar:
As máquinas caça-níqueis são, sem dúvida, uma das atrações mais populares do Woopwin. Com temas variados, gráficos impressionantes e bônus atraentes, estas máquinas garantem diversão sem fim. Algumas das categorias incluem:
Os jogadores que preferem um pouco mais de estratégia apreciarão a seleção de jogos de mesa disponíveis. O Woopwin oferece:
Para aqueles que buscam uma experiência mais realista, o cassino ao vivo do Woopwin permite que os jogadores interajam com dealers em tempo real. Isso cria uma atmosfera vibrante e social, ideal para quem gosta de jogar com amigos ou mesmo conhecer novas pessoas.
O Woopwin Casino BR se destaca pela generosidade de suas promoções. Novos jogadores são recebidos de braços abertos com um bônus de boas-vindas que pode incluir:
Além dos bônus, o Woopwin possui um programa de fidelidade que recompensa jogadores constantes com pontos que podem ser trocados por prêmios ou experiências exclusivas.
A segurança é uma prioridade no Woopwin Casino BR. O site utiliza tecnologia de criptografia avançada para proteger as informações pessoais e financeiras dos jogadores. Além disso, o cassino é licenciado e regulado por autoridades respeitáveis, oferecendo um ambiente de jogo justo e transparente.
O Woopwin se preocupa com o bem-estar de seus jogadores. O cassino oferece ferramentas para ajudar a manter o controle sobre o jogo, incluindo limites de depósito e opções https://woopwincasinobr.com/ de autoexclusão.
O Woopwin Casino BR oferece uma variedade de métodos de pagamento para facilitar os depósitos e saques dos jogadores. Aqui estão alguns dos métodos disponíveis:
| Método | Depósito Mínimo | Tempo de Processamento |
|---|---|---|
| Cartão de Crédito | R$ 30 | Imediato |
| Boleto Bancário | R$ 50 | 1-3 dias úteis |
| Transferência Bancária | R$ 50 | 1-2 dias úteis |
| Carteiras Eletrônicas | R$ 20 | Imediato |
O suporte ao cliente do Woopwin Casino BR é altamente eficiente e acessível. Os jogadores podem entrar em contato por meio de:
A equipe está disponível 24 horas por dia para resolver qualquer dúvida ou problema que os jogadores possam ter.
Aproveitar ao máximo sua experiência no Woopwin Casino BR pode ser simples com algumas dicas úteis:
O Woopwin Casino BR se destaca como uma plataforma de jogos online que combina diversão, segurança e uma ampla variedade de opções de jogos. Seja você um jogador novato ou experiente, há sempre algo novo e excitante para descobrir. Aproveite as promoções, jogue de forma responsável e, acima de tudo, divirta-se. Boa sorte nas mesas encantadas do Woopwin!
]]>