$(document).ready(function() {
- var today = new Date();
+ // get current time from server
+ var today = new Date($('now').val());
$("#event-startdate").datepicker({
- // Don't let the user set a crazy start date
+ // Don't let the user set a start date < before today
minDate: today,
- onClose: function(dateText, picker) {
- // Don't let the user set a crazy end date
- var newStartDate = new Date(dateText);
- var endDate = new Date($("#event-startdate").val());
- if (endDate < newStartDate) {
- $("#event-enddate").val(dateText);
- }
- if (dateText !== null) {
- $("#event-enddate").datepicker('option', 'minDate', new Date(dateText));
- }
- },
- onSelect: function() {
- var startd = $("#event-startdate").val();
- var endd = $("#event-enddate").val();
- var sdate = new Date(startd);
- var edate = new Date(endd);
- if (sdate !== edate) {
- updateTimes();
- }
- }
+ onClose: onStartDateSelected
});
$("#event-enddate").datepicker({
minDate: today,
- onSelect: function() {
- var startd = $("#event-startdate").val();
- var endd = $("#event-enddate").val();
- var sdate = new Date(startd);
- var edate = new Date(endd);
- if (sdate !== edate) {
- updateTimes();
+ onClose: onEndDateSelected
+ });
+
+ $("#event-starttime").change(function(e) {
+ var tz = $("#tz").val();
+
+ var startDate = $("#event-startdate").val();
+ var startTime = $("#event-starttime option:selected").val().replace(/(pm|am)/, ' $1');
+ var startStr = startDate + ' ' + startTime + ' ' + tz;
+
+ var endDate = $("#event-enddate").val();
+ var endTime = $("#event-endtime option:selected").val();
+ var endStr = endDate + ' ' + endTime.replace(/(pm|am)/, ' $1') + ' ' + tz;
+
+ // just need to compare hours
+ var start = new Date(startStr);
+ var end = new Date(endStr);
+
+ updateTimes(startStr, (startDate === endDate), function (data) {
+ var times = [];
+ $.each(data, function(key, val) {
+ times.push('<option value="' + key + '">' + val + '</option>');
+ });
+ $("#event-endtime").html(times.join(''));
+
+ if (start > end) {
+ $("#event-endtime").val(startTime).attr("selected", "selected");
+ } else {
+ $("#event-endtime").val(endTime).attr("selected", "selected");
+ }
+ });
+
+ });
+
+ $("#event-endtime").change(function(e) {
+ var HOUR = 60 * 60 * 1000;
+ var tz = $("#tz").val();
+ var startDate = $("#event-startdate").val();
+ var endDate = $("#event-enddate").val();
+ var starttime = $("#event-starttime option:selected").val();
+ var endtime = $("#event-endtime option:selected").val();
+ var endtimeText = $("#event-endtime option:selected").text();
+
+ // If the end time is in the next day then update the start date
+ if (startDate === endDate) {
+ var startstr = startDate + ' ' + starttime.replace(/(pm|am)/, ' $1') + ' ' + tz;
+ var start = new Date(startstr);
+ var matches = endtimeText.match(/\(.*\)/);
+ var hours;
+ if (matches) {
+ hours = matches[0].substr(1).split(' ')[0]; // get x from (x hours)
+ if (hours) {
+ if (hours == 30) {
+ hours = .5; // special case: x == 30 from (30 mins)
+ }
+ var end = new Date(start.getTime() + (hours * HOUR));
+ if (end.getDate() > start.getDate()) {
+ $("#event-enddate").datepicker('setDate', end);
+ var endstr = endDate + ' 12:00 am ' + tz;
+ updateTimes(endstr, false, function(data) {
+ var times = [];
+ $.each(data, function(key, val) {
+ times.push('<option value="' + key + '">' + val + '</option>');
+ });
+ $("#event-endtime").html(times.join(''));
+
+ if (start > end) {
+ $("#event-endtime").val(starttime).attr("selected", "selected");
+ } else {
+ $("#event-endtime").val(endtime).attr("selected", "selected");
+ }
+ });
+ }
+ }
}
}
});
- function updateTimes() {
- var startd = $("#event-startdate").val();
- var endd = $("#event-enddate").val();
+ function onStartDateSelected(dateText, inst) {
+ var tz = $("#tz").val();
+ var startTime = $("#event-starttime option:selected").val();
+ var startDateTime = new Date(dateText + ' ' + startTime.replace(/(pm|am)/, ' $1') + ' ' + tz);
+
+ // When we update the start date and time, we need to update the end date and time
+ // to make sure they are equal or in the future
+ $("#event-enddate").datepicker('option', 'minDate', startDateTime);
+
+ recalculateTimes();
+ }
+
+ function onEndDateSelected(dateText, inst) {
+ recalculateTimes();
+ }
+
+ function recalculateTimes(showDuration) {
+ var tz = $("#tz").val();
- var startt = $("#event-starttime option:selected").val();
- var endt = $("#event-endtime option:selected").val();
+ var startDate = $("#event-startdate").val();
+ var startTime = $("#event-starttime option:selected").val();
+ var startStr = startDate + ' ' + startTime.replace(/(pm|am)/, ' $1') + ' ' + tz;
+ var startDateTime = new Date(startStr);
- var sdate = new Date(startd + " " + startt);
- var edate = new Date(endd + " " + endt);
- var duration = (startd === endd);
+ var endDate = $("#event-enddate").val();
+ var endTime = $("#event-endtime option:selected").val();
+ var endDateTime = new Date(endDate + ' ' + endTime.replace(/(pm|am)/, ' $1') + ' ' + tz);
+ var showDuration = true;
+
+ if (endDateTime.getDate() !== startDateTime.getDate()) {
+ starStr = endDate + ' 12:00 am ' + tz;
+ showDuration = false;
+ }
- $.getJSON($('#timelist_action_url').val(),
- { start: startt, ajax: true, duration: duration },
- function(data) {
- var times = [];
- $.each(data, function(key, val) {
+ updateTimes(startStr, showDuration, function(data) {
+ var times = [];
+ $.each(data, function(key, val) {
times.push('<option value="' + key + '">' + val + '</option>');
});
-
$("#event-endtime").html(times.join(''));
- if (startt < endt) {
- $("#event-endtime").val(endt).attr("selected", "selected");
+ if (startDateTime > endDateTime) {
+ $("#event-endtime").val(startTime).attr("selected", "selected");
+ } else {
+ $("#event-endtime").val(endTime).attr("selected", "selected");
}
- })
+ });
}
- $("#event-starttime").change(function(e) {
- updateTimes();
- });
+ function updateTimes(start, duration, onSuccess) {
+ $.getJSON($('#timelist_action_url').val(), {start: start, ajax: true, duration: duration}, onSuccess);
+ }
});