// 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 καζίνο 20Bet στην Ελλάδα Ανακαλύψτε τη Διασκέδαση και τις Ευκαιρίες – 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

Online καζίνο 20Bet στην Ελλάδα Ανακαλύψτε τη Διασκέδαση και τις Ευκαιρίες

Με το 20bet app, η διασκέδαση είναι πάντα στα χέρια σας. Το 20bet casino προσφέρει απίθανες εμπειρίες παιχνιδιού και μεγάλες ευκαιρίες για νίκες.

Κάντε 20bet login και απολαύστε τα καλύτερα παιχνίδια στο 20 bet casino. Είστε έτοιμοι για συναρπαστικές στιγμές; Το 20bet greece σας περιμένει!

Επισκεφτείτε το 20bet.gr και ξεκινήστε την περιπέτειά σας με το bet 20. Το 20bet bet είναι η τέλεια επιλογή για όλους τους λάτρεις των στοιχημάτων και των καζίνο.

Γιατί να επιλέξετε το 20Bet για το Online καζίνο σας;

Το 20bet casino είναι η ιδανική επιλογή για όσους αναζητούν μια αξιόπιστη και συναρπαστική εμπειρία στο online καζίνο. Εδώ είναι μερικοί λόγοι που το 20bet ξεχωρίζει:

  • Ευρεία γκάμα παιχνιδιών: Από κλασικά παιχνίδια καζίνο έως live casino, το 20bet greece προσφέρει ποικιλία για κάθε γούστο.
  • Απλό 20bet login: Μπορείτε να συνδεθείτε γρήγορα και να ξεκινήσετε να παίζετε χωρίς περιπλοκές.
  • Εφαρμογή 20bet app: Παίξτε από οπουδήποτε με την εύχρηστη εφαρμογή για κινητά.
  • Ασφάλεια και αξιοπιστία: Το 20bet.gr διασφαλίζει την προστασία των δεδομένων και των συναλλαγών σας.
  • Ελκυστικές προσφορές: Το 20bet bet προσφέρει μπόνους και promotions για νέους και υπάρχοντες παίκτες.
  • Υποστήριξη πελατών: Η ομάδα του 20bet casino είναι διαθέσιμη 24/7 για οποιαδήποτε ερώτηση ή βοήθεια.
  • Επιλέξτε το 20βετ και απολαύστε μια ανταγωνιστική και διασκεδαστική εμπειρία στο online καζίνο!

    Ευρεία Ποικιλία Παιχνιδιών στο 20Bet

    Το 20Bet Casino προσφέρει μια εκτενή συλλογή παιχνιδιών για κάθε γούστο. Από κλασικά επιτραπέζια παιχνίδια έως σύγχρονες slot μηχανές, το 20bet καλύπτει όλες τις ανάγκες των παικτών. Με το 20bet login, μπορείτε να αποκτήσετε πρόσβαση σε χιλιάδες επιλογές με λίγα απλά βήματα.

    Στο 20bet.gr, θα βρείτε ζωντανά καζίνο παιχνίδια με πραγματικούς dealers, προσφέροντας μια αυθεντική εμπειρία. Επιπλέον, το 20bet app σας επιτρέπει να απολαμβάνετε τα αγαπημένα σας παιχνίδια από οπουδήποτε, ανά πάσα στιγμή. Το 20bet greece διασφαλίζει ότι κάθε παίκτης θα βρει κάτι που ταιριάζει στις προτιμήσεις του.

    Εάν είστε λάτρης των στοιχημάτων, το 20bet bet προσφέρει ευκαιρίες για στοιχήματα σε διάφορα αθλητικά γεγονότα. Το 20βετ συνδυάζει την ψυχαγωγία του καζίνο με τον ενθουσιασμό των στοιχημάτων, δημιουργώντας μια ολοκληρωμένη πλατφόρμα. Εξερευνήστε την ποικιλία του 20bet casino και ανακαλύψτε νέες ευκαιρίες για διασκέδαση και κέρδη!

    Ασφάλεια και Αξιοπιστία στο 20Bet

    Το 20bet Greece διασφαλίζει την απόλυτη ασφάλεια των χρηστών του. Με χρήση προηγμένων τεχνολογιών κρυπτογράφησης, όλες οι συναλλαγές και τα προσωπικά δεδομένα σας προστατεύονται από οποιαδήποτε εξωτερική παρέμβαση.

    Η πλατφόρμα 20bet casino λειτουργεί με άδεια από αναγνωρισμένες ρυθμιστικές αρχές, εξασφαλίζοντας τη διαφάνεια και την αξιοπιστία κάθε παιχνιδιού. Επιπλέον, η εφαρμογή 20bet app προσφέρει εύκολη και ασφαλή πρόσβαση από οποιοδήποτε σημείο.

    Πλεονεκτήματα
    Λεπτομέρειες

    Κρυπτογράφηση Ασφαλείς συναλλαγές στο 20bet.gr Άδεια Λειτουργίας Εγγυημένη αξιοπιστία στο 20 bet casino Πρόσβαση Ασφαλής σύνδεση μέσω 20bet login

    Επιλέγοντας το 20bet bet, απολαμβάνετε μια αξιόπιστη εμπειρία τόσο στο 20 bet όσο και στο 20bet casino. Η ευκολία και η ασφάλεια είναι οι βασικοί μας στόχοι για κάθε χρήστη.

    Εκπληκτικές Προσφορές και Μπόνους στο 20Bet

    Το 20Bet προσφέρει μια πληθώρα μπόνους και προσφορών για να ενισχύσει την εμπειρία σας στο 20 bet casino. Ανεξάρτητα από το αν είστε νέος παίκτης ή έμπειρος, θα βρείτε κάτι που ταιριάζει στις ανάγκες σας.

    • Ευκαιρία για νέους παίκτες: Με την εγγραφή σας στο 20bet.gr, μπορείτε να διεκδικήσετε ένα ευνοϊκό μπόνους πρώτης κατάθεσης.
    • Εβδομαδιαίες προσφορές: Το 20bet greece προσφέρει καθημερινές και εβδομαδιαίες ενισχύσεις για να διατηρήσετε το ενδιαφέρον σας.
    • Προγράμματα ανταμοιβής: Με το 20bet login, συμμετέχετε σε προγράμματα πιστότητας και κερδίζετε εξαιρετικά δώρα.

    Επιπλέον, η χρήση της 20bet app σας δίνει πρόσβαση σε αποκλειστικές προσφορές και ευκολία στη συμμετοχή σας. Το 20βετ είναι η καλύτερη επιλογή για όσους αναζητούν συναρπαστικές ευκαιρίες στο 20bet casino.

  • Εγγραφείτε στο 20bet bet και διεκδικήστε το μπόνους σας.
  • Ανακαλύψτε τις καθημερινές προσφορές μέσω του 20 bet casino.
  • Κερδίστε περισσότερα με τα προγράμματα ανταμοιβής του 20Bet.
  • Ζωντανά Καζίνο: Η Αληθινή Εμπειρία στο 20Bet

    Αν αναζητάτε την απόλυτη εμπειρία ζωντανού καζίνο, το 20bet casino είναι η ιδανική επιλογή για εσάς. Μέσω της πλατφόρμας 20bet.gr, έχετε πρόσβαση σε μια ποικιλία παιχνιδιών με πραγματικούς κρουπιέρες, που σας μεταφέρουν στην ατμόσφαιρα ενός φυσικού καζίνο.

    Χρησιμοποιώντας την 20bet app, μπορείτε να απολαύσετε τα αγαπημένα σας παιχνίδια από οπουδήποτε και αν βρίσκεστε. Είτε πρόκειται για ρουλέτα, μπλακτζακ ή παιχνίδια με ζάρια, το 20bet greece σας προσφέρει απρόσκοπτη διασκέδαση και υψηλή ποιότητα ροής.

    Για να ξεκινήσετε, απλώς κάντε 20bet login και εισέλθετε στον κόσμο του 20 bet. Η πλατφόρμα 20bet bet διασφαλίζει ασφάλεια και δίκαιους κανόνες, ενώ οι προσφορές και οι μπόνους κάνουν την εμπειρία σας ακόμα πιο συναρπαστική.

    Ανακαλύψτε το 20βετ και ζήστε τη μαγεία του ζωντανού καζίνο. Με το bet 20, η διασκέδαση δεν σταματά ποτέ!

    Εύκολη και Γρήγορη Διαδικασία Κατάθεσης και Ανάληψης

    Στο 20bet casino, η διαδικασία κατάθεσης και ανάληψης είναι απλή και γρήγορη. Χρησιμοποιώντας το 20bet login, μπορείτε να συνδεθείτε στο 20bet.gr και να επιλέξετε την προτιμώμενη μέθοδο πληρωμής. Το 20bet greece υποστηρίζει ποικιλία τρόπων, όπως πιστωτικές κάρτες, e-wallets και τραπεζικές μεταφορές.

    Μετά την επιλογή, η κατάθεση στο 20 bet casino ολοκληρώνεται σε λίγα δευτερόλεπτα, επιτρέποντάς σας να ξεκινήσετε αμέσως το παιχνίδι. Για τις αναλήψεις, το 20bet διασφαλίζει γρήγορες επεξεργασίες, ώστε να έχετε πρόσβαση στα κέρδη σας χωρίς καθυστερήσεις. Επιλέγοντας το 20βετ, απολαμβάνετε ασφάλεια και ευκολία σε κάθε βήμα.

    Είτε χρησιμοποιείτε το bet 20 μέσω υπολογιστή είτε από κινητό, η εμπειρία σας θα είναι εξίσου ομαλή. Το 20 bet διασφαλίζει ότι κάθε συναλλαγή είναι απλή, γρήγορη και ασφαλής, ώστε να εστιάζετε στο παιχνίδι σας.

    24/7 Υποστήριξη Πελατών στο 20Bet

    Στο 20bet casino, η εμπειρία σας είναι η προτεραιότητά μας. Με την 24/7 υποστήριξη πελατών, είμαστε πάντα δίπλα σας για να λύσουμε οποιαδήποτε απορία ή πρόβλημα. Είτε χρειάζεστε βοήθεια με το 20bet login, είτε θέλετε να μάθετε περισσότερα για τις υπηρεσίες του 20 bet, η ομάδα μας είναι διαθέσιμη ανά πάσα στιγμή.

    Μέσω του 20bet app ή της ιστοσελίδας 20bet.gr, μπορείτε να επικοινωνήσετε μαζί μας γρήγορα και εύκολα. Επιπλέον, στο 20 bet casino, προσφέρουμε οδηγίες για κάθε βήμα, από την εγγραφή έως την ανάληψη κερδών. Η 20βετ εξασφαλίζει ότι κάθε χρήστης λαμβάνει την καλύτερη δυνατή εξυπηρέτηση.

    Αν έχετε ερωτήσεις σχετικά με το bet 20 ή θέλετε να εξερευνήσετε τις δυνατότητες του 20bet bet, η ομάδα υποστήριξής μας είναι έτοιμη να σας βοηθήσει. Στο 20bet, η ικανοποίησή σας είναι η κύρια μας επιδίωξη!

    Design and Develop by Ovatheme