PageSourceSearch

https://cbaalbany.org/wp-content/plugins/gAppointments/assets/main.js?ver=1783431433

js cbaalbany.org collected 2026-10-02 10:59:35 UTC 25,526 bytes, 691 lines download raw bytes

1/**
2 * RENDER CHOSEN JS ON LOAD
3 */
4jQuery(window).load(function() {
5	jQuery(".chosen-select").chosen();
6});
7
8/**
9 * GF AJAX RENDER CHOSEN
10 */
11jQuery(document).bind('gform_post_render', function(){
12	jQuery(".chosen-select").chosen();
13});
14
15/*jQuery('.appointment_status_change_span').on('click',function(){
16	jQuery(this).hide();
17	jQuery(this).parent().find('.user_appointment_status_set').removeClass('user_appointment_status_set_hide');
18});*/
19jQuery('.user_appointment_status_set').on('click', function(e){
20	e.preventDefault();
21	var appID          = jQuery(this).attr('app-id');
22	var title          = jQuery(this).attr('title');
23	var action         = 'ga_user_set_appointment_pending';
24	var message 	   = '';
25	//var message        = '<textarea name="ga_cancel_message" placeholder="' + optional_text + '"></textarea><div class="hr"></div>';
26	var btn_title      = jQuery(this).attr('button-text');
27
28	var modal_output = '<div id="ga_model" class="ga_modal_bg"><div class="ga_dialog"><div class="ga_dialog_wrapper"><div class="ga_modal_wrapper"><div class="ga_modal_container"><span title="Close" class="ga_close ga_remove cancel_user_app_pending"></span><h3 class="modal-title">'+title+'</h3><div class="hr"></div><form id="ga_user_set_appointment_pending" action="" method="post" class="clearfix"><div class="ajax-response"></div><input type="hidden" name="app-id" value="'+appID+'"><input type="hidden" name="action" value="'+action+'">'+message+'<div class="ga_modal_footer"><button type="submit" class="ga-button">'+btn_title+'</button></div></form><div class="modal_overlay"></div></div></div></div></div></div>';
29
30	jQuery('#ga_appointment_modal').hide().html(modal_output).fadeIn(100, function() {
31		jQuery('html, body').addClass('ga_modal_open');
32	});
33
34});
35
36jQuery( document ).ready(function() {
37	/**
38	 * Select Service Event - AJAX
39	 */
40	jQuery('body').on('change', '.appointment_service_id', function() {
41		// Remove value to gform input
42		jQuery(".appointment_booking_date, .appointment_booking_time").val( '' );
43		jQuery("#ga_selected_bookings").fadeOut(300, function() { jQuery(this).html('').removeAttr("style"); });
44
45		// Add spinner to calendar
46		jQuery('.ga_monthly_schedule_wrapper').addClass('ga_spinner');
47
48		jQuery('.appointment_provider_id').each(function() {
49			//jQuery(this).hide();
50			jQuery(this).html('<option value="">Please wait...</option>');
51
52			if( jQuery(this).hasClass('chosen-select') ) {
53				jQuery(this).trigger("chosen:updated");
54			}
55
56		});
57
58		// service id
59		var service_id = jQuery(this).val();
60		var form_id    = jQuery(this).attr('form_id');
61
62		// wp ajax
63		var data = {
64			'action': 'ga_calendar_select_service',
65			'service_id': service_id,
66			'form_id': form_id,
67		};
68
69		jQuery.post(ga_calendar_services_obj.ajax_url, data, function(response) {
70				if ( typeof response !== 'undefined' ) {
71
72					if( response.success == true ) {
73
74						jQuery('.appointment_provider_id').each(function() {
75
76							jQuery(this).html( response.data['providers'] );
77
78							if( jQuery(this).hasClass('chosen-select') ) {
79								jQuery(this).trigger("chosen:updated");
80							}
81
82						});
83
84
85						jQuery('#gappointments_calendar').find('.ga_monthly_schedule_wrapper').html( response.data['calendar'] );
86
87						// Remove spinner from calendar
88						jQuery('.ga_monthly_schedule_wrapper').removeClass('ga_spinner');
89
90						gform_appointment_cost_filter();
91					}
92
93				}
94
95			//console.log(response);
96			//ga_ajax_response(response);
97		});
98		// wp ajax
99	});
100
101	/**
102	 * Select Provider Event - AJAX
103	 */
104	jQuery('body').on('change', '.appointment_provider_id', function() {
105		// Remove value to gform input
106		jQuery(".appointment_booking_date, .appointment_booking_time").val( '' );
107		jQuery("#ga_selected_bookings").fadeOut(300, function() { jQuery(this).html('').removeAttr("style"); });
108
109		// Add spinner to calendar
110		jQuery('.ga_monthly_schedule_wrapper').addClass('ga_spinner');
111
112		// service id
113		var provider_id   = jQuery(this).val();
114		var service_id    = jQuery('.appointment_service_id').val();
115		var form_id       = jQuery(this).attr('form_id');
116
117		//alert( service_id );
118
119		// wp ajax
120		var data = {
121			'action': 'ga_calendar_select_provider',
122			'service_id': service_id,
123			'provider_id': provider_id,
124			'form_id': form_id,
125		};
126
127		jQuery.post(ga_calendar_providers_obj.ajax_url, data, function(response) {
128			ga_ajax_response(response);
129
130
131			// Remove spinner from calendar
132			jQuery('.ga_monthly_schedule_wrapper').removeClass('ga_spinner');
133
134			gform_appointment_cost_filter();
135		});
136	});
137
138	/**
139	 * Calendar Previous Month Event - AJAX
140	 */
141	jQuery('body').on('click', '#ga_calendar_prev_month', function() {
142		// Remove value to gform input
143		jQuery(".appointment_booking_date, .appointment_booking_time").val( '' );
144
145		// Add spinner to calendar
146		jQuery('.ga_monthly_schedule_wrapper').addClass('ga_spinner');
147
148		var current_month = jQuery(this).attr('date-go');
149		var service_id    = jQuery(this).attr('service_id');
150		var provider_id   = jQuery(this).attr('provider_id');
151		var form_id       = jQuery('#ga_appointments_calendar').attr('form_id');
152
153		var data = {
154			'action': 'ga_calendar_prev_month',
155			'current_month': current_month,
156			'service_id': service_id,
157			'provider_id': provider_id,
158			'form_id': form_id,
159		};
160
161		jQuery.post(ga_calendar_prev_month_obj.ajax_url, data, function(response) {
162			ga_ajax_response(response);
163
164			// Remove spinner from calendar
165			jQuery('.ga_monthly_schedule_wrapper').removeClass('ga_spinner');
166		});
167	});
168
169	/**
170	 * Calendar Next Month Event - AJAX
171	 */
172	jQuery('body').on('click', '#ga_calendar_next_month', function() {
173		// Remove value to gform input
174		jQuery(".appointment_booking_date, .appointment_booking_time").val( '' );
175
176		// Add spinner to calendar
177		jQuery('.ga_monthly_schedule_wrapper').addClass('ga_spinner');
178
179		var current_month = jQuery(this).attr('date-go');
180		var service_id    = jQuery(this).attr('service_id');
181		var provider_id   = jQuery(this).attr('provider_id');
182		var form_id       = jQuery('#ga_appointments_calendar').attr('form_id');
183
184		var data = {
185			'action': 'ga_calendar_next_month',
186			'current_month': current_month,
187			'service_id': service_id,
188			'provider_id': provider_id,
189			'form_id': form_id,
190		};
191
192		jQuery.post(ga_calendar_next_month_obj.ajax_url, data, function(response) {
193			ga_ajax_response(response);
194
195			// Remove spinner from calendar
196			jQuery('.ga_monthly_schedule_wrapper').removeClass('ga_spinner');
197		});
198	});
199
200	/**
201	 * Time Slots Event - AJAX
202	 */
203	jQuery('body').on('click', '#service-working-days td.day_available', function(e) {
204		e.preventDefault();
205		var dateGo = jQuery(this).attr('date-go');
206
207		// Remove value to gform input
208		jQuery(".appointment_booking_date, .appointment_booking_time").val( '' );
209
210		if ( jQuery(this).hasClass("selected") ) {
211			var $_this = jQuery(this);
212			jQuery("#gappointments_calendar_slots").slideUp(0, function() {
213				jQuery(this).html('');
214			});
215
216			// Remove selected class
217			jQuery($_this).removeClass('selected');
218			gform_appointment_cost_filter();
219			return;
220		}
221
222		// Removing all available siblings
223		jQuery('#service-working-days td').each(function() {
224			jQuery(this).removeClass('selected');
225		});
226
227		// Adding selected class
228		jQuery(this).addClass('selected');
229
230		// Add value to gform input
231		jQuery(".appointment_booking_date").val( jQuery(this).attr('date-go') );
232
233		// Disable time slots if date slots class found
234		if ( jQuery(this).hasClass("ga_date_slots") ) {
235			jQuery(".appointment_booking_time").val( jQuery(this).attr('date-go') );
236
237
238			// Multiple Dates Selection
239			if( jQuery(this).attr('multi-select') == 'enabled' ) {
240				var valid       = true;
241				var inputs      = jQuery("#ga_selected_bookings .ga_selected_booking");
242				var total       = jQuery(this).attr('select-total');
243				var capacity    = jQuery(this).attr('capacity');
244				var no_double   = jQuery(this).attr('no_double');
245				var slot_cost   = jQuery(this).attr('service_cost');
246				var date        = jQuery(".appointment_booking_date").val();
247				var input_date  = date;
248				var input_time  = jQuery(".appointment_booking_time").val();
249				var input_value = input_date + ' ' + input_time;
250
251				var d = 0; // Doubles counter
252				jQuery(inputs).each(function() {
253					var dateField = jQuery(this).find( '.ga_selected_booking_date' ).val();
254					var timeField = jQuery(this).find( '.ga_selected_booking_time' ).val();
255					var dateTime  = dateField + ' ' + timeField;
256					if( inputs.length >= total ) {
257						valid = false;
258						return;
259					}
260
261					// Prevent Double Selections
262					if( no_double == 'yes' ) {
263						if( dateTime == input_value ) {
264							valid = false;
265						}
266					} else {
267						// Doubles Count
268						if( dateTime == input_value ) {
269							d++;
270						}
271
272						if( d >= capacity ) {
273							valid = false;
274						}
275
276					}
277
278				});
279
280				if(valid) {
281					var human_date  = jQuery(this).attr('lang_slot');
282					var name_date   = jQuery(".appointment_booking_date").attr('name').replace("[date]", "[bookings][date][]");
283					var name_time   = jQuery(".appointment_booking_date").attr('name').replace("[date]", "[bookings][time][]");
284					var input_html  = '<div class="ga_selected_booking"><div class="ga_delete_booking"><i class="fa fa-times-circle"></i></div><input type="hidden" class="ga_hidden_input ga_selected_booking_date" name="' + name_date + '" value="' + input_date + '" slot_cost="' + slot_cost + '"><input type="hidden" class="ga_hidden_input ga_selected_booking_time" name="' + name_time + '" value="' + input_time + '" slot_cost="' + slot_cost + '">' + human_date + '</div></div>';
285					jQuery(input_html).hide().appendTo("#ga_selected_bookings").fadeIn(700);
286				}
287			}
288			// Multiple Dates Selection
289
290			gform_appointment_cost_filter();
291
292			return;
293		}
294
295		jQuery("#gappointments_calendar_slots").each( function() {
296			jQuery( this ).remove();
297		});
298
299		jQuery(this).parent('tr').after('<tr id="gappointments_calendar_slots"><td colspan="7" class="calendar_slots"><div class="calendar_time_slots"><div class="app_hours_loading"><div class="ajax-spinner-bars"> <div class="bar-1"></div><div class="bar-2"></div><div class="bar-3"></div><div class="bar-4"></div><div class="bar-5"></div><div class="bar-6"></div><div class="bar-7"></div><div class="bar-8"></div><div class="bar-9"></div><div class="bar-10"></div><div class="bar-11"></div><div class="bar-12"></div><div class="bar-13"></div><div class="bar-14"></div><div class="bar-15"></div><div class="bar-16"></div></div></div></div></td></tr>');
300
301		setTimeout( function() {
302			var timeSlots = jQuery( '#' + dateGo ).html();
303			jQuery('#gappointments_calendar_slots .calendar_time_slots').html(timeSlots);
304		}, 500 );
305
306	});
307
308	/**
309	 * Ajax Response
310	 */
311	function ga_ajax_response(response) {
312		jQuery('#gappointments_calendar').find('.ga_monthly_schedule_wrapper').html(response);
313	}
314
315	/**
316	 * Close Modal Button
317	 */
318	jQuery('body').on('click', '#ga_model .ga_modal_wrapper .ga_remove, form#ga_cancel_appointment .ga_btn_close, form#ga_reschedule_appointment .ga_btn_close', function(e) {
319		e.preventDefault();
320
321		jQuery(this).parents('#ga_model').fadeIn(100, function() {
322			jQuery(this).remove();
323			jQuery('html, body').removeClass('ga_modal_open');
324		});
325
326	});
327	/*
328	* Close modal for status change
329	* */
330	jQuery('body').on('click', '#ga_user_set_appointment_pending .ga_btn_close', function(e){
331		e.preventDefault();
332		jQuery(this).parents('#ga_model').fadeIn(100, function() {
333			jQuery(this).remove();
334			jQuery('html, body').removeClass('ga_modal_open');
335		});
336		var select =jQuery('#sel-'+jQuery(this).attr('app-id'));
337		select.addClass('user_appointment_status_set_hide');
338		select.unbind();
339		var span = jQuery(select).parent().find('span');
340		span.removeClass('appointment_status_change_span');
341		span.html(jQuery(this).attr('pending-string'));
342		span.removeClass('appointment-status-green');
343		span.addClass('appointment-status-yellow');
344        span.show();
345		jQuery('#sel-'+jQuery('.ga_btn_close').attr('app-id')).remove();
346		select.remove();
347	});
348
349	/**
350	 * Cancel/Confirm Appointment Modal
351	 */
352	jQuery('body').on('click', '.appointment-status .appointment-action', function(e) {
353		e.preventDefault();
354		var appID          = jQuery(this).attr('app-id');
355		var title          = jQuery(this).attr('title');
356		var optional_text  = jQuery(this).attr('optional_text');
357		var action         = 'ga_cancel_appointment';
358		var message        = '<textarea name="ga_cancel_message" placeholder="' + optional_text + '"></textarea><div class="hr"></div>';
359		var btn_title      = jQuery(this).text();
360
361		if( jQuery(this).hasClass('provider-cancel') ) {
362			var action = 'ga_provider_cancel_appointment';
363		}
364
365		if( jQuery(this).hasClass('provider-confirm') ) {
366			var title     = jQuery(this).attr('title');
367			var action    = 'ga_provider_confirm';
368			var message   = '';
369			var btn_title = jQuery(this).text();
370		}
371
372		var modal_output = '<div id="ga_model" class="ga_modal_bg"><div class="ga_dialog"><div class="ga_dialog_wrapper"><div class="ga_modal_wrapper"><div class="ga_modal_container"><span title="Close" class="ga_close ga_remove"></span>
372<h3 class="modal-title">'+title+'</h3><div class="hr"></div><form id="ga_cancel_appointment" action="" method="post" class="clearfix"><div class="ajax-response"></div><input type="hidden" name="app-id" value="'+appID+'"><input type="hidden" name="action" value="'+action+'">'+message+'<div class="ga_modal_footer"><button type="submit" class="ga-button">'+btn_title+'</button></div></form><div class="modal_overlay"></div></div></div></div></div></div>';
373
374		jQuery('#ga_appointment_modal').hide().html(modal_output).fadeIn(100, function() {
375			jQuery('html, body').addClass('ga_modal_open');
376		});
377
378		window.appointmentID = jQuery(this).parent('.appointment-status');
379
380	});
381
382	/**
383	 * Reschedule Appointment Modal
384	 */
385	jQuery('body').on('click', '.appointment-status .reschedule-appointment-action', function(e) {
386		e.preventDefault();
387		var appID          = jQuery(this).attr('app-id');
388		var title          = jQuery(this).attr('title');
389		var action         = 'ga_reschedule_appointment';
390		var message 	   = '';
391		var btn_title      = jQuery(this).text();
392
393		// wp ajax
394		var data = {
395			'action': 'ga_get_calendar',
396			'app_id': appID,
397		};
398
399		jQuery.post(ga_get_calendar_obj.ajax_url, data, function(response) {
400			if ( typeof response !== 'undefined' ) {
401				message = response;
402			}
403		}).fail(function() {
404			message = '<div>Error</div>';
405			action = false;
406		}).done(function(){
407
408			var modal_output = '<div id="ga_model" class="ga_modal_bg"><div class="ga_dialog"><div class="ga_dialog_wrapper"><div class="ga_modal_wrapper"><div class="ga_modal_container"><span title="Close" class="ga_close ga_remove"></span><h3 class="modal-title">'+title+'</h3><div class="hr"></div><form id="ga_reschedule_appointment" action="" method="post" class="clearfix"><div class="ajax-response"></div><input type="hidden" name="app-id" value="'+appID+'"><input type="hidden" name="action" value="'+action+'">'+message+'<div class="ga_modal_footer"><button type="submit" class="ga-button">'+btn_title+'</button></div></form><div class="modal_overlay"></div></div></div></div></div></div>';
409			jQuery('#ga_appointment_modal').hide().html(modal_output).fadeIn(100, function() {
410				jQuery('html, body').addClass('ga_modal_open');
411			});
412		});
413
414
415		window.appointmentID = jQuery(this).parent('.appointment-status');
416	});
417
418	/**
419	 * Cancel/Confirm Appointment - Ajax
420	 */
421	jQuery(document).on("submit", "form#ga_cancel_appointment", function(e) {
422		e.preventDefault();
423		var modal_wrapper = jQuery(this);
424		var action = modal_wrapper.find('input[name=action]').val();
425
426		modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').show();
427
428		var data = jQuery("form#ga_cancel_appointment").serialize();
429
430		jQuery.post(ga_update_appointment_status_obj.ajax_url, data, function(response) {
431			if ( typeof response !== 'undefined' ) {
432
433				modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').hide();
434
435				if( response.success == false ) {
436	                jQuery("form#ga_cancel_appointment").html(response.data['message']);
437				}
438
439				if( response.success == true ) {
440	                jQuery("form#ga_cancel_appointment").html(response.data['message']);
441					jQuery( window.appointmentID ).html(response.data['app_status']);
442				}
443
444			}
445		}).fail(function() {
446			jQuery("form#ga_cancel_appointment .ajax-response").html('<div class="ga_alert ga_alert_danger">Error sending form!</div>');
447			modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').hide();
448		});
449	});
450
451	/**
452	 * User set appointment status to pending - Ajax
453	 */
454	jQuery(document).on("submit", "form#ga_user_set_appointment_pending", function(e) {
455		e.preventDefault();
456		var modal_wrapper = jQuery(this);
457		var action = modal_wrapper.find('input[name=action]').val();
458
459		modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').show();
460
461		var data = jQuery("form#ga_user_set_appointment_pending").serialize();
462
463		jQuery.post(ga_user_set_appointment_pending_obj.ajax_url, data, function(response) {
464			if ( typeof response !== 'undefined' ) {
465
466				modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').hide();
467
468				if( response.success == false ) {
469					jQuery("form#ga_user_set_appointment_pending").html(response.data['message']);
470				}
471
472				if( response.success == true ) {
473					console.log('nustatytas');
474					jQuery("form#ga_user_set_appointment_pending").html(response.data['message']);
475					jQuery( window.appointmentID ).html(response.data['app_status']);
476
477					jQuery('.cancel_user_app_pending').unbind();
478					jQuery('.cancel_user_app_pending').on('click', function(){
479						var select =jQuery('#sel-'+jQuery('.ga_btn_close').attr('app-id'));
480						select.addClass('user_appointment_status_set_hide');
481						select.unbind();
482
483						var span = jQuery(select).parent().find('span');
484						span.removeClass('appointment_status_change_span');
485						span.html(jQuery('.ga_btn_close').attr('pending-string'));
486						span.removeClass('appointment-status-green');
487						span.addClass('appointment-status-yellow');
488						span.show();
489						jQuery('#sel-'+jQuery('.ga_btn_close').attr('app-id')).remove();
490					})
491				}
492
493			}
494		}).fail(function() {
495			jQuery("form#ga_user_set_appointment_pending .ajax-response").html('<div class="ga_alert ga_alert_danger">Error sending form!</div>');
496			modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').hide();
497		});
498	});
499
500	/**
501	 * Reschedule Appointment - Ajax
502	 */
503	jQuery(document).on("submit", "form#ga_reschedule_appointment", function(e) {
504		e.preventDefault();
505		var modal_wrapper = jQuery(this);
506		var action = modal_wrapper.find('input[name=action]').val();
507
508		modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').show();
509
510		var data = jQuery("form#ga_reschedule_appointment").serialize();
511
512		jQuery.post(ga_update_appointment_status_obj.ajax_url, data, function(response) {
513			if ( typeof response !== 'undefined' ) {
514
515				modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').hide();
516
517				if( response.success == false ) {
518					jQuery("form#ga_reschedule_appointment").html(response.data['message']);
519				}
520
521				if( response.success == true ) {
522					jQuery("form#ga_reschedule_appointment").html(response.data['message']);
523					jQuery( window.appointmentID ).html(response.data['app_status']);
524				}
525
526			}
527		}).fail(function() {
528			jQuery("form#ga_reschedule_appointment .ajax-response").html('<div class="ga_alert ga_alert_danger">Error sending form!</div>');
529			modal_wrapper.parent('.ga_modal_container').find('.modal_overlay').hide();
530		});
531	});
532
533
534
535	/**
536	 * Init Service Cost
537	 */
538	jQuery('body').on('click', '#gappointments_calendar_slots label.time_slot', function() {
539		var time_slot = jQuery(this).attr('time_slot');
540		jQuery(".appointment_booking_time").val( time_slot );
541
542		// Removing all available siblings
543		jQuery('#gappointments_calendar_slots label.time_slot').each(function() {
544			jQuery(this).removeClass('time_selected');
545		});
546
547		// Adding selected class
548		jQuery(this).addClass('time_selected');
549
550		// Multiple Selection
551		if( jQuery(this).attr('multi-select') == 'enabled' ) {
552			var valid         = true;
553			var inputs        = jQuery("#ga_selected_bookings .ga_selected_booking");
554			var max           = jQuery(this).attr('select-max');
555			var total         = jQuery(this).attr('select-total');
556			var time_format   = jQuery(this).attr('time_format');
557			var remove_am_pm  = jQuery(this).attr('remove_am_pm');
558			var capacity      = jQuery(this).attr('capacity');
559			var no_double     = jQuery(this).attr('no_double');
560			var slot_cost     = jQuery(this).attr('slot_cost');
561			var date          = jQuery(".appointment_booking_date").val();
562			var input_date    = date;
563			var input_time    = jQuery(".appointment_booking_time").val();
564			var input_value   = input_date + ' ' + input_time;
565
566			var x = 0;
567			var d = 0; // Doubles counter
568			jQuery(inputs).each(function() {
569				var dateField = jQuery(this).find( '.ga_selected_booking_date' ).val();
570				var timeField = jQuery(this).find( '.ga_selected_booking_time' ).val();
571				var dateTime  = dateField + ' ' + timeField;
572
573					//console.log( dateTime );
574					//console.log( input_value );
575
576				// Total max selection is reached
577				if( inputs.length >= total ) {
578					valid = false;
579					return;
580				}
581
582				// Same date is found
583				if( jQuery(this).val().match(date) ) {
584					x++;
585				}
586
587				// Prevent Double Selections
588				if( no_double == 'yes' ) {
589					if( dateTime == input_value || x >= max ) {
590						valid = false;
591					}
592				} else {
593					// Doubles Count
594					if( dateTime == input_value ) {
595						d++;
596					}
597
598					if( d >= capacity ) {
599						valid = false;
600					}
601				}
602			});
603
604			//console.log( valid );
605
606			if(valid) {
607				var human_date  = jQuery(this).attr('lang_slot');
608				var name_date  = jQuery(".appointment_booking_date").attr('name').replace("[date]", "[bookings][date][]");
609				var name_time  = jQuery(".appointment_booking_date").attr('name').replace("[date]", "[bookings][time][]");
610				var input_html  = '<div class="ga_selected_booking"><div class="ga_delete_booking"><i class="fa fa-times-circle"></i></div><input type="hidden" class="ga_hidden_input ga_selected_booking_date" name="' + name_date + '" value="' + input_date + '" slot_cost="' + slot_cost + '"><input type="hidden" class="ga_hidden_input ga_selected_booking_time" name="' + name_time + '" value="' + input_time + '" slot_cost="' + slot_cost + '">' + human_date + '</div></div>';
611				jQuery(input_html).hide().appendTo("#ga_selected_bookings").fadeIn(700);
612			}
613		}
614		// Multiple Selection
615
616	    gform_appointment_cost_filter();
617	});
618
619
620
621	/**
622	 * Remove a Selected Booking
623	 */
624	jQuery('body').on('click', '#ga_selected_bookings .ga_selected_booking .ga_delete_booking', function() {
625		jQuery(this).parent('.ga_selected_booking').fadeOut(150, function() {
626			jQuery(this).remove();
627			gform_appointment_cost_filter();
628
629			if( !jQuery( '#ga_selected_bookings .ga_selected_booking .ga_delete_booking' ).lenght )
630				jQuery( '.appointment_booking_time' ).val( '' );
631		});
632	});
633
634	/**
635	 * Calculate appointment cost
636	 */
637	function gform_appointment_cost_filter() {
638		var $costFields  = jQuery( '.ginput_appointment_cost_input' );
639		var total        = 0;
640		var service_cost = jQuery("#service-working-days td.day_available").attr('service_cost');
641
642		// Date Slot Selected
643		var dateSelected = jQuery("#service-working-days td.ga_date_slots.selected");
644
645		// Time Slot Selected
646		var slotSelected = jQuery('#gappointments_calendar_slots label.time_selected');
647
648		// Mulitple Bookings
649		var bookings     = jQuery("#ga_selected_bookings .ga_selected_booking input.ga_selected_booking_date");
650
651		if( bookings && bookings.length ) {
652			jQuery("#ga_selected_bookings .ga_selected_booking input.ga_selected_booking_date").each(function() {
653				total += Math.max( 0, parseFloat( jQuery(this).attr('slot_cost') ) );
654			});
655		} else if( dateSelected && dateSelected.length && jQuery.isNumeric(service_cost) ) {
656			total = service_cost;
657		} else if( slotSelected && slotSelected.length ) {
658			total = slotSelected.attr('slot_cost');
659		}
660
661		// Add appointment total to cost inputs
662		$costFields.each( function() {
663			jQuery( this ).val( total ).change();
664		});
665
666		// Trigger gf total
667		if( typeof gformInitPriceFields == 'function' ) {
668			gformInitPriceFields(); // will trigger "gform_product_total" filter
669		}
670	}
671
672}); // end doc ready
673
674
675
676
677/**
678 * Trigger appointment cost & add cost to total
679 */
680( function( $ ) {
681	/**
682	 * Init Service Cost On AJAX Form Trigger
683	 */
684	jQuery(document).bind('gform_post_render', function() {
685		var $costFields = $( '.ginput_appointment_cost_input' ).change();
686		$costFields.each( function() {
687			$( this ).change();
688		});
689	});
690
691} )( 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.