Skip to content

Instantly share code, notes, and snippets.

@nefeline
Last active September 19, 2018 13:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nefeline/d441c3e2fb17d3add7b6ecfa9928547f to your computer and use it in GitHub Desktop.
Save nefeline/d441c3e2fb17d3add7b6ecfa9928547f to your computer and use it in GitHub Desktop.
This is a customization to display the Event Start Date/Time and Venue name for each one of the markers (L56-L80)
/**
* @file This file overrides The Events Calendar PRO's tribe-events-ajax-maps.js and contains all map view specific javascript.
* This file should load after all vendors and core events javascript.
* @version 1.0
*/
var count = 0;
(function( window, document, $, td, te, tf, tg, ts, tt, config, dbug ) {
/*
* $ = jQuery
* td = tribe_ev.data
* te = tribe_ev.events
* tf = tribe_ev.fn
* tg = tribe_ev.geoloc
* ts = tribe_ev.state
* tt = tribe_ev.tests
* dbug = tribe_debug
*/
// If we do not have valid geolocation data (ie, the geocenter values are nulls) then let's
// gracefully exit before attempting to interact with the Google Maps API
if ( null === TribeEventsPro.geocenter.max_lat ) {
return;
}
$.extend( tribe_ev.fn, {
/**
* @function tribe_ev.fn.map_add_marker
* @desc tribe_ev.fn.map_add_marker adds event markers to the map on geoloc view.
* @param {String} lat Marker latitude.
* @param {String} lng Marker longitude.
* @param {String} title Marker event title.
* @param {String} address Marker event address.
* @param {String} link Marker event permalink.
*/
map_add_marker: function( lat, lng, title, address, link, date ) {
var myLatlng = new google.maps.LatLng( lat, lng );
var marker = {
position: myLatlng,
map : tg.map
};
// If we have a Map Pin set, we use it
if ( 'undefined' !== GeoLoc.pin_url && GeoLoc.pin_url ) {
marker.icon = GeoLoc.pin_url;
}
// Overwrite with an actual object
marker = new google.maps.Marker( marker );
var infoWindow = new google.maps.InfoWindow();
/**
* This is a customization to display the Event Start Date/Time and Venue name for each one of the markers:
*/
// Collect all event data from the page and converts it to HTML
var event_object = JSON.parse( event.srcElement.response );
var event_data = event_object.html;
var d_event = document.createElement( 'html' );
d_event.innerHTML = event_data;
// Select the pieces of information we want to be displayed on map tooltips
var event_title = d_event.getElementsByClassName( 'tribe-events-map-event-title' );
var event_start_date = d_event.getElementsByClassName( 'tribe-event-date-start' );
var event_venue_details = d_event.getElementsByClassName( 'tribe-events-venue-details' );
// Initialize the marker content
var content = "";
// Convert the marker title to HTML
var d_marker = document.createElement( 'div' );
d_marker.innerHTML = title;
// Display the event details for each one of the markers
for ( var i = 0; i < d_marker.getElementsByTagName( 'a' ).length; i ++ ) {
// Convert the marker title to string
var marker_title_str = d_marker.getElementsByTagName( 'a' )[i].innerHTML;
for ( var j = 0; j < event_title.length; j ++ ) {
var event_title_str = event_title[j].textContent.trim();
if ( marker_title_str === event_title_str ) {
content = content + event_title[j].innerHTML + " - " + event_start_date[j].innerHTML + "<br/>";
if ( address ) {
address_marker = "<br/>" + event_venue_details[j].innerHTML;
}
}
}
}
content = content + address_marker;
// End of the customization
infoWindow.setContent( content );
google.maps.event.addListener( marker, 'click', function( event ) {
infoWindow.open( tg.map, marker );
} );
tg.markers.push( marker );
if ( tg.refine ) {
marker.setVisible( false );
}
tg.bounds.extend( myLatlng );
}
} );
tg.geocoder = new google.maps.Geocoder();https://github.com/mt-support/tribe-ext-venue-organizer-additional-fields/pull/1#pullrequestreview-156345274
tg.bounds = new google.maps.LatLngBounds();
$( document ).ready( function() {
/**
* @function tribe_test_location
* @desc tribe_test_location clears the lat and lng values in event bar if needed. Also hides or shows the geofence filter if present.
*/
function tribe_test_location() {
if ( $( '#tribe-bar-geoloc' ).length ) {
var val = $( '#tribe-bar-geoloc' ).val(),
$fence = $( "#tribe_events_filter_item_geofence" ),
$latlng = $( '#tribe-bar-geoloc-lat, #tribe-bar-geoloc-lng' );
if ( val.length ) {
$fence.show();
}
else {
$fence.hide();
if ( $latlng.length ) {
$latlng.val( '' );
}
}
}
}
tribe_test_location();
var $tribe_container = $( '#tribe-events' ),
$geo_bar_input = $( '#tribe-bar-geoloc' ),
$geo_options = $( "#tribe-geo-options" ),
invalid_date = false;
var options = {
zoom : 5,
center : new google.maps.LatLng( TribeEventsPro.geocenter.max_lat, TribeEventsPro.geocenter.max_lng ),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
if ( document.getElementById( 'tribe-geo-map' ) ) {
tg.map = new google.maps.Map( document.getElementById( 'tribe-geo-map' ), options );
tg.bounds = new google.maps.LatLngBounds();
var minLatlng = new google.maps.LatLng( TribeEventsPro.geocenter.min_lat, TribeEventsPro.geocenter.min_lng );
tg.bounds.extend( minLatlng );
var maxLatlng = new google.maps.LatLng( TribeEventsPro.geocenter.max_lat, TribeEventsPro.geocenter.max_lng );
tg.bounds.extend( maxLatlng );
}
if ( $().placeholder ) {
$( '#tribe-geo-location' ).placeholder();
}
if ( tt.map_view() ) {
var tribe_is_paged = tf.get_url_param( 'tribe_paged' ),
tribe_display = tf.get_url_param( 'tribe_event_display' );
if ( tribe_is_paged ) {
ts.paged = tribe_is_paged;
}
ts.view = 'map';
if ( tribe_display == 'past' ) {
ts.view = 'past';
}
tf.tooltips();
}
if ( tt.map_view() && td.params ) {
var tp = td.params;
if ( tf.in_params( tp, "tribe_geosearch" ) >= 0 ) {
}
else {
tp += '&action=tribe_geosearch';
}
if ( tf.in_params( tp, "tribe_paged" ) >= 0 ) {
}
else {
tp += '&tribe_paged=1';
}
ts.params = tp;
ts.do_string = false;
ts.pushstate = false;
ts.popping = true;
tf.pre_ajax( function() {
tribe_map_processOption();
} );
}
else if ( tt.map_view() ) {
ts.do_string = false;
ts.pushstate = false;
ts.popping = false;
ts.initial_load = true;
tf.pre_ajax( function() {
tribe_map_processOption();
} );
}
if ( tt.pushstate && tt.map_view() ) {
history.replaceState( {
"tribe_paged" : ts.paged,
"tribe_params": ts.params
}, '', location.href );
$( window ).on( 'popstate', function( event ) {
var state = event.originalEvent.state;
if ( state ) {
ts.do_string = false;
ts.pushstate = false;
ts.popping = true;
ts.params = state.tribe_params;
ts.paged = state.tribe_paged;
tf.pre_ajax( function() {
tribe_map_processOption();
} );
tf.set_form( ts.params );
}
} );
}
if ( tt.map_view() ) {
$tribe_container.on( 'click', '.tribe-geo-option-link', function( e ) {
e.preventDefault();
e.stopPropagation();
var $this = $( this );
$( '.tribe-geo-option-link' ).removeClass( 'tribe-option-loaded' );
$this.addClass( 'tribe-option-loaded' );
$geo_bar_input.val( $this.text() );
$( '#tribe-bar-geoloc-lat' ).val( tg.geocodes[$this.data( 'index' )].geometry.location.lat() );
$( '#tribe-bar-geoloc-lng' ).val( tg.geocodes[$this.data( 'index' )].geometry.location.lng() );
ts.do_string = true;
ts.pushstate = false;
ts.popping = false;
if ( tt.pushstate ) {
tf.pre_ajax( function() {
tribe_map_processOption();
$geo_options.hide();
} );
}
else {
tf.pre_ajax( function() {
/**
* DEPRECATED: tribe_ev_reloadOldBrowser has been deprecated in 4.0. Use reload-old-browser.tribe instead
*/
$( te ).trigger( 'tribe_ev_reloadOldBrowser' );
$( te ).trigger( 'reload-old-browser.tribe' );
} );
}
} );
$( document ).on( 'click', function() {
$geo_options.hide();
} );
tf.snap( '#tribe-events-content-wrapper', '#tribe-events-content-wrapper', '#tribe-events-footer .tribe-events-nav-previous a, #tribe-events-footer .tribe-events-nav-next a' );
}
/**
* @function tribe_generate_map_params
* @desc tribe_generate_map_params generates query parameters for the map view ajax call.
*/
function tribe_generate_map_params() {
ts.ajax_running = true;
ts.params = {
action : 'tribe_geosearch',
tribe_paged : ts.paged,
tribe_event_display: ts.view,
featured : tf.is_featured()
};
if ( ts.category ) {
ts.params.tribe_event_category = ts.category;
}
if ( td.default_permalinks ) {
if ( ! ts.params.hasOwnProperty( 'post_type' ) ) {
ts.params['post_type'] = config.events_post_type;
}
if ( ! ts.params.hasOwnProperty( 'eventDisplay' ) ) {
ts.params['eventDisplay'] = 'map';
}
}
/**
* DEPRECATED: tribe_ev_serializeBar has been deprecated in 4.0. Use serialize-bar.tribe instead
*/
$( te ).trigger( 'tribe_ev_serializeBar' );
$( te ).trigger( 'serialize-bar.tribe' );
if ( tf.invalid_date_in_params( ts.params ) ) {
ts.ajax_running = false;
invalid_date = true;
return;
}
else {
invalid_date = false;
}
ts.params = $.param( ts.params );
/**
* DEPRECATED: tribe_ev_collectParams has been deprecated in 4.0. Use collect-params.tribe instead
*/
$( te ).trigger( 'tribe_ev_collectParams' );
$( te ).trigger( 'collect-params.tribe' );
}
$( te ).on( 'reload-old-browser.tribe', function() {
tribe_generate_map_params();
window.location = td.cur_url + '?' + ts.params;
} );
/**
* @function tribe_map_processOption
* @desc tribe_map_processOption is the main ajax event query for map view.
*/
function tribe_map_processOption() {
if ( ! ts.popping ) {
tribe_generate_map_params();
ts.pushstate = false;
if ( ! ts.initial_load ) {
ts.do_string = true;
}
}
if ( invalid_date ) {
return;
}
$( '#tribe-events-content .tribe-events-loop' ).tribe_spin();
deleteMarkers();
$.post( GeoLoc.ajaxurl, ts.params, function( response ) {
/**
* DEPRECATED: tribe_ev_ajaxStart and tribe_ev_mapView_AjaxStart have been deprecated in 4.0. Use ajax-start.tribe and map-view-ajax-start.tribe instead
*/
$( te ).trigger( 'tribe_ev_ajaxStart' ).trigger( 'tribe_ev_mapView_AjaxStart' );
$( te ).trigger( 'ajax-start.tribe' ).trigger( 'map-view-ajax-start.tribe' );
tf.enable_inputs( '#tribe_events_filters_form', 'input, select' );
if ( response.success ) {
ts.ajax_running = false;
td.ajax_response = {
'total_count': parseInt( response.total_count ),
'view' : response.view,
'max_pages' : response.max_pages,
'tribe_paged': response.tribe_paged,
'timestamp' : new Date().getTime()
};
ts.initial_load = false;
var $the_content = $.parseHTML( response.html );
$( '#tribe-events-content' ).replaceWith( $the_content );
//If no events are returned, then hide Header
if ( response.total_count == 0 ) {
$( '#tribe-events-header' ).hide();
}
/**
* Calls the filterMarkers function
*/
var marker_filter = response.markers;
var filteredTgMarkers = FilterMarkers( marker_filter );
$.each( filteredTgMarkers, function( i, e ) {
tf.map_add_marker( e.lat, e.lng, e.title, e.address );
} );
/**
* @function FilterMarkers
* @desc FilterMarkers filter by latitude and longitude and concatenate titles
*/
function FilterMarkers( tgMarkers ) {
var markers_list = [];
for ( var i = 0; i < tgMarkers.length; i ++ ) {
var exist = false;
var existingMarker = tgMarkers[i];
markers_list.forEach( function( item ) {
if ( existingMarker.lat == item.lat && existingMarker.lng == item.lng && existingMarker.title != item.title ) {
exist = true;
item.title = "<center>" + item.title + existingMarker.title.link( existingMarker.link ) + "<center>";
}
} );
if ( ! exist ) {
var title = "";
title = "<center>" + title + existingMarker.title.link( existingMarker.link ) + "</center>";
markers_list.push( {
lat : existingMarker.lat,
lng : existingMarker.lng,
"title": title,
address: existingMarker.address
} );
}
}
return markers_list;
}
if ( tt.pushstate ) {
ts.page_title = $( '#tribe-events-header' ).data( 'title' );
document.title = ts.page_title;
if ( ts.do_string ) {
// strip the baseurl from the push state URL
var params = ts.params.replace( /&?baseurl=[^&]*/i, '' );
history.pushState( {
"tribe_paged" : ts.paged,
"tribe_params": ts.params
}, ts.page_title, td.cur_url + '?' + params );
}
if ( ts.pushstate ) {
history.pushState( {
"tribe_paged" : ts.paged,
"tribe_params": ts.params
}, ts.page_title, td.cur_url );
}
}
/**
* DEPRECATED: tribe_ev_ajaxSuccess and tribe_ev_mapView_AjaxSuccess have been deprecated in 4.0. Use ajax-success.tribe and map-view-ajax-success.tribe instead
*/
$( te ).trigger( 'tribe_ev_ajaxSuccess' ).trigger( 'tribe_ev_mapView_AjaxSuccess' );
$( te ).trigger( 'ajax-success.tribe' ).trigger( 'map-view-ajax-success.tribe' );
if ( response.markers.length > 0 ) {
centerMap();
}
}
} );
}
if ( tt.map_view() ) {
var center;
$( "#tribe-geo-map-wrapper" ).resize( function() {
center = tg.map.getCenter();
google.maps.event.trigger( tg.map, "resize" );
tg.map.setCenter( center );
} );
$( '#tribe-events' ).on( 'click', 'li.tribe-events-nav-next a', function( e ) {
e.preventDefault();
if ( ts.ajax_running ) {
return;
}
if ( ts.view === 'past' ) {
if ( ts.paged == '1' ) {
ts.view = 'map';
}
else {
ts.paged --;
}
}
else {
ts.paged ++;
}
ts.popping = false;
if ( tt.pushstate ) {
tf.pre_ajax( function() {
tribe_map_processOption();
} );
}
else {
tf.pre_ajax( function() {
/**
* DEPRECATED: tribe_ev_reloadOldBrowser has been deprecated in 4.0. Use reload-old-browser.tribe instead
*/
$( te ).trigger( 'tribe_ev_reloadOldBrowser' );
$( te ).trigger( 'reload-old-browser.tribe' );
} );
}
} ).on( 'click', 'li.tribe-events-nav-previous a', function( e ) {
e.preventDefault();
if ( ts.ajax_running ) {
return;
}
if ( ts.view === 'map' ) {
if ( ts.paged == '1' ) {
ts.view = 'past';
}
else {
ts.paged --;
}
}
else {
ts.paged ++;
}
ts.popping = false;
if ( tt.pushstate ) {
tf.pre_ajax( function() {
tribe_map_processOption( null );
} );
}
else {
tf.pre_ajax( function() {
/**
* DEPRECATED: tribe_ev_reloadOldBrowser has been deprecated in 4.0. Use reload-old-browser.tribe instead
*/
$( te ).trigger( 'tribe_ev_reloadOldBrowser' );
$( te ).trigger( 'reload-old-browser.tribe' );
} );
}
} );
}
/**
* @function tribe_events_bar_mapajax_actions
* @desc On events bar submit, this function collects the current state of the bar and sends it to the map view ajax handler.
* @param {event} e The event object.
*/
function tribe_events_bar_mapajax_actions( e ) {
if ( tribe_events_bar_action != 'change_view' ) {
e.preventDefault();
if ( ts.ajax_running ) {
return;
}
ts.paged = 1;
ts.view = 'map';
ts.popping = false;
if ( tt.pushstate ) {
tf.pre_ajax( function() {
tribe_map_processOption( null );
} );
}
else {
tf.pre_ajax( function() {
/**
* DEPRECATED: tribe_ev_reloadOldBrowser has been deprecated in 4.0. Use reload-old-browser.tribe instead
*/
$( te ).trigger( 'tribe_ev_reloadOldBrowser' );
$( te ).trigger( 'reload-old-browser.tribe' );
} );
}
}
}
if ( (GeoLoc.map_view && $( 'form#tribe-bar-form' ).length && tt.live_ajax() && tt.pushstate) || (GeoLoc.map_view && tt.no_bar()) ) {
$( '#tribe-events-bar' ).on( 'changeDate', '#tribe-bar-date', function( e ) {
tribe_events_bar_mapajax_actions( e );
} );
}
if ( GeoLoc.map_view ) {
$( te ).on( 'run-ajax.tribe', function() {
tribe_map_processOption();
} );
}
/**
* @function deleteMarkers
* @desc Clears markers from the active map.
*/
function deleteMarkers() {
if ( tg.markers ) {
for ( i in tg.markers ) {
tg.markers[i].setMap( null );
}
tg.markers.length = 0;
tg.bounds = new google.maps.LatLngBounds();
}
}
/**
* @function centerMap
* @desc Centers the active map.
*/
function centerMap() {
tg.map.fitBounds( tg.bounds );
if ( tg.map.getZoom() > 13 ) {
tg.map.setZoom( 13 );
}
}
function spin_start() {
$( '#tribe-events-footer, #tribe-events-header' ).find( '.tribe-events-ajax-loading' ).show();
}
function spin_end() {
$( '#tribe-events-footer, #tribe-events-header' ).find( '.tribe-events-ajax-loading' ).hide();
}
if ( tt.map_view() ) {
$( 'form#tribe-bar-form' ).on( 'submit', function() {
if ( tribe_events_bar_action != 'change_view' ) {
ts.paged = 1;
spin_start();
// hide pagination on submit
$( '.tribe-events-sub-nav' ).remove();
var val = $( '#tribe-bar-geoloc' ).val();
if ( val !== '' ) {
ts.do_string = true;
ts.pushstate = false;
ts.popping = false;
deleteMarkers();
$( "#tribe-geo-results" ).empty();
$( "#tribe-geo-options" ).hide();
$( "#tribe-geo-options #tribe-geo-links" ).empty();
tf.process_geocoding( val, function( results ) {
tg.geocodes = results;
spin_end();
var lat = results[0].geometry.location.lat();
var lng = results[0].geometry.location.lng();
if ( lat ) {
$( '#tribe-bar-geoloc-lat' ).val( lat );
}
if ( lng ) {
$( '#tribe-bar-geoloc-lng' ).val( lng );
}
if ( tg.geocodes.length > 1 ) {
tf.print_geo_options();
tribe_test_location();
centerMap();
}
else {
if ( tt.pushstate ) {
tribe_test_location();
tribe_map_processOption( tg.geocodes[0] );
}
else {
/**
* DEPRECATED: tribe_ev_reloadOldBrowser has been deprecated in 4.0. Use reload-old-browser.tribe instead
*/
$( te ).trigger( 'tribe_ev_reloadOldBrowser' );
$( te ).trigger( 'reload-old-browser.tribe' );
}
}
} );
return false;
}
if ( val === '' ) {
$( '#tribe-bar-geoloc-lat' ).val( '' );
$( '#tribe-bar-geoloc-lng' ).val( '' );
$( "#tribe-geo-options" ).hide();
//We can show the map even if we don't get a geo query
if ( tt.pushstate ) {
ts.do_string = true;
ts.pushstate = false;
ts.popping = false;
tribe_test_location();
tribe_map_processOption();
}
else {
/**
* DEPRECATED: tribe_ev_reloadOldBrowser has been deprecated in 4.0. Use reload-old-browser.tribe instead
*/
$( te ).trigger( 'tribe_ev_reloadOldBrowser' );
$( te ).trigger( 'reload-old-browser.tribe' );
}
spin_end();
return false;
}
return true;
}
} );
// @ifdef DEBUG
ts.view && dbug && debug.timeEnd( 'Tribe JS Init Timer' );
// @endif
}
// @ifdef DEBUG
dbug && debug.info( 'TEC Debug: tribe-events-ajax-maps.js successfully loaded' );
// @endif
} );
})( window, document, jQuery, tribe_ev.data, tribe_ev.events, tribe_ev.fn, tribe_ev.geoloc, tribe_ev.state, tribe_ev.tests, tribe_js_config, tribe_debug );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment