1var airDatePickerObj, gformid, fpObj, datesArr; 2var availableDays = {}; 3 4var auDate = new Date(); 5var isDate = function (date) { 6 return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date)); 7} 8 9jQuery(document).ready(function () { 10 console.debug('setting up Hyphen script'); 11 var $practiceIdInput = jQuery('.hh-practice-id-input input'); 12 var $appointmentTypeIdInput = jQuery('.hh-appointment-type-id-input input'); 13 var $datePicker = jQuery('.gravity-hh-date-picker'); 14 var $loaderOverlay = jQuery('.hh-loader-overlay'); 15 var $providerDropdown = jQuery('#hh-provider-dropdown'); 16 var $providerGender = jQuery('.hh-provider-gender input[type=radio]'); 17 var $providerInput = jQuery('.hh-provider-input input'); 18 var $providerIdInput = jQuery('.hh-provider-id-input input'); 19 var $dateTimeInput = jQuery('.hh-date-time input'); 20 var $timePicker = jQuery('.gravity-hh-time-picker'); 21 var $form = jQuery('.gform_wrapper form'); 22 var $humanDateInput = jQuery('.hh-human-date-input input'); 23 var $humanTimeInput = jQuery('.hh-human-time-input input'); 24 25 function checkCalendarShow() { 26 if ($practiceIdInput.val() && $appointmentTypeIdInput.val()) { 27 $datePicker.show(); 28 fetchAndDisplayTime(); // Call the function to fetch and display time 29 if (Object.keys(availableDays).length === 0) { 30 fetchAvailableDates($practiceIdInput.val(), function () { 31 setAvailableDates(); 32 }); 33 } else { 34 setAvailableDates(); 35 } 36 37 } else { 38 $datePicker.hide(); 39 } 40 } 41 42 function fetchAndDisplayTime() { 43 // Get the current time 44 const currentTime = new Date(); 45 46 // Convert to a string with specified options 47 const timeString = currentTime.toLocaleTimeString('en-AU', { 48 hour: '2-digit', 49 minute: '2-digit', 50 timeZone: 'Australia/Sydney', 51 hour12: true 52 }); 53 54 document.getElementById('current-time').textContent = timeStr
54ing; 55 } 56 57 fetchAndDisplayTime(); 58 59 // Set up a 10-second interval to update the time 60 setInterval(fetchAndDisplayTime, 10000); 61 62 function checkEnableDisableSubmitButton() { 63 var $submitButton = jQuery('#gform_' + gformid + ' input[type=submit]'); 64 if ($practiceIdInput.val().length && $appointmentTypeIdInput.val().length && $dateTimeInput.val().length) { 65 $submitButton.removeAttr('disabled'); 66 } else { 67 $submitButton.attr('disabled', 'disabled'); 68 } 69 } 70 71 function getProviders(change = false) { 72 $loaderOverlay.show(); 73 $providerInput.val(""); 74 $providerIdInput.val(""); 75 $dateTimeInput.val(""); 76 77 jQuery.get(hh_ajax.resturl + 'get-providers', { practiceId: $practiceIdInput.val(), gender: $providerGender.filter(':checked').val(), _: new Date().getTime() }, function (data) { 78 var providersOptions = '<option value="">Any Doctor</option>'; 79 jQuery(data).each(function (index, item) { 80 providersOptions += '<option value="' + item.id + '">' + item.name + '</option>'; 81 }); 82 $providerDropdown.html(providersOptions); 83 $loaderOverlay.hide(); 84 if (fpObj && fpObj.length && !change) { 85 fpObj.setDate(new Date()); 86 console.debug('fpObj found for setDate'); 87 }else{ 88 console.debug('fpObj missing for setDate, no date set'); 89 } 90 91 checkEnableDisableSubmitButton(); 92 checkCalendarShow(); 93 //$providerDropdown.trigger('change'); 94 }); 95 } 96 97 function getAvailableSlots(date, source = false) { 98 if (date instanceof Date || isDate(date)) { 99 $loaderOverlay.show(); 100 var gender = $providerGender.filter(':checked').val(); 101 date = date instanceof Date ? date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() : date; 102 jQuery.get(hh_ajax.resturl + 'available-booking-slots', { date: date, practiceId: $practiceIdInput.val(), providerId: $providerIdInput.val(), _: new Date().getTime() }, function (data) { 103 var slots = "<div class='hh-booking-slots-wrap'>"; 104 if (data.length === 0) { 105 slots += "<div class='no-appointments-message' style='text-align:center; font-weight: bold; padding: 20px;'>No available appointments on this day. Please select another day.</div>"; 106 } else { 107 data.forEach(function (provider) { 108 slots += "<div class='hh-provider-name gender-specific gender-" + provider.gender + "'>Doctor Name : " + provider.name + "</div>"; 109 slots += "<ul class='hh-booking-slots gender-specific gender-" + provider.gender + "'>"; 110 jQuery(provider['data']).each(function (_, item) { 111 slots += "<li><button type='button' class='hh-booking-slots-button gender-specific gender-" + provider.gender + "' data-providerid='" + item.providerId + "' data-providername='" + item.providerName + "' data-timestamp='" + item.timestamp + "' data-value='" + item.dateTime + "' data-date='" + item.date + "' data-time='" + item.time + "' >" + item.time + "</button></li>"; 112 }); 113 slots += "</ul>"; 114 }); 115 } 116 slots += "</div>"; 117 118 $timePicker.html(slots); 119 if (gender == 1 || gender == 2) { 120 jQuery('.gender-specific').hide(); 121 jQuery('.gender-' + gender).show(); 122 } 123 $timePicker.show(); 124 $loaderOverlay.hide(); 125 checkEnableDisableSubmitButton(); 126 }); 127 } 128 } 129 130 131 function fetchAvailableDates(practiceId, callback) { 132 jQuery.get(hh_ajax.resturl + 'get-available-days', { practiceId: practiceId, _: new Date().getTime() }, function (data) { 133 availableDays = data; // Store the fetched data in the global variable 134 if (typeof callback === 'function') { 135 callback(); 136 } 137 }); 138 } 139 140 function setAvailableDates() { 141 var providerId = $providerIdInput.val(); 142 143 var availableDaysForProvider = (providerId && availableDays[providerId] && availableDays[providerId]['availableDays']) ? availableDays[providerId]['availableDays'] : availableDays['all']['availableDays']; 144 var firstAvailableDate = (providerId && availableDays[providerId] && availableDays[providerId]['firstDate']) ? availableDays[providerId]['firstDate'] : availableDays['all']['firstDate']; 145 146 if(!fpObj){ 147 console.debug('fpObj does not exist yet'); 148 console.debug(fpObj); 149 return; 150 }else{ 151 console.debug('fpObj exists'); 152 } 153 fpObj.config.disable = [function (date) { 154 return (!availableDaysForProvider.includes(date.getDay())); 155 }]; 156 157 var currentDate = fpObj.selectedDates.length ? fpObj.selectedDates[0] : false;
158 fpObj.redraw(); 159 $loaderOverlay.hide(); 160 $timePicker.hide(); 161 162 if (availableDaysForProvider.length) { 163 fpObj.setDate(firstAvailableDate, true); 164 getAvailableSlots(firstAvailableDate, 'onReady'); 165 166 // var $selectedDay = jQuery(".flatpickr-day").not('.flatpickr-disabled').eq(0); 167 // var enabledDateOfMonth = $selectedDay.attr('aria-label'); 168 169 // if (fpObj.selectedDateElem.classList.contains('flatpickr-disabled') || !fpObj.selectedDates.length) { 170 // fpObj.setDate(enabledDateOfMonth, true, "Y-m-d"); 171 // $selectedDay.addClass('selected'); 172 // getAvailableSlots(enabledDateOfMonth, 'onReady'); 173 // } else { 174 // fpObj.setDate(currentDate, true); 175 // $selectedDay.addClass('selected'); 176 // getAvailableSlots(currentDate, 'onReady'); 177 // } 178 } 179 } 180 181 if ($practiceIdInput.length) { 182 gformid = $form.attr('data-formid'); 183 checkEnableDisableSubmitButton(); 184 getProviders(); 185 } 186 187 jQuery('#gform_' + gformid).submit(function () { 188 $loaderOverlay.show(); 189 }); 190 191 jQuery(document).on('gform_post_render', function (event, formId) { 192 if (jQuery('#gform_' + formId + ' .gfield_error').length > 0) { 193 $loaderOverlay.hide(); 194 } 195 }); 196 197 jQuery(document).on('gform_confirmation_loaded', function (event, formId) { 198 $loaderOverlay.hide(); 199 }); 200 201 $providerGender.change(function () { 202 getProviders(); 203 }); 204 205 jQuery('#hh-practice-dropdown').ready(function () { 206 $datePicker.hide(); 207 $timePicker.hide(); 208 $loaderOverlay.show(); 209 $providerDropdown.html('<option value="">Any Provider</option>'); 210 }); 211 212 jQuery('#hh-appointment-dropdown').change(function () { 213 var $this = jQuery(this); 214 jQuery('.hh-appointment-type-input input').val($this.find('option:selected').text()); 215 jQuery('.hh-appointment-type-id-input input').val($this.val()); 216 checkCalendarShow(); 217 $providerGender.trigger('change'); 218 }); 219 220 jQuery('#hh-practice-dropdown').change(function () { 221 var $this = jQuery(this); 222 jQuery('.hh-practice-input input').val($this.find('option:selected').text()); 223 jQuery('.hh-practice-id-input input').val($this.val()); 224 checkCalendarShow(); 225 }); 226 227 jQuery('#hh-provider-dropdown').change(function () { 228 var $this = jQuery(this); 229 jQuery('.hh-provider-input input').val($this.find('option:selected').text()); 230 jQuery('.hh-provider-id-input input').val($this.val()); 231 $dateTimeInput.val(""); 232 $loaderOverlay.show(); 233 checkCalendarShow(); 234 }); 235 236 jQuery('body').on('click', '.hh-booking-slots-button', function () { 237 var $this = jQuery(this); 238 jQuery('.hh-booking-slots-button').removeClass('hh-booking-slots-button-selected'); 239 $this.addClass('hh-booking-slots-button-selected'); 240 $dateTimeInput.val($this.data('value')); 241 $humanDateInput.val($this.data('date')); 242 $humanTimeInput.val($this.data('time')); 243 $providerIdInput.val($this.data('providerid')); 244 $providerInput.val($this.data('providername')); 245 $providerDropdown.val($this.data('providerid')); 246 checkEnableDisableSubmitButton(); 247 }); 248 249 if(flatpickr==undefined){ 250 console.debug('flatpickr is not loaded yet, ignoring date picker'); 251 console.debug(flatpickr); 252 }else{ 253 console.debug('flatpickr is loaded'); 254 fpObj = jQuery('.gravity-hh-date-picker-input').flatpickr({ 255 inline: true, 256 minDate: auDate, 257 defaultDate: auDate, 258 ariaDateFormat: "Y-m-d", 259 locale: { 260 firstDayOfWeek: 1 261 }, 262 onReady: function () { 263 $dateTimeInput.val(""); 264 checkEnableDisableSubmitButton(); 265 }, 266 onChange: function (date) { 267 $dateTimeInput.val(""); 268 getAvailableSlots(date[0], 'onchange'); 269 checkEnableDisableSubmitButton(); 270 }, 271 onMonthChange: function () { 272 applyCustomStyles(); 273 } 274 }); 275 } 276}); 277 278// Function to apply custom styles 279function applyCustomStyles() { 280 jQuery('.flatpickr-day.selected').css({ 281 'background-color': '#000000', 282 'border-color': '#000000', 283 }); 284}
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.