jQuery(function($){
'use strict';
function formData(form){
var data={}, extras=[];
$.each(form.serializeArray(), function(_, item){
data[item.name]=item.value;
if(item.name==='extra[]'){ extras.push(item.value); }});
data.extra_ids=extras.join(',');
return data;
}
function syncButton(form){
var ready=form.data('price-checked')==='passed' &&
form.data('min-days-checked')==='passed'&&!form.data('submitting');
form.find('.book_now_btn').prop('disabled', !ready).toggleClass('min-day-hide', !ready);
}
$(document).on('tmbooking:validation', 'form.booking_form', function(){
syncButton($(this));
});
$('.tm-js-select').niceSelect();
$('form.booking_form').each(function(){ syncButton($(this)); });
$('form.booking_form').on('change', function(){
var form=$(this), data=formData(form);
var sequence=(form.data('price-sequence')||0) + 1;
form.data('price-sequence', sequence).data('price-checked', 'pending');
form.data('min-days-checked', 'pending');
syncButton(form);
var total=form.find('.tm_price_total');
total.empty();
if(!data.id||!data.start_date||!data.end_date){
form.removeClass('loading');
return;
}
form.addClass('loading');
$.post(tm_booking_ajax.url, {action: 'tmbooking_change_total', data: data})
.done(function(response){
if(sequence!==form.data('price-sequence')){ return; }
var content=$('<div>').append($.parseHTML(typeof response==='string' ? response:'', document, false));
content.find('script').remove();
var valid=content.find('.total_price').length > 0 &&
content.find('.tm-booking-error-message').length===0;
total.empty().append(content.contents()).removeClass('tm_empty_container');
form.data('price-checked', valid ? 'passed':'failed');
syncButton(form);
})
.fail(function(){
if(sequence!==form.data('price-sequence')){ return; }
form.data('price-checked', 'failed');
total.text('Unable to calculate your booking. Please try again.').removeClass('tm_empty_container');
syncButton(form);
})
.always(function(){
if(sequence===form.data('price-sequence')){ form.removeClass('loading'); }});
});
$('.book_now_btn').on('click', function(event){
event.preventDefault();
var button=$(this), form=button.closest('form.booking_form');
if(form.data('price-checked')!=='passed'||form.data('min-days-checked')!=='passed'||form.data('submitting')){ return; }
var original=button.html();
form.data('submitting', true);
button.text(button.data('wait'));
syncButton(form);
$.post(tm_booking_ajax.url, {action: 'tmbooking_redirect_to_cart', data: formData(form)})
.done(function(response){
if(response&&response.redirect){
window.location.href=response.redirect;
}else{
form.find('.tm_price_total').text(response&&response.error ? response.error:'Unable to start booking. Please try again.');
}})
.fail(function(){ form.find('.tm_price_total').text('Unable to start booking. Please try again.'); })
.always(function(){
form.data('submitting', false);
button.html(original);
syncButton(form);
});
});
});