I am using JQuery UI datepicker on my e-commerce site so that customers can select a delivery date. I have set it up so that weekends are greyed out (unselectable). I also have certain holidays greyed out (such as Christmas). As well as this I also have previous dates greyed out so customers can only select dates in the future.
Normally a customer can select 'tomorrow' as the date of delivery but I want to implement a cut off time of 12pm (noon). If the time is currently after 12pm then 'tomorrow' would be greyed out but if the time is before 12pm then they can select 'tomorrow'.
The site is on'y available in the UK and is hosted in the UK so I don't need to worry about international time changes.
I have attached the code I am currently using below.
<script>
jQuery(document).ready(function($) {
var delivery_city = jQuery('#delivery_date_block').find("#delivery_city"),
delivery_date = jQuery("#delivery_date"),
delivery_time = jQuery('#delivery_date_block').find("#delivery_time"),
comment = jQuery("textarea[name='customer_comment']").eq(0,1);
jQuery('#delivery_date_block').insertAfter(jQuery("textarea[name='customer_comment']"));
var dateMin = new Date();
var weekDays = AddWeekDays(1);
dateMin.setDate(dateMin.getDate() + weekDays);
var natDays = [
[1, 1, 'uk'],
[12, 25, 'uk'],
[12, 26, 'uk']
];
function noWeekendsOrHolidays(date) {
var noWeekend = $.datepicker.noWeekends(date);
if (noWeekend[0]) {
return nationalDays(date);
} else {
return noWeekend;
}
}
function nationalDays(date) {
for (i = 0; i < natDays.length; i++) {
if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) {
return [false, natDays[i][2] + '_day'];
}
}
return [true, ''];
}
function AddWeekDays(weekDaysToAdd) {
var daysToAdd = 0
var mydate = new Date()
var day = mydate.getDay()
weekDaysToAdd = weekDaysToAdd - (5 - day)
if ((5 - day) < weekDaysToAdd || weekDaysToAdd == 1) {
daysToAdd = (5 - day) + 2 + daysToAdd
} else { // (5-day) >= weekDaysToAdd
daysToAdd = (5 - day) + daysToAdd
}
while (weekDaysToAdd != 0) {
var week = weekDaysToAdd - 5
if (week > 0) {
daysToAdd = 7 + daysToAdd
weekDaysToAdd = weekDaysToAdd - 5
} else { // week < 0
daysToAdd = (5 + week) + daysToAdd
weekDaysToAdd = weekDaysToAdd - (5 + week)
}
}
return daysToAdd;
}
jQuery('#delivery_date').datepicker({
beforeShowDay: noWeekendsOrHolidays,
minDate: dateMin,
defaultDate: +1,
firstDay: 1,
changeFirstDay: true,
dateFormat: "dd-mm-yy",
onSelect: function(dateText) {
jQuery.cookies.set('delivery_date',dateText);
}
});
delivery_city.val( jQuery.cookies.get('delivery_city', "<?php echo $city_value?>") )
.bind('change',function(){jQuery.cookies.set('delivery_city',jQuery(this).val())});
delivery_time.val( jQuery.cookies.get('delivery_time', "<?php echo $time_value?>") )
.change(function(){jQuery.cookies.set('delivery_time',jQuery(this).val())});
jQuery("#delivery_date").datepicker( "setDate" ,jQuery.cookies.get('delivery_date', "<?php echo $date_value?>") );
});
</script>