+ // drag stop event
+ function appointment_drag_stop(event, ui) {
+ var $this = $(this);
+ // cell that's dragging
+ $this = $this.data('cell');
+ var cells = $this.data('cells');
+ clear_drag_hi(cells);
+ $this.data('isdragging',false);
+ var offset = $this.data('offset');
+ // jump to first cell in appointment
+ var rownum = $this.parent().prevAll('tr').length;
+ var colnum = $this.prevAll('td').length;
+ $this = $this.parent().parent().children('tr').eq(rownum-offset).children('td').eq(colnum);
+ // loop through all cells in appointment
+ for ( var c=0; c < cells; c++) {
+ set_data_cell($this);
+ var rownum = $this.parent().prevAll('tr').length;
+ var colnum = $this.prevAll('td').length;
+ $this = $this.parent().parent().children('tr').eq(rownum+1).children('td').eq(colnum);
+ }
+ }
+
+ // drag over event
+ function appointment_drag_over(event, ui) {
+ // the cell that's dragging
+ var cells = ui.draggable.data('cell').data('cells');
+ // the droppable cell that you're over
+ var $this = $(this);
+ clear_drag_hi(cells);
+ if (!can_drop($this, ui)) return;
+ drag_hi = $this;
+ // loop through potential appointment cells
+ for ( var c=0; c < cells; c++) {
+ $this.css('background-color', '#ffffdd');
+ if ( !$this.data('isdragging')) {
+ set_cell_div($this,'','#ffffdd');
+ } else {
+ $this.css('background-color','#ffffdd');
+ }
+ if ( c == 0 ) {
+ $this.css('border-top', '1px double black');
+ }
+ if ( c == (cells-1) ) {
+ $this.css('border-bottom', '1px solid black');
+ }
+ $this.css('border-left', '1px double black');
+ $this.css('border-right', '1px solid black');
+ var rownum = $this.parent().prevAll('tr').length;
+ var colnum = $this.prevAll('td').length;
+ $this = $this.parent().parent().children('tr').eq(rownum+1).children('td').eq(colnum);
+ }
+ }
+
+ // drop event
+ function reschedule_appointment( event, ui ) {
+
+ // the droppable cell that you're over
+ var $this = $(this);
+
+ if (!can_drop($this, ui)) return;
+
+% #get the ticket number and appointment length (from the draggable object)
+ var dragcell = ui.draggable.data('cell');
+ var ticketid = dragcell.data('ticketid');
+ var length = dragcell.data('length');
+ var bgcolor = dragcell.data('bgcolor');
+ var offset = dragcell.data('offset');
+
+% #and.. the new date and time, and username (from the droppable object)
+ var starts = $this.data('starts');
+ var username = $this.data('username');
+ var due = parseInt(starts) + parseInt(length);
+ var n_epoch = $this.data('epoch');
+ var n_st_tod_row = $this.data('tod_row');
+
+ var droppable = $this;
+ ui.draggable.effect( "transfer", { to: droppable }, 420 );
+
+% #tell the backend to reschedule it
+ var url = "<% popurl(3) %>misc/xmlhttp-ticket-update.html?" +
+ "id=" + ticketid + ";starts=" + starts + ";due=" + due +
+ ";username=" + username;
+
+ $.getJSON( url, function( data ) {
+ if ( data.error && data.error.length ) {
+% #error? "that shouldn't happen" but should display
+ alert(data.error);
+
+ } else {
+
+ var label = data.sched_label;
+ var labeltime = data.sched_label_time;
+ var labeltitle = data.sched_label_title;
+
+ // jump to first cell in appointment
+ var rownum = dragcell.parent().prevAll('tr').length;
+ var colnum = dragcell.prevAll('td').length;
+ dragcell = dragcell.parent().parent().children('tr').eq(rownum-offset).children('td').eq(colnum);
+
+ // remove old appointment entirely
+ var epoch = dragcell.data('epoch');
+ var st_tod_row = dragcell.data('tod_row');
+ var old_username = dragcell.data('username');
+ var cells = dragcell.data('cells');
+ for ( var c=0; c < cells; c++) {
+ var tod_row = parseInt(st_tod_row) + (c * <%$timestep%>);
+ var td_id = 'td_' + epoch +
+ '_' + String( tod_row ) +
+ '_' + old_username;
+ var $cell = $('#'+td_id);
+ $cell.data('div').draggable('destroy');
+ set_schedulable_cell($cell);
+ set_droppable_cell($cell);
+ }
+
+ // set appointment in new position
+ clear_drag_hi(cells);
+ for ( var d=0; d < cells; d++) {
+ var n_tod_row = parseInt(n_st_tod_row) + (d * <%$timestep%>);
+ var n_td_id = 'td_' + n_epoch +
+ '_' + String( n_tod_row ) +
+ '_' + username;
+ var $cell = $('#'+n_td_id);
+ set_appointment_cell($cell,ticketid,bgcolor,labeltime,labeltitle,length,cells,d);
+ set_draggable_cell($cell);
+ set_droppable_cell($cell);
+ }
+ }
+ });
+ }
+
+% } # end of rescheduling functions
+