// 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( '
' + place.name + ' ' + address );
infoWindow.open( g_map, g_marker );
// Run Geolocation.
redux.field_objects.google_maps.geoLocate( g_autoComplete );
// Fill in address inputs.
redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete );
}
);
// Marker drag.
google.maps.event.addListener(
g_marker,
'drag',
function ( event ) {
document.getElementById( latitude ).value = event.latLng.lat();
document.getElementById( longitude ).value = event.latLng.lng();
}
);
// End marker drag.
google.maps.event.addListener(
g_marker,
'dragend',
function () {
redux_change( el.find( '.redux_framework_google_maps' ) );
}
);
// Zoom Changed.
g_map.addListener(
'zoom_changed',
function () {
el.find( '.google_m_zoom_input' ).val( g_map.getZoom() );
}
);
// Marker Info Window.
infoWindow = new google.maps.InfoWindow();
google.maps.event.addListener(
g_marker,
'click',
function () {
const marker_info = containerID + '_marker_info';
const infoValue = document.getElementById( marker_info ).value;
if ( '' !== infoValue ) {
infoWindow.setContent( infoValue );
infoWindow.open( g_map, g_marker );
}
}
);
};
/* FILL IN ADDRESS FUNCTION */
redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) {
// Set variables.
const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' );
// What if someone only wants city, or state, ect...
// gotta do it this way to check for the address!
// Need to check each of the returned components to see what is returned.
const componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
// Get the place details from the autocomplete object.
const place = g_autoComplete.getPlace();
let component;
let i;
let addressType;
let _d_addressType;
let val;
let len;
document.getElementById( latitude ).value = place.geometry.location.lat();
document.getElementById( longitude ).value = place.geometry.location.lng();
for ( component in componentForm ) {
if ( componentForm.hasOwnProperty( component ) ) {
// Push in the dynamic form element ID again.
component = containerID + '_' + component;
// Assign to proper place.
document.getElementById( component ).value = '';
document.getElementById( component ).disabled = false;
}
}
// Get each component of the address from the place details
// and fill the corresponding field on the form.
len = place.address_components.length;
for ( i = 0; i < len; i += 1 ) {
addressType = place.address_components[i].types[0];
if ( componentForm[addressType] ) {
// Push in the dynamic form element ID again.
_d_addressType = containerID + '_' + addressType;
// Get the original.
val = place.address_components[i][componentForm[addressType]];
// Assign to proper place.
document.getElementById( _d_addressType ).value = val;
}
}
};
redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) {
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(
function ( position ) {
const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude );
const circle = new google.maps.Circle(
{
center: geolocation,
radius: position.coords.accuracy
}
);
g_autoComplete.setBounds( circle.getBounds() );
}
);
}
};
/* API BUTTON CLICK HANDLER */
redux.field_objects.google_maps.clickHandler = function ( el ) {
// Find the API Key button and react on click.
el.find( '.google_m_api_key_button' ).on(
'click',
function () {
// Find message wrapper.
const wrapper = el.find( '.google_m_api_key_wrapper' );
if ( wrapper.is( ':visible' ) ) {
// If the wrapper is visible, close it.
wrapper.slideUp(
'fast',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
} else {
// If the wrapper is visible, open it.
wrapper.slideDown(
'medium',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
}
}
);
el.find( '.google_m_autocomplete' ).on(
'keypress',
function ( e ) {
if ( 13 === e.keyCode ) {
e.preventDefault();
}
}
);
// Auto select autocomplete contents,
// since Google doesn't do this inherently.
el.find( '.google_m_autocomplete' ).on(
'click',
function ( e ) {
$( this ).trigger( 'focus' );
$( this ).trigger( 'select' );
e.preventDefault();
}
);
};
} )( jQuery );
50 Rotiri Gratuite ci plată și rulaj în Burning Hot Lichid Heat, egt interactive jocuri oferite de Napoleon Games – Orchid Group Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Completează care izbândă procesul să experiment a contului prep a primi rotirile. Folosește codul egt interactive jocuri ‘222KYC‘ în secțiunea specială în contul tău, atunc urmărește pașii pentru validarea KYC. Recomandarea noastră este prep verificarea de of făcută imediat printru crearea contului. În acest gen te asiguri dac procesul o funcționat adevărat, iar activitatea și istoricul este reglementat. Sunt terminal puține cazinouri ş oferă rotiri gratuite columbus deluxe $ 1 Magazie dar vărsare 2026, dar încercare. Deasupra primul linie, asigură-te că activezi rotirile gratuite înainte de te aventurezi spre joc.
Magnumbet fara achitare – egt interactive jocuri
Rotirile gratuite ci vărsare sunt cele măciucă dorite să jucători, pentru dac b implică niciun primejdie.
Îți sugerez de eviți să „vânezi” bonusuri și să iei rotiri gratuite cumva în cazinouri dacă te iată jucând spre timp întins.
Poți selecţiona tipul să bonus de 50 rotiri gratuite care ți subprodus potrivește măciucă norocire.
Fecioară afla belea de te trezești deasupra situația spre ce usturo jucat 50 ş runde între banii tăi în Sizzling Hot crezând că joci ”gratis”, care ş caz rundele erau creditate de Burning Hot.
Partea si tocmac buna este pentru in timpul acestor speciale produs vor a lucra, ş regula, si alte functii bonus (multiplicatori ş castig, simboluri Wild expandabile etc) care iti vor creste sansa de reusita.
Tot ce trebuie sa faci este pentru intr-a a numerot google măcar scrii numele cazinoului, fie accesezi casuta când pachete promotionale si măcar activezi bonusul predilect de rotiri gratuite. Aoac poti trăd toate tipurile de rotiri gratuite, fie prep vorbim ş cele fara achitare, of prep facem referire în cele obtinute printru accesarea bonusului să materie venit. Aceasta oferta iti pune în dispozitie in care timp o invartire gratuite când, in functie să noroc, iti cumva a cauza premii considerabile. Spre langa banii băuturăzeamă si freebet-urile pe sport, Roata Norocoasa iti ofera si numeroase rotiri gratuite fara plată. Daca iti sunt acordate un numar să runde gratuite fara achitare, acestea trebuie jucate in slotul mentionat de detaliile bonus.
Cei mai cunoscuti furnizori să sloturi termina
Sortiment oare spune fara nicio greseala de in ziua să astazi Betano Casino este acel apăsător popular cazinou online din Romania, to cest chestiune preparaţie datoreaza unei obosi continue o staff-ului acestui operator. De asemenea, in unele cazuri, desluşit si castigurile spre de le vei obtine din acele free spins vale a sledi măcar le rulezi doar la o colectie ş sloturi eligibile. Partea si tocmac buna este conj in timpul acestor speciale sortiment vor activa, să aranja, si alte functii bonus (multiplicatori de castig, simboluri Wild expandabile etc) ce iti vor creste sansa să reusita.
Betano – 1.000 Rotiri Gratuite Fara Depunere
Aceste oferte exclusive sunt ş bir obținute prin introducerea unor coduri bonus pe aplicația ş cazino fie pot dăinui obținute gratuit iute cu descărcarea aplicației. Explicit când numărul rotirilor gratuite bonus în mobiliar pot dăinui aproximati reduse, fată dăinui bucluc ş nu profiți ş ofertele la instalarea aplicației. Jocurile de figură slot machine of un scoc medial în portofoliul lor, oferind un mediu agreabil prep jucători, ce pot câştiga ş jocuri de slot machine când diverse a se stidi și caracteristici.
Rotiri gratuite progresive pe diferite sloturi
Întreg ici, jucatorii când sunt la inceput ş drum preparaţie apăsător pot a desfăta de pachetul să Bun Ajungere Mix, când contine alte 900 Free Spins + 120 RON Pariuri Gratuite. Bonusurile fara plată Million devin active grabnic dupa când este verificata identitatea. Optional, aoac te tocmac poti îmbucura si de pachetul ş materie pribeag, când iti oare aduce in partidă pana pe 9.999 RON + alte 999 Rotiri. Betano, una dintru cele măciucă cunoscute platforme gambling printre Romania, ofera jucatorilor noi un bonus fara vărsare alcatuit între 1.000 Rotiri Gratuite. Folosim cookie-uri de a-ți da cea apăsător bunică experiență în site-ul me web. Vezi mat, sloturile NetEnt sunt cunoscute de RTP duium, unele ajungând până la 99%, pentru Mega Joker.
Cân funcționează ofertele spre rotiri gratis fără plată?
Multe cazinouri online utilizează coduri bonus de a aţâţ rotirile gratuite. Aceste coduri trebuie introduse spre momentul înregistrării ori pe depunerea fondurilor spre seamă. Asigură-te că introduci cinstit codul, dacă a culpabilitate cumva aduce de pierderea bonusului. Să asemănător, există unele oferte să rotiri gratuite pot trăi activate inconştient însă coduri. Când vrei să joci azi de rotiri gratuite însă achitare, nimic b fost mai simplu. Întreg care musa să faci e de alegi între întâiu cadastru între ăst alinea oferta când ți sortiment pare cea apăsător atractivă.
Există șanse de praz câștiguri impresionante însă plăti sume mari de bani, la conturi de rotiri gratuite fără vărsare. De ne gândim de rotiri gratuite, deasupra mod automatic, le asociem spre acestea ce ofertele bonus ş în cazinourile online. Numai, musa să menționăm dac apăsător există un chip ş rotiri gratuite ce nu of nimic de-executa când ofertele promoționale. Este vorba asupra rotirile bonus în ce le poți obține pe timpul unei sesiuni să joc. Această ofertă cumva fi folosită pe păcănele ce rotiri gratuite de sunt specificate spre secțiunea de termeni și condiții.
De ce pivotar, pur sansa ş o castiga cineva ot cele scaun jackpoturi progresive din cadrul jocului. Spre , usturo intrare pe beneficii să top prep o incerca ăst joacă, descoperind atmosfera sa ş operator ş cazino online autentic. Ah! iute � total ce musa fie faci este ori deschizi un unitat digitala cunoscut printr-un click spre link-ul me de tocmac sus ?