forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			145 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| $(document).ready(function() {
 | |
| 
 | |
|     // get current time from server
 | |
|     var today = new Date($('now').val());
 | |
| 
 | |
|     $("#event-startdate").datepicker({
 | |
|         // Don't let the user set a start date < before today
 | |
|         minDate: today,
 | |
|         onClose: onStartDateSelected
 | |
|     });
 | |
| 
 | |
|     $("#event-enddate").datepicker({
 | |
|         minDate: today,
 | |
|         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 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 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 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;
 | |
|         }
 | |
| 
 | |
|         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 (startDateTime > endDateTime) {
 | |
|                 $("#event-endtime").val(startTime).attr("selected", "selected");
 | |
|             } else {
 | |
|                 $("#event-endtime").val(endTime).attr("selected", "selected");
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     function updateTimes(start, duration, onSuccess) {
 | |
|         $.getJSON($('#timelist_action_url').val(), {start: start, ajax: true, duration: duration}, onSuccess);
 | |
|     }
 | |
| 
 | |
| });
 |