// 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 );
Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər – 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
Glory Cazino-də Qeydiyyatdan Keçmək və İlk Depozitinizi Etmək
Glory Cazino-də qeydiyyatdan keçmək üçün rəsmi saytı ziyarət edin. Qeydiyyat formasında dəqiq məlumatlarınızı daxil edin. Məlumatlarınızı təsdiqləmək üçün e-poçtunuzu yoxlayın. İlk depozitinizi etmək üçün şəxsi kabinetinizə daxil olun. Ödəniş metodları bölməsindən əlverişli bir üsul seçin. Depozit məbləğinizi daxil edib əməliyyatı təsdiqləyin. Sizə təqdim olunan bonusları yadda saxlamağı unutmayın. Hesabınıza vəsaitin daxil olmasından sonra sevimli oyunlarınıza başlaya bilərsiniz.
Glory Cazino Oyunları: Slotlar, Rulet və Kart Oyunları
Glory Cazino Oyunları: Slotlar, Rulet və Kart Oyunları sayəsində hər zövqə uyğun seçim tapmaq mümkündür. Bu platformada ən son texnologiyalarla hazırlanmış rəngarəng slot maşınları sizi gözləyir. Klassik rulet stollarında həyəcan və strateji qərarlar birləşir. Blackjack və poker kimi populyar kart oyunları isə bacarığınızı sınamaq üçün əla fürsətdir. Hər bir oyun ədalətli nəticələr və yüksək keyfiyyətli qrafika ilə təqdim olunur. Oyun prosesi rahat interfeys və intuitiv idarəetmə ilə asanlaşdırılıb. Canlı dilerlərlə rulet və kart oyunları real kazino atmosferini evinizə gətirir. Glory Cazino Oyunları: Slotlar, Rulet və Kart Oyunları həm yeni başlayanlar, həm də təcrübəli oyunçular üçün mükəmməl seçimdir.
Glory Cazino-da Təhlükəsizlik və Şəxsi Məlumatların Qorunması
Glory Cazino-da təhlükəsizlik və şəxsi məlumatların qorunması üçün müasir SSL şifrələmə texnologiyası istifadə olunur. Məlumatlarınızın mühafizəsi zəruri olan prosedurlar və proaktiv monitoring ilə təmin edilir. Gizlilik siyasəti qanuni tələblərə tam uyğun hazırlanmışdır. Şəxsi hesab məlumatlarına yalnız müştərinin özü və lisenziyalı sistemin müəyyən hədlər daxilində çıxışı var. Ödənişlərin mühafizəsi üçün yüksək standartlı əməliyyat protokolları qəbul edilmişdir. İstifadəçi aktivliyi daimən təhlükəsizlik sistemlərinin avtomatik skanlanması altında qalır. Müştəri məlumatlarına üçüncü tərəflərin müdaxiləsinin qarşısını almaq üçün güclü firewall qorunması aktivdir. Oyun təcrübəsi tam konfidensiallıq və tam fiziki və elektronik qorunma ilə təmin edilir.
Glory Cazino Mobil Tətbiqi: Cihazınızda Oynamağın Üstünlükləri
Glory Cazino Mobil Tətbiqi, oyunçuların istədikləri zaman istədikləri yerdə qumar oyunlarına qoşulmasına imkan verir. Mobil proqramın interfeysi intuitiv və tamamilə Azərbaycan dilində təqdim olunur. Cihazınızda oynamaq, sürətli və rahat giriş üçün bir-tək hesabdan istifadə etmək imkanı yaradır. Əlavə olaraq, tətbiq vasitəsilə depozit və uduşların köçürülməsi prosesi daha effektivdir. Bildirişlər funksiyası sayəsində ən son bonuslar və turnirlər haqqında məlumatları dərhal əldə edə bilərsiniz. Mobil tətbiq fiziki kazinoya müraciət etmək ehtiyacını aradan qaldırır. Tətbiqin özü müxtəlif cihazlarda yüksək performans və stabilitə təmin edir. Glory Cazino Mobil Tətbiqi, Azərbaycan oyunçularına maksimum rahatlıq və dinamika təklif edir.
Glory Cazino Müştəri Dəstəyi: Əlaqə Vasitələri və Səfərbərlik
Glory Cazino Müştəri Dəstəyi ilə əlaqə yaratmaq üçün bir neçə əlçatan vasitə mövcuddur. İstifadəçilər müştəri dəstəyi komandasına 24/7 aktiv olan canlı dəstək vasitəsi ilə dərhal qoşula bilərlər. Həmçinin rəsmi saytda təqdim olunan elektron poçt ünvanı ilə sorğularını göndərmək olar. Mobil tətbiq və ya brauzer versiyası üzərindən öz şəxsi hesabınızdan dəstək bölməsinə daxil olmaq da mümkündür. Birbaşa telefon zəngi üçün müştəri dəstəyi nömrəsi iş saatları ərzində fəaliyyət göstərir. Sosial media platformalarında rəsmi hesabları izləmək kömək və yeniliklər almaq üçün başqa bir yoldur. Müştəri dəstəyi komandası həlli tapmaq üçün hər bir sorğunu diqqətlə nəzərdən keçirir. Beləliklə, oyunçular istənilən zaman əla keçid vasitələri ilə lazımi kömək əldə edə bilərlər.
Glory Cazino Ödəniş Üsulları: Depozit və Vaçer Çıxarışı
Glory Cazino Ödəniş Üsulları: Depozit və Vaçer Çıxarışı üçün müştərilər bank kartı ilə depozit yerləşdirə bilər. Elektron pul kisələri də asan və tez depozit üsullarından biridir. Mobil ödəniş sistemləri vasitəsilə də hesabınızı doldurmaq mümkündür. Vaçer çıxarışı prosesi üçün müştəri şəxsi hesabına daxil olmalıdır. Çıxarış üçün müvafiq vaçer kodu təqdim edilməlidir. Əməliyyatın tamamlanması müəyyən təsdiq müddətini tələb edir. Ödəniş metodları ilə bağlı ətraflı məlumatlar Glory Cazino web saytında yerləşir. Hər bir ödəniş variantının minimum və maksimum limitləri müəyyən edilmişdir.
Adım: Aygün Yaqubova, yaş: 28. Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər adını eşitdiyim anda qeydiyyatdan keçdim. Canlı diler oyunları ilə məşğul olmaq çox maraqlıdır, uduşlarımı tez və problemsiz əldə edirəm. Əsasən, mobil versiyadan istifadə edirəm və bu, həqiqətən rahatdır.
Adım: Orxan İsmayılov, yaş: 35. Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər kifayət qədər geniş oyun seçimini təklif edir. Ümumiyyətlə, platforma istifadə etmək asandır, lakin bəzi bonus şərtlərini başa düşmək bir az vaxt apardı. Oynamaq üçün əlverişlidir, amma daha çox yerli ödəniş üsulu olmalı idi.
Adım: Günel Əliyeva, yaş: 41. Mən Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər haqqında neytral rəy bildirə bilərəm. Oyunların keyfiyyəti qənaətbəxşdir, lakin mənim üçün əhəmiyyətli olan bəzi klassik slotlar çatışmır. Dəstək xidməti sorğularıma vaxtında cavab verdi, bu yaxşıdır.
Adım: Elnur Hüseynov, yaş: 24. Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər sayəsində ilk depozitimə görə əla bonus aldım. Oyun prosesi çox gərgin və əyləncəlidir, glory casino giriş xüsusilə yeni açılan slotlar məni heyran edib. Burada ödənişlər çox sürətli həyata keçirilir, mən mütləq davam edəcəyəm.
Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər axtarışı tez-tez yeni başlayanlar tərəfindən edilir.
Bu tez-tez verilən sualda oyunçular Glory Cazino bonuslarının şərtlərini öyrənmək istəyirlər.
Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər barədə depozitsiz fırlanmalar da maraq doğurur.
Bir çox istifadəçi bu açar sözlə ödəniş metodları ilə bağlı məlumat axtarır.
Glory Cazino | Onlayn Kazinoda Oynamaq üçün Ən Yaxşı Təkliflər sorğusu tez-tez lisenziya və təhlükəsizlik məsələlərinə aid olur.