// 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( '
Los casinos móviles son plataformas de juego que permiten a los usuarios acceder a juegos de azar a través de sus teléfonos inteligentes y tabletas. Estos casinos ofrecen una experiencia similar a la de los casinos físicos, pero con la ventaja de poder jugar en cualquier lugar y en cualquier momento. Con la creciente penetración de smartphones y el acceso a internet de alta velocidad, el número de usuarios de casinos móviles ha crecido exponencialmente.
Los casinos móviles presentan varias características que los hacen atractivos para los jugadores:
La mayoría de los casinos móviles ofrecen una amplia gama de juegos, que incluyen tragamonedas, juegos de mesa como el póker y la ruleta, y juegos en vivo con crupieres reales. Esta diversidad permite a los jugadores elegir entre diferentes estilos de juego y experimentar nuevos títulos.
Una de las principales ventajas de los casinos móviles es su accesibilidad. Los jugadores pueden acceder a sus juegos favoritos en cualquier momento y lugar, ya sea durante un viaje en transporte público o en la comodidad de su hogar.
Los casinos móviles suelen ofrecer atractivas bonificaciones y promociones para atraer a nuevos jugadores y mantener a los existentes. Estos pueden incluir bonos de bienvenida, giros gratis y promociones de reembolso, lo que aumenta la motivación para jugar.
La seguridad es una preocupación primordial para los jugadores en línea. Los casinos móviles utilizan tecnología de encriptación avanzada para proteger la información personal y financiera de los usuarios. Además, muchos de ellos están regulados por autoridades de juego, lo que garantiza un entorno de juego seguro y justo.
Los casinos móviles ofrecen varias ventajas que los hacen preferibles para muchos jugadores:
La posibilidad de jugar en cualquier lugar y en cualquier momento es uno de los mayores atractivos de los casinos móviles. Los jugadores no están limitados a un lugar específico y pueden disfrutar de sus juegos favoritos en su tiempo libre.
Muchos casinos móviles ofrecen funciones de chat en vivo y juegos en vivo, lo que permite a los jugadores interactuar con crupieres y otros jugadores. Esta interacción social mejora la experiencia de juego y la hace más atractiva.
Los casinos móviles están a la vanguardia de la innovación tecnológica. Incorporan características como la realidad aumentada y la realidad virtual, que mejoran la experiencia de juego y atraen a un público más amplio.
A pesar de sus muchas ventajas, los casinos móviles también presentan algunas desventajas:
Jugar en un dispositivo móvil puede ser menos cómodo que hacerlo en una computadora de escritorio. Las pantallas más pequeñas pueden dificultar la visualización de ciertos juegos, especialmente aquellos que requieren atención a los detalles.
La experiencia de juego en un casino móvil depende en gran medida de una buena conexión a internet. Las conexiones lentas o inestables pueden interrumpir el juego y afectar la experiencia del usuario.
El acceso fácil y constante a los casinos móviles puede aumentar el riesgo de adicción al juego. Los jugadores pueden sentirse tentados a jugar más de lo que deberían, lo que puede llevar a problemas financieros y emocionales.
El crecimiento de los casinos móviles ha tenido un impacto significativo en la industria del juego en línea. A medida que más jugadores optan por jugar en sus dispositivos móviles, los operadores de casinos han tenido que adaptarse a esta tendencia. Esto ha llevado a un aumento en la inversión en tecnología y desarrollo de aplicaciones, así como a una mayor competencia entre los operadores.
Además, la popularidad de los casinos móviles ha impulsado la regulación del juego en línea en muchos países. Las autoridades están trabajando para establecer marcos legales que protejan a los jugadores y aseguren un entorno de juego responsable.
El futuro de los casinos móviles parece prometedor. Con el continuo avance de la tecnología, es probable que veamos más innovaciones en la forma en que los jugadores interactúan con los juegos. La inteligencia artificial y la personalización de la experiencia del usuario son áreas que están comenzando a explorarse y que podrían cambiar aún más el panorama del juego en línea.
Además, el crecimiento de las criptomonedas y la tecnología blockchain también podría influir en la forma en que los casinos móviles operan, ofreciendo nuevas formas de transacciones y aumentando la seguridad.
En conclusión, los casinos móviles han revolucionado la forma en que las personas juegan y acceden a los juegos de azar. Con su comodidad, variedad de juegos y características innovadoras, han atraído a una amplia gama de jugadores. Sin embargo, también es importante ser consciente de las desventajas y los riesgos asociados. A medida que la industria continúa evolucionando, es fundamental que los jugadores se mantengan informados y jueguen de manera responsable.
