// 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 );
کازینوی Gratorama – 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
خیر، هیچ مجموعه دیلر زندهای وجود ندارد، در حالی که NetoPlay هنوز یکی را راهاندازی نکرده است، با این حال، هنوز هزاران بازی به علاوهی بندرگاهها وجود دارد و ممکن است یادداشتهای سایش داشته باشید. تمام بازیهای ویدیویی را میتوان به صورت آنلاین بازی کرد، بنابراین آنها واقعاً هیچ یک از بستههای دیگری نیستند که در دستگاه شما نصب شده باشند. در حال حاضر، Gratorama بیش از ۸۰ بازی دیگر ارائه میدهد و به طور منظم نیز نصب میشوند. هنگام ایجاد یک حساب کاربری رایگان، بازیکنان باید با راهنمایی دقیق و واقعی بازی کنند، در حالی که کازینو ممکن است هنگام درخواست برداشت، از شما درخواست تأیید هویت کند.
ایدههایی برای برداشت درآمد واقعی از طریق سایت شرطبندی موبایل Gratorama دارید؟
Gambling Establishment.master در واقع یک منبع مستقل از اطلاعات واقعی در مورد کازینوهای آنلاین است و شما میتوانید بازیهای کازینو را بدون وابستگی به یک آژانس قمار انجام دهید. بسیاری از شرکتهای قمار دارای بازیهای ویدیویی تخصصی زنده هستند، اما میتوان از مشوقهای بدون سپرده برای آنها استفاده کرد. مشوقهای بدون سپرده برای افراد جدید معمولاً پس از ایجاد حساب کازینوی خود، به طور خودکار به عضویت شما اضافه میشوند. پاداشهای کازینوی آنلاین ارائه شده به شرکتکنندگان TR را بررسی کنید. با توجه به لیست بازیهای جدید کازینو، پرداختهای بزرگ، برداشت آسان و وبسایت وابسته شما، دلایل واضحی وجود دارد که Gratorama یکی از محبوبترین شرکتهای قمار با درآمد واقعی است.
مزایا و معایب کازینوی Gratorama دقیقاً چیست؟
موسسه قمار Gratorama دارای یک نرمافزار کاربرپسند است که به افراد تازهکار و همچنین متخصصان باتجربه امکان دریافت کدهای جایزه اضافی را میدهد.
شما ۴۸ بازی سرگرمکنندهی اسکرپینگ و ۳۱ بازی اسکرپینگ کازینویی پیدا خواهید کرد.
تمام بازیهای اسلات دارای تصویر متخصص هستند و شما کلیپهای صوتی و انگیزه زیادی خواهید داشت.
با این حال، معمولاً بعد از هر مثال، از حساب کاربری خودتان استفاده کنید، به خصوص وقتی که از یک ابزار شخصیِ شناختهشده برای دسترسی مستقیم به وبسایت استفاده میکنید.
دقت در هر مرحله، فرصت شما را برای استفاده از معاملات ویژه با فضیلت کامل افزایش میدهد. متخصصان کانادایی میتوانند با دنبال کردن این فرآیند آسان، فوراً در Gratorama به مزایای آنی دست یابند. پس از آماده شدن همه چیز، کاربران میتوانند به سادگی به همه ویژگیها دسترسی پیدا کنند و از حس شرطبندی جدید خود نهایت استفاده را ببرند.
هر روز، جدیدترین کازینو مسابقات منحصر به فردی را با قالبهای اختصاصی برگزار goldbet ۲۰۲۴ بدون واریز میکند و شما میتوانید جوایزی را رزرو کنید که همه در آن مشترک هستند. پیشرفتها ایجاد شدهاند، مهم نیست که او چقدر میتواند در هر آموزش شرطبندی موفق باشد، به علاوه امتیازات VIP کسب شده به آنها کمک میکند تا از نردبان جدید بالا بروند. این به آنها زمان زیادی میدهد تا با روش جدید انتقال شروع کنند، بنابراین در نهایت میتوانند بردها را نقد کنند.
در حال حاضر، بهترین شرکت نرمافزاری، بیش از دویست مجموعه بازی آنلاین جدید Netoplay، iSoftBet و Leander Video را عرضه میکند. کازینو Gratorama از فناوری رمزگذاری SSL استفاده میکند تا تمام اطلاعات شخصی شرکتکنندگان و تقریباً هر اطلاعات حساس و مهم دیگری که قابل انتشار در کسبوکارها نباشد، ایمن باقی بماند. توجه داشته باشید که Gratorama اکنون در صورت استفاده از Skrill، Paysafecard یا Best، 15٪ اضافی و در صورت استفاده از Sofort (Klarna) به عنوان مبلغ پورسانت، 25٪ شگفتانگیز ارائه میدهد. اکنون میتوانید با جایزه جدید Gratorama بدون واریز، لذت ببرید.
فروش و تبلیغات دیگری برای کمک به شما در بازی آنلاین وجود دارد؟ کازینو Gratorama یک وبسایت بسیار جذاب با بازیهای آنلاین فوقالعاده در داخل آن است. اگر خوششانس هستید که میتوانید از یکی از بازیهای Gratorama سود خاصی کسب کنید، حتماً مراحل برداشت ساده را طی کنید. چرا با کارت بانکی، ویزا، پیسیفکارت یا عضویت Neteller خود واریز خود را انجام نمیدهید؟
صرفاً به این دلیل که یک کازینو چرخشهای رایگان (یا حتی هرگونه مشوقی به عنوان مثال) ارائه میدهد، به این معنی نیست که شما میخواهید فوراً یک عضویت بازیکن جدید ایجاد کنید تا بتوانید او را تصاحب کنید. به عنوان مثال، پیشنهاداتی به بازیکنان حرفهای ارائه میدهد که دسترسی سریع به بازی امتیازی را بدون نیاز به شروع موجودی اضافی ارائه میدهند. صفر، اینکه کازینو آنلاین آن زبانهای مختلفی را نیز ارائه میدهد. به طور کلی، شرکت قمار Gratorama همچنین بازی NetoPlay را ارائه میدهد که RTP جدید آن 95٪ است، بنابراین همه بازیکنان سوم جوایز بیشتری کسب میکنند. اکنون، اپراتور کازینو باید نسخه موبایل بازی از طریق تلفنهای همراه را ارائه دهد. Gratorama یک کازینو عالی برای علاقهمندان به بازیهای کازینویی است که از یادداشتهای خراشیده، بنادر و … استفاده میکنند و میتوانند به سرعت بازی کنند.