<?php
// SET DEFOULT 30min BOOKING SLOT INTERVAL
add_action('hivepress/v1/models/listing/create', function($listing_id) {
if(hivepress()->get_version( 'bookings' )){
update_post_meta($listing_id, 'hp_booking_slot_duration', 30);
update_post_meta($listing_id, 'hp_booking_min_time', 0);
update_post_meta($listing_id, 'hp_booking_max_time', 0);
}
});
add_filter(
'hivepress/v1/models/listing/attributes',
function( $attributes ) {
if ( isset($attributes['booking_slot_duration']) ) {
$attributes['booking_slot_duration']['editable'] = false;
}
if ( isset($attributes['booking_slot_interval']) ) {
$attributes['booking_slot_interval']['editable'] = false;
}
if ( isset($attributes['booking_moderated']) ) {
$attributes['booking_moderated']['editable'] = false;
}
return $attributes;
},
1000,
2
);
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// ADD LISTING ID AND MIN. SERV. TIME ON GLOBALS
add_filter(
'hivepress/v1/templates/listing_view_page/blocks',
function ($blocks, $template) {
$listing = $template->get_context('listing');
if (!$listing) {
return $blocks;
}
$listing_id = $listing->get_id();
$listing_price = $listing->get_price();
// set listing id in globals
$GLOBALS["listing_id"] = $listing_id;
$GLOBALS["min_serv_time"] = $listing->display_min_service_time();
$GLOBALS["services_interval"] = $listing->display_services_interval();
$GLOBALS["listing_price"] = $listing_price;
// Set global variables for Monday
$GLOBALS["monday_start"] = $listing->display_monday_start();
$GLOBALS["monday_end"] = $listing->display_monday_end();
// Set global variables for Tuesday
$GLOBALS["tuesday_start"] = $listing->display_tuesday_start();
$GLOBALS["tuesday_end"] = $listing->display_tuesday_end();
// Set global variables for Wednesday
$GLOBALS["wednesday_start"] = $listing->display_wednesday_start();
$GLOBALS["wednesday_end"] = $listing->display_wednesday_end();
// Set global variables for Thursday
$GLOBALS["thursday_start"] = $listing->display_thursday_start();
$GLOBALS["thursday_end"] = $listing->display_thursday_end();
// Set global variables for Friday
$GLOBALS["friday_start"] = $listing->display_friday_start();
$GLOBALS["friday_end"] = $listing->display_friday_end();
// Set global variables for Saturday
$GLOBALS["saturday_start"] = $listing->display_saturday_start();
$GLOBALS["saturday_end"] = $listing->display_saturday_end();
// Set global variables for Sunday
$GLOBALS["sunday_start"] = $listing->display_sunday_start();
$GLOBALS["sunday_end"] = $listing->display_sunday_end();
return $blocks;
},
1000,
2
);
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// ADD START AND END TIME IN BOOKING FORM
add_filter('hivepress/v1/forms/booking_make', 'form_mod1', 1000);
function form_mod1( $form ) {
$form['fields']['_start_time'] = [
'label' => esc_html__( 'Start Time', 'hivepress-bookings' ),
'type' => 'select',
'source' => $form['fields']['_time']['source'],
'required' => true,
'_separate' => true,
'_order' => 5,
'attributes' => [
'data-parent' => '_dates',
'class' => [ 'booking-time-start' ],
'id' => 'booking-time-start',
'onchange' => 'start_time_select_change()',
],
];
$form['fields']['_end_time'] = [
'label' => esc_html__( 'End Time', 'hivepress-bookings' ),
'type' => 'select',
'source' => $form['fields']['_time']['source'],
'required' => false,
'_separate' => true,
'_order' => 5,
'attributes' => [
'data-parent' => '_dates',
'class' => [ 'booking-time-end' ],
'id' => 'booking-time-end',
'onchange' => 'end_time_select_change()',
],
];
$form['fields']['_dates']["attributes"] = [
"id" => "booking-date",
'onchange' => 'date_select_change()',
];
$form['button']["attributes"]["id"] = "request-booking-btn";
$form["attributes"]["id"] = "booking-form";
return $form;
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// ADD ID TO SIDEBAR PRICE AND TOGGLE PRICE ATOMATIC CHANGE
add_filter(
'hivepress/v1/templates/listing_view_page',
function( $template ) {
return hivepress()->helper->merge_trees(
$template,
[
'blocks' => [
'page_sidebar' => [
'blocks' => [
'listing_attributes_primary' => [
'area' => 'view_block_primary',
'attributes' => [
'id' => 'sidebar_listing_price',
],
],
],
],
],
]
);
},
1000
);
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// DEACTIVARE MULTI TIME SELECT AND SET DATE AS FIRST IN ORDER (in listing booking block form)
add_filter(
'hivepress/v1/forms/booking_make',
function( $form ) {
$form['fields']['_dates']['_order'] = 1;
unset($form['fields']['_time']);
return $form;
},
1000,
2
);
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// HANDE BOOKING TIME ORDER HOURS
add_action('wp_footer', 'booking_time_handler');
function booking_time_handler()
{
?>
<script>
addDescriptions();
var all_li_elements = [];
var current_tot_price = 0;
waitForElm("remove_dash_li", "body > span > span > span.select2-results");
waitForElm("handle_start_span_change", getStartSpanSelector());
waitForElm("handle_end_span_change", getEndSpanSelector());
waitForElm("remove_li_after_maximum", getUlOuterSelector());
waitForElm("remove_li_before_minimum", getUlOuterSelector());
waitForElm("remove_li_out_of_service_time", getUlOuterSelector());
function waitForElm(operation, selector, costum_values) {
return new Promise(resolve => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(mutations => {
if (document.querySelector(selector)) {
resolve(document.querySelector(selector));
switch (operation) {
case "remove_dash_li":
remove_li_after_dash(selector, observer);
break;
case "handle_start_span_change":
removeDashFromSpan(true);
addBtnClick();
break;
case "handle_end_span_change":
removeDashFromSpan(false);
break;
case "remove_li_before_minimum":
remove_li_before_minimum(selector, observer);
break;
case "remove_li_after_maximum":
remove_li_after_maximum(selector, observer);
break;
case "remove_li_out_of_service_time":
remove_li_out_of_service_time(selector, observer);
break;
default:
break;
}
}
});
observer_connect(observer);
});
}
function observer_connect(observer){
observer.observe(document.body, {
childList: true,
subtree: true
});
}
function removeDashFromSpan(isStartSpan){
var selector = isStartSpan ? getStartSpanSelector() : getEndSpanSelector();
var span_el = document.querySelector(selector);
if(span_el.innerHTML != "—"
&& span_el.innerHTML.includes("-")){
span_el.innerHTML = span_el.innerHTML.split("-")[0];
}
}
function remove_li_after_dash(selector, observer){
var ul_el = getUlInner();
if(ul_el.getElementsByTagName("li")[0] &&
!ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
observer.disconnect();
var li_elements = ul_el.getElementsByTagName("li");
for (let i = 0; i < li_elements.length; i++) {
var li_text = li_elements[i].innerHTML;
li_elements[i].innerHTML = li_text.split("-")[0];
}
observer_connect(observer);
}
}
function remove_span_after_dash(selector, observer, time_remove_executions){
var span_outer_el = document.querySelector(selector);
var span_inner_el = span_outer_el.getElementsByTagName("span")[0];
span_inner_el.get
if(!span_inner_el.innerHTML.includes("—")){
observer.disconnect();
span_text = span_inner_el.innerHTML;
span_inner_el.innerHTML = span_text.split("-")[0];
time_remove_executions++;
if(time_remove_executions < 2){
observer_connect(observer);
}
}
}
function handle_span_change(){
// START TIME SPAN
var span_inner_el_start = getStartSpan();
// END TIME SPAN
var span_inner_el_end = getEndSpan();
if(span_inner_el_start.innerHTML != "—"){
var minimum_end = getMinimumEnd();
// update_end_time_if_less_then_min();
span_inner_el_end.innerHTML = "—";
}
else if(span_inner_el_start.innerHTML == "—"
&& span_inner_el_end.innerHTML != "—"){
span_inner_el_start.innerHTML = "—";
span_inner_el_end.innerHTML = "—";
}
}
function remove_li_before_minimum(selector, observer){
var ul_el = getUlInner();
if(ul_el.getElementsByTagName("li")[0]
&& !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
observer.disconnect();
var li_elements = ul_el.getElementsByTagName("li");
var zeroEl = null;
// remove only if is end ul
if(!is_start_ul(li_elements)){
var keep_removing_from = null;
for (let i = 0; i < li_elements.length; i++) {
var li_text = li_elements[i].innerHTML.trim();
// li_text = li_text.innerHTML;
end_ul_set_selected();
var minEnd = getMinimumEnd();
var nextTime = calcTimes(li_text, '+', '00:30'); // next time = current + 30 min
// when minimum end time is reached, stop removing li elements
if(compareTimes(li_text, ">=", minEnd)){
if(keep_removing_from
|| (li_elements[i+1]
&& li_elements[i+1].innerHTML.trim() != nextTime)){
if (keep_removing_from){
ul_el.removeChild(li_elements[i]);
i--;
}
else{
keep_removing_from = li_elements[i+1].innerHTML;
}
}
continue;
}
else if(li_text == '00:00'){
zeroEl = li_elements[i];
continue;
}
else{
ul_el.removeChild(li_elements[i]);
i--;
}
// li_elements[i].innerHTML = li_text.split("-")[0];
}
if(zeroEl
&& li_elements[0].innerHTML.trim() == '00:00'
&& li_elements[li_elements.length - 1].innerHTML.trim() != '00:00'){
// remove 00:00
ul_el.removeChild(zeroEl);
if(li_elements.length >= 1
&& li_elements[li_elements.length -1].innerHTML.trim() == '23:30'
&& compareTimes(getWeekDayValue('end'), '==', '24:00')
){
// move 00:00 to the last element (re-add)
ul_el.appendChild(zeroEl);
}
}
// return_val = LAST LIs SO YOU CAN END IN THE "SERVICE INTERVAL ZONE"
var last_value = li_elements[li_elements.length - 1].innerHTML.trim();
if(!li_elements[li_elements.length - 1].getAttribute("removedLasts")
&& last_value != '00:00'
&& last_value != getWeekDayValue('end')){
var services_interval = "<?php echo $GLOBALS['services_interval']; ?>";
var last_time_to_set =calcTimes(last_value, '-', services_interval);
last_time_to_set = calcTimes(last_time_to_set, '+', '00:30');
for (let i = 0; i < li_elements.length; i++) {
var li_value = li_elements[i].innerHTML.trim();
if(compareTimes(li_value, '>', last_time_to_set)){
ul_el.removeChild(li_elements[i]);
i--;
}
}
li_elements[li_elements.length - 1].setAttribute("removedLasts", 'true')
}
}
observer_connect(observer);
}
}
function remove_li_after_maximum(selector, observer){
observer.disconnect();
var ul_el = getUlInner();
var li_elements = ul_el.getElementsByTagName("li");
if(ul_el.getElementsByTagName("li")[0]
&& !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
// save all li elements with also removed ones (save before removing)
if(all_li_elements.length == 0){
all_li_elements = li_elements;
}
var maximum_end = getMaximumEnd();
// remove only if is end ul
if(is_start_ul(li_elements)){
var time_holes = [];
for (let i = 0; i < li_elements.length; i++) {
var li_text = li_elements[i].innerHTML;
// when macimum end time is reached, remove all next li elements
if(compareTimes(li_text, ">", maximum_end)){
ul_el.removeChild(li_elements[i]);
i--;
}
var nextTime = calcTimes(li_text, '+', '00:30'); // next time = current + 30 min
// check if are missing times (already ordered)
if(li_elements[0]
&& !li_elements[0].getAttribute('alreadyRemoved')
&& li_elements[i+1]
&& li_elements[i+1].innerHTML.trim() != nextTime){
time_holes.push([li_text, li_elements[i+1].innerHTML]);
}
}
var service_end = getWeekDayValue('end');
var last_time_available = li_elements[li_elements.length -1].innerHTML;
if(!li_elements[0].getAttribute('alreadyRemoved')
&& compareTimes(last_time_available ,'<', getMaximumEnd())){
time_holes.push([last_time_available, service_end]);
}
if(getCurrentStartValue().trim() == '00:00'
&& getCurrentEndValue() == '00:00'){
time_holes = [];
}
time_holes.forEach(time_hole => {
var min_serv_time = "<?php echo $GLOBALS['min_serv_time']; ?>";
var serv_interval = "<?php echo $GLOBALS['services_interval']; ?>";
var remove_start = calcTimes(time_hole[0], '-', calcTimes(calcTimes(min_serv_time, '+',serv_interval), '-', '01:00'));
var remove_end = calcTimes(time_hole[1], '+', calcTimes(serv_interval, '-', '00:30'));
removeLiBetween(ul_el, li_elements, remove_start, remove_end);
});
li_elements[0].setAttribute('alreadyRemoved', 'true');
}
li_elements[li_elements.length - 1].classList.add("last_li");
}
observer_connect(observer);
}
function remove_li_out_of_service_time(selector, observer){
var ul_el = getUlInner();
if(ul_el.getElementsByTagName("li")[0]
&& !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
observer.disconnect();
var li_elements = ul_el.getElementsByTagName("li");
var day =getCurrentDateValue();
// remove only if is end ul
if(is_start_ul(li_elements)){
// remove before start time
for (let i = 0; i < li_elements.length; i++) {
var start_time = getWeekDayValue('start');
var li_value = li_elements[i].innerHTML;
if(compareTimes(li_value, "<", start_time)){
ul_el.removeChild(li_elements[i]);
i--;
}
}
}
else{
var end_time = getWeekDayValue('end');
if(end_time == '00:00'
|| end_time == '24:00'){
observer_connect(observer);
return;
}
// remove after end time
for (let i = 0; i < li_elements.length; i++) {
var li_value = li_elements[i].innerHTML;
if(compareTimes(li_value, ">", end_time)){
ul_el.removeChild(li_elements[i]);
i--;
}
}
}
observer_connect(observer);
}
}
function is_start_ul(li_elements){
for (let i = 0; i < li_elements.length; i++) {
// get start time from start span
var start_time = getCurrentStartValue();
// if no time is set, say is start ul also if is not
if(start_time == "—")
return true;
// if the li is equal to the start selected time is the start ul
if(li_elements[i].innerHTML == start_time
&& li_elements[i].getAttribute("aria-selected") == "true"){
return true;
}
}
// otherwise is end ul
return false;
}
function compareTimes(time1, operator, time2){
// Extract hours and minutes from time strings
const [hours1, minutes1] = time1.split(':').map(Number);
const [hours2, minutes2] = time2.split(':').map(Number);
// Calculate total minutes since midnight for each time
const totalMinutes1 = hours1 * 60 + minutes1;
const totalMinutes2 = hours2 * 60 + minutes2;
switch (operator) {
case ">":
return totalMinutes1 > totalMinutes2;
break;
case "<":
return totalMinutes1 < totalMinutes2;
break;
case ">=":
return totalMinutes1 >= totalMinutes2;
break;
case "<=":
return totalMinutes1 <= totalMinutes2;
break;
case "==":
return totalMinutes1 == totalMinutes2;
break;
default:
return false;
break;
}
}
function update_end_time_if_less_then_min(){
var start_span_inner = getStartSpan();
var end_span_inner = getEndSpan();
var endSpanValue = end_span_inner.innerHTML;
if(endSpanValue == '00:00'){
endSpanValue = '24:00';
}
var minimumEnd = getMinimumEnd();
if(endSpanValue == "—"
|| compareTimes(endSpanValue, "<", minimumEnd)){
if(minimumEnd == '24:00'){
minimumEnd = '00:00'
}
end_span_inner.innerHTML = minimumEnd;
}
}
function end_ul_set_selected(){
var ul_el = getUlInner();
if(ul_el.getElementsByTagName("li")[0]
&& !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
var li_elements = ul_el.getElementsByTagName("li");
// remove only if is end ul
if(!is_start_ul(li_elements)){
for (let i = 0; i < li_elements.length; i++) {
var li_text = li_elements[i].innerHTML;
// when minimum end time is reached, stop removing li elements
if(compareTimes(li_text, "==", getCurrentEndValue())){
li_elements[i].setAttribute("aria-selected", "true");
}
else{
li_elements[i].setAttribute("aria-selected", "false");
}
}
}
}
}
function addBtnClick(){
var button = document.querySelector("#request-booking-btn");
if(!button.hasClickListener){
button.hasClickListener = true;
button.addEventListener('click', function() {
// Code to be executed when the button is clicked
var form = document.querySelector("#booking-form");
form.addEventListener("submit", function(event) {
event.preventDefault(); // Prevent the form from submitting automatically
var actionLink = form.getAttribute("action");
var listing_id =
<?php
if(isset($GLOBALS["listing_id"])){
echo $GLOBALS["listing_id"];
}else{
echo "'NOT_FOUND'";
}
?>;
if(listing_id != "NOT_FOUND"){
var start_time = getCurrentStartValue().trim();
var end_time =getCurrentEndValue();
var date = getCurrentDateValue();
var price = current_tot_price;
actionLink += "?listing=" + listing_id;
actionLink += "&start_time=" + start_time;
actionLink += "&end_time=" + end_time;
actionLink += "&date="+date;
actionLink += "&price="+price;
// Manually redirect to the updated URL
window.location.href = actionLink;
}
});
});
}
}
function updatePriceVariable(){
var time1 = getCurrentEndValue();
var time2 = getCurrentStartValue();
if(!time1.includes("—") && !time2.includes("—")){
var totHours = getServiceDuration();
var listing_price = getListingPrice();
if(listing_price != "NOT_FOUND"){
// set commitions (default (none): 1, 0)
var commission_percentage = 1.0; // -> GET FROM HIVEPRESS (values like 1.15 for 15%, 1.2 for 20%)
var commission_fee = 0; // -> GET FROM HIVEPRESS
var finalPrice = listing_price * totHours;
// commissions calculation
finalPrice = (finalPrice * commission_percentage) + commission_fee;
current_tot_price = finalPrice;
var listing_price_str = priceNumberToScringWithZeros(listing_price);
var price_h_desc = '('+String(listing_price_str) + "€ /h)";
var tot_h_desc = hoursNumberToStringWithoutZeros(totHours) + ' ore';
var string_price = hoursNumberToStringWithZeros(current_tot_price);
getPriceElement().innerHTML = String(string_price) + " €";
getPriceDescriptionElement().innerHTML = tot_h_desc + ' '+price_h_desc;
// getTotPriceDescriptionElement().innerHTML = hoursNumberToStringWithoutZeros(totHours);
}
}
}
function calcTimes(time1, operator, time2) {
// Parse the input times into hours and minutes
const [hours1, minutes1] = time1.split(':').map(Number);
const [hours2, minutes2] = time2.split(':').map(Number);
let totalMinutes = 0;
// Calculate total minutes
if(operator == "+")
totalMinutes = (hours1 + hours2) * 60 + (minutes1 + minutes2);
else if(operator == "-")
totalMinutes = (hours1 * 60 + minutes1) - (hours2 * 60 + minutes2);
else{
return "Operator not valid!";
}
// Calculate the new hours and minutes
const newHours = Math.floor(totalMinutes / 60);
const newMinutes = totalMinutes % 60;
// Format the result
const resultHours = String(newHours).padStart(2, '0');
const resultMinutes = String(newMinutes).padStart(2, '0');
return `${resultHours}:${resultMinutes}`;
}
function removeLiBetween(ul_el, li_elements, remove_start, remove_end){
for (let i = 0; i < li_elements.length; i++) {
var li_value = li_elements[i].innerHTML;
if(compareTimes(li_value, '>=', remove_start)
&& compareTimes(li_value, '<=', remove_end)){
ul_el.removeChild(li_elements[i]);
i--;
}
}
}
function resetAllLabels(){
getStartSpan().innerHTML = "—";
getEndSpan().innerHTML = "—";
getPriceDescriptionElement().innerHTML = "-";
var listing_price = getListingPrice();
listing_price = hoursNumberToStringWithZeros(listing_price);
getPriceElement().innerHTML = listing_price + '€ /h';
}
function start_time_select_change() {
removeDashFromSpan(true);
handle_span_change();
// addBtnClick();
// observer_connect(observer);
updatePriceVariable();
// updatePrice();
getEndSpan().innerHTML = "—";
getPriceDescriptionElement().innerHTML = "-";
var listing_price = getListingPrice();
listing_price = hoursNumberToStringWithZeros(listing_price);
getPriceElement().innerHTML = listing_price + '€ /h';
}
function end_time_select_change() {
// observer.disconnect();
removeDashFromSpan(false);
// observer_connect(observer);
updatePriceVariable();
// updatePrice();
}
function date_select_change(){
resetAllLabels();
}
function getCurrentStartValue(){
var start_span_inner = getStartSpan();
return start_span_inner.innerHTML;
}
function getCurrentEndValue(){
var end_span_inner = getEndSpan();
return end_span_inner.innerHTML.trim();
}
function getCurrentDateValue(){
var date_input = document.querySelector("#booking-date").getElementsByTagName("input")[0];
return date_input.value;
}
function getMinimumServiceTime(){
var min_serv_time = "<?php
if(isset($GLOBALS["min_serv_time"])){
echo $GLOBALS["min_serv_time"];
}
else{
echo "ERR: min_serv_time not found";
}
?>";
return min_serv_time; // -> GET FROM PARAMS WORDPRESS
}
function getUlOuterSelector(){
return "body > span > span > span.select2-results";
}
function getStartSpanSelector(){
return "#select2-booking-time-start-container";
}
function getStartSpan(){
return document.querySelector(getStartSpanSelector());
}
function getEndSpanSelector(){
return "#select2-booking-time-end-container";
}
function getEndSpan(){
return document.querySelector(getEndSpanSelector());
}
function getUlInner(){
return document.querySelector(getUlOuterSelector()).getElementsByTagName("ul")[0];
}
function getPriceElementSelector(){
return "#sidebar_listing_price > div";
}
function getPriceElement(){
return document.querySelector(getPriceElementSelector());
}
function getPriceDescriptionElement(){
return document.querySelector("#price_h_description");
}
// function getTotPriceDescriptionElement(){
// return document.querySelector("#tot_h_description");
// }
function getMinimumEnd(){
var start_time = getCurrentStartValue();
var minimum_service_time = getMinimumServiceTime();
// Parse the start_time string to create a Date object
var startTimeParts = start_time.split(":");
var startDate = new Date();
startDate.setHours(parseInt(startTimeParts[0], 10));
startDate.setMinutes(parseInt(startTimeParts[1], 10));
// Parse the minimum_service_time string to create a Date object
var [minHours, minMinutes] = minimum_service_time.split(':');
minHours = parseInt(minHours);
minMinutes = parseInt(minMinutes);
// Add 2 hours and 30 minutes to the start_time
var endTime = new Date(startDate.getTime() + (minHours * 60 * 60 * 1000) + (minMinutes * 60 * 1000)); // Adding 30 minutes););
// Format the endTime as "HH:mm"
var endHours = endTime.getHours().toString().padStart(2, '0');
var endMinutes = endTime.getMinutes().toString().padStart(2, '0');
var min_end = endHours + ":" + endMinutes;
if(min_end == '00:00'){
min_end = '24:00';
}
return min_end;
}
function getMaximumEnd(){
var minimum_service_time = getMinimumServiceTime();
var li_elements = all_li_elements;
var last_hour = getWeekDayValue('end');
// Parse the start_time string to create a Date object
var lastTimeParts = last_hour.split(":");
var lastDate = new Date();
lastDate.setHours(parseInt(lastTimeParts[0], 10));
lastDate.setMinutes(parseInt(lastTimeParts[1], 10));
// Parse the last_hour string to create a Date object
var [minHours, minMinutes] = minimum_service_time.split(':');
minHours = parseInt(minHours);
minMinutes = parseInt(minMinutes);
// Add 2 hours and 30 minutes to the last_hour
var endTime = new Date(lastDate.getTime() - (minHours * 60 * 60 * 1000 + minMinutes * 60 * 1000)); // Adding 30 minutes);
// Format the endTime as "HH:mm"
var endHours = endTime.getHours().toString().padStart(2, '0');
var endMinutes = endTime.getMinutes().toString().padStart(2, '0');
var max_end = endHours + ":" + endMinutes;
return max_end;
}
function getDayOfWeek(dateString) {
// Parse the date string into a Date object
var date = new Date(dateString);
// Get the day of the week (0-6)
var dayOfWeek = date.getDay();
// Array to map the numerical day of the week to a string
var days = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];
// Return the day of the week as a string
return days[dayOfWeek];
}
function getWeekDayValue(start_or_end){
var week_day = getDayOfWeek(getCurrentDateValue());
var return_val = "";
if(start_or_end == 'start'){
switch (week_day) {
case 'monday':
return_val = "<?php echo $GLOBALS['monday_start'] ?>";
break;
case 'tuesday':
return_val = "<?php echo $GLOBALS['tuesday_start'] ?>";
break;
case 'wednesday':
return_val = "<?php echo $GLOBALS['wednesday_start'] ?>";
break;
case 'thursday':
return_val = "<?php echo $GLOBALS['thursday_start'] ?>";
break;
case 'friday':
return_val = "<?php echo $GLOBALS['friday_start'] ?>";
break;
case 'saturday':
return_val = "<?php echo $GLOBALS['saturday_start'] ?>";
break;
case 'sunday':
return_val = "<?php echo $GLOBALS['sunday_start'] ?>";
break;
default:
return_val = 'undefined';
break;
}
if(return_val == ''){
return_val = "00:00";
}
}
else if(start_or_end == 'end'){
switch (week_day) {
case 'monday':
return_val = "<?php echo $GLOBALS['monday_end'] ?>";
break;
case 'tuesday':
return_val = "<?php echo $GLOBALS['tuesday_end'] ?>";
break;
case 'wednesday':
return_val = "<?php echo $GLOBALS['wednesday_end'] ?>";
break;
case 'thursday':
return_val = "<?php echo $GLOBALS['thursday_end'] ?>";
break;
case 'friday':
return_val = "<?php echo $GLOBALS['friday_end'] ?>";
console.log(return_val);
break;
case 'saturday':
return_val = "<?php echo $GLOBALS['saturday_end'] ?>";
console.log(return_val);
break;
case 'sunday':
return_val = "<?php echo $GLOBALS['sunday_end'] ?>";
break;
default:
return_val = 'undefined';
break;
}
if(return_val == "00:00"
|| return_val == ''){
return_val = "24:00";
}
}
return return_val;
}
function getServiceDuration(){
var time1 = getCurrentEndValue();
var time2 = getCurrentStartValue();
var result = null;
if(time1 == '00:00'){
time1 = '24:00';
}
if(!time1.includes("—") && !time2.includes("—")){
const [hours1, minutes1] = time1.split(':').map(Number);
const [hours2, minutes2] = time2.split(':').map(Number);
const totalMinutes1 = hours1 * 60 + minutes1;
const totalMinutes2 = hours2 * 60 + minutes2;
const differenceInMinutes = totalMinutes1 - totalMinutes2;
result = differenceInMinutes / 60;
}
return result;
}
function hoursNumberToStringWithoutZeros(decimalHour){
if (decimalHour >= 0 && decimalHour <= 24) {
var hours = Math.floor(decimalHour);
var minutes = Math.round((decimalHour - hours) * 60);
var hoursString = hours;// < 10 ? '0' + hours : hours;
var minutesString = minutes < 10 ? '0' + minutes : minutes;
minutesString = minutes > 0 ? ':' + minutesString : ''
return hoursString + minutesString;
} else {
return "Invalid input";
}
}
function hoursNumberToStringWithZeros(price){
price = parseFloat(price);
// Check if the price has decimal values
if (price % 1 !== 0) {
// If it has decimal values, format it to have 2 decimal places
return price.toFixed(2);
} else {
// If it's an integer, add ".00" to represent the decimal values
return price + ".00";
}
}
function priceNumberToScringWithZeros(price){
// Check if the price has decimal places
if (price % 1 !== 0) {
// If there are decimal places, format with two decimal places
return price.toFixed(2);
} else {
// If there are no decimal places, return the price as is
return price.toString();
}
}
function addDescriptions(){
window.addEventListener('load', function () {
//---------------------------------------------------------------------------
// PIRCE / H LABEL under tot price
var price_element = document.querySelector('#sidebar_listing_price');
if(price_element){
var price_h_description = document.createElement('div');
price_h_description.classList.add('hp-field__description');
price_h_description.id = 'price_h_description';
price_h_description.innerHTML = '-';
price_element.appendChild(price_h_description);
}
//---------------------------------------------------------------------------
// TOT H LABEL above REQUEST BOOKING BUTTON
// var booking_form_element = document.querySelector('#booking-form');
// var hp_form_fields = booking_form_element.getElementsByClassName('hp-form__fields')[0];
// var tot_h_description = document.createElement('div');
// tot_h_description.classList.add('hp-field__description');
// tot_h_description.id = 'tot_h_description';
// tot_h_description.innerHTML = '-';
// hp_form_fields.appendChild(tot_h_description);
// var childs_count = booking_form_element.children.length;
// booking_form_element.insertBefore(tot_h_description, booking_form_element.childNodes[childs_count-1]);
});
}
function getListingPrice(){
var price = <?php
if(isset($GLOBALS["listing_price"])){
echo $GLOBALS["listing_price"];
}else{
error_log("ERROR: listing price not found");
echo "'NOT_FOUND'";
}
?>;
return price;
}
</script>
<?php
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// SET COSTUM DATE AND TIME IN THE DATABASE
add_action('hivepress/v1/models/booking/update', function($booking_id ) {
if(hivepress()->get_version( 'bookings' )
&& isset($_GET['start_time'])){
$listing_id = $_GET['listing'];
$start_time = $_GET['start_time'];
$end_time = $_GET['end_time'];
$start_date = $_GET['date'];
$end_date = $_GET['date'];
$price = $_GET['price'];
$GLOBALS['start_time'] = $_GET['start_time'];
$GLOBALS['end_time'] = $_GET['end_time'];
$GLOBALS['date'] = $_GET['date'];
// $GLOBALS['price'] = $_GET['price'];
if($end_time == '00:00'){
$end_date = date('d-m-Y', strtotime($end_date . ' + 1 day'));
}
update_post_meta( $booking_id, 'hp_start_time', strtotime("$start_date $start_time"));
update_post_meta( $booking_id, 'hp_end_time', strtotime("$end_date $end_time"));
setWooCommerceCartPrice($listing_id, $price);
}
});
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// Set manually the woocommerce cart price ( *2 the price becouse after we will divide by 2)
function setWooCommerceCartPrice($listing_id, $price){
// Product ID to add to the cart
$product_id = getProductId($listing_id);
if($product_id){
// Get the WooCommerce cart object
$cart = WC()->cart;
// Empty cart.
WC()->cart->empty_cart();
// Quantity of the product to add to the cart
$quantity = 1; // You can change this value as needed
// Add the product to the cart
$cart->add_to_cart( $product_id, $quantity );
// Modify cart item prices or quantities here
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Calculate new price (original price * 3)
$new_price = $price * 2;
// Set the new price for the cart item
$cart_item['data']->set_price( $new_price );
// Update cart item price and total
$cart->cart_contents[ $cart_item_key ]['data']->set_price( $new_price );
$cart->cart_contents[ $cart_item_key ]['line_total'] = $new_price * $cart_item['quantity'];
$cart->cart_contents[ $cart_item_key ]['line_subtotal'] = $new_price * $cart_item['quantity'];
}
// Calculate totals and refresh cart
$cart->calculate_totals();
}
}
function getProductId($listing_id){
$post_name = get_post_field('post_name', $listing_id);
if ($post_name) {
$product_id = 0;
// WP_Query arguments
$args = array(
'post_type' => 'product', // Specify the post type
'name' => $post_name, // Specify the post_name (slug)
'posts_per_page' => 1, // Limit the number of posts to 1
);
// The Query
$query = new WP_Query($args);
// Check if the query has any posts
if ($query->have_posts()) {
// Loop through the posts
while ($query->have_posts()) {
$query->the_post();
// Get the post ID
$product_id = get_the_ID();
}
// Restore original post data
wp_reset_postdata();
return $product_id;
} else {
// No posts found
return null;
}
} else {
return null;
}
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// every price calculation divide the cart total by 2 so the price will be correct
add_action('woocommerce_before_calculate_totals', 'set_half_price');
function set_half_price($cart) {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
foreach ($cart->get_cart() as $cart_item) {
$product_price = $cart_item['data']->get_price(); // Get the original product price
$half_price = $product_price / 2; // Calculate half price
// Set the new price to half only during checkout
$cart_item['data']->set_price($half_price);
}
}