// make it a global variable so other scripts can access it var booked_load_calendar_date_booking_options, booked_appt_form_options, bookedNewAppointment; ;(function($, window, document, undefined) { var $win = $(window); $.fn.spin.presets.booked = { lines: 10, // The number of lines to draw length: 7, // The length of each line width: 5, // The line thickness radius: 11, // The radius of the inner circle corners: 1, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#555', // #rgb or #rrggbb or array of colors speed: 1, // Rounds per second trail: 60, // Afterglow percentage shadow: false, // Whether to render a shadow hwaccel: false, // Whether to use hardware acceleration className: 'booked-spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to parent left: '50%' // Left position relative to parent } $.fn.spin.presets.booked_top = { lines: 11, // The number of lines to draw length: 10, // The length of each line width: 6, // The line thickness radius: 15, // The radius of the inner circle corners: 1, // Corner roundness (0..1) rotate: 0, // The rotation offset scale: 0.5, direction: 1, // 1: clockwise, -1: counterclockwise color: '#aaaaaa', // #rgb or #rrggbb or array of colors speed: 1, // Rounds per second trail: 60, // Afterglow percentage shadow: false, // Whether to render a shadow hwaccel: false, // Whether to use hardware acceleration className: 'booked-spinner booked-spinner-top', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '15px', // Top position relative to parent left: '50%' // Left position relative to parent } $.fn.spin.presets.booked_white = { lines: 13, // The number of lines to draw length: 11, // The length of each line width: 5, // The line thickness radius: 18, // The radius of the inner circle scale: 1, corners: 1, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#fff', // #rgb or #rrggbb or array of colors speed: 1, // Rounds per second trail: 60, // Afterglow percentage shadow: false, // Whether to render a shadow hwaccel: false, // Whether to use hardware acceleration className: 'booked-spinner booked-white', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to parent left: '50%' // Left position relative to parent } // Adjust the calendar sizing when resizing the window $win.on('resize', function(){ adjust_calendar_boxes(); resize_booked_modal(); }); $win.on('load', function() { BookedTabs.Init(); var ajaxRequests = []; // Adjust the calendar sizing on load adjust_calendar_boxes(); $('.booked-calendar-wrap').each(function(){ var thisCalendar = $(this); var calendar_month = thisCalendar.find('table.booked-calendar').attr('data-calendar-date'); thisCalendar.attr('data-default',calendar_month); init_tooltips(thisCalendar); }); $('.booked-list-view').each(function(){ var thisList = $(this); var list_date = thisList.find('.booked-appt-list').attr('data-list-date'); thisList.attr('data-default',list_date); }); bookedRemoveEmptyTRs(); init_appt_list_date_picker(); $('.booked_calendar_chooser').change(function(e){ e.preventDefault(); var $selector = $(this), thisIsCalendar = $selector.parents('.booked-calendarSwitcher').hasClass('calendar'); if (!thisIsCalendar){ var thisCalendarWrap = $selector.parents('.booked-calendar-shortcode-wrap').find('.booked-list-view'), thisDefaultDate = thisCalendarWrap.attr('data-default'), thisIsCalendar = $selector.parents('.booked-calendarSwitcher').hasClass('calendar'); if (typeof thisDefaultDate == 'undefined'){ thisDefaultDate = false; } thisCalendarWrap.addClass('booked-loading'); var args = { 'action' : 'booked_appointment_list_date', 'date' : thisDefaultDate, 'calendar_id' : $selector.val() }; $(document).trigger("booked-before-loading-appointment-list-booking-options"); thisCalendarWrap.spin('booked_top'); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: args, success: function( html ) { thisCalendarWrap.html( html ); init_appt_list_date_picker(); setTimeout(function(){ thisCalendarWrap.removeClass('booked-loading'); },1); } }); } else { var thisCalendarWrap = $selector.parents('.booked-calendar-shortcode-wrap').find('.booked-calendar-wrap'), thisDefaultDate = thisCalendarWrap.attr('data-default'); if (typeof thisDefaultDate == 'undefined'){ thisDefaultDate = false; } var args = { 'action' : 'booked_calendar_month', 'gotoMonth' : thisDefaultDate, 'calendar_id' : $selector.val() }; savingState(true,thisCalendarWrap); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: args, success: function( html ) { thisCalendarWrap.html( html ); adjust_calendar_boxes(); bookedRemoveEmptyTRs(); init_tooltips(thisCalendarWrap); $(window).trigger('booked-load-calendar', args, $selector ); } }); } return false; }); // Calendar Next/Prev Click $('.booked-calendar-wrap').on('click', '.page-right, .page-left, .monthName a', function(e) { e.preventDefault(); var $button = $(this), gotoMonth = $button.attr('data-goto'), thisCalendarWrap = $button.parents('.booked-calendar-wrap'), thisCalendarDefault = thisCalendarWrap.attr('data-default'), calendar_id = $button.parents('table.booked-calendar').attr('data-calendar-id'); if (typeof thisCalendarDefault == 'undefined'){ thisCalendarDefault = false; } var args = { 'action' : 'booked_calendar_month', 'gotoMonth' : gotoMonth, 'calendar_id' : calendar_id, 'force_default' : thisCalendarDefault }; savingState(true,thisCalendarWrap); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: args, success: function( html ) { thisCalendarWrap.html( html ); adjust_calendar_boxes(); bookedRemoveEmptyTRs(); init_tooltips(thisCalendarWrap); $(window).trigger('booked-load-calendar', args, $button ); } }); return false; }); // Calendar Date Click $('.booked-calendar-wrap').on('click', 'tr.week td', function(e) { e.preventDefault(); var $thisDate = $(this), booked_calendar_table = $thisDate.parents('table.booked-calendar'), $thisRow = $thisDate.parent(), date = $thisDate.attr('data-date'), calendar_id = booked_calendar_table.attr('data-calendar-id'), colspanSetting = $thisRow.find('td').length; if (!calendar_id){ calendar_id = 0; } if ($thisDate.hasClass('blur') || $thisDate.hasClass('booked') && !booked_js_vars.publicAppointments || $thisDate.hasClass('prev-date')){ // Do nothing. } else if ($thisDate.hasClass('active')){ $thisDate.removeClass('active'); $('tr.entryBlock').remove(); var calendarHeight = booked_calendar_table.height(); booked_calendar_table.parent().height(calendarHeight); } else { $('tr.week td').removeClass('active'); $thisDate.addClass('active'); $('tr.entryBlock').remove(); $thisRow.after(''); $('tr.entryBlock').find('td').spin('booked'); booked_load_calendar_date_booking_options = {'action':'booked_calendar_date','date':date,'calendar_id':calendar_id}; $(document).trigger("booked-before-loading-calendar-booking-options"); var calendarHeight = booked_calendar_table.height(); booked_calendar_table.parent().height(calendarHeight); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: booked_load_calendar_date_booking_options, success: function( html ) { $('tr.entryBlock').find('td').html( html ); $('tr.entryBlock').removeClass('booked-loading'); $('tr.entryBlock').find('.booked-appt-list').fadeIn(300); $('tr.entryBlock').find('.booked-appt-list').addClass('shown'); adjust_calendar_boxes(); } }); } return; }); // Appointment List Next/Prev Date Click $('.booked-list-view').on('click', '.booked-list-view-date-prev,.booked-list-view-date-next', function(e) { e.preventDefault(); var $thisLink = $(this), date = $thisLink.attr('data-date'), thisList = $thisLink.parents('.booked-list-view'), defaultDate = thisList.attr('data-default'), calendar_id = $thisLink.parents('.booked-list-view-nav').attr('data-calendar-id'); if (typeof defaultDate == 'undefined'){ defaultDate = false; } if (!calendar_id){ calendar_id = 0; } thisList.addClass('booked-loading'); var booked_load_list_view_date_booking_options = { 'action' : 'booked_appointment_list_date', 'date' : date, 'calendar_id' : calendar_id, 'force_default' : defaultDate }; $(document).trigger("booked-before-loading-appointment-list-booking-options"); thisList.spin('booked_top'); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: booked_load_list_view_date_booking_options, success: function( html ) { thisList.html( html ); init_appt_list_date_picker(); setTimeout(function(){ thisList.removeClass('booked-loading'); },1); } }); return false; }); // New Appointment Click bookedNewAppointment = function(e) { e.preventDefault(); var $button = $(this), title = $button.attr('data-title'), timeslot = $button.attr('data-timeslot'), date = $button.attr('data-date'), calendar_id = $button.attr('data-calendar-id'), $thisTimeslot = $button.parents('.timeslot'), is_list_view = $button.parents('.booked-calendar-wrap').hasClass('booked-list-view'); if (typeof is_list_view != 'undefined' && is_list_view){ var new_calendar_id = $button.parents('.booked-list-view').find('.booked-list-view-nav').attr('data-calendar-id'); } else { var new_calendar_id = $button.parents('table.booked-calendar').attr('data-calendar-id'); } calendar_id = new_calendar_id ? new_calendar_id : calendar_id; booked_appt_form_options = {'action':'booked_new_appointment_form','date':date,'timeslot':timeslot,'calendar_id':calendar_id,'title':title}; $(document).trigger("booked-before-loading-booking-form"); create_booked_modal(); setTimeout(function(){ $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: booked_appt_form_options, success: function( html ) { $('.bm-window').html( html ); var bookedModal = $('.booked-modal'); var bmWindow = bookedModal.find('.bm-window'); bmWindow.css({'visibility':'hidden'}); bookedModal.removeClass('bm-loading'); $(document).trigger("booked-on-new-app"); resize_booked_modal(); bmWindow.hide(); $('.booked-modal .bm-overlay').find('.booked-spinner').remove(); setTimeout(function(){ bmWindow.css({'visibility':'visible'}); bmWindow.show(); },50); } }); },100); return false; } $('.booked-calendar-wrap').on('click', 'button.new-appt', bookedNewAppointment); // Profile Tabs var profileTabs = $('.booked-tabs'); if (!profileTabs.find('li.active').length){ profileTabs.find('li:first-child').addClass("active"); } if (profileTabs.length){ $('.booked-tab-content').hide(); var activeTab = profileTabs.find('.active > a').attr('href'); activeTab = activeTab.split('#'); activeTab = activeTab[1]; $('#profile-'+activeTab).show(); profileTabs.find('li > a').on('click', function(e) { e.preventDefault(); $('.booked-tab-content').hide(); profileTabs.find('li').removeClass('active'); $(this).parent().addClass('active'); var activeTab = $(this).attr('href'); activeTab = activeTab.split('#'); activeTab = activeTab[1]; $('#profile-'+activeTab).show(); return false; }); } // Show Additional Information $('.booked-profile-appt-list').on('click', '.booked-show-cf', function(e) { e.preventDefault(); var hiddenBlock = $(this).parent().find('.cf-meta-values-hidden'); if(hiddenBlock.is(':visible')){ hiddenBlock.hide(); $(this).removeClass('booked-cf-active'); } else { hiddenBlock.show(); $(this).addClass('booked-cf-active'); } return false; }); // Check Login/Registration/Forgot Password forms before Submitting if ($('#loginform').length){ $('#loginform input[type="submit"]').on('click',function(e) { if ($('#loginform input[name="log"]').val() && $('#loginform input[name="pwd"]').val()){ $('#loginform .booked-custom-error').hide(); } else { e.preventDefault(); $('#loginform').parents('.booked-form-wrap').find('.booked-custom-error').fadeOut(200).fadeIn(200); } }); } if ($('#profile-forgot').length){ $('#profile-forgot input[type="submit"]').on('click',function(e) { if ($('#profile-forgot input[name="user_login"]').val()){ $('#profile-forgot .booked-custom-error').hide(); } else { e.preventDefault(); $('#profile-forgot').find('.booked-custom-error').fadeOut(200).fadeIn(200); } }); } // Custom Upload Field if ($('.booked-upload-wrap').length){ $('.booked-upload-wrap input[type=file]').on('change',function(){ var fileName = $(this).val(); $(this).parent().find('span').html(fileName); $(this).parent().addClass('hasFile'); }); } // Delete Appointment $('.booked-profile-appt-list').on('click', '.appt-block .cancel', function(e) { e.preventDefault(); var $button = $(this), $thisParent = $button.parents('.appt-block'), appt_id = $thisParent.attr('data-appt-id'); confirm_delete = confirm(booked_js_vars.i18n_confirm_appt_delete); if (confirm_delete == true){ var currentApptCount = parseInt($('.booked-profile-appt-list').find('h4').find('span.count').html()); currentApptCount = parseInt(currentApptCount - 1); if (currentApptCount < 1){ $('.booked-profile-appt-list').find('h4').find('span.count').html('0'); $('.no-appts-message').slideDown('fast'); } else { $('.booked-profile-appt-list').find('h4').find('span.count').html(currentApptCount); } $('.appt-block').animate({'opacity':0.4},0); $thisParent.slideUp('fast',function(){ $(this).remove(); }); $.ajax({ 'url' : booked_js_vars.ajax_url, 'method' : 'post', 'data' : { 'action' : 'booked_cancel_appt', 'appt_id' : appt_id }, success: function(data) { $('.appt-block').animate({'opacity':1},150); } }); } return false; }); $('body').on('touchstart click','.bm-overlay, .bm-window .close, .booked-form .cancel',function(e){ e.preventDefault(); close_booked_modal(); return false; }); $('body') .on('focusin', '.booked-form input', function() { if(this.title==this.value) { $(this).addClass('hasContent'); this.value = ''; } }).on('focusout', '.booked-form input', function(){ if(this.value==='') { $(this).removeClass('hasContent'); this.value = this.title; } }); $('body').on('change','.booked-form input',function(){ var condition = $(this).attr('data-condition'), thisVal = $(this).val(); if (condition && $('.condition-block').length) { $('.condition-block.'+condition).hide(); $('#condition-'+thisVal).fadeIn(200); resize_booked_modal(); } }); // Perform AJAX login on form submit $('body').on('submit','form#ajaxlogin', function(e){ e.preventDefault(); $('form#ajaxlogin p.status').show().html('   ' + booked_js_vars.i18n_please_wait); resize_booked_modal(); var $this = $(this), date = $this.data('date'), title = $this.data('title'), timeslot = $this.data('timeslot'), calendar_id = $this.data('calendar-id'); $.ajax({ type : 'post', url : booked_js_vars.ajax_url, data : $('form#ajaxlogin').serialize(), success : function(data) { if (data == 'success'){ // close the modal box close_booked_modal(); // reopen the modal box var $button = $( '' ); $button.on( 'click', window.bookedNewAppointment ); $button.triggerHandler( 'click' ); $button.unbind( 'click', window.bookedNewAppointment ); $button.detach(); } else { $('form#ajaxlogin p.status').show().html('   ' + booked_js_vars.i18n_wrong_username_pass); resize_booked_modal(); } } }); e.preventDefault(); }); $('body').on('click','.booked-forgot-password',function(e){ e.preventDefault(); $('#ajaxlogin').hide(); $('#ajaxforgot').show(); resize_booked_modal(); }); $('body').on('click','.booked-forgot-goback',function(e){ e.preventDefault(); $('#ajaxlogin').show(); $('#ajaxforgot').hide(); resize_booked_modal(); }); // Perform AJAX login on form submit $('body').on('submit','form#ajaxforgot', function(e){ e.preventDefault(); $('form#ajaxforgot p.status').show().html('   ' + booked_js_vars.i18n_please_wait); resize_booked_modal(); var $this = $(this); $.ajax({ type : 'post', url : booked_js_vars.ajax_url, data : $('form#ajaxforgot').serialize(), success : function(data) { if (data == 'success'){ e.preventDefault(); $('#ajaxlogin').show(); $('#ajaxforgot').hide(); $('form#ajaxlogin p.status').show().html('   ' + booked_js_vars.i18n_password_reset); resize_booked_modal(); } else { //console.log(data); $('form#ajaxforgot p.status').show().html('   ' + booked_js_vars.i18n_password_reset_error); resize_booked_modal(); } } }); e.preventDefault(); }); // Submit the "Request Appointment" Form $('body').on('click','.booked-form input#submit-request-appointment',function(e){ $('form#newAppointmentForm p.status').show().html('   ' + booked_js_vars.i18n_please_wait); resize_booked_modal(); e.preventDefault(); var customerType = $('#newAppointmentForm input[name=customer_type]').val(), customerID = $('#newAppointmentForm input[name=user_id]').val(), name = $('#newAppointmentForm input[name=booked_appt_name]').val(), surname = $('#newAppointmentForm input[name=booked_appt_surname]').val(), surnameActive = $('#newAppointmentForm input[name=booked_appt_surname]').length, guest_name = $('#newAppointmentForm input[name=guest_name]').val(), guest_surname = $('#newAppointmentForm input[name=guest_surname]').val(), guest_surnameActive = $('#newAppointmentForm input[name=guest_surname]').length, guest_email = $('#newAppointmentForm input[name=guest_email]').val(), guest_emailActive = $('#newAppointmentForm input[name=guest_email]').length, email = $('#newAppointmentForm input[name=booked_appt_email]').val(), password = $('#newAppointmentForm input[name=booked_appt_password]').val(), showRequiredError = false, ajaxRequests = []; $(this).parents('.booked-form').find('input,textarea,select').each(function(i,field){ var required = $(this).attr('required'); if (required && $(field).attr('type') == 'hidden'){ var fieldParts = $(field).attr('name'); fieldParts = fieldParts.split('---'); fieldName = fieldParts[0]; fieldNumber = fieldParts[1].split('___'); fieldNumber = fieldNumber[0]; if (fieldName == 'radio-buttons-label'){ var radioValue = false; $('input:radio[name="single-radio-button---'+fieldNumber+'[]"]:checked').each(function(){ if ($(this).val()){ radioValue = $(this).val(); } }); if (!radioValue){ showRequiredError = true; } } else if (fieldName == 'checkboxes-label'){ var checkboxValue = false; $('input:checkbox[name="single-checkbox---'+fieldNumber+'[]"]:checked').each(function(){ if ($(this).val()){ checkboxValue = $(this).val(); } }); if (!checkboxValue){ showRequiredError = true; } } } else if (required && $(field).attr('type') != 'hidden' && $(field).val() == ''){ showRequiredError = true; } }); if (showRequiredError) { $('form#newAppointmentForm p.status').show().html('   ' + booked_js_vars.i18n_fill_out_required_fields); resize_booked_modal(); return false; } if ( customerType == 'new' && !name || customerType == 'new' && surnameActive && !surname || customerType == 'new' && !email || customerType == 'new' && !password ) { $('form#newAppointmentForm p.status').show().html('   ' + booked_js_vars.i18n_appt_required_fields); resize_booked_modal(); return false; } if ( customerType == 'guest' && !guest_name || customerType == 'guest' && guest_emailActive && !guest_email || customerType == 'guest' && guest_surnameActive && !guest_surname ){ $('form#newAppointmentForm p.status').show().html('   ' + booked_js_vars.i18n_appt_required_fields_guest); resize_booked_modal(); return false; } if (customerType == 'current' && customerID || customerType == 'guest' && guest_name && !guest_surnameActive && !guest_emailActive || customerType == 'guest' && guest_name && guest_surnameActive && guest_surname && !guest_emailActive || customerType == 'guest' && guest_name && guest_emailActive && guest_email && !guest_surnameActive || customerType == 'guest' && guest_name && guest_emailActive && guest_email && guest_surnameActive && guest_surname ) { SubmitRequestAppointment.currentUserOrGuest(); } if (customerType == 'new' && name && email && password) { if ( !surnameActive || surnameActive && surname ){ SubmitRequestAppointment.newUser(); } } }); var SubmitRequestAppointment = { formSelector: '#newAppointmentForm', formBtnRequestSelector: '.booked-form input#submit-request-appointment', formStatusSelector: 'p.status', formSubmitBtnSelector: '#submit-request-appointment', apptContainerSelector: '.booked-appointment-details', baseFields: [ 'guest_name','guest_surname','guest_email','action', 'customer_type', 'user_id' ], apptFields: [ 'appoinment', 'calendar_id', 'title', 'date', 'timestamp', 'timeslot' ], userFields: [ 'booked_appt_name','booked_appt_surname','booked_appt_email', 'booked_appt_password' ], captchaFields: [ 'captcha_word', 'captcha_code' ], currentApptIndex: false, currentApptCounter: false, hasAnyErrors: false, currentUserOrGuest: function() { var total_appts = SubmitRequestAppointment._totalAppts(); if ( ! total_appts ) { return; } SubmitRequestAppointment._showLoadingMessage(); SubmitRequestAppointment._resetDefaultValues(); var data = SubmitRequestAppointment._getBaseData(); SubmitRequestAppointment.currentApptIndex = 0; SubmitRequestAppointment.currentApptCounter = 1; SubmitRequestAppointment._doRequestAppointment( data, total_appts ); }, // pretty much the same as SubmitRequestAppointment.currentUserOrGuest(), however, it include the user name, email and password newUser: function() { var total_appts = SubmitRequestAppointment._totalAppts(); if ( ! total_appts ) { return; } SubmitRequestAppointment._showLoadingMessage(); SubmitRequestAppointment._resetDefaultValues(); var data = SubmitRequestAppointment._getBaseData(); // when there are more than one appointment, we need to make the registration request first and then loop the appointments if ( total_appts > 1 ) { var data_obj_with_no_reference = null; data_obj_with_no_reference = $.extend( true, {}, data ); data_obj_with_no_reference = SubmitRequestAppointment._addUserRegistrationData( data_obj_with_no_reference ); SubmitRequestAppointment._requestUserRegistration( data_obj_with_no_reference ); data.customer_type = 'current'; } else { // add user registration fields values data = SubmitRequestAppointment._addUserRegistrationData( data ); } SubmitRequestAppointment.currentApptIndex = 0; SubmitRequestAppointment._doRequestAppointment( data, total_appts ); }, _doRequestAppointment: function( data, total_appts ) { var appt_fields = SubmitRequestAppointment.apptFields; // for the first item only if ( SubmitRequestAppointment.currentApptIndex === 0 ) { SubmitRequestAppointment._hideCancelBtn(); SubmitRequestAppointment._disableSubmitBtn(); SubmitRequestAppointment.hasAnyErrors = false; } // <------end var data_obj_with_no_reference = $.extend( true, {}, data ); // add the appointment fields to the data for (var i = 0; i < appt_fields.length; i++) { data_obj_with_no_reference[ appt_fields[i] ] = SubmitRequestAppointment._getFieldVal( appt_fields[i], SubmitRequestAppointment.currentApptIndex ); } var calendar_id = SubmitRequestAppointment._getFieldVal( 'calendar_id', SubmitRequestAppointment.currentApptIndex ); data_obj_with_no_reference = SubmitRequestAppointment._addCustomFieldsData( data_obj_with_no_reference, calendar_id ); var $appt = SubmitRequestAppointment._getApptElement( SubmitRequestAppointment.currentApptIndex ); if ( ! $appt.hasClass('skip') ) { $.ajax({ type : 'post', url : booked_js_vars.ajax_url, data : data_obj_with_no_reference, success : function( response ) { //SubmitRequestAppointment._enableSubmitBtn(); //SubmitRequestAppointment._showCancelBtn(); //console.log(response); //return; SubmitRequestAppointment._requestAppointmentResponseHandler( response ); SubmitRequestAppointment.currentApptIndex++; setTimeout( function() { if ( SubmitRequestAppointment.currentApptCounter === total_appts ) { // for the last item only if ( ! SubmitRequestAppointment.hasAnyErrors ) { SubmitRequestAppointment._onAfterRequestAppointment(); } else { SubmitRequestAppointment._enableSubmitBtn(); SubmitRequestAppointment._showCancelBtn(); } // <------end } else { SubmitRequestAppointment.currentApptCounter++; SubmitRequestAppointment._doRequestAppointment( data, total_appts ); } }, 100 ); } }); } else { SubmitRequestAppointment.currentApptIndex++; SubmitRequestAppointment.currentApptCounter++; SubmitRequestAppointment._doRequestAppointment( data, total_appts, SubmitRequestAppointment.currentApptIndex ); } }, _totalAppts: function() { return $(SubmitRequestAppointment.formSelector + ' input[name="appoinment[]"]').length; }, _getBaseData: function() { var data = {}, fields = SubmitRequestAppointment.baseFields; // set up the base form data for ( var i = 0; i < fields.length; i++ ) { data[ fields[i] ] = SubmitRequestAppointment._getFieldVal( fields[i] ); } data['is_fe_form'] = true; data['total_appts'] = SubmitRequestAppointment._totalAppts(); return data; }, _getFieldVal: function( field_name, field_index ) { var field_name = typeof field_name === 'undefined' ? '' : field_name, field_index = typeof field_index === 'undefined' ? false : field_index, selector = SubmitRequestAppointment.formSelector + ' '; if ( field_index === false ) { selector += ' [name=' + field_name + ']'; return $( selector ).val(); } selector += ' [name="' + field_name + '[]"]'; return $( selector ).eq( field_index ).val(); }, _resetDefaultValues: function() { $('.booked-form input').each(function(){ var thisVal = $(this).val(), thisDefault = $(this).attr('title'); if ( thisDefault == thisVal ){ $(this).val(''); } }); }, _resetToDefaultValues: function() { $('.booked-form input').each(function(){ var thisVal = $(this).val(), thisDefault = $(this).attr('title'); if ( ! thisVal ){ $(this).val( thisDefault ); } }); }, _addUserRegistrationData: function( data ) { // populate the user data $.each( SubmitRequestAppointment.userFields, function( index, field_name ) { data[ field_name ] = SubmitRequestAppointment._getFieldVal( field_name ); } ); // populate captcha data if available $.each( SubmitRequestAppointment.captchaFields, function( index, field_name ) { var field_value = SubmitRequestAppointment._getFieldVal( field_name ); if ( ! field_value ) { return; } data[ field_name ] = field_value; } ); return data; }, _addCustomFieldsData: function( data, calendar_id ) { var custom_fields_data = $('.cf-block [name]') .filter( function( index ) { var $this = $(this); return parseInt($this.data('calendar-id')) === parseInt(calendar_id) && $this.attr('name').match(/---\d+/g); } ) .each( function( index ) { var $this = $(this), name = $this.attr('name'), value = $this.val(), type = $this.attr('type'); if ( ! value ) { return; } if ( ! name.match(/checkbox|radio+/g) ) { data[ name ] = value; return; } if ( name.match(/radio+/g) && $this.is(':checked') ) { data[ name ] = value; return; } if ( ! name.match(/radio+/g) && typeof data[ name ] === 'undefined' || ! name.match(/radio+/g) && data[ name ].constructor !== Array ) { data[ name ] = []; } if ( ! $this.is(':checked') ) { return; } data[ name ].push( value ); } ); return data; }, _requestUserRegistration: function( base_data, appt_index ) { $.ajax({ type : 'post', url : booked_js_vars.ajax_url, data : base_data, async : false, success : function( response ) { SubmitRequestAppointment._requestUserRegistrationResponseHandler( response ); } }); }, _requestUserRegistrationResponseHandler: function( response ) { var response_parts = response.split('###'), data_result = response_parts[0].substr( response_parts[0].length - 5 ); if ( data_result === 'error' ) { // do something on registration failure return; } // do something on successful registration }, _requestAppointment: function( response ) { SubmitRequestAppointment._requestAppointmentResponseHandler( response ); }, _requestAppointmentResponseHandler: function( response ) { var response_parts = response.split('###'), data_result = response_parts[0].substr( response_parts[0].length - 5 ); if ( data_result === 'error' ) { SubmitRequestAppointment._requestAppointmentOnError( response_parts ); return; } SubmitRequestAppointment._requestAppointmentOnSuccess( response_parts ); }, _requestAppointmentOnError: function( response_parts ) { var $apptEl = SubmitRequestAppointment._getApptElement(); $(document).trigger("booked-on-requested-appt-error",[$apptEl]); SubmitRequestAppointment._highlightAppt(); SubmitRequestAppointment._setStatusMsg( response_parts[1] ); SubmitRequestAppointment.hasAnyErrors = true; resize_booked_modal(); }, _requestAppointmentOnSuccess: function( response_parts ) { var $apptEl = SubmitRequestAppointment._getApptElement(); $(document).trigger("booked-on-requested-appt-success",[$apptEl]); SubmitRequestAppointment._unhighlightAppt(); }, _onAfterRequestAppointment: function() { var redirectObj = { redirect : false }; var redirect = $(document).trigger("booked-on-requested-appointment",[redirectObj]); if ( redirectObj.redirect ) { return; } if ( booked_js_vars.profilePage ) { window.location = booked_js_vars.profilePage; return; } SubmitRequestAppointment._reloadApptsList(); SubmitRequestAppointment._reloadCalendarTable(); }, _setStatusMsg: function( msg ) { var form_status_selector = SubmitRequestAppointment.formSelector + ' ' + SubmitRequestAppointment.formStatusSelector; $( form_status_selector ).show().html( '   ' + msg ); }, _getApptElement: function( appt_index ) { var appt_index = typeof appt_index === 'undefined' ? SubmitRequestAppointment.currentApptIndex : appt_index, appt_cnt_selector = SubmitRequestAppointment.formSelector + ' ' + SubmitRequestAppointment.apptContainerSelector; return $( appt_cnt_selector ).eq( appt_index ); }, _highlightAppt: function( msg ) { var $apptEl = SubmitRequestAppointment._getApptElement(); if ( ! $apptEl.length ) { return; } $apptEl.addClass('has-error'); }, _unhighlightAppt: function( msg ) { var $apptEl = SubmitRequestAppointment._getApptElement(); if ( ! $apptEl.length ) { return; } $apptEl.removeClass('has-error').addClass('skip'); }, _enableSubmitBtn: function() { var btn_selector = SubmitRequestAppointment.formSelector + ' ' + SubmitRequestAppointment.formSubmitBtnSelector; $( btn_selector ).attr( 'disabled', false ); }, _disableSubmitBtn: function() { var btn_selector = SubmitRequestAppointment.formSelector + ' ' + SubmitRequestAppointment.formSubmitBtnSelector; $( btn_selector ).attr( 'disabled', true ); }, _showCancelBtn: function() { $( SubmitRequestAppointment.formSelector ).find('button.cancel').show(); }, _hideCancelBtn: function() { $( SubmitRequestAppointment.formSelector ).find('button.cancel').hide(); }, _showLoadingMessage: function() { $('form#newAppointmentForm p.status').show().html('   ' + booked_js_vars.i18n_please_wait); }, _reloadApptsList: function() { if ( ! $('.booked-appt-list').length ){ return; } $('.booked-appt-list').each( function() { var $thisApptList = $(this), date = $thisApptList.attr('data-list-date'), thisList = $thisApptList.parents('.booked-list-view'), defaultDate = thisList.attr('data-default'), calendar_id = parseInt($thisApptList.find('.booked-list-view-nav').attr('data-calendar-id')) || 0; defaultDate = typeof defaultDate === 'undefined' ? false : defaultDate; calendar_id = calendar_id ? calendar_id : 0; thisList.addClass('booked-loading'); var booked_load_list_view_date_booking_options = { 'action' : 'booked_appointment_list_date', 'date' : date, 'calendar_id' : calendar_id, 'force_default' : defaultDate }; $(document).trigger("booked-before-loading-appointment-list-booking-options"); thisList.spin('booked_top'); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: booked_load_list_view_date_booking_options, success: function( html ) { thisList.html( html ); close_booked_modal(); init_appt_list_date_picker(); setTimeout(function(){ thisList.removeClass('booked-loading'); },1); } }); }); }, _reloadCalendarTable: function() { if ( ! $('td.active').length ) { return; } var $activeTD = $('td.active'), activeDate = $activeTD.attr('data-date'), calendar_id = parseInt( $activeTD.parents('table').data('calendar-id') ) || 0; booked_load_calendar_date_booking_options = { 'action':'booked_calendar_date', 'date':activeDate, 'calendar_id':calendar_id }; $(document).trigger("booked-before-loading-calendar-booking-options"); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: booked_load_calendar_date_booking_options, success: function( html ) { $('tr.entryBlock').find('td').html( html ); close_booked_modal(); $('tr.entryBlock').removeClass('booked-loading'); $('tr.entryBlock').find('.booked-appt-list').hide().fadeIn(300); $('tr.entryBlock').find('.booked-appt-list').addClass('shown'); adjust_calendar_boxes(); } }); } } }); function bookedRemoveEmptyTRs(){ $('table.booked-calendar').find('tr.week').each(function(){ if ($(this).children().length == 0){ $(this).remove(); } }); } // Saving state updater function savingState(show,limit_to){ show = typeof show !== 'undefined' ? show : true; limit_to = typeof limit_to !== 'undefined' ? limit_to : false; if (limit_to){ var $savingStateDIV = limit_to.find('li.active .savingState, .topSavingState.savingState, .calendarSavingState'); var $stuffToHide = limit_to.find('.monthName'); var $stuffToTransparent = limit_to.find('table.booked-calendar tbody'); } else { var $savingStateDIV = $('li.active .savingState, .topSavingState.savingState, .calendarSavingState'); var $stuffToHide = $('.monthName'); var $stuffToTransparent = $('table.booked-calendar tbody'); } if (show){ $savingStateDIV.fadeIn(200); $stuffToHide.hide(); $stuffToTransparent.animate({'opacity':0.2},100); } else { $savingStateDIV.hide(); $stuffToHide.show(); $stuffToTransparent.animate({'opacity':1},0); } } $(document).ajaxStop(function() { savingState(false); }); function init_appt_list_date_picker(){ $('.booked_list_date_picker').each(function(){ var thisDatePicker = $(this); var minDateVal = thisDatePicker.parents('.booked-appt-list').attr('data-min-date'); var maxDateVal = thisDatePicker.parents('.booked-appt-list').attr('data-max-date'); if (typeof minDateVal == 'undefined'){ var minDateVal = thisDatePicker.attr('data-min-date'); } thisDatePicker.datepicker({ dateFormat: 'yy-mm-dd', minDate: minDateVal, maxDate: maxDateVal, showAnim: false, beforeShow: function(input, inst) { $('#ui-datepicker-div').removeClass(); $('#ui-datepicker-div').addClass('booked_custom_date_picker'); }, onClose: function(dateText){ $('.booked_list_date_picker_trigger').removeClass('booked-dp-active'); }, onSelect: function(dateText){ var thisInput = $(this), date = dateText, thisList = thisInput.parents('.booked-list-view'), defaultDate = thisList.attr('data-default'), calendar_id = thisInput.parents('.booked-list-view-nav').attr('data-calendar-id'); if (typeof defaultDate == 'undefined'){ defaultDate = false; } if (!calendar_id){ calendar_id = 0; } thisList.addClass('booked-loading'); var booked_load_list_view_date_booking_options = { 'action' : 'booked_appointment_list_date', 'date' : date, 'calendar_id' : calendar_id, 'force_default' : defaultDate }; $(document).trigger("booked-before-loading-appointment-list-booking-options"); thisList.spin('booked_top'); $.ajax({ url: booked_js_vars.ajax_url, type: 'post', data: booked_load_list_view_date_booking_options, success: function( html ) { thisList.html( html ); init_appt_list_date_picker(); setTimeout(function(){ thisList.removeClass('booked-loading'); },1); } }); return false; } }); }); $('body').on('click','.booked_list_date_picker_trigger',function(e){ e.preventDefault(); if (!$(this).hasClass('booked-dp-active')){ $(this).addClass('booked-dp-active'); $(this).parents('.booked-appt-list').find('.booked_list_date_picker').datepicker('show'); } }); } var BookedTabs = { bookingModalSelector: '.booked-modal', tabSelector: '.booked-tabs', tabNavSelector: '.booked-tabs-nav span', tabCntSelector: '.booked-tabs-cnt', Init: function() { $(document).on( 'click', this.tabNavSelector, this.tabsNav ); }, tabsNav: function( event ) { event.preventDefault(); BookedTabs.switchToTab( $(this) ); BookedTabs.maybeResizeBookingModal(); }, switchToTab: function( tab_nav_item ) { var $nav_item = tab_nav_item, tab_cnt_class = '.' + $nav_item.data('tab-cnt'), $tabs_container = $nav_item.parents( BookedTabs.tabSelector ); $nav_item .addClass( 'active' ) .siblings() .removeClass( 'active' ) $tabs_container .find( BookedTabs.tabCntSelector + ' ' + tab_cnt_class ) .addClass( 'active' ) .siblings() .removeClass( 'active' ); }, maybeResizeBookingModal: function() { if ( ! $(BookedTabs.bookingModalSelector).length ) { return; } resize_booked_modal(); } } })(jQuery, window, document); // Create Booked Modal function create_booked_modal(){ var windowHeight = jQuery(window).height(); var windowWidth = jQuery(window).width(); if (windowWidth > 720){ var maxModalHeight = windowHeight - 295; } else { var maxModalHeight = windowHeight; } jQuery('body input, body textarea, body select').blur(); jQuery('body').addClass('booked-noScroll'); jQuery('
').appendTo('body'); jQuery('.booked-modal .bm-overlay').spin('booked_white'); jQuery('.booked-modal .bm-window').css({'max-height':maxModalHeight+'px'}); } var previousRealModalHeight = 100; function resize_booked_modal(){ var windowHeight = jQuery(window).height(); var windowWidth = jQuery(window).width(); var common43 = 43; if (jQuery('.booked-modal .bm-window .booked-scrollable').length){ var realModalHeight = jQuery('.booked-modal .bm-window .booked-scrollable')[0].scrollHeight; if (realModalHeight < 100){ realModalHeight = previousRealModalHeight; } else { previousRealModalHeight = realModalHeight; } } else { var realModalHeight = 0; } var minimumWindowHeight = realModalHeight + common43 + common43; var modalScrollableHeight = realModalHeight - common43; var maxModalHeight; var maxFormHeight; if (windowHeight < minimumWindowHeight){ modalScrollableHeight = windowHeight - common43 - common43; } else { modalScrollableHeight = realModalHeight; } if (windowWidth > 720){ maxModalHeight = modalScrollableHeight - 25; maxFormHeight = maxModalHeight - 15; var modalNegMargin = (maxModalHeight + 78) / 2; } else { maxModalHeight = windowHeight - common43; maxFormHeight = maxModalHeight - 60; var modalNegMargin = (maxModalHeight) / 2; } jQuery('.booked-modal').css({'margin-top':'-'+modalNegMargin+'px'}); jQuery('.booked-modal .bm-window').css({'max-height':maxModalHeight+'px'}); jQuery('.booked-modal .bm-window .booked-scrollable').css({'max-height':maxFormHeight+'px'}); } function close_booked_modal(){ var modal = jQuery('.booked-modal'); modal.fadeOut(200); modal.addClass('bm-closing'); jQuery('body').removeClass('booked-noScroll'); setTimeout(function(){ modal.remove(); },300); } function init_tooltips(container){ jQuery('.tooltipster').tooltipster({ theme: 'tooltipster-light', animation: 'grow', speed: 200, delay: 50, offsetY: -15 }); } // Function to adjust calendar sizing function adjust_calendar_boxes(){ jQuery('.booked-calendar').each(function(){ var windowWidth = jQuery(window).width(); var smallCalendar = jQuery(this).parents('.booked-calendar-wrap').hasClass('small'); var boxesWidth = jQuery(this).find('tbody tr.week td').width(); var calendarHeight = jQuery(this).height(); boxesHeight = boxesWidth * 1; jQuery(this).find('tbody tr.week td').height(boxesHeight); jQuery(this).find('tbody tr.week td .date').css('line-height',boxesHeight+'px'); jQuery(this).find('tbody tr.week td .date .number').css('line-height',boxesHeight+'px'); if (smallCalendar || windowWidth < 720){ jQuery(this).find('tbody tr.week td .date .number').css('line-height',boxesHeight+'px'); } else { jQuery(this).find('tbody tr.week td .date .number').css('line-height',''); } var calendarHeight = jQuery(this).height(); jQuery(this).parent().height(calendarHeight); }); }