PageSourceSearch

https://lesudmakesmehappy.com/assets/lesudmakesmehappy.com/wp-cont…/includes/js/events-manager-4c425cc81f.js

js lesudmakesmehappy.com collected 2026-10-08 21:20:26 UTC 82,867 bytes, 1,276 lines download raw bytes

1var _____WB$wombat$assign$function_____=function(name){return (globalThis._wb_wombat && globalThis._wb_wombat.local_init && globalThis._wb_wombat.local_init(name))||globalThis[name];};if(!globalThis.__WB_pmw){globalThis.__WB_pmw=function(obj){this.__WB_source=obj;return this;}}{
2let window = _____WB$wombat$assign$function_____("window");
3let self = _____WB$wombat$assign$function_____("self");
4let document = _____WB$wombat$assign$function_____("document");
5let location = _____WB$wombat$assign$function_____("location");
6let top = _____WB$wombat$assign$function_____("top");
7let parent = _____WB$wombat$assign$function_____("parent");
8let frames = _____WB$wombat$assign$function_____("frames");
9let opener = _____WB$wombat$assign$function_____("opener");
10jQuery(document).ready( function($){
11	var load_ui_css = false; //load jquery ui css?
12	/* Time Entry */
13	$('#start-time').each(function(i, el){
14		$(el).addClass('em-time-input em-time-start').next('#end-time').addClass('em-time-input em-time-end').parent().addClass('em-time-range');
15	});
16	if( $(".em-time-input").length > 0 ){
17		em_setup_timepicker('body');
18	}
19	/* Calendar AJAX */
20	$('.em-calendar-wrapper a').off("click");
21	$('.em-calendar-wrapper').on('click', 'a.em-calnav, a.em-calnav', function(e){
22		e.preventDefault();
23		$(this).closest('.em-calendar-wrapper').prepend('<div class="loading" id="em-loading"></div>');
24		var url = em_ajaxify($(this).attr('href'));
25		$(this).closest('.em-calendar-wrapper').load(url, function(){$(this).trigger('em_calendar_load');});
26	} );
27
28	//Events Search
29	$(document).on('click change', '.em-toggle', function(e){
30		e.preventDefault();
31		//show or hide advanced tickets, hidden by default
32		var el = $(this);
33		var rel = el.attr('rel').split(':');
34		if( el.hasClass('show-search') ){
35			if( rel.length > 1 ){ el.closest(rel[1]).find(rel[0]).slideUp(); }
36			else{ $(rel[0]).slideUp(); }
37			el.find('.show, .show-advanced').show();
38			el.find('.hide, .hide-advanced').hide();
39			el.removeClass('show-search');
40		}else{
41			if( rel.length > 1 ){ el.closest(rel[1]).find(rel[0]).slideDown(); }
42			else{ $(rel[0]).slideDown(); }
43			el.find('.show, .show-advanced').hide();
44			el.find('.hide, .hide-advanced').show();
45			el.addClass('show-search');
46		}
47		
48	});
49	if( EM.search_term_placeholder ){
50		if( 'placeholder' in document.createElement('input') ){
51			$('input.em-events-search-text, input.em-search-text').attr('placeholder', EM.search_term_placeholder);
52		}else{
53			$('input.em-events-search-text, input.em-search-text').on('blur', function(){
54				if( this.value=='' ) this.value = EM.search_term_placeholder;
55			}).on('focus', function(){
56				if( this.value == EM.search_term_placeholder ) this.value='';
57			}).trigger('blur');
58		}
59	}
60	$('.em-search-form select[name=country]').on('change', function(){
61		var el = $(this);
62		$('.em-search select[name=state]').html('<option value="">'+EM.txt_loading+'</option>');
63		$('.em-search select[name=region]').html('<option value="">'+EM.txt_loading+'</option>');
64		$('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>');
65		if( el.val() != '' ){
66			el.closest('.em-search-location').find('.em-search-location-meta').slideDown();
67			var data = {
68				action : 'search_states',
69				country : el.val(),
70				return_html : true
71			};
72			$('.em-search select[name=state]').load( EM.ajaxurl, data );
73			data.action = 'search_regions';
74			$('.em-search select[name=region]').load( EM.ajaxurl, data );
75			data.action = 'search_towns';
76			$('.em-search select[name=town]').load( EM.ajaxurl, data );
77		}else{
78			el.closest('.em-search-location').find('.em-search-location-meta').slideUp();
79		}
80	});
81
82	$('.em-search-form select[name=region]').on('change', function(){
83		$('.em-search select[name=state]').html('<option value="">'+EM.txt_loading+'</option>');
84		$('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>');
85		var data = {
86			action : 'search_states',
87			region : $(this).val(),
88			country : $('.em-search-form select[name=country]').val(),
89			return_html : true
90		};
91		$('.em-search select[name=state]').load( EM.ajaxurl, data );
92		data.action = 'search_towns';
93		$('.em-search select[name=town]').load( EM.ajaxurl, data );
94	});
95
96	$('.em-search-form select[name=state]').on('change', function(){
97		$('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>');
98		var data = {
99			action : 'search_towns',
100			state : $(this).val(),
101			region : $('.em-search-form select[name=region]').val(),
102			country : $('.em-search-form select[name=country]').val(),
103			return_html : true
104		};
105		$('.em-search select[name=town]').load( EM.ajaxurl, data );
106	});
107	
108	//in order for this to work, you need the above classes to be present in your templates
109	$(document).on('submit', '.em-search-form, .em-events-search-form', function(e){
110		var form = $(this);
111    	if( this.em_search && this.em_search.value == EM.txt_search){ this.em_search.value = ''; }
112    	var results_wrapper = form.closest('.em-search-wrapper').find('.em-search-ajax');
113    	if( results_wrapper.length == 0 ) results_wrapper = $('.em-search-ajax');
114    	if( results_wrapper.length > 0 ){
115    		results_wrapper.append('<div class="loading" id="em-loading"></div>');
116    		var submitButton = form.find('.em-search-submit');
117    		submitButton.data('buttonText', submitButton.val()).val(EM.txt_searching);
118    		var img = submitButton.children('img');
119    		if( img.length > 0 ) img.attr('src', img.attr('src').replace('search-mag.png', 'search-loading.gif'));
120    		var vars = form.serialize();
121    		$.ajax( EM.ajaxurl, {
122				type : 'POST',
123	    		dataType : 'html',
124	    		data : vars,
125			    success : function(responseText){
126			    	submitButton.val(submitButton.data('buttonText'));
127			    	if( img.length > 0 ) img.attr('src', img.attr('src').replace('search-loading.gif', 'search-mag.png'));
128		    		results_wrapper.replaceWith(responseText);
129		        	if( form.find('input[name=em_search]').val() == '' ){ form.find('input[name=em_search]').val(EM.txt_search); }
130		        	//reload results_wrapper
131		        	results_wrapper = form.closest('.em-search-wrapper').find('.em-search-ajax');
132		        	if( results_wrapper.length == 0 ) results_wrapper = $('.em-search-ajax');
133			    	jQuery(document).triggerHandler('em_search_ajax', [vars, results_wrapper, e]); //ajax has loaded new results
134			    }
135	    	});
136    		e.preventDefault();
137			return false;
138    	}
139	});
140	if( $('.em-search-ajax').length > 0 ){
141		$(document).on('click', '.em-search-ajax a.page-numbers', function(e){
142			var a = $(this);
143			var data = a.closest('.em-pagination').attr('data-em-ajax');
144			var wrapper = a.closest('.em-search-ajax');
145			var wrapper_parent = wrapper.parent();
146		    var qvars = a.attr('href').split('?');
147		    var vars = qvars[1];
148		    //add data-em-ajax att if it exists
149		    if( data != '' ){
150		    	vars = vars != '' ? vars+'&'+data : data;
151		    }
152		    wrapper.append('<div class="loading" id="em-loading"></div>');
153		    $.ajax( EM.ajaxurl, {
154				type : 'POST',
155	    		dataType : 'html',
156	    		data : vars,
157			    success : function(responseText) {
158			    	wrapper.replaceWith(responseText);
159			    	wrapper = wrapper_parent.find('.em-search-ajax');
160			    	jQuery(document).triggerHandler('em_search_ajax', [vars, wrapper, e]); //ajax has loaded new results
161			    }
162	    	});
163			e.preventDefault();
164			return false;
165		});
166	}
167		
168	/*
169	 * ADMIN AREA AND PUBLIC FORMS (Still polishing this section up, note that form ids and classes may change accordingly)
170	 */
171	//Events List
172		//Approve/Reject Links
173		$('.events-table').on('click', '.em-event-delete', function(){
174			if( !confirm("Are you sure you want to delete?") ){ return false; }
175			window.location.href = this.href;
176		});
177	//Forms
178	$('#event-form #event-image-delete, #location-form #location-image-delete').on('click', function(){
179		var el = $(this);
180		if( el.is(':checked') ){
181			el.closest('.event-form-image, .location-form-image').find('#event-image-img, #location-image-img').hide();
182		}else{
183			el.closest('.event-form-image, .location-form-image').find('#event-image-img, #location-image-img').show();
184		}
185	});
186	//Event Editor 
187		//Recurrence Warnings
188		$('#event-form.em-event-admin-recurring').on('submit', function(event){
189			var form = $(this);
190			if( form.find('input[name="event_reschedule"]').first().val() == 1 ){
191				var warning_text = EM.event_reschedule_warning;
192			}else if( form.find('input[name="event_recreate_tickets"]').first().val() == 1 ){
193				var warning_text = EM.event_recurrence_bookings;
194			}else{
195				var warning_text = EM.event_recurrence_overwrite;
196			}
197			confirmation = confirm(warning_text);
198			if( confirmation == false ){
199				event.preventDefault();
200			}
201		});
202		//Buttons for recurrence warnings within event editor forms
203		$('.em-reschedule-trigger').on('click', function(e){
204			e.preventDefault();
205			var trigger = $(this);
206			trigger.closest('.em-recurrence-reschedule').find(trigger.data('target')).removeClass('reschedule-hidden');
207			trigger.siblings('.em-reschedule-value').val(1);
208			trigger.addClass('reschedule-hidden').siblings('a').removeClass('reschedule-hidden');
209		});
210		$('.em-reschedule-cancel').on('click', function(e){
211			e.preventDefault();
212			var trigger = $(this);
213			trigger.closest('.em-recurrence-reschedule').find(trigger.data('target')).addClass('reschedule-hidden');
214			trigger.siblings('.em-reschedule-value').val(0);
215			trigger.addClass('reschedule-hidden').siblings('a').removeClass('reschedule-hidden');
216		});
217	//Tickets & Bookings
218	if( $("#em-tickets-form").length > 0 ){
219		//Enable/Disable Bookings
220		$('#event-rsvp').on('click', function(event){
221			if( !this.checked ){
222				confirmation = confirm(EM.disable_bookings_warning);
223				if( confirmation == false ){
224					event.preventDefault();
225				}else{
226					$('#event-rsvp-options').hide();
227				}
228			}else{
229				$('#event-rsvp-options').fadeIn();
230			}
231		});
232		if($('input#event-rsvp').is(":checked")) {
233			$("div#rsvp-data").fadeIn();
234		} else {
235			$("div#rsvp-data").hide();
236		}
237		//Ticket(s) UI
238		var reset_ticket_forms = function(){
239			$('#em-tickets-form table tbody tr.em-tickets-row').show();
240			$('#em-tickets-form table tbody tr.em-tickets-row-form').hide();
241		};
242		//recurrences and cut-off logic for ticket availability
243		if( $('#em-recurrence-checkbox').length > 0 ){
244			$('#em-recurrence-checkbox').on('change', function(){
245				if( $('#em-recurrence-checkbox').is(':checked') ){
246					$('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring').show();
247					$('#em-tickets-form .ticket-dates-from-normal, #em-tickets-form .ticket-dates-to-normal, #event-rsvp-options .em-booking-date-normal, #em-tickets-form .hidden').hide();
248				}else{
249					$('#em-tickets-form .ticket-dates-from-normal, #em-tickets-form .ticket-dates-to-normal, #event-rsvp-options .em-booking-date-normal').show();
250					$('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring, #em-tickets-form .hidden').hide();
251				}
252			}).trigger('change');
253		}else if( $('#em-form-recurrence').length > 0 ){
254			$('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring').show();
255			$('#em-tickets-form .ticket-dates-from-normal, #em-tickets-form .ticket-dates-to-normal, #event-rsvp-options .em-booking-date-normal, #em-tickets-form .hidden').hide();
256		}else{
257			$('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring, #em-tickets-form .hidden').hide();
258		}
259		//Add a new ticket
260		$("#em-tickets-add").on('click', function(e){
261			e.preventDefault();
262			reset_ticket_forms();
263			//create copy of template slot, insert so ready for population
264			var tickets = $('#em-tickets-form table tbody');
265			var rowNo = tickets.length+1;
266			var slot = tickets.first('.em-ticket-template').clone(true).attr('id','em-ticket-'+ rowNo).removeClass('em-ticket-template').addClass('em-ticket').appendTo($('#em-tickets-form table'));
267			//change the index of the form element names
268			slot.find('*[name]').each( function(index,el){
269				el = $(el);
270				el.attr('name', el.attr('name').replace('em_tickets[0]','em_tickets['+rowNo+']'));
271			});
272			//show ticket and switch to editor
273			slot.show().find('.ticket-actions-edit').trigger('click');
274			//refresh datepicker and values
275			slot.find('.em-date-input-loc').datepicker('destroy').removeAttr('id'); //clear all datepickers
276			slot.find('.em-time-input').off().each(function(index, el){
277				if( typeof this.em_timepickerObj == 'object' ){
278					this.em_timepicker('remove');
279				}
280			}); //clear all em_timepickers - consequently, also other click/blur/change events, recreate the further down
281			em_setup_datepicker(slot);
282			em_setup_timepicker(slot);
283		    $('html, body').animate({ scrollTop: slot.offset().top - 30 }); //sends user to form
284			check_ticket_sortability();
285		});
286		//Edit a Ticket
287		$(document).on('click', '.ticket-actions-edit', function(e){
288			e.preventDefault();
289			reset_ticket_forms();
290			var tbody = $(this).closest('tbody');
291			tbody.find('tr.em-tickets-row').hide();
292			tbody.find('tr.em-tickets-row-form').fadeIn();
293			return false;
294		});
295		$(document).on('click', '.ticket-actions-edited', function(e){
296			e.preventDefault();
297			var tbody = $(this).closest('tbody');
298			var rowNo = tbody.attr('id').replace('em-ticket-','');
299			tbody.find('.em-tickets-row').fadeIn();
300			tbody.find('.em-tickets-row-form').hide();
301			tbody.find('*[name]').each(function(index,el){
302				el = $(el);
303				if( el.attr('name') == 'ticket_start_pub'){
304					tbody.find('span.ticket_start').text(el.val());
305				}else if( el.attr('name') == 'ticket_end_pub' ){
306					tbody.find('span.ticket_end').text(el.val());
307				}else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_type]' ){
308					if( el.find(':selected').val() == 'members' ){
309						tbody.find('span.ticket_name').prepend('* ');
310					}
311				}else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_start_recurring_days]' ){
312					var text = tbody.find('select.ticket-dates-from-recurring-when').val() == 'before' ? '-'+el.val():el.val();
313					if( el.val() != '' ){
314						tbody.find('span.ticket_start_recurring_days').text(text);
315						tbody.find('span.ticket_start_recurring_days_text, span.ticket_start_time').removeClass('hidden').show();
316					}else{
317						tbody.find('span.ticket_start_recurring_days').text(' - ');
318						tbody.find('span.ticket_start_recurring_days_text, span.ticket_start_time').removeClass('hidden').hide();
319					}
320				}else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_end_recurring_days]' ){
321					var text = tbody.find('select.ticket-dates-to-recurring-when').val() == 'before' ? '-'+el.val():el.val();
322					if( el.val() != '' ){
323						tbody.find('span.ticket_end_recurring_days').text(text);
324						tbody.find('span.ticket_end_recurring_days_text, span.ticket_end_time').removeClass('hidden').show();
325					}else{
326						tbody.find('span.ticket_end_recurring_days').text(' - ');
327						tbody.find('span.ticket_end_recurring_days_text, span.ticket_end_time').removeClass('hidden').hide();
328					}
329				}else{
330					var classname = el.attr('name').replace('em_tickets['+rowNo+'][','').replace(']','').replace('[]','');
331					tbody.find('.em-tickets-row .'+classname).text(el.val());
332				}
333			});
334			//allow for others to hook into this
335			$(document).triggerHandler('em_maps_tickets_edit', [tbody, rowNo, true]);
336		    $('html, body').animate({ scrollTop: tbody.parent().offset().top - 30 }); //sends user back to top of form
337			return false;
338		});
339		$(document).on('change', '.em-ticket-form select.ticket_type', function(e){
340			//check if ticket is for all users or members, if members, show roles to limit the ticket to
341			var el = $(this);
342			if( el.find('option:selected').val() == 'members' ){
343				el.closest('.em-ticket-form').find('.ticket-roles').fadeIn();
344			}else{
345				el.closest('.em-ticket-form').find('.ticket-roles').hide();
346			}
347		});
348		$(document).on('click', '.em-ticket-form .ticket-options-advanced', function(e){
349			//show or hide advanced tickets, hidden by default
350			e.preventDefault();
351			var el = $(this);
352			if( el.hasClass('show') ){
353				el.closest('.em-ticket-form').find('.em-ticket-form-advanced').fadeIn();
354				el.find('.show,.show-advanced').hide();
355				el.find('.hide,.hide-advanced').show();
356			}else{
357				el.closest('.em-ticket-form').find('.em-ticket-form-advanced').hide();
358				el.find('.show,.show-advanced').show();
359				el.find('.hide,.hide-advanced').hide();
360			}
361			el.toggleClass('show');
362		});
363		$('.em-ticket-form').each( function(){
364			//check whether to show advanced options or not by default for each ticket
365			var show_advanced = false;
366			var el = $(this); 
367			el.find('.em-ticket-form-advanced input[type="text"]').each(function(){ if(this.value != '') show_advanced = true; });
368			if( el.find('.em-ticket-form-advanced input[type="checkbox"]:checked').length > 0 ){ show_advanced = true; }
369			el.find('.em-ticket-form-advanced option:selected').each(function(){ if(this.value != '') show_advanced = true; });
370			if( show_advanced ) el.find('.ticket-options-advanced').trigger('click');
371		});
372		//Delete a ticket
373		$(document).on('click', '.ticket-actions-delete', function(e){
374			e.preventDefault();
375			var el = $(this);
376			var tbody = el.closest('tbody');
377			if( tbody.find('input.ticket_id').val() > 0 ){
378				//only will happen if no bookings made
379				el.text('Deleting...');	
380				$.getJSON( $(this).attr('href'), {'em_ajax_action':'delete_ticket', 'id':tbody.find('input.ticket_id').val()}, function(data){
381					if(data.result){
382						tbody.remove();
383					}else{
384						el.text('Delete');
385						alert(data.error);
386					}
387				});
388			}else{
389				//not saved to db yet, so just remove
390				tbody.remove();
391			}
392			check_ticket_sortability();
393			return false;
394		});
395		//Sort Tickets
396		$('#em-tickets-form.em-tickets-sortable table').sortable({
397			items: '> tbody',
398			placeholder: "em-ticket-sortable-placeholder",
399			handle:'.ticket-status',
400			helper: function( event, el ){
401				var helper = $(el).clone().addClass('em-ticket-sortable-helper');
402				var tds = helper.find('.em-tickets-row td').length;
403				helper.children().remove();
404				helper.append('<tr class="em-tickets-row"><td colspan="'+tds+'" style="text-align:left; padding-left:15px;"><span class="dashicons dashicons-tickets-alt"></span></td></tr>');
405				return helper;
406			},
407		});
408		var check_ticket_sortability = function(){
409			var em_tickets = $('#em-tickets-form table tbody.em-ticket');
410			if( em_tickets.length == 1 ){
411				em_tickets.find('.ticket-status').addClass('single');
412				$('#em-tickets-form.em-tickets-sortable table').sortable( "option", "disabled", true );
413			}else{
414				em_tickets.find('.ticket-status').removeClass('single');
415				$('#em-tickets-form.em-tickets-sortable table').sortable( "option", "disabled", false );
416			}
417		};
418		check_ticket_sortability();
419	}
420	//Manageing Bookings
421	if( $('#em-bookings-table').length > 0 ){
422		//Pagination link clicks
423		$(document).on('click', '#em-bookings-table .tablenav-pages a', function(){
424			var el = $(this);
425			var form = el.parents('#em-bookings-table form.bookings-filter');
426			//get page no from url, change page, submit form
427			var match = el.attr('href').match(/#[0-9]+/);
428			if( match != null && match.length > 0){
429				var pno = match[0].replace('#','');
430				form.find('input[name=pno]').val(pno);
431			}else{
432				form.find('input[name=pno]').val(1);
433			}
434			form.trigger('submit');
435			return false;
436		});
437		//Overlay Options
438		var em_bookings_settings_dialog = {
439			modal : true,
440			autoOpen: false,
441			minWidth: 500,
442			height: 'auto',
443			buttons: [{
444				text: EM.bookings_settings_save,
445				click: function(e){
446					e.preventDefault();
447					//we know we'll deal with cols, so wipe hidden value from main
448					var match = $("#em-bookings-table form.bookings-filter [name=cols]").val('');
449					var booking_form_cols = $('form#em-bookings-table-settings-form input.em-bookings-col-item');
450					$.each( booking_form_cols, function(i,item_match){
451						//item_match = $(item_match);
452						if( item_match.value == 1 ){
453							if( match.val() != ''){
454								match.val(match.val()+','+item_match.name);
455							}else{
456								match.val(item_match.name);
457							}
458						}
459					});
460					//submit main form
461					$('#em-bookings-table-settings').trigger('submitted'); //hook into this with bind()
462					$('#em-bookings-table form.bookings-filter').trigger('submit');					
463					$(this).dialog('close');
464				}
465			}]
466		};
467		var em_bookings_export_dialog = {
468			modal : true,
469			autoOpen: false,
470			minWidth: 500,
471			height: 'auto',
472			buttons: [{
473				text: EM.bookings_export_save,
474				click: function(e){
475					$(this).children('form').trigger('submit');
476					$(this).dialog('close');
477				}
478			}]
479		};
480		if( $("#em-bookings-table-settings").length > 0 ){
481			//Settings Overlay
482			$("#em-bookings-table-settings").dialog(em_bookings_settings_dialog);
483			$(document).on('click', '#em-bookings-table-settings-trigger', function(e){ e.preventDefault(); $("#em-bookings-table-settings").dialog('open'); });
484			//Export Overlay
485			$("#em-bookings-table-export").dialog(em_bookings_export_dialog);
486			$(document).on('click', '#em-bookings-table-export-trigger', function(e){ e.preventDefault(); $("#em-bookings-table-export").dialog('open'); });
487			var export_overlay_show_tickets = function(){
488				if( $('#em-bookings-table-export-form input[name=show_tickets]').is(':checked') ){
489					$('#em-bookings-table-export-form .em-bookings-col-item-ticket').show();
490					$('#em-bookings-table-export-form #em-bookings-export-cols-active .em-bookings-col-item-ticket input').val(1);
491				}else{
492					$('#em-bookings-table-export-form .em-bookings-col-item-ticket').hide().find('input').val(0);					
493				}
494			};
495			//Sync export overlay with table search field changes
496			$('#em-bookings-table form select').each(function(i, el){
497				$(el).on('change', function(e){
498					var select_el = $(this);
499					var input_par = $('#em-bookings-table-export-form input[name='+select_el.attr('name')+']');
500					var input_par_selected = select_el.find('option:selected');
501					input_par.val(input_par_selected.val());
502				});
503			});
504			
505			export_overlay_show_tickets();
506			$('#em-bookings-table-export-form input[name=show_tickets]').on('click', export_overlay_show_tickets);
507			//Sortables
508			$( ".em-bookings-cols-sortable" ).sortable({
509				connectWith: ".em-bookings-cols-sortable",
510				update: function(event, ui) {
511					if( ui.item.parents('ul#em-bookings-cols-active, ul#em-bookings-export-cols-active').length > 0 ){							
512						ui.item.addClass('ui-state-highlight').removeClass('ui-state-default').children('input').val(1);
513					}else{
514						ui.item.addClass('ui-state-default').removeClass('ui-state-highlight').children('input').val(0);
515					}
516				}
517			}).disableSelection();
518			load_ui_css = true;
519		}
520		//Widgets and filter submissions
521		$(document).on('submit', '#em-bookings-table form.bookings-filter', function(e){
522			var el = $(this);			
523			//append loading spinner
524			el.parents('#em-bookings-table').find('.table-wrap').first().append('<div id="em-loading" />');
525			//ajax call
526			$.post( EM.ajaxurl, el.serializeArray(), function(data){
527				var root = el.parents('#em-bookings-table').first();
528				root.replaceWith(data);
529				//recreate overlays
530				$('#em-bookings-table-export input[name=scope]').val(root.find('select[name=scope]').val());
531				$('#em-bookings-table-export input[name=status]').val(root.find('select[name=status]').val());
532				jQuery(document).triggerHandler('em_bookings_filtered', [data, root, el]);
533			});
534			return false;
535		});
536		//Approve/Reject Links
537		$(document).on('click', '.em-bookings-approve,.em-bookings-reject,.em-bookings-unapprove,.em-bookings-delete', function(){
538			var el = $(this); 
539			if( el.hasClass('em-bookings-delete') ){
540				if( !confirm(EM.booking_delete) ){ return false; }
541			}
542			var url = em_ajaxify( el.attr('href'));		
543			var td = el.parents('td').first();
544			td.html(EM.txt_loading);
545			td.load( url );
546			return false;
547		});
548	}
549	//Old Bookings Table - depreciating soon
550	if( $('.em_bookings_events_table').length > 0 ){
551		//Widgets and filter submissions
552		$(document).on('submit', '.em_bookings_events_table form', function(e){
553			var el = $(this);
554			var url = em_ajaxify( el.attr('action') );		
555			el.parents('.em_bookings_events_table').find('.table-wrap').first().append('<div id="em-loading" />');
556			$.get( url, el.serializeArray(), function(data){
557				el.parents('.em_bookings_events_table').first().replaceWith(data);
558			});
559			return false;
560		});
561		//Pagination link clicks
562		$(document).on('click', '.em_bookings_events_table .tablenav-pages a', function(){
563			var el = $(this);
564			var url = em_ajaxify( el.attr('href') );	
565			el.parents('.em_bookings_events_table').find('.table-wrap').first().append('<div id="em-loading" />');
566			$.get( url, function(data){
567				el.parents('.em_bookings_events_table').first().replaceWith(data);
568			});
569			return false;
570		});
571	}
572	
573	//Manual Booking
574	$(document).on('click', 'a.em-booking-button', function(e){
575		e.preventDefault();
576		var button = $(this);
577		if( button.text() != EM.bb_booked && $(this).text() != EM.bb_booking){
578			button.text(EM.bb_booking);
579			var button_data = button.attr('id').split('_'); 
580			$.ajax({
581				url: EM.ajaxurl,
582				dataType: 'jsonp',
583				data: {
584					event_id : button_data[1],
585					_wpnonce : button_data[2],
586					action : 'booking_add_one'
587				},
588				success : function(response, statusText, xhr, $form) {
589					if(response.result){
590						button.text(EM.bb_booked);
591					}else{
592						button.text(EM.bb_error);
593					}
594					if(response.message != '') alert(response.message);
595					$(document).triggerHandler('em_booking_button_response', [response, button]);
596				},
597				error : function(){ button.text(EM.bb_error); }
598			});
599		}
600		return false;
601	});	
602	$(document).on('click', 'a.em-cancel-button', function(e){
603		e.preventDefault();
604		var button = $(this);
605		if( button.text() != EM.bb_cancelled && button.text() != EM.bb_canceling){
606			button.text(EM.bb_canceling);
607			var button_data = button.attr('id').split('_'); 
608			$.ajax({
609				url: EM.ajaxurl,
610				dataType: 'jsonp',
611				data: {
612					booking_id : button_data[1],
613					_wpnonce : button_data[2],
614					action : 'booking_cancel'
615				},
616				success : function(response, statusText, xhr, $form) {
617					if(response.result){
618						button.text(EM.bb_cancelled);
619					}else{
620						button.text(EM.bb_cancel_error);
621					}
622				},
623				error : function(){ button.text(EM.bb_cancel_error); }
624			});
625		}
626		return false;
627	});  
628
629	//Datepicker
630	if( $('.em-date-single, .em-date-range, #em-date-start').length > 0 ){
631		load_ui_css = true;
632		em_setup_datepicker('body');
633	}
634	if( load_ui_css ) em_load_jquery_css();
635	
636	//previously in em-admin.php
637	function updateIntervalDescriptor () { 
638		$(".interval-desc").hide();
639		var number = "-plural";
640		if ($('input#recurrence-interval').val() == 1 || $('input#recurrence-interval').val() == "")
641		number = "-singular";
642		var descriptor = "span#interval-"+$("select#recurrence-frequency").val()+number;
643		$(descriptor).show();
644	}
645	function updateIntervalSelectors () {
646		$('p.alternate-selector').hide();   
647		$('p#'+ $('select#recurrence-frequency').val() + "-selector").show();
648	}
649	function updateShowHideRecurrence () {
650		if( $('input#event-recurrence').is(":checked")) {
651			$("#event_recurrence_pattern").fadeIn();
652			$("#event-date-explanation").hide();
653			$("#recurrence-dates-explanation").show();
654			$("h3#recurrence-dates-title").show();
655			$("h3#event-date-title").hide();     
656		} else {
657			$("#event_recurrence_pattern").hide();
658			$("#recurrence-dates-explanation").hide();
659			$("#event-date-explanation").show();
660			$("h3#recurrence-dates-title").hide();
661			$("h3#event-date-title").show();   
662		}
663	}		 
664	$("#recurrence-dates-explanation").hide();
665	$("#date-to-submit").hide();
666	$("#end-date-to-submit").hide();
667	
668	$("#localised-date").show();
669	$("#localised-end-date").show();
670	
671	$('#em-wrapper input.select-all').on('change', function(){
672	 	if($(this).is(':checked')){
673			$('input.row-selector').prop('checked', true);
674			$('input.select-all').prop('checked', true);
675	 	}else{
676			$('input.row-selector').prop('checked', false);
677			$('input.select-all').prop('checked', false);
678		}
679	}); 
680	
681	updateIntervalDescriptor(); 
682	updateIntervalSelectors();
683	updateShowHideRecurrence();
684	$('input#event-recurrence').on('change', updateShowHideRecurrence);
685	   
686	// recurrency elements   
687	$('input#recurrence-interval').on('keyup', updateIntervalDescriptor);
688	$('select#recurrence-frequency').on('change', updateIntervalDescriptor);
689	$('select#recurrence-frequency').on('change', updateIntervalSelectors);
690
691	/* Load any maps */	
692	if( $('.em-location-map').length > 0 || $('.em-locations-map').length > 0 || $('#em-map').length > 0 || $('.em-search-geo').length > 0 ){
693		em_maps_load();
694	}
695
696	/* Location Type Selection */
697	$('.em-location-types .em-location-types-select').on('change', function(){
698		let el = $(this);
699		if( el.val() == 0 ){
700			$('.em-location-type').hide();
701		}else{
702			let location_type = el.find('option:selected').data('display-class');
703			$('.em-location-type').hide();
704			$('.em-location-type.'+location_type).show();
705			if( location_type != 'em-location-type-place' ){
706				jQuery('#em-location-reset a').trigger('click');
707			}
708		}
709		if( el.data('active') !== '' && el.val() !== el.data('active') ){
710			$('.em-location-type-delete-active-alert').hide();
711			$('.em-location-type-delete-active-alert').show();
712		}else{
713			$('.em-location-type-delete-active-alert').hide();
714		}
715	}).trigger('change');
716	
717	//Finally, add autocomplete here
718	//Autocomplete
719	if( jQuery( "div.em-location-data input#location-name" ).length > 0 ){
720		jQuery( "div.em-location-data input#location-name" ).autocomplete({
721			source: EM.locationajaxurl,
722			minLength: 2,
723			focus: function( event, ui ){
724				jQuery("input#location-id" ).val( ui.item.value );
725				return false;
726			},			 
727			select: function( event, ui ){
728				jQuery("input#location-id" ).val(ui.item.id).trigger('change');
729				jQuery("input#location-name" ).val(ui.item.value);
730				jQuery('input#location-address').val(ui.item.address);
731				jQuery('input#location-town').val(ui.item.town);
732				jQuery('input#location-state').val(ui.item.state);
733				jQuery('input#location-region').val(ui.item.region);
734				jQuery('input#location-postcode').val(ui.item.postcode);
735				jQuery('input#location-latitude').val(ui.item.latitude);
736				jQuery('input#location-longitude').val(ui.item.longitude);
737				if( ui.item.country == '' ){
738					jQuery('select#location-country option:selected').removeAttr('selected');
739				}else{
740					jQuery('select#location-country option[value="'+ui.item.country+'"]').attr('selected', 'selected');
741				}
742				jQuery('div.em-location-data input').css('background-color','#ccc').prop('readonly', true);
743				jQuery('div.em-location-data select').css('background-color','#ccc').css('color', '#666666').prop('disabled', true);
744				jQuery('#em-location-reset').show();
745				jQuery('#em-location-search-tip').hide();
746				jQuery(document).triggerHandler('em_locations_autocomplete_selected', [event, ui]);
747				return false;
748			}
749		}).data( "ui-autocomplete" )._renderItem = function( ul, item ) {
750			html_val = "<a>" + em_esc_attr(item.label) + '<br><span style="font-size:11px"><em>'+ em_esc_attr(item.address) + ', ' + em_esc_attr(item.town)+"</em></span></a>";
751			return jQuery( "<li></li>" ).data( "item.autocomplete", item ).append(html_val).appendTo( ul );
752		};
753		jQuery('#em-location-reset a').on('click', function(){
754			jQuery('div.em-location-data input').css('background-color','#fff').val('').prop('readonly', false);
755			jQuery('div.em-location-data select').css('background-color','#fff').css('color', 'auto').prop('disabled', false);
756			jQuery('div.em-location-data option:selected').removeAttr('selected');
757			jQuery('input#location-id').val('');
758			jQuery('#em-location-reset').hide();
759			jQuery('#em-location-search-tip').show();
760			jQuery('#em-map').hide();
761			jQuery('#em-map-404').show();
762			if(typeof(marker) !== 'undefined'){
763				marker.setPosition(new google.maps.LatLng(0, 0));
764				infoWindow.close();
765				marker.setDraggable(true);
766			}
767			return false;
768		});
769		if( jQuery('input#location-id').val() != '0' && jQuery('input#location-id').val() != '' ){
770			jQuery('div.em-location-data input').css('background-color','#ccc').prop('readonly', true);
771			jQuery('div.em-location-data select').css('background-color','#ccc').css('color', '#666666').prop('disabled', true);
772			jQuery('#em-location-reset').show();
773			jQuery('#em-location-search-tip').hide();
774		}
775	}
776	/* Local JS Timezone related placeholders */
777	/* Moment JS Timzeone PH */
778	if( window.moment ){
779		var replace_specials = function( day, string ){
780			// replace things not supported by moment
781			string = string.replace(/##T/g, Intl.DateTimeFormat().resolvedOptions().timeZone);
782			string = string.replace(/#T/g, "GMT"+day.format('Z'));
783			string = string.replace(/###t/g, day.utcOffset()*-60);
784			string = string.replace(/##t/g, day.isDST());
785			string = string.replace(/#t/g, day.daysInMonth());
786			return string;
787		};
788		$('.em-date-momentjs').each( function(){
789			// Start Date
790			var el = $(this);
791			var day_start = moment.unix(el.data('date-start'));
792			var date_start_string = replace_specials(day_start, day_start.format(el.data('date-format')));
793			if( el.data('date-start') !== el.data('date-end') ){
794				// End Date
795				var day_end = moment.unix(el.data('date-end'));
796				var day_end_string = replace_specials(day_start, day_end.format(el.data('date-format')));
797				// Output
798				var date_string = date_start_string + el.data('date-separator') + day_end_string;
799			}else{
800				var date_string = date_start_string;
801			}
802			el.text(date_string);
803		});
804		var get_date_string = function(ts, format){
805			let date = new Date(ts * 1000);
806			let minutes = date.getMinutes();
807			if( format == 24 ){
808				let hours = date.getHours();
809				hours = hours < 10 ? '0' + hours : hours;
810				minutes = minutes < 10 ? '0' + minutes : minutes;
811				return hours + ':' + minutes;
812			}else{
813				let hours = date.getHours() % 12;
814				let ampm = hours >= 12 ? 'PM' : 'AM';
815				if( hours === 0 ) hours = 12; // the hour '0' should be '12'
816				minutes = minutes < 10 ? '0'+minutes : minutes;
817				return hours + ':' + minutes + ' ' + ampm;
818			}
819		}
820		$('.em-time-localjs').each( function(){
821			var el = $(this);
822			var strTime = get_date_string( el.data('time'), el.data('time-format') );
823			if( el.data('time-end') ){
824				var separator = el.data('time-separator') ? el.data('time-separator') : ' - ';
825				strTime = strTime + separator + get_date_string( el.data('time-end'), el.data('time-format') );
826			}
827			el.text(strTime);
828		});
829	}
830	/* Done! */
831	jQuery(document).triggerHandler('em_javascript_loaded');
832});
833
834function em_load_jquery_css(){
835	if( EM.ui_css && jQuery('link#jquery-ui-css').length == 0 ){
836		var script = document.createElement("link");
837		script.id = 'jquery-ui-css';
838		script.rel = "stylesheet";
839		script.href = EM.ui_css;
840		document.body.appendChild(script);
841	}
842}
843
844function em_setup_datepicker(wrap){	
845	wrap = jQuery(wrap);
846	//default picker vals
847	var datepicker_vals = { altFormat: "yy-mm-dd", changeMonth: true, changeYear: true, firstDay : EM.firstDay, yearRange:'c-100:c+15' };
848	if( EM.dateFormat ) datepicker_vals.dateFormat = EM.dateFormat;
849	if( EM.yearRange ) datepicker_vals.yearRange = EM.yearRange;
850	jQuery(document).triggerHandler('em_datepicker', datepicker_vals);
851	
852	//apply datepickers
853	dateDivs = wrap.find('.em-date-single, .em-date-range');
854	if( dateDivs.length > 0 ){
855		//apply datepickers to elements
856		dateDivs.find('input.em-date-input-loc').each(function(i,dateInput){
857			//init the datepicker
858			var dateInput = jQuery(dateInput);
859			var dateValue = dateInput.nextAll('input.em-date-input').first();
860			var dateValue_value = dateValue.val();
861			dateInput.datepicker(datepicker_vals);
862			dateInput.datepicker('option', 'altField', dateValue);
863			//now set the value
864			if( dateValue_value ){
865				var this_date_formatted = jQuery.datepicker.formatDate( EM.dateFormat, jQuery.datepicker.parseDate('yy-mm-dd', dateValue_value) );
866				dateInput.val(this_date_formatted);
867				dateValue.val(dateValue_value);
868			}
869			//add logic for texts
870			dateInput.on('change', function(){
871				if( jQuery(this).val() == '' ){
872					jQuery(this).nextAll('.em-date-input').first().val('');
873				}
874			});
875		});
876		//deal with date ranges
877		dateDivs.filter('.em-date-range').find('input.em-date-input-loc').each(function(i,dateInput){
878			//finally, apply start/end logic to this field
879			dateInput = jQuery(dateInput);
880			if( dateInput.hasClass('em-date-start') ){
881				dateInput.datepicker('option','onSelect', function( selectedDate ) {
882					//get corresponding end date input, we expect ranges to be contained in .em-date-range with a start/end input element
883					var startDate = jQuery(this);
884					var endDate = startDate.parents('.em-date-range').find('.em-date-end').first();
885					var startValue = startDate.nextAll('input.em-date-input').first().val();
886					var endValue = endDate.nextAll('input.em-date-input').first().val();
887					startDate.trigger('em_datepicker_change');
888					if( startValue > endValue && endValue != '' ){
889						endDate.datepicker( "setDate" , selectedDate );
890						endDate.trigger('change').trigger('em_datepicker_change');
891					}
892					endDate.datepicker( "option", 'minDate', selectedDate );
893				});
894			}else if( dateInput.hasClass('em-date-end') ){
895				var startInput = dateInput.parents('.em-date-range').find('.em-date-start').first();
896				if( startInput.val() != '' ){
897					dateInput.datepicker('option', 'minDate', startInput.val());
898				}
899			}
900		});
901	}
902}
903function em_setup_timepicker(wrap){
904	wrap = jQuery(wrap);
905	var timepicker_options = {
906		step:15
907	}
908	timepicker_options.timeFormat = EM.show24hours == 1 ? 'G:i':'g:i A';
909	jQuery(document).triggerHandler('em_timepicker_options', timepicker_options);
910	wrap.find(".em-time-input").em_timepicker(timepicker_options);
911
912	// Keep the duration between the two inputs.
913	wrap.find(".em-time-range input.em-time-start").each( function(i, el){
914		var time = jQuery(el);
915		time.data('oldTime', time.em_timepicker('getSecondsFromMidnight'));
916	}).on('change', function() {
917		var start = jQuery(this);
918		var end = start.nextAll('.em-time-end');
919		if (end.val()) { // Only update when second input has a value.
920			// Calculate duration.
921			var oldTime = start.data('oldTime');
922			var duration = (end.em_timepicker('getSecondsFromMidnight') - oldTime) * 1000;
923			var time = start.em_timepicker('getSecondsFromMidnight');
924			if( end.em_timepicker('getSecondsFromMidnight') >= oldTime ){
925				// Calculate and update the time in the second input.
926				end.em_timepicker('setTime', new Date(start.em_timepicker('getTime').getTime() + duration));
927			}
928			start.data('oldTime', time);
929		}
930	});
931	// Validate.
932	wrap.find(".event-form-when .em-time-range input.em-time-end").on('change', function() {
933		var end = jQuery(this);
934		var start = end.prevAll('.em-time-start');
935		var wrapper = end.closest('.event-form-when');
936		var start_date = wrapper.find('.em-date-end').val();
937		var end_date = wrapper.find('.em-date-start').val();
938		if( start.val() ){
939			if( start.em_timepicker('getTime') > end.em_timepicker('getTime') && ( end_date.length == 0 || start_date == end_date ) ) { end.addClass("error"); }
940			else { end.removeClass("error"); }
941		}
942	});
943	wrap.find(".event-form-when .em-date-end").on('change', function(){
944		jQuery(this).closest('.event-form-when').find('.em-time-end').trigger('change');
945	});
946	//Sort out all day checkbox
947	wrap.find('.em-time-range input.em-time-all-day').on('change', function(){
948		var allday = jQuery(this);
949		if( allday.is(':checked') ){
950			allday.siblings('.em-time-input').css('background-color','#ccc');
951		}else{
952			allday.siblings('.em-time-input').css('background-color','#fff');
953		}
954	}).trigger('change');
955}
956
957/* Useful function for adding the em_ajax flag to a url, regardless of querystring format */
958var em_ajaxify = function(url){
959	if ( url.search('em_ajax=0') != -1){
960		url = url.replace('em_ajax=0','em_ajax=1');
961	}else if( url.search(/\?/) != -1 ){
962		url = url + "&em_ajax=1";
963	}else{
964		url = url + "?em_ajax=1";
965	}
966	return url;
967};
968
969/*
970 * MAP FUNCTIONS
971 */
972var em_maps_loaded = false;
973var maps = {};
974var maps_markers = {};
975var infoWindow;
976//loads maps script if not already loaded and executes EM maps script
977function em_maps_load(){
978	if( !em_maps_loaded ){
979		if ( jQuery('script#google-maps').length == 0 && ( typeof google !== 'object' || typeof google.maps !== 'object' ) ){ 
980			var script = document.createElement("script");
981			script.type = "text/javascript";
982			script.id = "google-maps";
983			var proto = (EM.is_ssl) ? 'https:' : 'http:';
984			if( typeof EM.google_maps_api !== 'undefined' ){
985				script.src = proto + 'https://maps.google.com/maps/api/js?v=quarterly&libraries=places&callback=em_maps&key='+EM.google_maps_api;
986			}else{
987				script.src = proto + 'https://maps.google.com/maps/api/js?v=quarterly&libraries=places&callback=em_maps';
988			}
989			document.body.appendChild(script);
990		}else if( typeof google === 'object' && typeof google.maps === 'object' && !em_maps_loaded ){
991			em_maps();
992		}else if( jQuery('script#google-maps').length > 0 ){
993			jQuery(window).load(function(){ if( !em_maps_loaded ) em_maps(); }); //google isn't loaded so wait for page to load resources
994		}
995	}
996}
997//re-usable function to load global location maps
998function em_maps_load_locations(el){
999	var el = jQuery(el);
1000	var map_id = el.attr('id').replace('em-locations-map-','');
1001	var em_data = jQuery.parseJSON( el.nextAll('.em-locations-map-coords').first().text() );
1002	if( em_data == null ){
1003		var em_data = jQuery.parseJSON( jQuery('#em-locations-map-coords-'+map_id).text() );
1004	}
1005	jQuery.getJSON(document.URL, em_data , function(data){
1006		if(data.length > 0){
1007			//define default options and allow option for extension via event triggers
1008			  var map_options = { mapTypeId: google.maps.MapTypeId.ROADMAP };
1009			  if( typeof EM.google_map_id_styles == 'object' && typeof EM.google_map_id_styles[map_id] !== 'undefined' ){ console.log(EM.google_map_id_styles[map_id]); map_options.styles = EM.google_map_id_styles[map_id]; }
1010			  else if( typeof EM.google_maps_styles !== 'undefined' ){ map_options.styles = EM.google_maps_styles; }
1011			  jQuery(document).triggerHandler('em_maps_locations_map_options', map_options);
1012			  var marker_options = {};
1013			  jQuery(document).triggerHandler('em_maps_location_marker_options', marker_options);
1014			  
1015			  maps[map_id] = new google.maps.Map(el[0], map_options);
1016			  maps_markers[map_id] = [];
1017
1018			  var bounds = new google.maps.LatLngBounds();
1019			  
1020			  jQuery.map( data, function( location, i ){
1021				  if( !(location.location_latitude == 0 && location.location_longitude == 0) ){
1022					var latitude = parseFloat( location.location_latitude );
1023					var longitude = parseFloat( location.location_longitude );
1024					var location_position = new google.maps.LatLng( latitude, longitude );
1025					//extend the default marker options
1026					jQuery.extend(marker_options, {
1027					    position: location_position, 
1028					    map: maps[map_id]
1029					})
1030					var marker = new google.maps.Marker(marker_options);
1031					maps_markers[map_id].push(marker);
1032					marker.setTitle(location.location_name);
1033					var myContent = '<div class="em-map-balloon"><div id="em-map-balloon-'+map_id+'" class="em-map-balloon-content">'+ location.location_balloon +'</div></div>';
1034					em_map_infobox(marker, myContent, maps[map_id]);
1035					//extend bounds
1036					bounds.extend(new google.maps.LatLng(latitude,longitude))
1037				  }
1038			  });
1039			  // Zoom in to the bounds
1040			  maps[map_id].fitBounds(bounds);
1041			  
1042			//Call a hook if exists
1043			jQuery(document).triggerHandler('em_maps_locations_hook', [maps[map_id], data, map_id, maps_markers[map_id]]);
1044		}else{
1045			el.children().first().html('No locations found');
1046			jQuery(document).triggerHandler('em_maps_locations_hook_not_found', [el]);
1047		}
1048	});
1049}
1050function em_maps_load_location(el){
1051	el = jQuery(el);
1052	var map_id = el.attr('id').replace('em-location-map-','');
1053	em_LatLng = new google.maps.LatLng( jQuery('#em-location-map-coords-'+map_id+' .lat').text(), jQuery('#em-location-map-coords-'+map_id+' .lng').text());
1054	//extend map and markers via event triggers
1055	var map_options = {
1056	    zoom: 14,
1057	    center: em_LatLng,
1058	    mapTypeId: google.maps.MapTypeId.ROADMAP,
1059	    mapTypeControl: false,
1060	    gestureHandling: 'cooperative'
1061	};
1062	if( typeof EM.google_map_id_styles == 'object' && typeof EM.google_map_id_styles[map_id] !== 'undefined' ){ console.log(EM.google_map_id_styles[map_id]); map_options.styles = EM.google_map_id_styles[map_id]; }
1063	else if( typeof EM.google_maps_styles !== 'undefined' ){ map_options.styles = EM.google_maps_styles; }
1064	jQuery(document).triggerHandler('em_maps_location_map_options', map_options);
1065	maps[map_id] = new google.maps.Map( document.getElementById('em-location-map-'+map_id), map_options);
1066	var marker_options = {
1067	    position: em_LatLng,
1068	    map: maps[map_id]
1069	};
1070	jQuery(document).triggerHandler('em_maps_location_marker_options', marker_options);
1071	maps_markers[map_id] = new google.maps.Marker(marker_options);
1072	infoWindow = new google.maps.InfoWindow({ content: jQuery('#em-location-map-info-'+map_id+' .em-map-balloon').get(0) });
1073	infoWindow.open(maps[map_id],maps_markers[map_id]);
1074	maps[map_id].panBy(40,-70);
1075	
1076	//JS Hook for handling map after instantiation
1077	//Example hook, which you can add elsewhere in your theme's JS - jQuery(document).on('em_maps_location_hook', function(){ alert('hi');} );
1078	jQuery(document).triggerHandler('em_maps_location_hook', [maps[map_id], infoWindow, maps_markers[map_id], map_id]);
1079	//map resize listener
1080	jQuery(window).on('resize', function(e) {
1081		google.maps.event.trigger(maps[map_id], "resize");
1082		maps[map_id].setCenter(maps_markers[map_id].getPosition());
1083		maps[map_id].panBy(40,-70);
1084	});
1085}
1086jQuery(document).on('em_search_ajax', function(e, vars, wrapper){
1087	if( em_maps_loaded ){
1088		wrapper.find('.em-location-map').each( function(index, el){ em_maps_load_location(el); } );
1089		wrapper.find('.em-locations-map').each( function(index, el){ em_maps_load_locations(el); });
1090	}
1091});
1092//Load single maps (each map is treated as a seperate map).
1093function em_maps() {
1094	//Find all the maps on this page and load them
1095	jQuery('.em-location-map').each( function(index, el){ em_maps_load_location(el); } );	
1096	jQuery('.em-locations-map').each( function(index, el){ em_maps_load_locations(el); } );
1097	
1098	//Location stuff - only needed if inputs for location exist
1099	if( jQuery('select#location-select-id, input#location-address').length > 0 ){
1100		var map, marker;
1101		//load map info
1102		var refresh_map_location = function(){
1103			var location_latitude = jQuery('#location-latitude').val();
1104			var location_longitude = jQuery('#location-longitude').val();
1105			if( !(location_latitude == 0 && location_longitude == 0) ){
1106				var position = new google.maps.LatLng(location_latitude, location_longitude); //the location coords
1107				marker.setPosition(position);
1108				var mapTitle = (jQuery('input#location-name').length > 0) ? jQuery('input#location-name').val():jQuery('input#title').val();
1109				mapTitle = em_esc_attr(mapTitle);
1110				marker.setTitle( mapTitle );
1111				jQuery('#em-map').show();
1112				jQuery('#em-map-404').hide();
1113				google.maps.event.trigger(map, 'resize');
1114				map.setCenter(position);
1115				map.panBy(40,-55);
1116				infoWindow.setContent( 
1117					'<div id="location-balloon-content"><strong>' + mapTitle + '</strong><br>' + 
1118					em_esc_attr(jQuery('#location-address').val()) + 
1119					'<br>' + em_esc_attr(jQuery('#location-town').val()) + 
1120					'</div>'
1121				);
1122				infoWindow.open(map, marker);
1123				jQuery(document).triggerHandler('em_maps_location_hook', [map, infoWindow, marker, 0]);
1124			} else {
1125    			jQuery('#em-map').hide();
1126    			jQuery('#em-map-404').show();
1127			}
1128		};
1129		
1130		//Add listeners for changes to address
1131		var get_map_by_id = function(id){
1132			if(jQuery('#em-map').length > 0){
1133				jQuery.getJSON(document.URL,{ em_ajax_action:'get_location', id:id }, function(data){
1134					if( data.location_latitude!=0 && data.location_longitude!=0 ){
1135						loc_latlng = new google.maps.LatLng(data.location_latitude, data.location_longitude);
1136						marker.setPosition(loc_latlng);
1137						marker.setTitle( data.location_name );
1138						marker.setDraggable(false);
1139						jQuery('#em-map').show();
1140						jQuery('#em-map-404').hide();
1141						map.setCenter(loc_latlng);
1142						map.panBy(40,-55);
1143						infoWindow.setContent( '<div id="location-balloon-content">'+ data.location_balloon +'</div>');
1144						infoWindow.open(map, marker);
1145						google.maps.event.trigger(map, 'resize');
1146						jQuery(document).triggerHandler('em_maps_location_hook', [map, infoWindow, marker, 0]);
1147					}else{
1148						jQuery('#em-map').hide();
1149						jQuery('#em-map-404').show();
1150					}
1151				});
1152			}
1153		};
1154		jQuery('#location-select-id, input#location-id').on('change', function(){get_map_by_id(jQuery(this).val());} );
1155		jQuery('#location-name, #location-town, #location-address, #location-state, #location-postcode, #location-country').on('change', function(){
1156			//build address
1157			if( jQuery(this).prop('readonly') === true ) return;
1158			var addresses = [ jQuery('#location-address').val(), jQuery('#location-town').val(), jQuery('#location-state').val(), jQuery('#location-postcode').val() ];
1159			var address = '';
1160			jQuery.each( addresses, function(i, val){
1161				if( val != '' ){
1162					address = ( address == '' ) ? address+val:address+', '+val;
1163				}
1164			});
1165			if( address == '' ){ //in case only name is entered, no address
1166				jQuery('#em-map').hide();
1167				jQuery('#em-map-404').show();
1168				return false;
1169			}
1170			//do country last, as it's using the text version
1171			if( jQuery('#location-country option:selected').val() != 0 ){
1172				address = ( address == '' ) ? address+jQuery('#location-country option:selected').text():address+', '+jQuery('#location-country option:selected').text();
1173			}
1174			if( address != '' && jQuery('#em-map').length > 0 ){
1175				geocoder.geocode( { 'address': address }, function(results, status) {
1176				    if (status == google.maps.GeocoderStatus.OK) {
1177						jQuery('#location-latitude').val(results[0].geometry.location.lat());
1178						jQuery('#location-longitude').val(results[0].geometry.location.lng());
1179					}
1180				    refresh_map_location();
1181				});
1182			}
1183		});
1184		
1185		//Load map
1186		if(jQuery('#em-map').length > 0){
1187			var em_LatLng = new google.maps.LatLng(0, 0);
1188			var map_options = {
1189				    zoom: 14,
1190				    center: em_LatLng,
1191				    mapTypeId: google.maps.MapTypeId.ROADMAP,
1192				    mapTypeControl: false,
1193				    gestureHandling: 'cooperative'
1194			};
1195			if( typeof EM.google_maps_styles !== 'undefined' ){ map_options.styles = EM.google_maps_styles; }
1196			map = new google.maps.Map( document.getElementById('em-map'), map_options);
1197			var marker = new google.maps.Marker({
1198			    position: em_LatLng,
1199			    map: map,
1200			    draggable: true
1201			});
1202			infoWindow = new google.maps.InfoWindow({
1203			    content: ''
1204			});
1205			var geocoder = new google.maps.Geocoder();
1206			google.maps.event.addListener(infoWindow, 'domready', function() { 
1207				document.getElementById('location-balloon-content').parentNode.style.overflow=''; 
1208				document.getElementById('location-balloon-content').parentNode.parentNode.style.overflow=''; 
1209			});
1210			google.maps.event.addListener(marker, 'dragend', function() {
1211				var position = marker.getPosition();
1212				jQuery('#location-latitude').val(position.lat());
1213				jQuery('#location-longitude').val(position.lng());
1214				map.setCenter(position);
1215				map.panBy(40,-55);
1216			});
1217			if( jQuery('#location-select-id').length > 0 ){
1218				jQuery('#location-select-id').trigger('change');
1219			}else{
1220				refresh_map_location();
1221			}
1222			jQuery(document).triggerHandler('em_map_loaded', [map, infoWindow, marker]);
1223		}
1224		//map resize listener
1225		jQuery(window).on('resize', function(e) {
1226			google.maps.event.trigger(map, "resize");
1227			map.setCenter(marker.getPosition());
1228			map.panBy(40,-55);
1229		});
1230	}
1231	em_maps_loaded = true; //maps have been loaded
1232	jQuery(document).triggerHandler('em_maps_loaded');
1233}
1234  
1235function em_map_infobox(marker, message, map) {
1236  var iw = new google.maps.InfoWindow({ content: message });
1237  google.maps.event.addListener(marker, 'click', function() {
1238	if( infoWindow ) infoWindow.close();
1239	infoWindow = iw;
1240    iw.open(map,marker);
1241  });
1242}
1243
1244function em_esc_attr( str ){
1245	if( typeof str !== 'string' ) return '';
1246	return str.replace(/</gi,'&lt;').replace(/>/gi,'&gt;');
1247}
1248
1249/*!
1250 * jquery-timepicker v1.13.16 - Copyright (c) 2020 Jon Thornton - https://www.jonthornton.com/jquery-timepicker/
1251 * Did a search/replace of timepicker to em_timepicker to prevent conflicts.
1252 */
1253(function(){"use strict";function _typeof(obj){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function(obj){return typeof obj}}else{_typeof=function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj}}return _typeof(obj)}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);
1253if(enumerableOnly)symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable});keys.push.apply(keys,symbols)}return keys}function _objectSpread2(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};if(i%2){ownKeys(Object(source),true).forEach(function(key){_defineProperty(target,key,source[key])})}else if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}}return target}function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _createForOfIteratorHelper(o){if(typeof Symbol==="undefined"||o[Symbol.iterator]==null){if(Array.isArray(o)||(o=_unsupportedIterableToArray(o))){var i=0;var F=function(){};return{s:F,n:function(){if(i>=o.length)return{done:true};return{done:false,value:o[i++]}},e:function(e){throw e},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var it,normalCompletion=true,didErr=false,err;return{s:function(){it=o[Symbol.iterator]()},n:function(){var step=it.next();normalCompletion=step.done;return step},e:function(e){didErr=true;err=e},f:function(){try{if(!normalCompletion&&it.return!=null)it.return()}finally{if(didErr)throw err}}}}var ONE_DAY=86400;var roundingFunction=function roundingFunction(seconds,settings){if(seconds===null){return null}else if(typeof settings.step!=="number"){return seconds}else{var offset=seconds%(settings.step*60);var start=settings.minTime||0;offset-=start%(settings.step*60);if(offset>=settings.step*30){seconds+=settings.step*60-offset}else{seconds-=offset}return _moduloSeconds(seconds,settings)}};function _moduloSeconds(seconds,settings){if(seconds==ONE_DAY&&settings.show2400){return seconds}return seconds%ONE_DAY}var DEFAULT_SETTINGS={appendTo:"body",className:null,closeOnWindowScroll:false,disableTextInput:false,disableTimeRanges:[],disableTouchKeyboard:false,durationTime:null,forceRoundTime:false,lang:{},listWidth:null,maxTime:null,minTime:null,noneOption:false,orientation:"l",roundingFunction:roundingFunction,scrollDefault:null,selectOnBlur:false,show2400:false,showDuration:false,showOn:["click","focus"],showOnFocus:true,step:30,stopScrollPropagation:false,timeFormat:"g:ia",typeaheadHighlight:true,useSelect:false,wrapHours:true};var DEFAULT_LANG={am:"am",pm:"pm",AM:"AM",PM:"PM",decimal:".",mins:"mins",hr:"hr",hrs:"hrs"};var Timepicker=function(){function Timepicker(targetEl){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,Timepicker);this._handleFormatValue=this._handleFormatValue.bind(this);this._handleKeyUp=this._handleKeyUp.bind(this);this.targetEl=targetEl;var attrOptions=Timepicker.extractAttrOptions(targetEl,Object.keys(DEFAULT_SETTINGS));this.settings=this.parseSettings(_objectSpread2(_objectSpread2(_objectSpread2({},DEFAULT_SETTINGS),options),attrOptions))}_createClass(Timepicker,[{key:"hideMe",value:function hideMe(){if(this.settings.useSelect){this.targetEl.blur();return}if(!this.list||!Timepicker.isVisible(this.list)){return}if(this.settings.selectOnBlur){this._selectValue()}this.list.hide();var hideTimepickerEvent=new CustomEvent("hideTimepicker");this.targetEl.dispatchEvent(hideTimepickerEvent)}},{key:"_findRow",value:function _findRow(value){if(!value&&value!==0){return false}var out=false;var value=this.settings.roundingFunction(value,this.settings);if(!this.list){return false}this.list.find("li").each(function(i,obj){var parsed=Number.parseInt(obj.dataset.time);if(Number.isNaN(parsed)){return}if(parsed==value){out=obj;return false}});return out}},{key:"_hideKeyboard",value:function _hideKeyboard(){return(window.navigator.msMaxTouchPoints||"ontouchstart"in document)&&this.settings.disableTouchKeyboard}},{key:"_setTimeValue",value:function _setTimeValue(value,source){if(this.targetEl.nodeName==="INPUT"){if(value!==null||this.targetEl.value!=""){this.targetEl.value=value}var tp=this;var settings=tp.settings;if(settings.useSelect&&source!="select"&&tp.list){tp.list.val(tp._roundAndFormatTime(tp.time2int(value)))}}
1253var selectTimeEvent=new Event("selectTime");if(this.selectedValue!=value){this.selectedValue=value;var changeTimeEvent=new Event("changeTime");var changeEvent=new CustomEvent("change",{detail:"em_timepicker"});if(source=="select"){this.targetEl.dispatchEvent(selectTimeEvent);this.targetEl.dispatchEvent(changeTimeEvent);this.targetEl.dispatchEvent(changeEvent)}else if(["error","initial"].indexOf(source)==-1){this.targetEl.dispatchEvent(changeTimeEvent)}return true}else{if(["error","initial"].indexOf(source)==-1){this.targetEl.dispatchEvent(selectTimeEvent)}return false}}},{key:"_getTimeValue",value:function _getTimeValue(){if(this.targetEl.nodeName==="INPUT"){return this.targetEl.value}else{return this.selectedValue}}},{key:"_selectValue",value:function _selectValue(){var tp=this;var settings=tp.settings;var list=tp.list;var cursor=list.find(".ui-em_timepicker-selected");if(cursor.hasClass("ui-em_timepicker-disabled")){return false}if(!cursor.length){return true}var timeValue=cursor.get(0).dataset.time;if(timeValue){var parsedTimeValue=Number.parseInt(timeValue);if(!Number.isNaN(parsedTimeValue)){timeValue=parsedTimeValue}}if(timeValue!==null){if(typeof timeValue!="string"){timeValue=tp._int2time(timeValue)}tp._setTimeValue(timeValue,"select")}return true}},{key:"time2int",value:function time2int(timeString){if(timeString===""||timeString===null||timeString===undefined)return null;if(timeString instanceof Date){return timeString.getHours()*3600+timeString.getMinutes()*60+timeString.getSeconds()}if(typeof timeString!="string"){return timeString}timeString=timeString.toLowerCase().replace(/[\s\.]/g,"");if(timeString.slice(-1)=="a"||timeString.slice(-1)=="p"){timeString+="m"}var pattern=/^(([^0-9]*))?([0-9]?[0-9])(([0-5][0-9]))?(([0-5][0-9]))?(([^0-9]*))$/;var hasDelimetersMatch=timeString.match(/\W/);if(hasDelimetersMatch){pattern=/^(([^0-9]*))?([0-9]?[0-9])(\W+([0-5][0-9]?))?(\W+([0-5][0-9]))?(([^0-9]*))$/}var time=timeString.match(pattern);if(!time){return null}var hour=parseInt(time[3]*1,10);var ampm=time[2]||time[9];var hours=hour;var minutes=time[5]*1||0;var seconds=time[7]*1||0;if(!ampm&&time[3].length==2&&time[3][0]=="0"){ampm="am"}if(hour<=12&&ampm){ampm=ampm.trim();var isPm=ampm==this.settings.lang.pm||ampm==this.settings.lang.PM;if(hour==12){hours=isPm?12:0}else{hours=hour+(isPm?12:0)}}else{var t=hour*3600+minutes*60+seconds;if(t>=ONE_DAY+(this.settings.show2400?1:0)){if(this.settings.wrapHours===false){return null}hours=hour%24}}var timeInt=hours*3600+minutes*60+seconds;if(hour<12&&!ampm&&this.settings._twelveHourTime&&this.settings.scrollDefault){var delta=timeInt-this.settings.scrollDefault();if(delta<0&&delta>=ONE_DAY/-2){timeInt=(timeInt+ONE_DAY/2)%ONE_DAY}}return timeInt}},{key:"parseSettings",value:function parseSettings(settings){var _this=this;settings.lang=_objectSpread2(_objectSpread2({},DEFAULT_LANG),settings.lang);this.settings=settings;if(settings.minTime){settings.minTime=this.time2int(settings.minTime)}if(settings.maxTime){settings.maxTime=this.time2int(settings.maxTime)}if(settings.listWidth){settings.listWidth=this.time2int(settings.listWidth)}if(settings.durationTime&&typeof settings.durationTime!=="function"){settings.durationTime=this.time2int(settings.durationTime)}if(settings.scrollDefault=="now"){settings.scrollDefault=function(){return settings.roundingFunction(_this.time2int(new Date),settings)}}else if(settings.scrollDefault&&typeof settings.scrollDefault!="function"){var val=settings.scrollDefault;settings.scrollDefault=function(){return settings.roundingFunction(_this.time2int(val),settings)}}else if(settings.minTime){settings.scrollDefault=function(){return settings.roundingFunction(settings.minTime,settings)}}if(typeof settings.timeFormat==="string"&&settings.timeFormat.match(/[gh]/)){settings._twelveHourTime=true}if(settings.showOnFocus===false&&settings.showOn.indexOf("focus")!=-1){settings.showOn.splice(settings.showOn.indexOf("focus"),1)}if(!settings.disableTimeRanges){settings.disableTimeRanges=[]}if(settings.disableTimeRanges.length>0){for(var i in settings.disableTimeRanges){settings.disableTimeRanges[i]=[this.time2int(sett
1253ings.disableTimeRanges[i][0]),this.time2int(settings.disableTimeRanges[i][1])]}settings.disableTimeRanges=settings.disableTimeRanges.sort(function(a,b){return a[0]-b[0]});for(var i=settings.disableTimeRanges.length-1;i>0;i--){if(settings.disableTimeRanges[i][0]<=settings.disableTimeRanges[i-1][1]){settings.disableTimeRanges[i-1]=[Math.min(settings.disableTimeRanges[i][0],settings.disableTimeRanges[i-1][0]),Math.max(settings.disableTimeRanges[i][1],settings.disableTimeRanges[i-1][1])];settings.disableTimeRanges.splice(i,1)}}}return settings}},{key:"_disableTextInputHandler",value:function _disableTextInputHandler(e){switch(e.keyCode){case 13:case 9:return;default:e.preventDefault()}}},{key:"_int2duration",value:function _int2duration(seconds,step){seconds=Math.abs(seconds);var minutes=Math.round(seconds/60),duration=[],hours,mins;if(minutes<60){duration=[minutes,this.settings.lang.mins]}else{hours=Math.floor(minutes/60);mins=minutes%60;if(step==30&&mins==30){hours+=this.settings.lang.decimal+5}duration.push(hours);duration.push(hours==1?this.settings.lang.hr:this.settings.lang.hrs);if(step!=30&&mins){duration.push(mins);duration.push(this.settings.lang.mins)}}return duration.join(" ")}},{key:"_roundAndFormatTime",value:function _roundAndFormatTime(seconds){seconds=this.settings.roundingFunction(seconds,this.settings);if(seconds!==null){return this._int2time(seconds)}}},{key:"_int2time",value:function _int2time(timeInt){if(typeof timeInt!="number"){return null}var seconds=parseInt(timeInt%60),minutes=parseInt(timeInt/60%60),hours=parseInt(timeInt/(60*60)%24);var time=new Date(1970,0,2,hours,minutes,seconds,0);if(isNaN(time.getTime())){return null}if(typeof this.settings.timeFormat==="function"){return this.settings.timeFormat(time)}var output="";var hour,code;for(var i=0;i<this.settings.timeFormat.length;i++){code=this.settings.timeFormat.charAt(i);switch(code){case"a":output+=time.getHours()>11?this.settings.lang.pm:this.settings.lang.am;break;case"A":output+=time.getHours()>11?this.settings.lang.PM:this.settings.lang.AM;break;case"g":hour=time.getHours()%12;output+=hour===0?"12":hour;break;case"G":hour=time.getHours();if(timeInt===ONE_DAY)hour=this.settings.show2400?24:0;output+=hour;break;case"h":hour=time.getHours()%12;if(hour!==0&&hour<10){hour="0"+hour}output+=hour===0?"12":hour;break;case"H":hour=time.getHours();if(timeInt===ONE_DAY)hour=this.settings.show2400?24:0;output+=hour>9?hour:"0"+hour;break;case"i":var minutes=time.getMinutes();output+=minutes>9?minutes:"0"+minutes;break;case"s":seconds=time.getSeconds();output+=seconds>9?seconds:"0"+seconds;break;case"\\":i++;output+=this.settings.timeFormat.charAt(i);break;default:output+=code}}return output}},{key:"_setSelected",value:function _setSelected(){var list=this.list;list.find("li").removeClass("ui-em_timepicker-selected");var timeValue=this.time2int(this._getTimeValue());if(timeValue===null){return}var selected=this._findRow(timeValue);if(selected){var selectedRect=selected.getBoundingClientRect();var listRect=list.get(0).getBoundingClientRect();var topDelta=selectedRect.top-listRect.top;if(topDelta+selectedRect.height>listRect.height||topDelta<0){var newScroll=list.scrollTop()+(selectedRect.top-listRect.top)-selectedRect.height;list.scrollTop(newScroll)}var parsed=Number.parseInt(selected.dataset.time);if(this.settings.forceRoundTime||parsed===timeValue){selected.classList.add("ui-em_timepicker-selected")}}}},{key:"_isFocused",value:function _isFocused(el){return el===document.activeElement}},{key:"_handleFormatValue",value:function _handleFormatValue(e){if(e&&e.detail=="em_timepicker"){return}this._formatValue(e)}},{key:"_formatValue",value:function _formatValue(e,origin){if(this.targetEl.value===""){this._setTimeValue(null,origin);return}if(this._isFocused(this.targetEl)&&(!e||e.type!="change")){return}var settings=this.settings;var seconds=this.time2int(this.targetEl.value);if(seconds===null){var timeFormatErrorEvent=new CustomEvent("timeFormatError");this.targetEl.dispatchEvent(timeFormatErrorEvent);return}var rangeError=false;if(settings.minTime!==null&&settings.maxTime!==null&&(seconds<settings.minTime||seconds>
1253settings.maxTime)){rangeError=true}var _iterator=_createForOfIteratorHelper(settings.disableTimeRanges),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var range=_step.value;if(seconds>=range[0]&&seconds<range[1]){rangeError=true;break}}}catch(err){_iterator.e(err)}finally{_iterator.f()}if(settings.forceRoundTime){var roundSeconds=settings.roundingFunction(seconds,settings);if(roundSeconds!=seconds){seconds=roundSeconds;origin=null}}var prettyTime=this._int2time(seconds);if(rangeError){this._setTimeValue(prettyTime);var timeRangeErrorEvent=new CustomEvent("timeRangeError");this.targetEl.dispatchEvent(timeRangeErrorEvent)}else{this._setTimeValue(prettyTime,origin)}}},{key:"_generateNoneElement",value:function _generateNoneElement(optionValue,useSelect){var label,className,value;if(_typeof(optionValue)=="object"){label=optionValue.label;className=optionValue.className;value=optionValue.value}else if(typeof optionValue=="string"){label=optionValue;value=""}else{$.error("Invalid noneOption value")}var el;if(useSelect){el=document.createElement("option");el.value=value}else{el=document.createElement("li");el.dataset.time=String(value)}el.innerText=label;el.classList.add(className);return el}},{key:"_handleKeyUp",value:function _handleKeyUp(e){if(!this.list||!Timepicker.isVisible(this.list)||this.settings.disableTextInput){return true}if(e.type==="paste"||e.type==="cut"){setTimeout(function(){if(this.settings.typeaheadHighlight){this._setSelected()}else{this.list.hide()}},0);return}switch(e.keyCode){case 96:case 97:case 98:case 99:case 100:case 101:case 102:case 103:case 104:case 105:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 65:case 77:case 80:case 186:case 8:case 46:if(this.settings.typeaheadHighlight){this._setSelected()}else{this.list.hide()}break}}}],[{key:"extractAttrOptions",value:function extractAttrOptions(element,keys){var output={};var _iterator2=_createForOfIteratorHelper(keys),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var key=_step2.value;if(key in element.dataset){output[key]=element.dataset[key]}}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}return output}},{key:"isVisible",value:function isVisible(elem){var el=elem[0];return el.offsetWidth>0&&el.offsetHeight>0}},{key:"hideAll",value:function hideAll(){var _iterator3=_createForOfIteratorHelper(document.getElementsByClassName("ui-em_timepicker-input")),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var el=_step3.value;var tp=el.em_timepickerObj;if(tp){tp.hideMe()}}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}}]);return Timepicker}();(function(factory){if((typeof exports==="undefined"?"undefined":_typeof(exports))==="object"&&exports&&(typeof module==="undefined"?"undefined":_typeof(module))==="object"&&module&&module.exports===exports){factory(require("jquery"))}else if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else{factory(jQuery)}})(function($){var _lang={};var methods={init:function init(options){return this.each(function(){var self=$(this);var tp=new Timepicker(this,options);var settings=tp.settings;_lang=settings.lang;this.em_timepickerObj=tp;self.addClass("ui-em_timepicker-input");if(settings.useSelect){_render(self)}else{self.prop("autocomplete","off");if(settings.showOn){for(var i in settings.showOn){self.on(settings.showOn[i]+".em_timepicker",methods.show)}}self.on("change.em_timepicker",tp._handleFormatValue);self.on("keydown.em_timepicker",_keydownhandler);self.on("keyup.em_timepicker",tp._handleKeyUp);if(settings.disableTextInput){self.on("keydown.em_timepicker",tp._disableTextInputHandler)}self.on("cut.em_timepicker",tp._handleKeyUp);self.on("paste.em_timepicker",tp._handleKeyUp);tp._formatValue(null,"initial")}})},show:function show(e){var self=$(this);var tp=self[0].em_timepickerObj;var settings=tp.settings;if(e){e.preventDefault()}if(settings.useSelect){tp.list.trigger("focus");return}if(tp._hideKeyboard()){self.trigger("blur")}var list=tp.list;if(self.prop("readonly")){return}if(!list||list.length===0||typeof settings.durationTime==="function"){_render(self);list=tp.list}if(Timepicker.isVisible(list)){return}if(self.is("input")){tp.selectedValue=self.val()}tp._setSelected();Timepicker.hideAll();if(typeof settings.listWidth=="number"){list.width(self.outerWidth()*settings.listWidth)}list.show();var listOffset={};if(settings.orientation.match(/r/)){listOffset.left=self.offset().left+self.outerWidth()-list.outerWidth()+parseInt(list.css("marginLeft").replace("px",""),10)}else if(settings.orientation.match(/l/)){listOffset.left=self.offset().left+parseInt(list.css("marginLeft").replace("px",""),10)}else if(settings.orientation.match(/c/)){listOffset.left=self.offset().left+(self.outerWidth()-list.outerWidth())/2+parseInt(list.css("marginLeft").replace("px",""),10)}var verticalOrientation;if(settings.orientation.match(/t/)){verticalOrientation="t"}else if(settings.orientation.match(/b/)){verticalOrientation="b"}else if(self.offset().top+self.outerHeight(true)+list.outerHeight()>$(window).height()+$(window).scrollTop()){verticalOrientation="t"}else{verticalOrientation="b"}if(verticalOrientation=="t"){list.addClass("ui-em_timepicker-positioned-top");listOffset.top=self.offset().top-list.outerHeight()+parseInt(list.css("marginTop").replace("px",""),10)}else{list.removeClass("ui-em_timepicker-positioned-top");listOffset.top=self.offset().top+self.outerHeight()+parseInt(list.css("marginTop").replace("px",""),10)}list.offset(listOffset);var selected=list.find(".ui-em_timepicker-selected");if(!selected.length){var timeInt=tp.time2int(tp._getTimeValue());if(timeInt!==null){selected=$(tp._findRow(timeInt))}else if(settings.scrollDefault){selected=$(tp._findRow(settings.scrollDefault()))}}if(!selected.length||selected.hasClass("ui-em_timepicker-disabled")){selected=list.find("li:not(.ui-em_timepicker-disabled):first")}if(selected&&selected.length){var topOffset=list.scrollTop()+selected.position().top-selected.outerHeight();list.scrollTop(topOffset)}else{list.scrollTop(0)}if(settings.stopScrollPropagation){$(document).on("wheel.ui-em_timepicker",".ui-em_timepicker-wrapper",function(e){e.preventDefault();var currentScroll=$(this).scrollTop();$(this).scrollTop(currentScroll+e.originalEvent.deltaY)})}$(document).on("mousedown.ui-em_timepicker",_closeHandler);$(window).on("resize.ui-em_timepicker",_closeHandler);if(settings.closeOnWindowScroll){$(document).on("scroll.ui-em_timepicker",_closeHandler)}self.trigger("showTimepicker");return this},hide:function hide(e){var tp=this[0].em_timepickerObj;if(tp){tp.hideMe()}Timepicker.hideAll();return this},option:function option(key,value){if(typeof key=="string"&&typeof value=="undefined"){var tp=this[0].em_timepickerObj;return tp.settings[key]}return this.each(function(){var self=$(this);var tp=self[0].em_timepickerObj;var settings=tp.settings;var list=tp.list;
1253if(_typeof(key)=="object"){settings=$.extend(settings,key)}else if(typeof key=="string"){settings[key]=value}settings=tp.parseSettings(settings);tp.settings=settings;tp._formatValue({type:"change"},"initial");if(list){list.remove();tp.list=null}if(settings.useSelect){_render(self)}})},getSecondsFromMidnight:function getSecondsFromMidnight(){var tp=this[0].em_timepickerObj;return tp.time2int(tp._getTimeValue())},getTime:function getTime(relative_date){var tp=this[0].em_timepickerObj;var time_string=tp._getTimeValue();if(!time_string){return null}var offset=tp.time2int(time_string);if(offset===null){return null}if(!relative_date){relative_date=new Date}var time=new Date(relative_date);time.setHours(offset/3600);time.setMinutes(offset%3600/60);time.setSeconds(offset%60);time.setMilliseconds(0);return time},isVisible:function isVisible(){var tp=this[0].em_timepickerObj;return!!(tp&&tp.list&&Timepicker.isVisible(tp.list))},setTime:function setTime(value){var tp=this[0].em_timepickerObj;var settings=tp.settings;if(settings.forceRoundTime){var prettyTime=tp._roundAndFormatTime(tp.time2int(value))}else{var prettyTime=tp._int2time(tp.time2int(value))}if(value&&prettyTime===null&&settings.noneOption){prettyTime=value}tp._setTimeValue(prettyTime,"initial");tp._formatValue({type:"change"},"initial");if(tp&&tp.list){tp._setSelected()}return this},remove:function remove(){var self=this;if(!self.hasClass("ui-em_timepicker-input")){return}var tp=self[0].em_timepickerObj;var settings=tp.settings;self.removeAttr("autocomplete","off");self.removeClass("ui-em_timepicker-input");self.removeData("em_timepicker-obj");self.off(".em_timepicker");if(tp.list){tp.list.remove()}if(settings.useSelect){self.show()}tp.list=null;return this}};function _render(self){var tp=self[0].em_timepickerObj;var list=tp.list;var settings=tp.settings;if(list&&list.length){list.remove();tp.list=null}if(settings.useSelect){list=$("<select></select>",{class:"ui-em_timepicker-select"});if(self.attr("name")){list.attr("name","ui-em_timepicker-"+self.attr("name"))}var wrapped_list=list}else{list=$("<ul></ul>",{class:"ui-em_timepicker-list"});var wrapped_list=$("<div></div>",{class:"ui-em_timepicker-wrapper",tabindex:-1});wrapped_list.css({display:"none",position:"absolute"}).append(list)}if(settings.noneOption){if(settings.noneOption===true){settings.noneOption=settings.useSelect?"Time...":"None"}if($.isArray(settings.noneOption)){for(var i in settings.noneOption){if(parseInt(i,10)==i){var noneElement=tp._generateNoneElement(settings.noneOption[i],settings.useSelect);list.append(noneElement)}}}else{var noneElement=tp._generateNoneElement(settings.noneOption,settings.useSelect);list.append(noneElement)}}if(settings.className){wrapped_list.addClass(settings.className)}if((settings.minTime!==null||settings.durationTime!==null)&&settings.showDuration){var stepval=typeof settings.step=="function"?"function":settings.step;wrapped_list.addClass("ui-em_timepicker-with-duration");wrapped_list.addClass("ui-em_timepicker-step-"+settings.step)}var durStart=settings.minTime;if(typeof settings.durationTime==="function"){durStart=tp.time2int(settings.durationTime())}else if(settings.durationTime!==null){durStart=settings.durationTime}var start=settings.minTime!==null?settings.minTime:0;var end=settings.maxTime!==null?settings.maxTime:start+ONE_DAY-1;if(end<start){end+=ONE_DAY}if(end===ONE_DAY-1&&$.type(settings.timeFormat)==="string"&&settings.show2400){end=ONE_DAY}var dr=settings.disableTimeRanges;var drCur=0;var drLen=dr.length;var stepFunc=settings.step;if(typeof stepFunc!="function"){stepFunc=function stepFunc(){return settings.step}}for(var i=start,j=0;i<=end;j++,i+=stepFunc(j)*60){var timeInt=i;var timeString=tp._int2time(timeInt);if(settings.useSelect){var row=$("<option></option>",{value:timeString});row.text(timeString)}else{var row=$("<li></li>");row.addClass(timeInt%ONE_DAY<ONE_DAY/2?"ui-em_timepicker-am":"ui-em_timepicker-pm");row.attr("data-time",roundingFunction(timeInt,settings));row.text(timeString)}if((settings.minTime!==null||settings.durationTime!==null)&&settings.showDuration){var durationString=tp._int2duration(i-durStart,settings.step);if(settings.useSelect){row.text(row.text()+" ("+durationString+")")}else{var duration=$("<span></span>",{class:"ui-em_timepicker-duration"});duration.text(" ("+durationString+")");row.append(duration)}}if(drCur<drLen){if(timeInt>=dr[drCur][1]){drCur+=1}if(dr[drCur]&&timeInt>=dr[drCur][0]&&timeInt<dr[drCur][1]){if(settings.useSelect){row.prop("disabled",true)}else{row.addClass("ui-em_timepicker-disabled")}}}list.append(row)}wrapped_list.data("em_timepicker-input",self);tp.list=wrapped_list;if(settings.useSelect){if(self.val()){list.val(tp._roundAndFormatTime(tp.time2int(self.val())))}list.on("focus",function(){$(this).data("em_timepicker-input").trigger("showTimepicker")});list.on("blur",function(){$(this).data("em_timepicker-input").trigger("hideTimepicker")});list.on("change",function(){tp._setTimeValue($(this).val(),"select")});tp._setTimeValue(list.val(),"initial");self.hide().after(list)}else{var appendTo=settings.appendTo;if(typeof appendTo==="string"){appendTo=$(appendTo)}else if(typeof appendTo==="function"){appendTo=appendTo(self)}appendTo.append(wrapped_list);tp._setSelected();list.on("mousedown click","li",function(e){self.off("focus.em_timepicker");self.on("focus.em_timepicker-ie-hack",function(){self.off("focus.em_timepicker-ie-hack");self.on("focus.em_timepicker",methods.show)});if(!tp._hideKeyboard()){self[0].focus()}list.find("li").removeClass("ui-em_timepicker-selected");$(this).addClass("ui-em_timepicker-selected");if(tp._selectValue()){self.trigger("hideTimepicker");list.on("mouseup.em_timepicker click.em_timepicker","li",function(e){list.off("mouseup.em_timepicker click.em_timepicker");wrapped_list.hide()})}})}}function _closeHandler(e){if(e.target==window){return}var target=$(e.target);if(target.closest(".ui-em_timepicker-input").length||target.closest(".ui-em_timepicker-wrapper").length){return}Timepicker.hideAll();$(document).off(".ui-em_timepicker");$(window).off(".ui-em_timepicker")}function _keydownhandler(e){var self=$(this);var tp=self[0].em_timepickerObj;var list=tp.list;if(!list||!Timepicker.isVisible(list)){if(e.keyCode==40){methods.show.call(self.get(0));list=tp.list;if(!tp._hideKeyboard()){self.trigger("focus")}}else{return true}}switch(e.keyCode){case 13:if(tp._selectValue()){tp._formatValue({type:"change"});tp.hideMe()}e.preventDefault();return false;case 38:var selected=list.find(".ui-em_timepicker-selected");if(!selected.length){list.find("li").each(function(i,obj){if($(obj).position().top>0){selected=$(obj);return false}});selected.addClass("ui-em_timepicker-selected")}else if(!selected.is(":first-child")){selected.removeClass("ui-em_timepicker-selected");selected.prev().addClass("ui-em_timepicker-selected");if(selected.prev().position().top<selected.outerHeight()){list.scrollTop(list.scrollTop()-selected.outerHeight())}}return false;case 40:selected=list.find(".ui-em_timepicker-selected");if(selected.length===0){list.find("li").each(function(i,obj){if($(obj).position().top>0){selected=$(obj);return false}});selected.addClass("ui-em_timepicker-selected")}else if(!selected.is(":last-child")){selected.removeClass("ui-em_timepicker-selected");selected.next().addClass("ui-em_timepicker-selected");if(selected.next().position().top+2*selected.outerHeight()>list.outerHeight()){list.scrollTop(list.scrollTop()+selected.outerHeight())}}return false;case 27:list.find("li").removeClass("ui-em_timepicker-selected");tp.hideMe();break;case 9:tp.hideMe();break;default:return true}}$.fn.em_timepicker=function(method){if(!this.length)return this;if(methods[method]){if(!this.hasClass("ui-em_timepicker-input")){return this}return methods[method].apply(this,Array.prototype.slice.call(arguments,1
1253))}else if(_typeof(method)==="object"||!method){return methods.init.apply(this,arguments)}else{$.error("Method "+method+" does not exist on jQuery.em_timepicker")}};$.fn.em_timepicker.defaults=DEFAULT_SETTINGS})})();
1254}
1255
1256/*
1257     FILE ARCHIVED ON 21:37:08 Jun 07, 2023 AND RETRIEVED FROM THE
1258     INTERNET ARCHIVE ON 15:55:02 Aug 31, 2026.
1259     JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
1260
1261     ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
1262     SECTION 108(a)(3)).
1263*/
1264/*
1265playback timings (ms):
1266  captures_list: 0.683
1267  exclusion.robots: 0.096
1268  exclusion.robots.policy: 0.084
1269  esindex: 0.008
1270  cdx.remote: 27.529
1271  LoadShardBlock: 1124.885 (3)
1272  PetaboxLoader3.datanode: 216.056 (5)
1273  PetaboxLoader3.resolve: 83.111 (2)
1274  load_resource: 215.396
1275  loaddict: 110.03
1276*/

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.