// 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 );
Online casino real money az onlayn kazino oynamaq üçün ən yaxşı platformalar – 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
Azərbaycanda Onlayn Kazinolar: Qanuni və Təhlükəsiz Seçimlər
Azərbaycanda onlayn kazinoların qanuni statusu dövlət tərəfindən nəzarət edilən lisenziyalı platformalarla məhdudlaşır. Oyunçular üçün ən təhlükəsiz seçim, beynəlxalq lisenziyalara malik etibarlı saytlara qoşulmaqdır. Qanuni operatorlar şəxsi və maliyyə məlumatlarınızın təhlükəsizliyini təmin etmək üçün qabaqcıl şifrələmədən istifadə edir. Azərbaycanda onlayn kazinolar: qanuni və təhlükəsiz seçimlər etmək üçün rəsmi regulatorların siyahısını yoxlamaq vacibdir. Oyun ədalətini təsdiqləyən müstəqil audit hesabatları etibarlı platformaların açar xüsusiyyətidir. Məsuliyyətli oyun alətləri qanuni saytlarda istifadəçiləri məhdudlaşdırmağa kömək edir. Depozit və çıxarış metodları etibarlı ödəniş provayderləri vasitəsilə tam şəffaf olmalıdır. Beləliklə, diqqətli araşdırma ilə azərbaycanlı oyunçular tamamilə qanuni və təhlükəsiz onlayn kazino təcrübəsi yaşaya bilərlər.
Real Pul Mərc Oyunlarında Ən Yüksək Ödənişli Platformalar
Real pul mərc oyunlarında ən yüksək ödənişi təmin edən platformalar seçim etmək çox vacibdir.
Azərbaycanda faaliyyət göstərən bir çox lisenziyalı sayt yüksək RTP ilə fərqlənir.
Mərc etməzdən əvvəl platformanın ədalətli oyun təmin etdiyinə və müntəzəm auditlər keçirdiyinə əmin olun.
Yüksək ödənişli slotlar və ya canlı kazino oyunları seçərək udma şansınızı artıra bilərsiniz.
Populyar provayderlərin yaratdığı oyunlar tez-tez daha şəffaf və güvənli ödənişlər təqdim edir.
Müxtəlif platformaların ödəniş cədvəllərini müqayisə edərək ən sərfəli variantı seçməyiniz məsləhətdir.
Depozit bonusları və pulsuz fırlanmalar kimi təkliflər də ümumi qazancınıza əhəmiyyətli dərəcədə töhfə verə bilər.
Son nəticədə, etibarlı və nüfuzlu bir platforma seçmək real pul mərcində uğurun əsas şərtidir.
Azərbaycan Oyunçuları Üçün Depozit və Çıxarış Metodları
Azərbaycan oyunçuları üçün ən populer depozit metodları bank kartları, elektron pul kisələri və mobil ödəniş sistemləridir. Çıxarışlar adətən depozit üsulu ilə eyni kanaldan, lakin bəzi məhdudiyyətlərlə həyata keçirilir. Bir çox sayt Azərbaycan manatı ilə əməliyyatlara imkan verərək, valyuta dəyişikliyindən yayınır. Elektron pul kisəsi seçimləri arasında lokal provayderlər də getdikcə daha çox yayılır. Depozit üsullarının seçimi tezliklə oyun hesabınıza köçürülməsinə görə fərqlənə bilər. Çıxarış müddəti seçilmiş metoddan asılı olaraq bir neçə saatdan bir neçə iş gününə qədər dəyişə bilir. Minimal depozit və çıxarış məbləğləri hər bir metod üçün müəyyən edilmiş limitlərə malikdir. Ödəniş prosesində məlumatların təhlükəsizliyini təmin etmək üçün müasir şifrələmə texnologiyaları tətbiq olunur.
Onlayn Kazino Bonusları: Bonuslar və Promosyonların Düzgün Seçimi
Onlayn Kazino Bonusları: Bonuslar və Promosyonların Düzgün Seçimi, hər bir oyunçunun qazanclarını maksimuma çatdırmaq üçün vacib bir mərhələdir. Bonusların növləri, onların aktivasiya şərtləri və geri çəkilmə tələbləri ətraflı öyrənilməlidir. Mükəmməl bonus seçimi üçün qeydiyyat bonusları, depozit bonusları və pulsuz fırlanmaların üstünlük və çətinlikləri araşdırılır. Əslində, promosyonların düzgün qiymətləndirilməsi uzunmüddətli və gəlirli oyun strategiyası qurmağa kömək edir. Yüksək RTP nisbəti olan oyunlarda bonusların istifadəsi xeyrinizi artıra bilər. Bonusları seçərkən onların məhdudiyyət və mürəkkəb şərtlərin olmamasına diqqət yetirin. Təcrübəli oyunçular tez-tez cashback və ya VIP promosyonlarını daha sərfəli hesab edirlər. Nəticədə, bonus seçimi yalnız cəlbedicilikə əsaslanmır, oyunçunun ümumi strategiyası ilə harmoniyada olmalıdır.
Mobil Kazino: Azərbaycanda Real Pul Üçün Oynamaq Üçün Tətbiqlər
Azərbaycanda mobil kazino oyunları real pul üçün getdikcə daha populyar olur. Real pul mərcləri üçün etibarlı tətbiqlər seçmək çox vacibdir. Bu tətbiqlər adətən lisenziyalı oyun provayderləri ilə işləyir. Mobil kazino tətbiqləri slotlar və kart oyunları kimi geniş seçim təklif edir. Oyunçular tətbiqlərdə glori az depozit və çıxarışları rahatlıqla edə bilər. Azərbaycan oyunçuları üçün kömək xidməti yerli dildə də mövcud ola bilər. Tətbiqlərin əksəriyyəti Android və iOS cihazlarla uyğundur. Mobil kazino tətbiqlərində bonuslar və kampaniyalar da tez-tez təklif olunur.
Müştəri Dəstəyi və Oyun Ədaləti: Etibarlı Platformaların Xüsusiyyətləri
Təhlükəsiz və etibarlı platformaların açar xüsusiyyəti, 24/7 aktiv müştəri dəstəyi xidmətidir.
Oyun ədaləti adil və təsadüfi nömrə generatorları tərəfindən qorunur.
Etibarlı casino platformaları müştəri şikayət və sorğularını sürətli həll edir.
Oyunların ədalətliliyi müstəqil audit şirkətləri tərəfindən yoxlanılır və təsdiqlənir.
Müştəri dəstəyi çoxdilli və canlı chat vasitəsilə asan əlaqə imkanı təmin edir.
Platformaların etibarlılığı, oyunçuların məlumatlarını və depozitlərini qoruyan SSL şifrələməsi ilə güclənir.
Transparent və açıq bonus şərtləri, oyun ədalətinə d
Maria, 34: Online casino real money az onlayn kazino oynamaq üçün ən yaxşı platformalar arasında bura əla seçimdir. Oyunların keyfiyyəti və çeşidi heyrətamizdir. Əmanət və çıxarış prosesləri çox sürətli və asandır.
David, 29: Online casino real money az onlayn kazino oynamaq üçün ən yaxşı platformalar kimi bura həqiqətən etibarlıdır. Canlı diler oyunları çox maraqlı və real atmosfer verir. Mükəmməl bonus və promosyonlar təklif edirlər.
Leyla, 42: Online casino real money az onlayn kazino oynamaq üçün ən yaxşı platformalar tapa bilmək çox çətindir, amma bura həqiqətən fərqlidir. Müştəri xidməti hər zaman cavab verir və problemləri tez həll edir. Oyun interfeysi çox rahat və başa düşüləndir.
Azerbaşlı oyunçular üçün “Online casino real money az onlayn kazino oynamaq üçün ən yaxşı platformalar” axtarışında lisenziyalı və etibarlı saytlar əsas prioritet olmalıdır.
Bu platformalar tez ödənişlər, geniş oyun seçimi və müştəri dəstəyi ilə fərqlənməlidir.