PageSourceSearch

https://msi.gob.pe/portal/wp-content/plugins/events-manager/includes/js/events-manager.js?ver=5.61

js msi.gob.pe collected 2026-10-02 04:58:34 UTC 49,151 bytes, 1,084 lines download raw bytes

1jQuery(document).ready( function($){
2	var load_ui_css = false; //load jquery ui css?
3	/* Time Entry */
4	$('#start-time').each(function(i, el){
5		$(el).addClass('em-time-input em-time-start').next('#end-time').addClass('em-time-input em-time-end').parent().addClass('em-time-range');
6	});
7	if( $(".em-time-input").length > 0 ){
8		em_setup_timepicker('body');
9	}
10	/* Calendar AJAX */
11	$('.em-calendar-wrapper a').unbind("click");
12	$('.em-calendar-wrapper a').undelegate("click");
13	$('.em-calendar-wrapper').delegate('a.em-calnav, a.em-calnav', 'click', function(e){
14		e.preventDefault();
15		$(this).closest('.em-calendar-wrapper').prepend('<div class="loading" id="em-loading"></div>');
16		var url = em_ajaxify($(this).attr('href'));
17		$(this).closest('.em-calendar-wrapper').load(url, function(){$(this).trigger('em_calendar_load');});
18	} );
19
20	//Events Search
21	$(document).delegate('.em-toggle', 'click change', function(e){
22		e.preventDefault();
23		//show or hide advanced tickets, hidden by default
24		var el = $(this);
25		var rel = el.attr('rel').split(':');
26		if( el.hasClass('show-search') ){
27			if( rel.length > 1 ){ el.closest(rel[1]).find(rel[0]).slideUp(); }
28			else{ $(rel[0]).slideUp(); }
29			el.find('.show, .show-advanced').show();
30			el.find('.hide, .hide-advanced').hide();
31			el.removeClass('show-search');
32		}else{
33			if( rel.length > 1 ){ el.closest(rel[1]).find(rel[0]).slideDown(); }
34			else{ $(rel[0]).slideDown(); }
35			el.find('.show, .show-advanced').hide();
36			el.find('.hide, .hide-advanced').show();
37			el.addClass('show-search');
38		}
39		
40	});
41	if( EM.search_term_placeholder ){
42		if( 'placeholder' in document.createElement('input') ){
43			$('input.em-events-search-text, input.em-search-text').attr('placeholder', EM.search_term_placeholder);
44		}else{
45			$('input.em-events-search-text, input.em-search-text').blur(function(){
46				if( this.value=='' ) this.value = EM.search_term_placeholder;
47			}).focus(function(){
48				if( this.value == EM.search_term_placeholder ) this.value='';
49			}).trigger('blur');
50		}
51	}
52	$('.em-search-form select[name=country]').change( function(){
53		var el = $(this);
54		$('.em-search select[name=state]').html('<option value="">'+EM.txt_loading+'</option>');
55		$('.em-search select[name=region]').html('<option value="">'+EM.txt_loading+'</option>');
56		$('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>');
57		if( el.val() != '' ){
58			el.closest('.em-search-location').find('.em-search-location-meta').slideDown();
59			var data = {
60				action : 'search_states',
61				country : el.val(),
62				return_html : true
63			};
64			$('.em-search select[name=state]').load( EM.ajaxurl, data );
65			data.action = 'search_regions';
66			$('.em-search select[name=region]').load( EM.ajaxurl, data );
67			data.action = 'search_towns';
68			$('.em-search select[name=town]').load( EM.ajaxurl, data );
69		}else{
70			el.closest('.em-search-location').find('.em-search-location-meta').slideUp();
71		}
72	});
73
74	$('.em-search-form select[name=region]').change( function(){
75		$('.em-search select[name=state]').html('<option value="">'+EM.txt_loading+'</option>');
76		$('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>');
77		var data = {
78			action : 'search_states',
79			region : $(this).val(),
80			country : $('.em-search-form select[name=country]').val(),
81			return_html : true
82		};
83		$('.em-search select[name=state]').load( EM.ajaxurl, data );
84		data.action = 'search_towns';
85		$('.em-search select[name=town]').load( EM.ajaxurl, data );
86	});
87
88	$('.em-search-form select[name=state]').change( function(){
89		$('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>');
90		var data = {
91			action : 'search_towns',
92			state : $(this).val(),
93			region : $('.em-search-form select[name=region]').val(),
94			country : $('.em-search-form select[name=country]').val(),
95			return_html : true
96		};
97		$('.em-search select[name=town]').load( EM.ajaxurl, data );
98	});
99	
100	//in order for this to work, you need the above classes to be present in your templates
101	$(document).delegate('.em-search-form, .em-events-search-form', 'submit', function(e){
102		var form = $(this);
103    	if( this.em_search && this.em_search.value == EM.txt_search){ this.em_search.value = ''; }
104    	var results_wrapper = form.closest('.em-search-wrapper').find('.em-search-ajax');
105    	if( results_wrapper.length == 0 ) results_wrapper = $('.em-search-ajax');
106    	if( results_wrapper.length > 0 ){
107    		results_wrapper.append('<div class="loading" id="em-loading"></div>');
108    		var submitButton = form.find('.em-search-submit');
109    		submitButton.data('buttonText', submitButton.val()).val(EM.txt_searching);
110    		var img = submitButton.children('img');
111    		if( img.length > 0 ) img.attr('src', img.attr('src').replace('search-mag.png', 'search-loading.gif'));
112    		var vars = form.serialize();
113    		$.ajax( EM.ajaxurl, {
114				type : 'POST',
115	    		dataType : 'html',
116	    		data : vars,
117			    success : function(responseText){
118			    	submitButton.val(submitButton.data('buttonText'));
119			    	if( img.length > 0 ) img.attr('src', img.attr('src').replace('search-loading.gif', 'search-mag.png'));
120		    		results_wrapper.replaceWith(responseText);
121		        	if( form.find('input[name=em_search]').val() == '' ){ form.find('input[name=em_search]').val(EM.txt_search); }
122		        	//reload results_wrapper
123		        	results_wrapper = form.closest('.em-search-wrapper').find('.em-search-ajax');
124		        	if( results_wrapper.length == 0 ) results_wrapper = $('.em-search-ajax');
125			    	jQuery(document).triggerHandler('em_search_ajax', [vars, results_wrapper, e]); //ajax has loaded new results
126			    }
127	    	});
128    		e.preventDefault();
129			return false;
130    	}
131	});
132	if( $('.em-search-ajax').length > 0 ){
133		$(document).delegate('.em-search-ajax a.page-numbers', 'click', function(e){
134			var a = $(this);
135			var data = a.closest('.em-pagination').attr('data-em-ajax');
136			var wrapper = a.closest('.em-search-ajax');
137			var wrapper_parent = wrapper.parent();
138		    var qvars = a.attr('href').split('?');
139		    var vars = qvars[1];
140		    //add data-em-ajax att if it exists
141		    if( data != '' ){
142		    	vars = vars != '' ? vars+'&'+data : data;
143		    }
144		    wrapper.append('<div class="loading" id="em-loading"></div>');
145		    $.ajax( EM.ajaxurl, {
146				type : 'POST',
147	    		dataType : 'html',
148	    		data : vars,
149			    success : function(responseText) {
150			    	wrapper.replaceWith(responseText);
151			    	wrapper = wrapper_parent.find('.em-search-ajax');
152			    	jQuery(document).triggerHandler('em_search_ajax', [vars, wrapper, e]); //ajax has loaded new results
153			    }
154	    	});
155			e.preventDefault();
156			return false;
157		});
158	}
159		
160	/*
161	 * ADMIN AREA AND PUBLIC FORMS (Still polishing this section up, note that form ids and classes may change accordingly)
162	 */
163	//Events List
164		//Approve/Reject Links
165		$('.events-table').on('click', '.em-event-delete', function(){
166			if( !confirm("Are you sure you want to delete?") ){ return false; }
167			window.location.href = this.href;
168		});
169	//Forms
170	$('#event-form #event-image-delete, #location-form #location-image-delete').on('click', function(){
171		var el = $(this);
172		if( el.is(':checked') ){
173			el.closest('.event-form-image, .location-form-image').find('#event-image-img, #location-image-img').hide();
174		}else{
175			el.closest('.event-form-image, .location-form-image').find('#event-image-img, #location-image-img').show();
176		}
177	});
178	//Tickets & Bookings
179	if( $("#em-tickets-form").length > 0 ){
180		//Enable/Disable Bookings
181		$('#event-rsvp').click( function(event){
182			if( !this.checked ){
183				confirmation = confirm(EM.disable_bookings_warning);
184				if( confirmation == false ){
185					event.preventDefault();
186				}else{
187					$('#event-rsvp-options').hide();
188				}
189			}else{
190				$('#event-rsvp-options').fadeIn();
191			}
192		});
193		if($('input#event-rsvp').is(":checked")) {
194			$("div#rsvp-data").fadeIn();
195		} else {
196			$("div#rsvp-data").hide();
197		}
198		//Ticket(s) UI
199		var reset_ticket_forms = function(){
200			$('#em-tickets-form table tbody tr.em-tickets-row').show();
201			$('#em-tickets-form table tbody tr.em-tickets-row-form').hide();
202		};
203		//recurrences and cut-off logic for ticket availability
204		if( $('#em-recurrence-checkbox').length > 0 ){
205			$('#em-recurrence-checkbox').change(function(){
206				if( $('#em-recurrence-checkbox').is(':checked') ){
207					$('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring').show();
208					$('#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();
209				}else{
210					$('#em-tickets-form .ticket-dates-from-normal, #em-tickets-form .ticket-dates-to-normal, #event-rsvp-options .em-booking-date-normal').show();
211					$('#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();
212				}
213			}).trigger('change');
214		}else if( $('#em-form-recurrence').length > 0 ){
215			$('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring').show();
216			$('#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();
217		}else{
218			$('#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();
219		}
220		//Add a new ticket
221		$("#em-tickets-add").click(function(e){ 
222			e.preventDefault();
223			reset_ticket_forms();
224			//create copy of template slot, insert so ready for population
225			var tickets = $('#em-tickets-form table tbody');
226			var rowNo = tickets.length+1;
227			var slot = tickets.first().clone(true).attr('id','em-ticket-'+ rowNo).appendTo($('#em-tickets-form table'));
228			//change the index of the form element names
229			slot.find('*[name]').each( function(index,el){
230				el = $(el);
231				el.attr('name', el.attr('name').replace('em_tickets[0]','em_tickets['+rowNo+']'));
232			});
233			//show ticket and switch to editor
234			slot.show().find('.ticket-actions-edit').trigger('click');
235			//refresh datepicker and values
236			slot.find('.em-date-input-loc').datepicker('destroy').removeAttr('id'); //clear all datepickers
237			slot.find('.em-time-input').unbind().each(function(index, el){ this.timePicker = false; }); //clear all timepickers - consequently, also other click/blur/change events, recreate the further down
238			em_setup_datepicker(slot);
239			em_setup_timepicker(slot);
240		    $('html, body').animate({ scrollTop: slot.offset().top - 30 }); //sends user to form
241		});
242		//Edit a Ticket
243		$(document).delegate('.ticket-actions-edit', 'click', function(e){
244			e.preventDefault();
245			reset_ticket_forms();
246			var tbody = $(this).closest('tbody');
247			tbody.find('tr.em-tickets-row').hide();
248			tbody.find('tr.em-tickets-row-form').fadeIn();
249			return false;
250		});
251		$(document).delegate('.ticket-actions-edited', 'click', function(e){
252			e.preventDefault();
253			var tbody = $(this).closest('tbody');
254			var rowNo = tbody.attr('id').replace('em-ticket-','');
255			tbody.find('.em-tickets-row').fadeIn();
256			tbody.find('.em-tickets-row-form').hide();
257			tbody.find('*[name]').each(function(index,el){
258				el = $(el);
259				if( el.attr('name') == 'ticket_start_pub'){
260					tbody.find('span.ticket_start').text(el.attr('value'));
261				}else if( el.attr('name') == 'ticket_end_pub' ){
262					tbody.find('span.ticket_end').text(el.attr('value'));
263				}else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_type]' ){
264					if( el.find(':selected').val() == 'members' ){
265						tbody.find('span.ticket_name').prepend('* ');
266					}
267				}else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_start_recurring_days]' ){
268					var text = tbody.find('select.ticket-dates-from-recurring-when').val() == 'before' ? '-'+el.attr('value'):el.attr('value');
269					if( el.attr('value') != '' ){
270						tbody.find('span.ticket_start_recurring_days').text(text);
271						tbody.find('span.ticket_start_recurring_days_text, span.ticket_start_time').removeClass('hidden').show();
272					}else{
273						tbody.find('span.ticket_start_recurring_days').text(' - ');
274						tbody.find('span.ticket_start_recurring_days_text, span.ticket_start_time').removeClass('hidden').hide();
275					}
276				}else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_end_recurring_days]' ){
277					var text = tbody.find('select.ticket-dates-to-recurring-when').val() == 'before' ? '-'+el.attr('value'):el.attr('value');
278					if( el.attr('value') != '' ){
279						tbody.find('span.ticket_end_recurring_days').text(text);
280						tbody.find('span.ticket_end_recurring_days_text, span.ticket_end_time').removeClass('hidden').show();
281					}else{
282						tbody.find('span.ticket_end_recurring_days').text(' - ');
283						tbody.find('span.ticket_end_recurring_days_text, span.ticket_end_time').removeClass('hidden').hide();
284					}
285				}else{
286					tbody.find('.'+el.attr('name').replace('em_tickets['+rowNo+'][','').replace(']','').replace('[]','')).text(el.attr('value'));
287				}
288			});
289			//allow for others to hook into this
290			$(document).triggerHandler('em_maps_tickets_edit', [tbody, rowNo, true]);
291		    $('html, body').animate({ scrollTop: tbody.parent().offset().top - 30 }); //sends user back to top of form
292			return false;
293		});
294		$(document).delegate('.em-ticket-form select.ticket_type','change', function(e){
295			//check if ticket is for all users or members, if members, show roles to limit the ticket to
296			var el = $(this);
297			if( el.find('option:selected').val() == 'members' ){
298				el.closest('.em-ticket-form').find('.ticket-roles').fadeIn();
299			}else{
300				el.closest('.em-ticket-form').find('.ticket-roles').hide();
301			}
302		});
303		$(document).delegate('.em-ticket-form .ticket-options-advanced','click', function(e){
304			//show or hide advanced tickets, hidden by default
305			e.preventDefault();
306			var el = $(this);
307			if( el.hasClass('show') ){
308				el.closest('.em-ticket-form').find('.em-ticket-form-advanced').fadeIn();
309				el.find('.show,.show-advanced').hide();
310				el.find('.hide,.hide-advanced').show();
311			}else{
312				el.closest('.em-ticket-form').find('.em-ticket-form-advanced').hide();
313				el.find('.show,.show-advanced').show();
314				el.find('.hide,.hide-advanced').hide();
315			}
316			el.toggleClass('show');
317		});
318		$('.em-ticket-form').each( function(){
319			//check whether to show advanced options or not by default for each ticket
320			var show_advanced = false;
321			var el = $(this); 
322			el.find('.em-ticket-form-advanced input[type="text"]').each(function(){ if(this.value != '') show_advanced = true; });
323			if( el.find('.em-ticket-form-advanced input[type="checkbox"]:checked').length > 0 ){ show_advanced = true; }
324			el.find('.em-ticket-form-advanced option:selected').each(function(){ if(this.value != '') show_advanced = true; });
325			if( show_advanced ) el.find('.ticket-options-advanced').trigger('click');
326		});
327		//Delete a ticket
328		$(document).delegate('.ticket-actions-delete', 'click', function(e){
329			e.preventDefault();
330			var el = $(this);
331			var tbody = el.closest('tbody');
332			if( tbody.find('input.ticket_id').val() > 0 ){
333				//only will happen if no bookings made
334				el.text('Deleting...');	
335				$.getJSON( $(this).attr('href'), {'em_ajax_action':'delete_ticket', 'id':tbody.find('input.ticket_id').val()}, function(data){
336					if(data.result){
337						tbody.remove();
338					}else{
339						el.text('Delete');
340						alert(data.error);
341					}
342				});
343			}else{
344				//not saved to db yet, so just remove
345				tbody.remove();
346			}
347			return false;
348		});
349	}
350	//Manageing Bookings
351	if( $('#em-bookings-table').length > 0 ){
352		//Pagination link clicks
353		$(document).delegate('#em-bookings-table .tablenav-pages a', 'click', function(){
354			var el = $(this);
355			var form = el.parents('#em-bookings-table form.bookings-filter');
356			//get page no from url, change page, submit form
357			var match = el.attr('href').match(/#[0-9]+/);
358			if( match != null && match.length > 0){
359				var pno = match[0].replace('#','');
360				form.find('input[name=pno]').val(pno);
361			}else{
362				form.find('input[name=pno]').val(1);
363			}
364			form.trigger('submit');
365			return false;
366		});
367		//Overlay Options
368		var em_bookings_settings_dialog = {
369			modal : true,
370			autoOpen: false,
371			minWidth: 500,
372			height: 'auto',
373			buttons: [{
374				text: EM.bookings_settings_save,
375				click: function(e){
376					e.preventDefault();
377					//we know we'll deal with cols, so wipe hidden value from main
378					var match = $("#em-bookings-table form.bookings-filter [name=cols]").val('');
379					var booking_form_cols = $('form#em-bookings-table-settings-form input.em-bookings-col-item');
380					$.each( booking_form_cols, function(i,item_match){
381						//item_match = $(item_match);
382						if( item_match.value == 1 ){
383							if( match.val() != ''){
384								match.val(match.val()+','+item_match.name);
385							}else{
386								match.val(item_match.name);
387							}
388						}
389					});
390					//submit main form
391					$('#em-bookings-table-settings').trigger('submitted'); //hook into this with bind()
392					$('#em-bookings-table form.bookings-filter').trigger('submit');					
393					$(this).dialog('close');
394				}
395			}]
396		};
397		var em_bookings_export_dialog = {
398			modal : true,
399			autoOpen: false,
400			minWidth: 500,
401			height: 'auto',
402			buttons: [{
403				text: EM.bookings_export_save,
404				click: function(e){
405					$(this).children('form').submit();
406					$(this).dialog('close');
407				}
408			}]
409		};
410		if( $("#em-bookings-table-settings").length > 0 ){
411			//Settings Overlay
412			$("#em-bookings-table-settings").dialog(em_bookings_settings_dialog);
413			$(document).delegate('#em-bookings-table-settings-trigger','click', function(e){ e.preventDefault(); $("#em-bookings-table-settings").dialog('open'); });
414			//Export Overlay
415			$("#em-bookings-table-export").dialog(em_bookings_export_dialog);
416			$(document).delegate('#em-bookings-table-export-trigger','click', function(e){ e.preventDefault(); $("#em-bookings-table-export").dialog('open'); });
417			var export_overlay_show_tickets = function(){
418				if( $('#em-bookings-table-export-form input[name=show_tickets]').is(':checked') ){
419					$('#em-bookings-table-export-form .em-bookings-col-item-ticket').show();
420					$('#em-bookings-table-export-form #em-bookings-export-cols-active .em-bookings-col-item-ticket input').val(1);
421				}else{
422					$('#em-bookings-table-export-form .em-bookings-col-item-ticket').hide().find('input').val(0);					
423				}
424			};
425			//Sync export overlay with table search field changes
426			$('#em-bookings-table form select').each(function(i, el){
427				$(el).change(function(e){
428					var select_el = $(this);
429					var input_par = $('#em-bookings-table-export-form input[name='+select_el.attr('name')+']');
430					var input_par_selected = select_el.find('option:selected');
431					input_par.val(input_par_selected.val());
432				});
433			});
434			
435			export_overlay_show_tickets();
436			$('#em-bookings-table-export-form input[name=show_tickets]').click(export_overlay_show_tickets);
437			//Sortables
438			$( ".em-bookings-cols-sortable" ).sortable({
439				connectWith: ".em-bookings-cols-sortable",
440				update: function(event, ui) {
441					if( ui.item.parents('ul#em-bookings-cols-active, ul#em-bookings-export-cols-active').length > 0 ){							
442						ui.item.addClass('ui-state-highlight').removeClass('ui-state-default').children('input').val(1);
443					}else{
444						ui.item.addClass('ui-state-default').removeClass('ui-state-highlight').children('input').val(0);
445					}
446				}
447			}).disableSelection();
448			load_ui_css = true;
449		}
450		//Widgets and filter submissions
451		$(document).delegate('#em-bookings-table form.bookings-filter', 'submit', function(e){
452			var el = $(this);			
453			//append loading spinner
454			el.parents('#em-bookings-table').find('.table-wrap').first().append('<div id="em-loading" />');
455			//ajax call
456			$.post( EM.ajaxurl, el.serializeArray(), function(data){
457				var root = el.parents('#em-bookings-table').first();
458				root.replaceWith(data);
459				//recreate overlays
460				$('#em-bookings-table-export input[name=scope]').val(root.find('select[name=scope]').val());
461				$('#em-bookings-table-export input[name=status]').val(root.find('select[name=status]').val());
462				jQuery(document).triggerHandler('em_bookings_filtered', [data, root, el]);
463			});
464			return false;
465		});
466		//Approve/Reject Links
467		$(document).delegate('.em-bookings-approve,.em-bookings-reject,.em-bookings-unapprove,.em-bookings-delete', 'click', function(){
468			var el = $(this); 
469			if( el.hasClass('em-bookings-delete') ){
470				if( !confirm(EM.booking_delete) ){ return false; }
471			}
472			var url = em_ajaxify( el.attr('href'));		
473			var td = el.parents('td').first();
474			td.html(EM.txt_loading);
475			td.load( url );
476			return false;
477		});
478	}
479	//Old Bookings Table - depreciating soon
480	if( $('.em_bookings_events_table').length > 0 ){
481		//Widgets and filter submissions
482		$(document).delegate('.em_bookings_events_table form', 'submit', function(e){
483			var el = $(this);
484			var url = em_ajaxify( el.attr('action') );		
485			el.parents('.em_bookings_events_table').find('.table-wrap').first().append('<div id="em-loading" />');
486			$.get( url, el.serializeArray(), function(data){
487				el.parents('.em_bookings_events_table').first().replaceWith(data);
488			});
489			return false;
490		});
491		//Pagination link clicks
492		$(document).delegate('.em_bookings_events_table .tablenav-pages a', 'click', function(){		
493			var el = $(this);
494			var url = em_ajaxify( el.attr('href') );	
495			el.parents('.em_bookings_events_table').find('.table-wrap').first().append('<div id="em-loading" />');
496			$.get( url, function(data){
497				el.parents('.em_bookings_events_table').first().replaceWith(data);
498			});
499			return false;
500		});
501	}
502	
503	//Manual Booking
504	$('a.em-booking-button').click(function(e){
505		e.preventDefault();
506		var button = $(this);
507		if( button.text() != EM.bb_booked && $(this).text() != EM.bb_booking){
508			button.text(EM.bb_booking);
509			var button_data = button.attr('id').split('_'); 
510			$.ajax({
511				url: EM.ajaxurl,
512				dataType: 'jsonp',
513				data: {
514					event_id : button_data[1],
515					_wpnonce : button_data[2],
516					action : 'booking_add_one'
517				},
518				success : function(response, statusText, xhr, $form) {
519					if(response.result){
520						button.text(EM.bb_booked);
521					}else{
522						button.text(EM.bb_error);					
523					}
524					if(response.message != '') alert(response.message);
525				},
526				error : function(){ button.text(EM.bb_error); }
527			});
528		}
529		return false;
530	});	
531	$('a.em-cancel-button').click(function(e){
532		e.preventDefault();
533		var button = $(this);
534		if( button.text() != EM.bb_cancelled && button.text() != EM.bb_canceling){
535			button.text(EM.bb_canceling);
536			var button_data = button.attr('id').split('_'); 
537			$.ajax({
538				url: EM.ajaxurl,
539				dataType: 'jsonp',
540				data: {
541					booking_id : button_data[1],
542					_wpnonce : button_data[2],
543					action : 'booking_cancel'
544				},
545				success : function(response, statusText, xhr, $form) {
546					if(response.result){
547						button.text(EM.bb_cancelled);
548					}else{
549						button.text(EM.bb_cancel_error);
550					}
551				},
552				error : function(){ button.text(EM.bb_cancel_error); }
553			});
554		}
555		return false;
556	});  
557
558	//Datepicker
559	if( $('.em-date-single, .em-date-range, #em-date-start').length > 0 ){
560		if( EM.locale != 'en' && EM.locale_data ){
561			$.datepicker.setDefaults(EM.locale_data);
562		}
563		load_ui_css = true;
564		em_setup_datepicker('body');
565	}
566	if( load_ui_css ) em_load_jquery_css();
567	
568	//previously in em-admin.php
569	function updateIntervalDescriptor () { 
570		$(".interval-desc").hide();
571		var number = "-plural";
572		if ($('input#recurrence-interval').val() == 1 || $('input#recurrence-interval').val() == "")
573		number = "-singular";
574		var descriptor = "span#interval-"+$("select#recurrence-frequency").val()+number;
575		$(descriptor).show();
576	}
577	function updateIntervalSelectors () {
578		$('p.alternate-selector').hide();   
579		$('p#'+ $('select#recurrence-frequency').val() + "-selector").show();
580	}
581	function updateShowHideRecurrence () {
582		if( $('input#event-recurrence').is(":checked")) {
583			$("#event_recurrence_pattern").fadeIn();
584			$("#event-date-explanation").hide();
585			$("#recurrence-dates-explanation").show();
586			$("h3#recurrence-dates-title").show();
587			$("h3#event-date-title").hide();     
588		} else {
589			$("#event_recurrence_pattern").hide();
590			$("#recurrence-dates-explanation").hide();
591			$("#event-date-explanation").show();
592			$("h3#recurrence-dates-title").hide();
593			$("h3#event-date-title").show();   
594		}
595	}		 
596	$("#recurrence-dates-explanation").hide();
597	$("#date-to-submit").hide();
598	$("#end-date-to-submit").hide();
599	
600	$("#localised-date").show();
601	$("#localised-end-date").show();
602	
603	$('#em-wrapper input.select-all').change(function(){
604	 	if($(this).is(':checked')){
605			$('input.row-selector').prop('checked', true);
606			$('input.select-all').prop('checked', true);
607	 	}else{
608			$('input.row-selector').prop('checked', false);
609			$('input.select-all').prop('checked', false);
610		}
611	}); 
612	
613	updateIntervalDescriptor(); 
614	updateIntervalSelectors();
615	updateShowHideRecurrence();
616	$('input#event-recurrence').change(updateShowHideRecurrence);
617	   
618	// recurrency elements   
619	$('input#recurrence-interval').keyup(updateIntervalDescriptor);
620	$('select#recurrence-frequency').change(updateIntervalDescriptor);
621	$('select#recurrence-frequency').change(updateIntervalSelectors);
622
623	/* Load any maps */	
624	if( $('.em-location-map').length > 0 || $('.em-locations-map').length > 0 || $('#em-map').length > 0 || $('.em-search-geo').length > 0 ){
625		em_maps_load();
626	}
627	
628	//Finally, add autocomplete here
629	//Autocomplete
630	if( jQuery( "div.em-location-data input#location-name" ).length > 0 ){
631		jQuery( "div.em-location-data input#location-name" ).autocomplete({
632			source: EM.locationajaxurl,
633			minLength: 2,
634			focus: function( event, ui ){
635				jQuery("input#location-id" ).val( ui.item.value );
636				return false;
637			},			 
638			select: function( event, ui ){
639				jQuery("input#location-id" ).val(ui.item.id).trigger('change');
640				jQuery("input#location-name" ).val(ui.item.value);
641				jQuery('input#location-address').val(ui.item.address);
642				jQuery('input#location-town').val(ui.item.town);
643				jQuery('input#location-state').val(ui.item.state);
644				jQuery('input#location-region').val(ui.item.region);
645				jQuery('input#location-postcode').val(ui.item.postcode);
646				if( ui.item.country == '' ){
647					jQuery('select#location-country option:selected').removeAttr('selected');
648				}else{
649					jQuery('select#location-country option[value="'+ui.item.country+'"]').attr('selected', 'selected');
650				}
651				jQuery('div.em-location-data input, div.em-location-data select').css('background-color','#ccc').attr('readonly','readonly');
652				jQuery('#em-location-reset').show();
653				jQuery('#em-location-search-tip').hide();
654				jQuery(document).triggerHandler('em_locations_autocomplete_selected', [event, ui]);
655				return false;
656			}
657		}).data( "ui-autocomplete" )._renderItem = function( ul, item ) {
658			html_val = "<a>" + item.label + '<br><span style="font-size:11px"><em>'+ item.address + ', ' + item.town+"</em></span></a>";
659			return jQuery( "<li></li>" ).data( "item.autocomplete", item ).append(html_val).appendTo( ul );
660		};
661		jQuery('#em-location-reset a').click( function(){
662			jQuery('div.em-location-data input').css('background-color','#fff').val('').removeAttr('readonly');
663			jQuery('div.em-location-data select').css('background-color','#fff');
664			jQuery('div.em-location-data option:selected').removeAttr('selected');
665			jQuery('input#location-id').val('');
666			jQuery('#em-location-reset').hide();
667			jQuery('#em-location-search-tip').show();
668			jQuery('#em-map').hide();
669			jQuery('#em-map-404').show();
670			if(typeof(marker) !== 'undefined'){
671				marker.setPosition(new google.maps.LatLng(0, 0));
672				infoWindow.close();
673				marker.setDraggable(true);
674			}
675			return false;
676		});
677		if( jQuery('input#location-id').val() != '0' && jQuery('input#location-id').val() != '' ){
678			jQuery('div.em-location-data input, div.em-location-data select').css('background-color','#ccc').attr('readonly','readonly');
679			jQuery('#em-location-reset').show();
680			jQuery('#em-location-search-tip').hide();
681		}
682	}
683	
684});
685
686function em_load_jquery_css(){
687	if( EM.ui_css && jQuery('link#jquery-ui-css').length == 0 ){
688		var script = document.createElement("link");
689		script.id = 'jquery-ui-css';
690		script.rel = "stylesheet";
691		script.href = EM.ui_css;
692		document.body.appendChild(script);
693	}
694}
695
696function em_setup_datepicker(wrap){	
697	wrap = jQuery(wrap);
698	//default picker vals
699	var datepicker_vals = { altFormat: "yy-mm-dd", changeMonth: true, changeYear: true, firstDay : EM.firstDay, yearRange:'-100:+10' };
700	if( EM.dateFormat ) datepicker_vals.dateFormat = EM.dateFormat;
701	if( EM.yearRange ) datepicker_vals.yearRange = EM.yearRange;
702	jQuery(document).triggerHandler('em_datepicker', datepicker_vals);
703	
704	//apply datepickers
705	dateDivs = wrap.find('.em-date-single, .em-date-range');
706	if( dateDivs.length > 0 ){
707		//apply datepickers to elements
708		dateDivs.find('input.em-date-input-loc').each(function(i,dateInput){
709			//init the datepicker
710			var dateInput = jQuery(dateInput);
711			var dateValue = dateInput.nextAll('input.em-date-input').first();
712			var dateValue_value = dateValue.val();
713			dateInput.datepicker(datepicker_vals);
714			dateInput.datepicker('option', 'altField', dateValue);
715			//now set the value
716			if( dateValue_value ){
717				var this_date_formatted = jQuery.datepicker.formatDate( EM.dateFormat, jQuery.datepicker.parseDate('yy-mm-dd', dateValue_value) );
718				dateInput.val(this_date_formatted);
719				dateValue.val(dateValue_value);
720			}
721			//add logic for texts
722			dateInput.change(function(){
723				if( jQuery(this).val() == '' ){
724					jQuery(this).nextAll('.em-date-input').first().val('');
725				}
726			});
727		});
728		//deal with date ranges
729		dateDivs.filter('.em-date-range').find('input.em-date-input-loc').each(function(i,dateInput){
730			//finally, apply start/end logic to this field
731			dateInput = jQuery(dateInput);
732			if( dateInput.hasClass('em-date-start') ){
733				dateInput.datepicker('option','onSelect', function( selectedDate ) {
734					//get corresponding end date input, we expect ranges to be contained in .em-date-range with a start/end input element
735					var startDate = jQuery(this);
736					var endDate = startDate.parents('.em-date-range').find('.em-date-end').first();
737					if( startDate.val() > endDate.val() && endDate.val() != '' ){
738						endDate.datepicker( "setDate" , selectedDate );
739						endDate.trigger('change');
740					}
741					endDate.datepicker( "option", 'minDate', selectedDate );
742				});
743			}else if( dateInput.hasClass('em-date-end') ){
744				var startInput = dateInput.parents('.em-date-range').find('.em-date-start').first();
745				if( startInput.val() != '' ){
746					dateInput.datepicker('option', 'minDate', startInput.val());
747				}
748			}
749		});
750	}
751}
752
753function em_setup_timepicker(wrap){
754	wrap = jQuery(wrap);
755	var timepicker_options = {
756		show24Hours: EM.show24hours == 1,
757		step:15
758	}
759	jQuery(document).triggerHandler('em_timepicker_options', timepicker_options);
760	wrap.find(".em-time-input").timePicker(timepicker_options);
761	
762	// Keep the duration between the two inputs.
763	wrap.find(".em-time-range input.em-time-start").each( function(i, el){
764		jQuery(el).data('oldTime', jQuery.timePicker(el).getTime());
765	}).change( function() {
766		var start = jQuery(this);
767		var end = start.nextAll('.em-time-end');
768		if (end.val()) { // Only update when second input has a value.
769		    // Calculate duration.
770			var oldTime = start.data('oldTime');
771		    var duration = (jQuery.timePicker(end).getTime() - oldTime);
772		    var time = jQuery.timePicker(start).getTime();
773		    if( jQuery.timePicker(end).getTime() >= oldTime ){
774			    // Calculate and update the time in the second input.
775			    jQuery.timePicker(end).setTime(new Date(new Date(time.getTime() + duration)));
776			}
777		    start.data('oldTime', time); 
778		}
779	});
780	// Validate.
781	wrap.find(".em-time-range input.em-time-end").change(function() {
782		var end = jQuery(this);
783		var start = end.prevAll('.em-time-start');
784		if( start.val() ){
785			if( jQuery.timePicker(start).getTime() > jQuery.timePicker(this).getTime() && ( jQuery('.em-date-end').val().length == 0 || jQuery('.em-date-start').val() == jQuery('.em-date-end').val() ) ) { end.addClass("error"); }
786			else { end.removeClass("error"); }
787		}
788	});
789	//Sort out all day checkbox
790	wrap.find('.em-time-range input.em-time-all-day').change(function(){
791		var allday = jQuery(this);
792		if( allday.is(':checked') ){
793			allday.siblings('.em-time-input').css('background-color','#ccc');
794		}else{
795			allday.siblings('.em-time-input').css('background-color','#fff');
796		}
797	}).trigger('change');
798}
799
800/* Useful function for adding the em_ajax flag to a url, regardless of querystring format */
801var em_ajaxify = function(url){
802	if ( url.search('em_ajax=0') != -1){
803		url = url.replace('em_ajax=0','em_ajax=1');
804	}else if( url.search(/\?/) != -1 ){
805		url = url + "&em_ajax=1";
806	}else{
807		url = url + "?em_ajax=1";
808	}
809	return url;
810};
811
812/*
813 * MAP FUNCTIONS
814 */
815var em_maps_loaded = false;
816var maps = {};
817var maps_markers = {};
818var infowindow;
819//loads maps script if not already loaded and executes EM maps script
820function em_maps_load(){
821	if( !em_maps_loaded ){
822		if ( jQuery('script#google-maps').length == 0 && ( typeof google !== 'object' || typeof google.maps !== 'object' ) ){ 
823			var script = document.createElement("script");
824			script.type = "text/javascript";
825			script.id = "google-maps";
826			var proto = (EM.is_ssl) ? 'https:' : 'http:';
827			script.src = proto + '//maps.google.com/maps/api/js?v=3.12&sensor=false&libraries=places&callback=em_maps';
828			document.body.appendChild(script);
829		}else if( typeof google === 'object' && typeof google.maps === 'object' && !em_maps_loaded ){
830			em_maps();
831		}else if( jQuery('script#google-maps').length > 0 ){
832			jQuery(window).load(function(){ if( !em_maps_loaded ) em_maps(); }); //google isn't loaded so wait for page to load resources
833		}
834	}
835}
836//re-usable function to load global location maps
837function em_maps_load_locations(el){
838	var el = jQuery(el);
839	var map_id = el.attr('id').replace('em-locations-map-','');
840	var em_data = jQuery.parseJSON( el.nextAll('.em-locations-map-coords').first().text() );
841	if( em_data == null ){
842		var em_data = jQuery.parseJSON( jQuery('#em-locations-map-coords-'+map_id).text() );
843	}
844	jQuery.getJSON(document.URL, em_data , function(data){
845		if(data.length > 0){
846			//define default options and allow option for extension via event triggers
847			  var map_options = { mapTypeId: google.maps.MapTypeId.ROADMAP };
848			  jQuery(document).triggerHandler('em_maps_locations_map_options', map_options);
849			  var marker_options = {};
850			  jQuery(document).triggerHandler('em_maps_location_marker_options', marker_options);
851			  
852			  maps[map_id] = new google.maps.Map(el[0], map_options);
853			  maps_markers[map_id] = [];
854			  
855			  var minLatLngArr = [0,0];
856			  var maxLatLngArr = [0,0];
857			  
858			  for (var i = 0; i < data.length; i++) {
859				  if( !(data[i].location_latitude == 0 && data[i].location_longitude == 0) ){
860					var latitude = parseFloat( data[i].location_latitude );
861					var longitude = parseFloat( data[i].location_longitude );
862					var location = new google.maps.LatLng( latitude, longitude );
863					//extend the default marker options
864					jQuery.extend(marker_options, {
865					    position: location, 
866					    map: maps[map_id]
867					})
868					var marker = new google.maps.Marker(marker_options);
869					maps_markers[map_id].push(marker);
870					marker.setTitle(data[i].location_name);
871					var myContent = '<div class="em-map-balloon"><div id="em-map-balloon-'+map_id+'" class="em-map-balloon-content">'+ data[i].location_balloon +'</div></div>';
872					em_map_infobox(marker, myContent, maps[map_id]);
873					
874					//Get min and max long/lats
875					minLatLngArr[0] = (latitude < minLatLngArr[0] || i == 0) ? latitude : minLatLngArr[0];
876					minLatLngArr[1] = (longitude < minLatLngArr[1] || i == 0) ? longitude : minLatLngArr[1];
877					maxLatLngArr[0] = (latitude > maxLatLngArr[0] || i == 0) ? latitude : maxLatLngArr[0];
878					maxLatLngArr[1] = (longitude > maxLatLngArr[1] || i == 0) ? longitude : maxLatLngArr[1];
879				  }
880			  }
881			  // Zoom in to the bounds
882			  var minLatLng = new google.maps.LatLng(minLatLngArr[0],minLatLngArr[1]);
883			  var maxLatLng = new google.maps.LatLng(maxLatLngArr[0],maxLatLngArr[1]);
884			  var bounds = new google.maps.LatLngBounds(minLatLng,maxLatLng);
885			  maps[map_id].fitBounds(bounds);
886			  
887			//Call a hook if exists
888			jQuery(document).triggerHandler('em_maps_locations_hook', [maps[map_id], data, map_id]);
889		}else{
890			el.children().first().html('No locations found');
891			jQuery(document).triggerHandler('em_maps_locations_hook_not_found', [el]);
892		}
893	});
894}
895function em_maps_load_location(el){
896	el = jQuery(el);
897	var map_id = el.attr('id').replace('em-location-map-','');
898	em_LatLng = new google.maps.LatLng( jQuery('#em-location-map-coords-'+map_id+' .lat').text(), jQuery('#em-location-map-coords-'+map_id+' .lng').text());
899	//extend map and markers via event triggers
900	var map_options = {
901	    zoom: 14,
902	    center: em_LatLng,
903	    mapTypeId: google.maps.MapTypeId.ROADMAP,
904	    mapTypeControl: false
905	};
906	jQuery(document).triggerHandler('em_maps_location_map_options', map_options);
907	maps[map_id] = new google.maps.Map( document.getElementById('em-location-map-'+map_id), map_options);
908	var marker_options = {
909	    position: em_LatLng,
910	    map: maps[map_id]
911	};
912	jQuery(document).triggerHandler('em_maps_location_marker_options', marker_options);
913	maps_markers[map_id] = new google.maps.Marker(marker_options);
914	infowindow = new google.maps.InfoWindow({ content: jQuery('#em-location-map-info-'+map_id+' .em-map-balloon').get(0) });
915	infowindow.open(maps[map_id],maps_markers[map_id]);
916	maps[map_id].panBy(40,-70);
917	
918	//JS Hook for handling map after instantiation
919	//Example hook, which you can add elsewhere in your theme's JS - jQuery(document).bind('em_maps_location_hook', function(){ alert('hi');} );
920	jQuery(document).triggerHandler('em_maps_location_hook', [maps[map_id], infowindow, maps_markers[map_id], map_id]);
921	//map resize listener
922	jQuery(window).on('resize', function(e) {
923		google.maps.event.trigger(maps[map_id], "resize");
924		maps[map_id].setCenter(maps_markers[map_id].getPosition());
925		maps[map_id].panBy(40,-70);
926	});
927}
928jQuery(document).bind('em_search_ajax', function(e, vars, wrapper){
929	if( em_maps_loaded ){
930		wrapper.find('.em-location-map').each( function(index, el){ em_maps_load_location(el); } );
931		wrapper.find('.em-locations-map').each( function(index, el){ em_maps_load_locations(el); });
932	}
933});
934//Load single maps (each map is treated as a seperate map).
935function em_maps() {
936	//Find all the maps on this page and load them
937	jQuery('.em-location-map').each( function(index, el){ em_maps_load_location(el); } );	
938	jQuery('.em-locations-map').each( function(index, el){ em_maps_load_locations(el); } );
939	
940	//Location stuff - only needed if inputs for location exist
941	if( jQuery('select#location-select-id, input#location-address').length > 0 ){
942		var map, marker;
943		//load map info
944		var refresh_map_location = function(){
945			var location_latitude = jQuery('#location-latitude').val();
946			var location_longitude = jQuery('#location-longitude').val();
947			if( !(location_latitude == 0 && location_longitude == 0) ){
948				var position = new google.maps.LatLng(location_latitude, location_longitude); //the location coords
949				marker.setPosition(position);
950				var mapTitle = (jQuery('input#location-name').length > 0) ? jQuery('input#location-name').val():jQuery('input#title').val();
951				marker.setTitle( jQuery('input#location-name input#title, #location-select-id').first().val() );
952				jQuery('#em-map').show();
953				jQuery('#em-map-404').hide();
954				google.maps.event.trigger(map, 'resize');
955				map.setCenter(position);
956				map.panBy(40,-55);
957				infoWindow.setContent( 
958					'<div id="location-balloon-content"><strong>' + 
959					mapTitle + 
960					'</strong><br/>' + 
961					jQuery('#location-address').val() + 
962					'<br/>' + jQuery('#location-town').val()+ 
963					'</div>'
964				);
965				infoWindow.open(map, marker);
966				jQuery(document).triggerHandler('em_maps_location_hook', [map, infowindow, marker, 0]);
967			} else {
968    			jQuery('#em-map').hide();
969    			jQuery('#em-map-404').show();
970			}
971		};
972		
973		//Add listeners for changes to address
974		var get_map_by_id = function(id){
975			if(jQuery('#em-map').length > 0){
976				jQuery.getJSON(document.URL,{ em_ajax_action:'get_location', id:id }, function(data){
977					if( data.location_latitude!=0 && data.location_longitude!=0 ){
978						loc_latlng = new google.maps.LatLng(data.location_latitude, data.location_longitude);
979						marker.setPosition(loc_latlng);
980						marker.setTitle( data.location_name );
981						marker.setDraggable(false);
982						jQuery('#em-map').show();
983						jQuery('#em-map-404').hide();
984						map.setCenter(loc_latlng);
985						map.panBy(40,-55);
986						infoWindow.setContent( '<div id="location-balloon-content">'+ data.location_balloon +'</div>');
987						infoWindow.open(map, marker);
988						google.maps.event.trigger(map, 'resize');
989						jQuery(document).triggerHandler('em_maps_location_hook', [map, infowindow, marker, 0]);
990					}else{
991						jQuery('#em-map').hide();
992						jQuery('#em-map-404').show();
993					}
994				});
995			}
996		};
997		jQuery('#location-select-id, input#location-id').change( function(){get_map_by_id(jQuery(this).val());} );
998		jQuery('#location-name, #location-town, #location-address, #location-state, #location-postcode, #location-country').change( function(){
999			//build address
1000			var addresses = [ jQuery('#location-address').val(), jQuery('#location-town').val(), jQuery('#location-state').val(), jQuery('#location-postcode').val() ];
1001			var address = '';
1002			jQuery.each( addresses, function(i, val){
1003				if( val != '' ){
1004					address = ( address == '' ) ? address+val:address+', '+val;
1005				}
1006			});
1007			if( address == '' ){ //in case only name is entered, no address
1008				jQuery('#em-map').hide();
1009				jQuery('#em-map-404').show();
1010				return false;
1011			}
1012			//do country last, as it's using the text version
1013			if( jQuery('#location-country option:selected').val() != 0 ){
1014				address = ( address == '' ) ? address+jQuery('#location-country option:selected').text():address+', '+jQuery('#location-country option:selected').text();
1015			}
1016			if( address != '' && jQuery('#em-map').length > 0 ){
1017				geocoder.geocode( { 'address': address }, function(results, status) {
1018				    if (status == google.maps.GeocoderStatus.OK) {
1019						jQuery('#location-latitude').val(results[0].geometry.location.lat());
1020						jQuery('#location-longitude').val(results[0].geometry.location.lng());
1021					}
1022				    refresh_map_location();
1023				});
1024			}
1025		});
1026		
1027		//Load map
1028		if(jQuery('#em-map').length > 0){
1029			var em_LatLng = new google.maps.LatLng(0, 0);
1030			map = new google.maps.Map( document.getElementById('em-map'), {
1031			    zoom: 14,
1032			    center: em_LatLng,
1033			    mapTypeId: google.maps.MapTypeId.ROADMAP,
1034			    mapTypeControl: false
1035			});
1036			var marker = new google.maps.Marker({
1037			    position: em_LatLng,
1038			    map: map,
1039			    draggable: true
1040			});
1041			infoWindow = new google.maps.InfoWindow({
1042			    content: ''
1043			});
1044			var geocoder = new google.maps.Geocoder();
1045			google.maps.event.addListener(infoWindow, 'domready', function() { 
1046				document.getElementById('location-balloon-content').parentNode.style.overflow=''; 
1047				document.getElementById('location-balloon-content').parentNode.parentNode.style.overflow=''; 
1048			});
1049			google.maps.event.addListener(marker, 'dragend', function() {
1050				var position = marker.getPosition();
1051				jQuery('#location-latitude').val(position.lat());
1052				jQuery('#location-longitude').val(position.lng());
1053				map.setCenter(position);
1054				map.panBy(40,-55);
1055			});
1056			if( jQuery('#location-select-id').length > 0 ){
1057				jQuery('#location-select-id').trigger('change');
1058			}else{
1059				refresh_map_location();
1060			}
1061			jQuery(document).triggerHandler('em_map_loaded', [map, infowindow, marker]);
1062		}
1063		//map resize listener
1064		jQuery(window).on('resize', function(e) {
1065			google.maps.event.trigger(map, "resize");
1066			map.setCenter(marker.getPosition());
1067			map.panBy(40,-55);
1068		});
1069	}
1070	em_maps_loaded = true; //maps have been loaded
1071	jQuery(document).triggerHandler('em_maps_loaded');
1072}
1073  
1074function em_map_infobox(marker, message, map) {
1075  var iw = new google.maps.InfoWindow({ content: message });
1076  google.maps.event.addListener(marker, 'click', function() {
1077	if( infowindow ) infowindow.close();
1078	infowindow = iw;
1079    iw.open(map,marker);
1080  });
1081}
1082
1083/* jQuery timePicker - http://labs.perifer.se/timedatepicker/ @ http://github.com/perifer/timePicker commit 100644 */
1084(function(e){function t(t,n,r,i){t.value=e(n).text();e(t).change();if(!navigator.userAgent.match(/msie/i)){t.focus()}r.hide()}function n(e,t){var n=e.getHours();var i=t.show24Hours?n:(n+11)%12+1;var s=e.getMinutes();return r(i)+t.separator+r(s)+(t.show24Hours?"":n<12?" AM":" PM")}function r(e){return(e<10?"0":"")+e}function i(e,t){return typeof e=="object"?o(e):s(e,t)}function s(e,t){if(e){var n=e.split(t.separator);var r=parseFloat(n[0]);var i=parseFloat(n[1]);if(!t.show24Hours){if(r===12&&e.indexOf("AM")!==-1){r=0}else if(r!==12&&e.indexOf("PM")!==-1){r+=12}}var s=new Date(0,0,0,r,i,0);return o(s)}return null}function o(e){e.setFullYear(2001);e.setMonth(0);e.setDate(0);return e}e.fn.timePicker=function(t){var n=e.extend({},e.fn.timePicker.defaults,t);return this.each(function(){e.timePicker(this,n)})};e.timePicker=function(t,n){var r=e(t)[0];return r.timePicker||(r.timePicker=new jQuery._timePicker(r,n))};e.timePicker.version="0.3";e._timePicker=function(r,u){var a=false;var f=false;var l=i(u.startTime,u);var c=i(u.endTime,u);var h="selected";var p="li."+h;e(r).attr("autocomplete","OFF");var d=[];var v=new Date(l);while(v<=c){d[d.length]=n(v,u);v=new Date(v.setMinutes(v.getMinutes()+u.step))}var m=e('<div class="time-picker'+(u.show24Hours?"":" time-picker-12hours")+'"></div>');var g=e("<ul></ul>");for(var y=0;y<d.length;y++){g.append("<li>"+d[y]+"</li>")}m.append(g);m.appendTo("body").hide();m.mouseover(function(){a=true}).mouseout(function(){a=false});e("li",g).mouseover(function(){if(!f){e(p,m).removeClass(h);e(this).addClass(h)}}).mousedown(function(){a=true}).click(function(){t(r,this,m,u);a=false});var b=function(){if(m.is(":visible")){return false}e("li",m).removeClass(h);var t=e(r).offset();m.css({top:t.top+r.offsetHeight,left:t.left});m.show();var i=r.value?s(r.value,u):l;var a=l.getHours()*60+l.getMinutes();var f=i.getHours()*60+i.getMinutes()-a;var p=Math.round(f/u.step);var d=o(new Date(0,0,0,0,p*u.step+a,0));d=l<d&&d<=c?d:l;var v=e("li:contains("+n(d,u)+")",m);if(v.length){v.addClass(h);m[0].scrollTop=v[0].offsetTop}return true};e(r).focus(b).click(b);e(r).blur(function(){if(!a){m.hide()}});e(r)["keydown"](function(n){var i;f=true;var s=m[0].scrollTop;switch(n.keyCode){case 38:if(b()){return false}i=e(p,g);var o=i.prev().addClass(h)[0];if(o){i.removeClass(h);if(o.offsetTop<s){m[0].scrollTop=s-o.offsetHeight}}else{i.removeClass(h);o=e("li:last",g).addClass(h)[0];m[0].scrollTop=o.offsetTop-o.offsetHeight}return false;break;case 40:if(b()){return false}i=e(p,g);var a=i.next().addClass(h)[0];if(a){i.removeClass(h);if(a.offsetTop+a.offsetHeight>s+m[0].offsetHeight){m[0].scrollTop=s+a.offsetHeight}}else{i.removeClass(h);a=e("li:first",g).addClass(h)[0];m[0].scrollTop=0}return false;break;case 13:if(m.is(":visible")){var l=e(p,g)[0];t(r,l,m,u)}return false;break;case 27:m.hide();return false;break}return true});e(r).keyup(function(e){f=false});this.getTime=function(){return s(r.value,u)};this.setTime=function(t){r.value=n(i(t,u),u);e(r).change()}};e.fn.timePicker.defaults={step:30,startTime:new Date(0,0,0,0,0,0),endTime:new Date(0,0,0,23,30,0),separator:":",show24Hours:true}})(jQuery)

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.