3 * http://opencaps.atrc.utoronto.ca
\r
5 * Copyright 2009 Heidi Hazelton
\r
6 * Adaptive Technology Resource Centre, University of Toronto
\r
8 * Licensed under the Educational Community License (ECL), Version 2.0.
\r
9 * You may not use this file except in compliance with this License.
\r
10 * http://www.opensource.org/licenses/ecl2.php
\r
16 var proj = proj || {};
\r
18 var MIN_CLIP_DUR = 400;
\r
20 var clip_playing = false;
\r
22 var movie = movie || {};
\r
23 var clip = clip || {};
\r
24 var movieObj = movieObj || {};
\r
27 clips = new Array();
\r
29 this_location = new Object;
\r
52 //set values in seconds
\r
64 /*************************************** initialize */
\r
66 $(document).ready(function () {
\r
67 $("#movie-controls").css("visibility", "hidden");
\r
68 $("#clip-controls").css("visibility", "hidden");
\r
69 $("#make-clip").css("visibility", "hidden");
\r
70 $("#clip-info").css("visibility", "hidden");
\r
72 $.get("include/workflow.php", { task: 'get_json' }, function(json) {
\r
74 proj = JSON.parse(json);
\r
79 $("#caption-text").keyup( function(event) {
\r
80 //if ($("#caption-text").text() != this_location.caption_text) {
\r
81 $("#makeclip").removeAttr("disabled");
\r
88 function confirmDelete(clipnum) {
\r
89 if (confirm("Are you sure you want to delete Clip "+clipnum+"?")) {
\r
90 deleteClip(clipnum);
\r
94 function startEditor() {
\r
95 movieObj = document.mymovie;
\r
97 //register listeners
\r
98 RegisterListener('qt_play', 'mymovie', 'mymovie_embed', startTimeline);
\r
99 RegisterListener('qt_pause', 'mymovie', 'mymovie_embed', pauseTimeline);
\r
100 RegisterListener('qt_ended', 'mymovie', 'mymovie_embed', pauseTimeline);
\r
102 /* show or hide side bar action */
\r
103 $("#show_hide_caps").click(function() {
\r
104 if ($("#info-tab").css("display") == "none") {
\r
105 $("#info-tab").show();
\r
106 $("#info-container").css("margin-left", "71%");
\r
107 $("#movie-container").css("width", "70%");
\r
109 $(this).html('<h4 style="margin:0px">Clips <img style="float:right" src="images/application_get.png" alt="hide clips" title="hide clips" /></h4>');
\r
111 $("#info-tab").hide();
\r
112 $("#info-container").css("margin-left", "97%");
\r
113 $("#movie-container").css("width", "96%");
\r
115 $(this).html('<img src="images/application_put.png" alt="show clips" title="show clips" />');
\r
119 /* hide clip side bar */
\r
120 $("#info-tab").hide();
\r
121 $("#info-container").css("margin-left", "97%");
\r
122 $("#movie-container").css("width", "96%");
\r
123 $("#show_hide_caps").html('<img src="images/application_put.png" alt="show clips" title="show clips" />');
\r
126 $("#editor-tab").addClass('current');
\r
127 $("#clips-subtab").addClass('current');
\r
129 /* global proj related vars */
\r
130 if (proj.clip_collection)
\r
131 num_clips = proj.clip_collection.clips.length;
\r
133 interval = window.setInterval("QTStatus()",100);
\r
136 function QTStatus() {
\r
138 if (movieObj.GetPluginStatus() == "Complete") {
\r
139 window.clearInterval(interval);
\r
140 $("#movie_status").html("");
\r
143 $("#movie_status").html("<strong>Loading media...</strong>");
\r
149 function setDisplay() {
\r
150 $("#movie-controls").css("visibility", "visible");
\r
151 $("#clip-controls").css("visibility", "visible");
\r
152 $("#make-clip").css("visibility", "visible");
\r
153 $("#clip-info").css("visibility", "visible");
\r
155 $("#source-file").text(movieObj.GetURL());
\r
157 $("#duration").text(getFormattedTime(movieObj.GetDuration()));
\r
158 dur = parseInt(movieObj.GetDuration()/movieObj.GetTimeScale()*1000);
\r
160 var mysize = movieObj.GetRectangle().split(',');
\r
162 /* set if audio file: min 250x100 */
\r
163 if (mysize[3] >= 1)
\r
164 proj.media_height = mysize[3];
\r
166 proj.media_height = 1;
\r
168 if (mysize[2] >= 250)
\r
169 proj.media_width = mysize[2];
\r
171 proj.media_width = 250;
\r
173 proj.duration = getFormattedTime2(dur);
\r
174 clips = proj.clip_collection.clips;
\r
176 $("#m_timeline").slider({
\r
180 stop: function(e, ui) {
\r
181 $("#m_timeline").slider("value", ui.value);
\r
184 slide: function(e, ui) {
\r
185 $("#c_timeline").slider("value", ui.value);
\r
186 moveMovieAll(ui.value);
\r
190 //$("#show_hide_caps").html('<img src="images/application_get.png" style="margin-bottom:-3px;" alt="hide clips" title="hide clips" /> Clips');
\r
192 pace = dur / parseInt($("#m_timeline").css("width"));
\r
194 //isn't it always 0?
\r
195 if (movieObj.GetTime() > 0) {
\r
196 curTime = calcTime(movieObj.GetTime());
\r
198 curTime = getFormattedTime2(0);
\r
201 $("#current-time").text(curTime);
\r
202 $("#clip-time").text(curTime);
\r
204 curTime = getMilliseconds(curTime);
\r
205 $("#makeclip").attr("disabled","disabled");
\r
210 function moveMovie(time) { //time in milliseconds
\r
211 movieObj.SetTime(time*movieObj.GetTimeScale()/1000);
\r
214 $("#current-time").text(getFormattedTime2(time));
\r
216 clipTime = parseInt(time - this_location.inTimeMilli);
\r
217 $("#clip-time").text(getFormattedTime2(clipTime));
\r
222 function moveMovieAll(time) { //time in milliseconds
\r
223 movieObj.SetTime(time*movieObj.GetTimeScale()/1000);
\r
226 $("#c_timeline").slider("value", time);
\r
227 $("#m_timeline").slider("value", time);
\r
228 $("#current-time").text(getFormattedTime2(time));
\r
230 clipTime = parseInt(time - this_location.inTimeMilli);
\r
231 $("#clip-time").text(getFormattedTime2(clipTime));
\r
235 function startTimeline() {
\r
236 /*if (getMilliseconds(calcTime(movieObj.GetTime())) == curTime-1) {
\r
237 movieObj.SetTime((curTime*movieObj.GetTimeScale()/1000)+50);
\r
241 this_location_dur = getMilliseconds($("#out-time").text())-getMilliseconds($("#in-time").text());
\r
242 clip_pace = this_location_dur / parseInt($("#c_timeline").css("width"));
\r
244 updateMovieMarker(curTime);
\r
245 updateClipMarker(curTime);
\r
248 function pauseTimeline() {
\r
249 clearTimeout(clocktimer);
\r
250 clearTimeout(marker);
\r
251 clearTimeout(clip_marker);
\r
254 function updateMovieMarker(time) {
\r
255 $("#m_timeline").slider("value", time);
\r
256 marker = setTimeout("updateMovieMarker(curTime)", pace);
\r
259 function updateClipMarker(time) {
\r
260 $("#c_timeline").slider("value", time);
\r
261 clip_marker = setTimeout("updateClipMarker(curTime)", clip_pace);
\r
264 function runTimer() {
\r
265 curTime = calcTime(movieObj.GetTime());
\r
267 $("#current-time").text(curTime);
\r
268 curTime = getMilliseconds(curTime);
\r
270 clipTime = parseInt(curTime - getMilliseconds($("#in-time").text()));
\r
272 if ( curTime==dur || curTime>getMilliseconds($("#out-time").text()) || curTime<getMilliseconds($("#in-time").text()) ) {
\r
273 if (clip_playing || curTime >= dur) {
\r
275 moveMovieAll(getMilliseconds($("#out-time").text()));
\r
278 setCurClip(curTime);
\r
281 $("#clip-time").text(getFormattedTime2(clipTime));
\r
282 clocktimer = setTimeout("runTimer()",1);
\r
285 function setClipTimeline(cdur, cin, cout) {
\r
286 //console.log('setClipTimeline', cin, cout);
\r
288 //destroy the old slider set up and create the new one
\r
289 $("#c_timeline").slider("destroy");
\r
291 $("#c_timeline").slider({
\r
295 stop: function(e, ui) {
\r
296 $("#c_timeline").slider("value", ui.value);
\r
298 slide: function(e, ui) {
\r
299 $("#m_timeline").slider("value", ui.value);
\r
300 moveMovieAll(ui.value);
\r
305 function loadClips() {
\r
306 $('#numclips').text(num_clips);
\r
309 if (num_clips > 0) {
\r
310 for (var i in clips) {
\r
313 if (clips[parseInt(i)-1] == undefined && clips[i].inTimeMilli>0) {
\r
314 space_dur = getFormattedTime2(clips[i].inTimeMilli-1);
\r
315 clips_html += '<div class="space"><span style="font-weight:bold;float:left;"><a href="#" onclick="javascript:resetClipWork();moveMovieAll(0);">Space before Clip 1</a></span><span style="float:right">'+ space_dur +'</span><span id="space'+i+'"></span><br style="clear:both;" /></div>';
\r
316 } else if ( clips[parseInt(i)-1] != undefined && (clips[i].inTimeMilli != parseInt(clips[parseInt(i)-1].outTimeMilli)+1)) {
\r
317 space_dur = getFormattedTime2(clips[i].inTimeMilli - clips[parseInt(i)-1].outTimeMilli -2);
\r
318 clips_html += '<div class="space"><span style="font-weight:bold;float:left;"><a href="#" onclick="javascript:resetClipWork();moveMovieAll('+(clips[parseInt(i)-1].outTimeMilli+1)+');">Space after Clip '+i+'</a></span><span style="float:right">'+ space_dur +'</span><span id="space'+i+'"></span><br style="clear:both;" /></div>';
\r
322 html_caption = clips[i].caption_text.replace(/\n/g, "<br />");
\r
323 clips[i].name = 'Clip '+(parseInt(i)+1);
\r
324 clips_html += '<div style="float:right; padding-top:5px;margin-right:5px;"><a href="#" onclick="javascript:confirmDelete('+(parseInt(i)+1)+');">X</a></div><div class="clip"><span class="clip-title"><a name="clip'+i+'" href="#" onclick="javascript:resetClipWork();moveMovieAll('+clips[i].inTimeMilli+');">'+clips[i].name+'</a></span><span id="clip'+(parseInt(i)+1)+'"></span><br />' + html_caption + '<br /><div style="float:right"> '+ clips[i].duration + '</div><span style="font-size:smaller">in: ' + clips[i].inTime + ' <br />out: '+ clips[i].outTime +'</span></div>';
\r
327 if (clips[parseInt(i)+1] == undefined && clips[i].outTimeMilli<dur) {
\r
328 space_dur = getFormattedTime2(dur - clips[i].outTimeMilli-1);
\r
329 clips_html += '<div class="space"><span style="font-weight:bold;float:left;"><a href="#" onclick="javascript:resetClipWork();moveMovieAll('+parseInt(clips[i].outTimeMilli+1)+');">Space after Clip '+(parseInt(i)+1)+'</a></span><span style="float:right">'+ space_dur +'</span><span id="space'+(parseInt(i)+1)+'"></span><br style="clear:both;" /></div>';
\r
334 $("#info-tab").html(clips_html);
\r
337 clips_html = '<div class="space" style="border-bottom:0px"><span style="font-weight:bold;float:left;"><a href="#" onclick="javascript:resetClipWork();moveMovieAll(0);">Space</a></span><span style="float:right">'+ $("#duration").text() +'</span><br style="clear:both;" /></div>';
\r
338 $("#info-tab").html(clips_html);
\r
342 setCurClip(curTime);
\r
346 * As the movie plays (or the playhead is moved), figure out what clip it's on
\r
348 function setCurClip(time) {
\r
350 this_location = {};
\r
355 this_location.inTime = temp_in;
\r
356 this_location.inTimeMilli = getMilliseconds(temp_in);
\r
358 this_location.inTime = $("#in-time").text();
\r
359 this_location.inTimeMilli = getMilliseconds(this_location.inTime);
\r
362 this_location.outTime = temp_out;
\r
363 this_location.outTimeMilli = getMilliseconds(temp_out);
\r
365 this_location.outTime = $("#out-time").text();
\r
366 this_location.outTimeMilli = getMilliseconds(this_location.outTime);
\r
369 if (extend == true) {
\r
370 if( (temp_in && time < getMilliseconds(temp_in)) || (temp_out && time > getMilliseconds(temp_out) )) {
\r
380 if (num_clips == 0) {
\r
382 this_location.name = "Space";
\r
384 asterisk = "#space0";
\r
386 this_location.inTimeMilli = 0;
\r
387 this_location.inTime = getFormattedTime2(this_location.inTimeMilli);
\r
390 this_location.outTimeMilli = dur;
\r
391 this_location.outTime = getFormattedTime2(dur);
\r
394 this_location.caption_text = "";
\r
396 $("#makeclip").val("Make Clip");
\r
399 for (var i in clips) {
\r
400 if (time < clips[i].inTimeMilli && clips[parseInt(i)-1] == undefined) {
\r
402 this_location.name = "Space before Clip 1";
\r
404 asterisk = "#space0";
\r
407 this_location.inTimeMilli = 0;
\r
408 this_location.inTime = getFormattedTime2(this_location.inTimeMilli);
\r
411 this_location.outTimeMilli = parseInt(clips[i].inTimeMilli)-1;
\r
412 this_location.outTime = getFormattedTime2(this_location.outTimeMilli);
\r
415 this_location.caption_text = "";
\r
417 $("#makeclip").val("Make Clip");
\r
420 } else if ( (clips[parseInt(i)+1] == undefined || time < clips[parseInt(i)+1].inTimeMilli) && time > clips[i].outTimeMilli) {
\r
423 this_location.name = "Space after Clip "+ parseInt(parseInt(i)+1);
\r
426 this_location.inTimeMilli = clips[i].outTimeMilli+1;
\r
427 this_location.inTime = getFormattedTime2(this_location.inTimeMilli);
\r
431 if (clips[parseInt(i)+1] == undefined)
\r
432 this_location.outTimeMilli = dur;
\r
434 this_location.outTimeMilli = clips[parseInt(i)+1].inTimeMilli-1;
\r
436 this_location.outTime = getFormattedTime2(this_location.outTimeMilli);
\r
439 this_location.caption_text = "";
\r
440 curClip = parseInt(i)+1;
\r
441 asterisk = "#space"+curClip;
\r
443 $("#makeclip").val("Make Clip");
\r
446 } else if (time >= clips[i].inTimeMilli && time <= clips[i].outTimeMilli) {
\r
448 curClip = parseInt(i)+1;
\r
449 this_location = clips[i];
\r
451 $("#makeclip").val("Update Clip");
\r
453 asterisk = "#clip"+curClip;
\r
456 //console.log("skipping this one", i, clips[i].inTimeMilli, clips[i].outTimeMilli);
\r
461 // 'you are here' asterisk
\r
462 $("#space"+lastLoc).text("");
\r
463 $("#clip"+lastLoc).text("");
\r
465 $(asterisk).html(" <img src='images/asterisk_yellow.png' alt='current space' />");
\r
467 // in and out times
\r
469 $("#in-time").text(this_location.inTime);
\r
471 $("#out-time").text(this_location.outTime);
\r
474 this_location.durationMilli = this_location.outTimeMilli - this_location.inTimeMilli;
\r
475 this_location.duration = getFormattedTime2(this_location.durationMilli);
\r
476 $("#clip-duration").text(this_location.duration);
\r
479 // moved into a different clip or space
\r
480 if ($("#clip-name").text() != this_location.name || (new_flag && !temp_in && !temp_out && !temp_caps)) {
\r
483 $("#caption-text").val(this_location.caption_text);
\r
485 // user was working on a new clip but it gets reset when moving out of current clip
\r
486 if (temp_in || temp_out || temp_caps) {
\r
490 //move scroll bar to clip
\r
492 $("#info-tab").scrollTop(curClip*70);
\r
494 $("#info-tab").scrollTop(0);
\r
496 // update the clip timeline and move the playhead
\r
497 setClipTimeline(this_location.durationMilli, this_location.inTimeMilli, this_location.outTimeMilli);
\r
501 $("#clip-name").text(this_location.name);
\r
503 /*************************************** movie controller buttons */
\r
505 movie.normPlay = function() {
\r
506 if ($("#playButton").attr("src") == "images/play.png") {
\r
508 $("#playButton").attr("src", 'images/pause.png');
\r
509 $("#clip-playButton").attr("src", 'images/pause.png');
\r
512 movie.pressStop();
\r
516 movie.pressPlay = function() {
\r
518 $("#pressButton").attr("src", 'images/pause.png');
\r
520 movie.pressStop = function() {
\r
522 $("#playButton").attr("src", 'images/play.png');
\r
523 $("#clip-playButton").attr("src", 'images/play.png');
\r
525 $("#pressButton").attr("src", 'images/pressplay.png');
\r
529 /*************************************** clip controller buttons */
\r
531 clip.normPlay = function() {
\r
532 if ($("#clip-playButton").attr("src") == "images/play.png") {
\r
533 lastplay = curTime;
\r
535 $("#clip-playButton").attr("src", 'images/pause.png');
\r
536 $("#playButton").attr("src", 'images/pause.png');
\r
537 clip_playing = true;
\r
543 clip.pressPlay = function() {
\r
544 lastplay = curTime;
\r
545 moveMovie(curTime);
\r
547 $("#clip-pressButton").attr("src", 'images/pause.png');
\r
548 clip_playing = true;
\r
550 clip.pressStop = function() {
\r
552 var max = $("#c_timeline").slider("option", "max");
\r
554 moveMovie(max-1000);
\r
556 $("#clip-playButton").attr("src", 'images/play.png');
\r
557 $("#playButton").attr("src", 'images/play.png');
\r
558 $("#clip-pressButton").attr("src", 'images/pressplay.png');
\r
559 clip_playing = false;
\r
562 function getIndex( myarray, item ) {
\r
563 for (var i=0; i<myarray.length; i++) {
\r
564 if (myarray[i] == item) {
\r
570 clip.previous = function() {
\r
572 if (inClip && curClip > 1) {
\r
573 //go to prev space (prev clip's out time +1)
\r
574 if (clips[curClip-2].outTimeMilli+1 != clips[curClip-1].inTimeMilli) {
\r
575 moveMovieAll(clips[curClip-2].outTimeMilli+1);
\r
577 //if no space, go to prev clip
\r
579 moveMovieAll(clips[curClip-2].inTimeMilli);
\r
582 //if in a space, go to prev clip
\r
583 } else if (!inClip && curClip>0) {
\r
584 moveMovieAll(clips[curClip-1].inTimeMilli);
\r
585 //if in first space or clip, go to start
\r
590 clip.next = function() {
\r
592 if (inClip && clips[curClip] != undefined) {
\r
594 //go to next space (next clip's out time +1)
\r
595 if (clips[curClip].inTimeMilli != clips[curClip-1].outTimeMilli+1) {
\r
596 moveMovieAll(clips[curClip-1].outTimeMilli+1);
\r
598 //if no space, go to next clip
\r
600 moveMovieAll(clips[curClip].inTimeMilli);
\r
603 //if in a space, go to next clip
\r
604 } else if (!inClip && clips[curClip] != undefined) {
\r
605 moveMovieAll(clips[curClip].inTimeMilli);
\r
608 } else if (clips[clips.length-1] != undefined) {
\r
609 if (clips[clips.length-1].outTimeMilli == dur)
\r
610 moveMovieAll(clips[clips.length-1].inTimeMilli);
\r
612 moveMovieAll(clips[clips.length-1].outTimeMilli+1);
\r
617 clip.goToStart = function() {
\r
618 moveMovieAll(getMilliseconds($("#in-time").text()));
\r
620 clip.goToEnd = function() {
\r
621 moveMovieAll(getMilliseconds($("#out-time").text()));
\r
623 clip.stepBack = function(step) {
\r
624 if (curTime >= step && (curTime-step >= getMilliseconds($("#in-time").text())) )
\r
625 moveMovieAll(curTime - step);
\r
627 clip.stepForward = function(step) {
\r
628 if ( curTime+step <= getMilliseconds($("#out-time").text()) )
\r
629 moveMovieAll(curTime + step);
\r
632 clip.lastPlay = function() {
\r
633 moveMovieAll(lastplay);
\r
636 /*************** making a clip */
\r
638 clip.newInTime = function() {
\r
640 clip_dur = this_location.outTimeMilli-curTime;
\r
641 if (clip_dur <= MIN_CLIP_DUR) {
\r
642 alert("Too few frames to make a clip!");
\r
644 $("#in").css("color","red");
\r
645 $("#in-time").css("color","red");
\r
646 $("#clip-duration").css("color","red");
\r
647 $("#makeclip").removeAttr("disabled");
\r
648 $("#clip-duration").text(getFormattedTime2(clip_dur));
\r
650 //old_in = getMilliseconds($("#in-time").text());
\r
652 temp_in = getFormattedTime2(curTime);
\r
653 $("#in-time").text(temp_in);
\r
655 setClipTimeline(clip_dur, curTime, this_location.outTimeMilli);
\r
656 moveMovieAll(curTime);
\r
659 $("#in-undo").html("<a href='#' onclick='javascript:clip.undoIn(0)'><img src='images/bullet_delete.png' alt='cancel in-time' title='cancel in-time' /></a>");
\r
660 else if (inAClip())
\r
661 $("#in-undo").html("<a href='#' onclick='javascript:clip.undoIn("+milli_ins[curClip-1]+")'><img src='images/bullet_delete.png' alt='cancel in-time' title='cancel in-time' /></a>");
\r
663 $("#in-undo").html("<a href='#' onclick='javascript:clip.undoIn("+milli_spaceins[curClip]+")'><img src='images/bullet_delete.png' alt='cancel in-time' title='cancel in-time' /></a>");
\r
669 clip.newOutTime = function() {
\r
670 if (curTime != getMilliseconds($("#out-time").text())) {
\r
674 clip_dur = curTime-getMilliseconds(temp_in);
\r
676 clip_dur = curTime-getMilliseconds($("#in-time").text());
\r
679 if (clip_dur <= MIN_CLIP_DUR) {
\r
680 alert("Too few frames to make a clip!");
\r
683 $("#out").css("color","red");
\r
684 $("#out-time").css("color","red");
\r
685 $("#clip-duration").css("color","red");
\r
686 $("#makeclip").removeAttr("disabled");
\r
687 $("#clip-duration").text(getFormattedTime2(clip_dur));
\r
689 temp_out = getFormattedTime2(curTime);
\r
690 $("#out-time").text(temp_out);
\r
692 setClipTimeline(curTime - getMilliseconds($("#in-time").text()), getMilliseconds($("#in-time").text()), curTime);
\r
693 moveMovieAll(curTime);
\r
696 $("#out-undo").html("<a href='#' onclick='javascript:clip.undoOut("+dur+")'><img src='images/bullet_delete.png' alt='cancel out-time' title='cancel out-time' /></a>");
\r
697 else if (inAClip())
\r
698 $("#out-undo").html("<a href='#' onclick='javascript:clip.undoOut("+milli_outs[curClip-1]+")'><img src='images/bullet_delete.png' alt='cancel out-time' title='cancel out-time' /></a>");
\r
700 $("#out-undo").html("<a href='#' onclick='javascript:clip.undoOut("+milli_spaceouts[curClip]+")'><img src='images/bullet_delete.png' alt='cancel out-time' title='cancel out-time' /></a>");
\r
706 clip.addPrevSpace = function() {
\r
708 //if the current clip's inTime is > 0 and also not equal to the prev clip's outTime
\r
709 if (inClip && clips[curClip-1].inTimeMilli > 0 && ( clips[curClip-2]==undefined || clips[curClip-1].inTimeMilli != clips[curClip-2].outTimeMilli) ) {
\r
713 //make clip start = last clip's end
\r
714 if (clips[curClip-2] != undefined) {
\r
715 newin = clips[curClip-2].outTimeMilli + 1;
\r
719 temp_in = getFormattedTime2(newin);
\r
720 var oldout = getMilliseconds($("#out-time").text())
\r
721 var caption_text = $("#caption-text").val();
\r
723 //set new temp values
\r
724 $("#in-time").css("color","red");
\r
725 $("#in-time").text(temp_in);
\r
727 $("#clip-duration").css("color","red");
\r
728 $("#makeclip").removeAttr("disabled");
\r
729 $("#makeclip").val("Update Clip");
\r
731 //$("#caption-text").val(caption_text);
\r
732 $("#clip-duration").text(getFormattedTime2(oldout - newin));
\r
735 setClipTimeline(oldout - newin, newin, oldout);
\r
736 moveMovieAll(curTime);
\r
737 //$("#in-undo").html("<a href='#' onclick='javascript:clip.undoIn("+milli_ins[curClip-1]+")'><img src='images/bullet_delete.png' alt='cancel in-time' title='cancel in-time' /></a>");
\r
741 clip.addNextSpace = function() {
\r
743 if (inClip && clips[curClip-1].outTimeMilli < dur && (clips[curClip]==undefined || clips[curClip-1].outTimeMilli != clips[curClip].inTimeMilli)) {
\r
745 //make clip start = last clip's end
\r
746 if (clips[curClip] != undefined) {
\r
747 newout = clips[curClip].inTimeMilli - 1;
\r
751 temp_out = getFormattedTime2(newout);
\r
753 var oldin = getMilliseconds($("#in-time").text())
\r
754 var caption_text = $("#caption-text").val();
\r
756 //set new temp values
\r
757 $("#out-time").css("color","red");
\r
758 $("#out-time").text(temp_out);
\r
760 $("#clip-duration").css("color","red");
\r
761 $("#makeclip").removeAttr("disabled");
\r
762 $("#makeclip").val("Update Clip");
\r
764 //$("#caption-text").val(caption_text);
\r
765 $("#clip-duration").text(getFormattedTime2(newout - oldin));
\r
768 setClipTimeline(newout - oldin, oldin, newout);
\r
769 moveMovieAll(curTime);
\r
770 //$("#out-undo").html("<a href='#' onclick='javascript:clip.undoOut("+milli_outs[curClip-1]+")'><img src='images/bullet_delete.png' alt='cancel out-time' title='cancel out-time' /></a>");
\r
774 /****** making/updating and saving clips **/
\r
776 movie.saveClip = function() {
\r
777 var caption_text = $("#caption-text").val();
\r
780 // button should be disabled but double check that at least one time has changed, or caption text has changed
\r
781 //if (temp_in || temp_out) {
\r
785 temp_in = $("#in-time").text();
\r
788 temp_out = $("#out-time").text();
\r
791 this_location.inTime = temp_in;
\r
792 this_location.outTime = temp_out;
\r
793 this_location.inTimeMilli = getMilliseconds(temp_in);
\r
794 this_location.outTimeMilli = getMilliseconds(temp_out);
\r
796 this_location.durationMilli = this_location.outTimeMilli - this_location.inTimeMilli;
\r
797 this_location.duration = getFormattedTime2(this_location.durationMilli);
\r
798 this_location.caption_text = caption_text;
\r
800 if($("#makeclip").val() == "Make Clip") {
\r
803 if (num_clips > 0) {
\r
804 //add to clips list
\r
805 clips[num_clips-1] = this_location;
\r
807 //sort clips by inTimeMilli
\r
808 clips.sort(function (a,b) { return a.inTimeMilli-b.inTimeMilli});
\r
811 clips = new Array(); //clips
\r
812 clips[0] = this_location;
\r
817 clips[curClip-1] = this_location;
\r
822 var move_to = getMilliseconds(temp_out) + 1;
\r
823 if (move_to < (dur - MIN_CLIP_DUR) ) {
\r
824 setTimeout("moveMovieAll("+move_to+")", 500);
\r
826 setTimeout("moveMovie(curTime)", 500);
\r
837 function deleteClip(clipnum) {
\r
839 clips.splice(clipnum-1, 1);
\r
843 function saveJson() {
\r
845 json = JSON.stringify(proj);
\r
847 $.post("include/workflow.php", { task: 'save_json', json:json, pid:proj.id }, function(data) {
\r
856 var d = new Date();
\r
858 var curr_hour = d.getHours();
\r
859 var curr_min = d.getMinutes();
\r
861 $("#last-saved").text('Last saved at '+curr_hour + ":" + ((curr_min < 10) ? "0" : "") + curr_min);
\r
864 /****************reset UI */
\r
866 function resetClipWork() {
\r
867 $("#in").css("color","black");
\r
868 $("#out").css("color","black");
\r
869 $("#in-time").css("color","black");
\r
870 $("#out-time").css("color","black");
\r
871 $("#clip-duration").css("color","black");
\r
877 $("#makeclip").attr("disabled","disabled");
\r
878 $("#in-undo").html("");
\r
879 $("#out-undo").html("");
\r