django-transcribe 0.8.6__py3-none-any.whl → 0.8.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-transcribe
3
- Version: 0.8.6
3
+ Version: 0.8.7
4
4
  Summary: crowd source transcription
5
5
  Home-page: https://gitlab.com/byuhbll/lib/python/django-transcribe
6
6
  Author: BYU Library Software Engineering
@@ -1,4 +1,4 @@
1
- transcribe/__init__.py,sha256=r34ohxWgkIOyeUWdJBIRYPDHXkuKpDlB3bvtkRmXdxA,78
1
+ transcribe/__init__.py,sha256=Gs7GhqAEXQXLT7_CjvoOv_Lju1JjtHlcM5Z9XIv8Udg,78
2
2
  transcribe/admin.py,sha256=qPLL0XNzK0abIRBVRtjQq8SaEK2gzb_yyshafbxk9B4,6766
3
3
  transcribe/api.py,sha256=2m_y44ilQh87CWksHHqiE4A14javR8omlXEXm65lmC4,74
4
4
  transcribe/apps.py,sha256=XUdPQkCjpqWAKDCIaE6Mh8Q4xN5upKv95MG1u2_5pig,246
@@ -64,8 +64,8 @@ transcribe/static/transcribe/img/stacked_icon_white.png,sha256=U0f7MLamu-wZOFNyJ
64
64
  transcribe/static/transcribe/img/sugarglider1.jpg,sha256=1KtBvAaFhoEZRbu3MHzUOHss7SNQXmcaAJzTqKo19ZE,102169
65
65
  transcribe/static/transcribe/img/sugarglider2.jpg,sha256=X8jmanyYxgQKHnR0wvwcCLJND3JwP6xahgjAzBiwXrI,74549
66
66
  transcribe/static/transcribe/img/sugarglider3.jpg,sha256=bnmXenvSjA_vCV1IexpDLTV4JLrr9sOwEzbd9wpvpnc,373908
67
- transcribe/static/transcribe/js/app.js,sha256=ufgPhPGg1Rl4ITfHEiE7xrhbnuaJWad7xyXtxvmmuZE,18344
68
- transcribe/static/transcribe/js/app.js.map,sha256=piOuczaV8WwY3DEZqQk0OISYyMht9Z98YhVIxtBwees,62083
67
+ transcribe/static/transcribe/js/app.js,sha256=kCp6ymVIlKaZ4EYCaaQfg0LQI6jzvaDFjfjMZ_L9jw4,18086
68
+ transcribe/static/transcribe/js/app.js.map,sha256=qZE87Y9QlnvufqAueKOSx_Ophv-WLUGG3DsuUl137RQ,66105
69
69
  transcribe/static/transcribe/js/lib/formspackage-1.0.js,sha256=t7Te7JoCcoFwlD-dHr3rk7yNwTyxw9DOS8BoQWETJNE,52253
70
70
  transcribe/static/transcribe/js/lib/html5shiv-1.0.js,sha256=WMyuVLi2ElgDggu0xqcOYxfiF9w91ZvheFizRYr-jSQ,1484
71
71
  transcribe/static/transcribe/js/lib/jquery-1.7.1.js,sha256=iBcUE_x23aI6syuqF7EeT_-JFBxjPs5zeFJEXxumwb0,93868
@@ -143,9 +143,9 @@ transcribe/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
143
143
  transcribe/views/mixins.py,sha256=QmFDhWb5VCEaGatLdbsTK72jiBG2OKrlncnz79FUmto,2727
144
144
  transcribe/views/reports.py,sha256=7YD5E6CPsIfWP8hG8IFTek29cM2T29NHuowAdlTAyBs,13408
145
145
  transcribe/views/web.py,sha256=WsejNr0k2_fRTU9XKlwHsxhOB9vFUmoTJtbhkLzWuIc,15363
146
- django_transcribe-0.8.6.dist-info/AUTHORS,sha256=rNmFConshTlNpyhcu4CKZSeQQMwuyVYXbeqXgRko-Yc,640
147
- django_transcribe-0.8.6.dist-info/LICENSE,sha256=I9xp13yeayqZikrv7rQrzsDWviTwy1R0phFlKtM1meg,1472
148
- django_transcribe-0.8.6.dist-info/METADATA,sha256=IzTIlPp0o_ksAQ4syaP8zBhNSaAjjHJb08siEw1XqR8,1021
149
- django_transcribe-0.8.6.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
150
- django_transcribe-0.8.6.dist-info/top_level.txt,sha256=NljSay7zO6czcjqjVmivw6VW58aXlYHVZQvnwmpy08g,11
151
- django_transcribe-0.8.6.dist-info/RECORD,,
146
+ django_transcribe-0.8.7.dist-info/AUTHORS,sha256=rNmFConshTlNpyhcu4CKZSeQQMwuyVYXbeqXgRko-Yc,640
147
+ django_transcribe-0.8.7.dist-info/LICENSE,sha256=I9xp13yeayqZikrv7rQrzsDWviTwy1R0phFlKtM1meg,1472
148
+ django_transcribe-0.8.7.dist-info/METADATA,sha256=5qow5EPzygeP_IFf4RaP4B4pgOoA9LZAOKkdyu9doNc,1021
149
+ django_transcribe-0.8.7.dist-info/WHEEL,sha256=WnJ8fYhv8N4SYVK2lLYNI6N0kVATA7b0piVUNvqIIJE,91
150
+ django_transcribe-0.8.7.dist-info/top_level.txt,sha256=NljSay7zO6czcjqjVmivw6VW58aXlYHVZQvnwmpy08g,11
151
+ django_transcribe-0.8.7.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.2)
2
+ Generator: setuptools (75.3.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
transcribe/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
1
  default_app_config = 'transcribe.apps.transcribeConfig'
2
- __version__ = '0.8.6'
2
+ __version__ = '0.8.7'
@@ -1,2 +1 @@
1
- "use strict";$(document).ready(function(){var r=null,l=null;$(".playButton").click(function(){var t=$("audio")[0];t.paused?t.play():t.pause()}),$("audio").on("play",function(){$(".playButton").removeClass("icon-play"),$(".playButton").addClass("icon-pause")}),$("audio").on("pause",function(){$(".playButton").removeClass("icon-pause"),$(".playButton").addClass("icon-play")}),$("audio").on("canplaythrough",function(t){var e=v($("audio")[0].duration);$(".audioControls .timeDisplay .totalTime").text(e),$(".audioControls .timeDisplay .progress").text("00:00")}),$("audio").on("error",function(t){$(".audioControls .timeDisplay .totalTime").text("--:--"),$(".audioControls .timeDisplay .progress").text("--:--")}),$("audio").on("timeupdate",function(t){var e=v($("audio")[0].currentTime);$(".audioControls .timeDisplay .progress").text(e)});var t,i=!1;$(".seekCursor").mousedown(function(t){i=!0}),$(window).mousemove(function(t){if(i){var e=$(".seekTrack").offset().left,a=($(".seekTrack").width(),t.pageX-e);a<0?$(".seekCursor").css("left",0):a>$(".seekTrack").width()?$(".seekCursor").css("left",$(".seekTrack").width()):$(".seekCursor").css("left",a)}}),$(window).mouseup(function(t){if(i){i=!1;var e=$(".seekCursor").css("left"),a=e.indexOf("px"),s=e.substring(0,a),n=parseFloat(s)/$(".seekTrack").width();$("audio")[0].currentTime=n*$("audio")[0].duration}}),$("audio").on("timeupdate",function(t){if(!i){var e=this.currentTime/this.duration*100;$(this).parent().find(".seekCursor").css("left",e+"%")}}),$(".speedButton").click(function(t){"none"===$(".speedSlider").css("display")?$(".speedSlider").css("display","block"):t.target!==$(".speedSlider")[0]&&$(".speedSlider").css("display","none")}),$(window).click(function(t){t.target!==$(".speedButton")[0]&&t.target!==$(".speedSlider")[0]&&$(".speedSlider").css("display","none")}),0<$("audio").length&&(t=$("audio")[0].playbackRate);var e=100-t/1.5*100;$(".speedCursor").css("top",e+"%");var a,d=!1;$(".speedCursor").mousedown(function(t){d=!0}),$(window).mousemove(function(t){if(d){var e=$(".speedTrack").offset().top,a=($(".speedTrack").height(),t.pageY-e);a<0?$(".speedCursor").css("top",0):a>$(".speedTrack").height()?$(".speedCursor").css("top",$(".speedTrack").height()):$(".speedCursor").css("top",a);var s=$(".speedCursor").css("top"),n=s.indexOf("px"),i=s.substring(0,n),o=parseFloat(i)/$(".speedTrack").height();$("audio")[0].playbackRate=1/(2*o)}}),$(window).mouseup(function(t){d=!1}),$(".volumeButton").click(function(t){"none"===$(".volumeSlider").css("display")?$(".volumeSlider").css("display","block"):t.target!==$(".volumeSlider")[0]&&$(".volumeSlider").css("display","none")}),$(window).click(function(t){t.target!==$(".volumeButton")[0]&&t.target!==$(".volumeSlider")[0]&&$(".volumeSlider").css("display","none")}),0<$("audio").length&&(a=$("audio")[0].playbackRate);e=100-100*a;$(".volumeCursor").css("top",e+"%");var c=!1;$(".volumeCursor").mousedown(function(t){c=!0}),$(window).mousemove(function(t){if(c){var e=$(".volumeTrack").offset().top,a=($(".volumeTrack").height(),t.pageY-e);a<0?$(".volumeCursor").css("top",0):a>$(".volumeTrack").height()?$(".volumeCursor").css("top",$(".volumeTrack").height()):$(".volumeCursor").css("top",a);var s=$(".volumeCursor").css("top"),n=s.indexOf("px"),i=s.substring(0,n),o=parseFloat(i)/$(".volumeTrack").height();$("audio")[0].volume=1-o}}),$(window).mouseup(function(t){c=!1}),$("#serifToggleButton").click(function(t){$("#transcriptionTextArea").hasClass("serif")?($("#transcriptionTextArea").removeClass("serif"),$("#serifToggleInput").val("false")):($("#transcriptionTextArea").addClass("serif"),$("#serifToggleInput").val("true")),$.post($("#serifToggleForm").attr("action"),$("#serifToggleForm").serialize())});var u=!1,p=null,m=null;function s(){$.post($("#resizeTranscriptionForm").attr("action"),$("#resizeTranscriptionForm").serialize())}$(".splitter").mousedown(function(t){u=!0,r=t.pageX,l=t.pageY,p=$(".task .transcript").height(),m=$(".task .transcript").width()}),$(window).mousemove(function(t){if(u)if($(".task").hasClass("stacked")){var e=t.pageY-l,a=p-e,s=$(".task").height()-21;s<a&&(a=s);var n=a.toString()+"px";stackedHeight=n,$(".task .transcript").css("height",n)}else{var i=t.pageX-r,o=(m-i).toString()+"px";unstackedWidth=o,$(".task .transcript").css("width",o)}}),$(window).mouseup(function(){u&&(function(){if($(".task").hasClass("stacked")){var t=$(".task .transcript").innerHeight().toString();$("#transcriptionHeight").val(t)}else{var e=$(".task .transcript").innerWidth().toString();$("#transcriptionWidth").val(e)}}(),s()),u=!1,m=p=l=r=null});$("#previousPageButton").click(function(){C(),taskEdit.currentPage=function(){var t=taskEdit.currentPage,e=taskEdit.pages.indexOf(t)-1;return e<0?t:taskEdit.pages[e]}(),k(),T()}),$("#currentPageButton").click(function(){C(),taskEdit.currentPage=taskEdit.editedPage,b(),T()}),$("#nextPageButton").click(function(){C(),taskEdit.currentPage=function(){var t=taskEdit.currentPage,e=taskEdit.pages.indexOf(t)+1;return e>=taskEdit.pages.length?t:taskEdit.pages[e]}(),k(),T()}),$(".notify > li.success").delay(4e3).fadeOut("slow"),$(".tasks li").click(function(t){t.preventDefault();var e=$(this).find(".title");if(t.target===e[0])window.location=e.attr("href");else{var a=$(this).find(".type").attr("href");window.location=a}}),0==$(".finishedTask").length&&0==$(".skippedTask").length&&$("#transcriptionTextArea").focus(),$("#transcriptionTextArea").bind("paste",function(t){t.preventDefault();var e=t.originalEvent.clipboardData.getData("text/plain");E(e=function(t){return $("<div>").text(t).html()}(e))});var n=!1;$(document).on("click keyup",function(t){17==(t.keyCode||t.which)&&(n=!1),g()}),$(document).on("keydown",function(t){var e=t.keyCode||t.which;if(17==e&&(n=!0),68==e&&1==n)return scrollDown(),!1;if(85==e&&1==n)return scrollUp(),!1;if(0!=$(".finishedTask").length||0!=$(".skippedTask").length);else if(83==e&&1==n)return h(),!1;return 75==e&&1==n?(function(){var t=B();t&&(t.paused?t.play():t.pause())}(),!1):74==e&&1==n?(function(t){var e=B();e&&(t=void 0!==t?t:5,e.currentTime=e.currentTime-t)}(),!1):76==e&&1==n?(function(t){var e=B();e&&(t=void 0!==t?t:5,e.currentTime=e.currentTime+t)}(),!1):void 0}),$("#transcriptionTextArea").on("keydown",function(t){var e=t.key||t.which;"Tab"==e?(t.preventDefault(),E("\t")):"Enter"==e&&(t.preventDefault(),-1==navigator.userAgent.indexOf("AppleWebKit")&&-1==navigator.userAgent.indexOf("MSIE")||"\n"!=$("#transcriptionTextArea").text().slice(-1)&&$("#transcriptionTextArea").append("\n"),-1!=navigator.userAgent.indexOf("AppleWebKit")&&x()&&$("#transcriptionTextArea").scrollTop($("#transcriptionTextArea")[0].scrollHeight),E("\n"),-1==navigator.userAgent.indexOf("AppleWebKit")&&x()&&$("#transcriptionTextArea").scrollTop($("#transcriptionTextArea")[0].scrollHeight))}),$("#transcribeForm #saveButton").click(function(t){return t.preventDefault(),h(),!1}),$("#transcribeForm #finishButton").click(function(t){if(0<$("#transcriptionTextArea span.opts").first().length)return t.preventDefault(),alert('Click the "apply diffs" button before submitting.'),!1;f()}),$("#transcribeForm #skipButton").click(function(t){f()});function o(){$("#transcribeForm").append($("<input type='hidden' />").attr({name:"status",id:"userTaskStatus",value:"in progress"}))}var f=function(){$("#transcribeForm").append($("<input type='hidden' />").attr({name:"transcription",id:"userTranscriptionFormInput",value:$("#transcriptionTextArea").html().replace("<br>","")}))},h=function(){$("#transcribeForm #saveButton").removeClass("saved"),$("#transcribeForm #saveButton").removeClass("failedToSave"),$("#transcribeForm #saveButton").addClass("saving"),f(),o(),$.post($("#transcribeForm").attr("action"),$("#transcribeForm").serialize()).done(function(t){"success"===t.status?(setTimeout(function(){$("#transcribeForm #saveButton").removeClass("saving")},500),$("#transcribeForm #saveButton").removeClass("failedToSave"),$("#transcribeForm #saveButton").addClass("saved")):(setTimeout(function(){$("#transcribeForm #saveButton").removeClass("saving")},500),$("#transcribeForm #saveButton").removeClass("saved"),$("#transcribeForm #saveButton").addClass("failedToSave"),alert("Error: Unable to save.")),$("#transcriptionTextArea").focus()}),$("#userTranscriptionFormInput").remove(),$("#userTaskStatus").remove()};$("a.saveTranscription").click(function(){return 0==$("#transcribeForm").length||(0!=$(".finishedTask").length||0!=$(".skippedTask").length||(f(),o(),h(),window.location=$(this).attr("href"),!1))}),$("a#toggle").click(function(){return!1}),0==$(".finishedTask").length&&0==$(".skippedTask").length||($("li.finishButton").hide(),$("li.skipButton").hide(),$("li.saveButton").hide()),$("a.reOpenUserTask").click(function(){return event.preventDefault(),$("li.finishButton").show(),$("li.skipButton").show(),$("li.saveButton").show(),$("div.notouch").remove(),$("#transcriptionTextArea").focus(),!1}),$("#toggleLayout").click(function(){return $(".task").hasClass("stacked")?$(".task").hasClass("stacked")&&($("#transcriptionStacked").val("false"),s(),$(".task").removeClass("stacked"),$(".task .transcript").css("height","100%"),$(".task .transcript").css("width",unstackedWidth)):($("#transcriptionStacked").val("true"),s(),$(".task").addClass("stacked"),$(".task .transcript").css("width","100%"),$(".task .transcript").css("height",stackedHeight)),!1}),"boolean"==typeof stacked&&(stacked?($(".task").addClass("stacked"),$("a#stacked").addClass("selected"),$("a#sidebyside").removeClass("selected"),$(".task .transcript").css("height",stackedHeight),$(".task .transcript").css("width","100%")):($(".task").removeClass("stacked"),$("a#stacked").removeClass("selected"),$("a#sidebyside").addClass("selected"),$(".task .transcript").css("height","100%"),$(".task .transcript").css("width",unstackedWidth))),$("span.opt").click(function(t){$(this).hide(0),$(this).addClass("optHidden"),0==$(this).next(".opt").length?($(this).siblings(".opt").first().removeClass("optHidden"),$(this).siblings(".opt").first().hide(0),$(this).siblings(".opt").first().fadeIn(250)):($(this).next(".opt").removeClass("optHidden"),$(this).next(".opt").hide(0),$(this).next(".opt").fadeIn(250)),$(this).siblings(".opt").first().css("display","inline")}),0<$("#transcriptionTextArea span.opts").first().length&&($(".tags button").hide(),$(".tags h3").hide(),$(".tags").append('<div id="diffInstructions"><p class="instructions">Click highlighted areas to choose diffs, or <a id="flipDiffs">flip all diffs</a>.</p><button id="applyDiffs">apply diffs</button></div>')),$("#flipDiffs").click(function(t){$("span.opts span.opt.optHidden").addClass("show"),$("span.opts span.opt").not(".optHidden").addClass("hide"),$("span.opts span.opt.show").css("display","inline"),$("span.opts span.opt.hide").css("display","none"),$("span.opts span.opt.show").removeClass("optHidden"),$("span.opts span.opt.show").removeClass("show"),$("span.opts span.opt.hide").addClass("optHidden"),$("span.opts span.opt.hide").removeClass("hide")}),$("button#applyDiffs").click(function(t){$(".optHidden").remove(),$(".optEmpty").remove(),$(".opt").contents().unwrap(),$(".opts").contents().unwrap(),$(".opts").remove(),$(".tags button").show(),$(".tags h2").show(),$("#diffInstructions").remove()});var g=function(){if(S("name","type","person")?$("button[buttonName='Person']").addClass("applied"):$("button[buttonName='Person']").removeClass("applied"),S("name","type","place")?$("button[buttonName='Place']").addClass("applied"):$("button[buttonName='Place']").removeClass("applied"),S("date")){$("button[buttonName='Date']").addClass("applied");var t=D(),e=$(t).closest("date").attr("when");$("button[buttonName='Date']").html("Date: "+e)}else $("button[buttonName='Date']").removeClass("applied"),$("button[buttonName='Date']").html("Date");S("TEIhead")?$("button[buttonName='Heading']").addClass("applied"):$("button[buttonName='Heading']").removeClass("applied"),S("q")?$("button[buttonName='Quote']").addClass("applied"):$("button[buttonName='Quote']").removeClass("applied"),S("add")?$("button[buttonName='Add']").addClass("applied"):$("button[buttonName='Add']").removeClass("applied"),S("del","rend","overstrike")?$("button[buttonName='Del']").addClass("applied"):$("button[buttonName='Del']").removeClass("applied"),S("note","place","margin")?$("button[buttonName='Note']").addClass("applied"):$("button[buttonName='Note']").removeClass("applied"),S("unclear","reason","illegible")?$("button[buttonName='Unclear']").addClass("applied"):$("button[buttonName='Unclear']").removeClass("applied"),S("hi","rend","underline")?$("button[buttonName='Underline']").addClass("applied"):$("button[buttonName='Underline']").removeClass("applied"),S("hi","rend","bold")?$("button[buttonName='Bold']").addClass("applied"):$("button[buttonName='Bold']").removeClass("applied"),S("hi","rend","italic")?$("button[buttonName='Italic']").addClass("applied"):$("button[buttonName='Italic']").removeClass("applied"),S("hi","rend","sup")?$("button[buttonName='Superscript']").addClass("applied"):$("button[buttonName='Superscript']").removeClass("applied"),S("hi","rend","sub")?$("button[buttonName='Subscript']").addClass("applied"):$("button[buttonName='Subscript']").removeClass("applied")};function v(t){var e=Math.floor(t/60).toString();1==e.length&&(e="0"+e);var a=Math.floor(t%60).toString();return 1==a.length&&(a="0"+a),e+":"+a}function k(){taskEdit.currentPage===taskEdit.editedPage?b():($("#transcriptDimmer").css("display","block"),$("#transcriptionTextArea").attr("contenteditable",!1))}function b(){$("#transcriptDimmer").css("display","none"),$("#transcriptionTextArea").attr("contenteditable",!0)}function C(){var t=taskEdit.currentPage;t.scrollLeft=$(t.figure).scrollLeft(),t.scrollTop=$(t.figure).scrollTop()}function T(){var t=taskEdit.currentPage;void 0===t.image?t.loadImage(function(){w(t.figure)}):t.figure!==$(".task .source figure").first()&&(w(t.figure),$(t.figure).scrollLeft(t.scrollLeft),$(t.figure).scrollTop(t.scrollTop))}function w(t){$(".task .source figure").first().remove(),$(".task .source").append(t)}$("button[class='insertTags']").click(function(t){t.preventDefault();if(!$(this).hasClass("applied")){var e=rangy.getSelection().toHtml();if(""==e)return!1;if("Person"==$(this).attr("buttonName")&&E('<name type="person">'+e+"</name>"),"Place"==$(this).attr("buttonName")&&E('<name type="place">'+e+"</name>"),"Date"==$(this).attr("buttonName")){var a=prompt("Enter a formatted date (YYYY-MM-DD):","YYYY-MM-DD");if(""===a||"YYYY-MM-DD"===a)return!1;E('<date when="'+a+'">'+e+"</date>")}"Heading"==$(this).attr("buttonName")&&E("<TEIhead>"+e+"</TEIhead>"),"Quote"==$(this).attr("buttonName")&&E("<q>"+e+"</q>"),"Add"==$(this).attr("buttonName")&&E("<add>"+e+"</add>"),"Del"==$(this).attr("buttonName")&&E('<del rend="overstrike">'+e+"</del>"),"Note"==$(this).attr("buttonName")&&E('<note place="margin">'+e+"</note>"),"Unclear"==$(this).attr("buttonName")&&E('<unclear reason="illegible">'+e+"</unclear>"),"Page #"==$(this).attr("buttonName")&&E('\n<pb n="'+e+'"/>'),"Underline"==$(this).attr("buttonName")&&E('<hi rend="underline">'+e+"</hi>"),"Bold"==$(this).attr("buttonName")&&E('<hi rend="bold">'+e+"</hi>"),"Italic"==$(this).attr("buttonName")&&E('<hi rend="italic">'+e+"</hi>"),"Superscript"==$(this).attr("buttonName")&&E('<hi rend="sup">'+e+"</hi>"),"Subscript"==$(this).attr("buttonName")&&E('<hi rend="sub">'+e+"</hi>")}}),$("button[class='insertTags']").click(function(t){if($(this).hasClass("applied")){var e=$(this).attr("buttonName"),a=D();switch(e){case"Person":a=$(a).closest("name[type='person']");break;case"Place":a=$(a).closest("name[type='place']");break;case"Date":a=$(a).closest("date");break;case"Heading":a=$(a).closest("TEIhead");break;case"Quote":a=$(a).closest("q");break;case"Add":a=$(a).closest("add");break;case"Del":a=$(a).closest("del[rend='overstrike']");break;case"Note":a=$(a).closest("note[place='margin']");break;case"Unclear":a=$(a).closest("unclear[reason='illegible']");break;case"Underline":a=$(a).closest("hi[rend='underline']");break;case"Bold":a=$(a).closest("hi[rend='bold']");break;case"Italic":a=$(a).closest("hi[rend='italic']");break;case"Superscript":a=$(a).closest("hi[rend='sup']");break;case"Subscript":a=$(a).closest("hi[rend='sub']");break;default:return!1}a&&$(a).contents().unwrap()}});var y={loadImage:function(t){var e=$(new Image);e.attr("draggable",!1),e.attr("src",this.url);var a=this;e.on("load",function(){$(a.figure).append(e),a.image=e,t()})}};if("undefined"!=typeof taskEdit)for(var N=0;N<taskEdit.pages.length;N++)Object.setPrototypeOf(taskEdit.pages[N],y);function x(){var t,e,a=$("#transcriptionTextArea").get(0),s=!1;if(window.getSelection){var n=window.getSelection();n.rangeCount&&((e=(t=n.getRangeAt(0)).cloneRange()).selectNodeContents(a),e.setEnd(t.startContainer,t.startOffset),""==e.toString(),e.selectNodeContents(a),e.setStart(t.endContainer,t.endOffset),s=""==e.toString()||"\n"==e.toString())}else document.selection&&"Control"!=document.selection.type&&((e=(t=document.selection.createRange()).duplicate()).moveToElementText(a),e.setEndPoint("EndToStart",t),""==e.text,e.moveToElementText(a),e.setEndPoint("StartToEnd",t),s=""==e.text||"\n"==e.text);return s}function S(t,e,a){var s=D();for(t=t.toUpperCase();s;){if(1==s.nodeType)if(void 0===e||void 0===a){if(s.tagName==t)return!0}else if(s.tagName==t&&s.attributes.getNamedItem(e).value==a)return!0;s=s.parentNode}return!1}function D(){return function(t){var e=t.commonAncestorContainer;3==e.nodeType&&(e=e.parentNode);return e}(rangy.getSelection().getRangeAt(0))}function E(t){var e,a;if(window.getSelection){if((e=window.getSelection()).getRangeAt&&e.rangeCount){(a=e.getRangeAt(0)).deleteContents();var s=document.createElement("div");s.innerHTML=t;for(var n,i,o=document.createDocumentFragment();n=s.firstChild;)i=o.appendChild(n);a.insertNode(o),i&&((a=a.cloneRange()).setStartAfter(i),a.collapse(!0),e.removeAllRanges(),e.addRange(a))}}else document.selection&&"Control"!=document.selection.type&&document.selection.createRange().pasteHTML(t)}function B(){var t=!1;return document.getElementsByTagName("audio")[0]?t=document.getElementsByTagName("audio")[0]:document.getElementsByTagName("video")[0]&&(t=document.getElementsByTagName("video")[0]),t}});
2
- //# sourceMappingURL=app.js.map
1
+ $(document).ready(function(){var t,s=null,n=null,o=($(".playButton").click(function(){var t=$("audio")[0];t.paused?t.play():t.pause()}),$("audio").on("play",function(){$(".playButton").removeClass("icon-play"),$(".playButton").addClass("icon-pause")}),$("audio").on("pause",function(){$(".playButton").removeClass("icon-pause"),$(".playButton").addClass("icon-play")}),$("audio").on("canplaythrough",function(t){var e=g($("audio")[0].duration);$(".audioControls .timeDisplay .totalTime").text(e),$(".audioControls .timeDisplay .progress").text("00:00")}),$("audio").on("error",function(t){$(".audioControls .timeDisplay .totalTime").text("--:--"),$(".audioControls .timeDisplay .progress").text("--:--")}),$("audio").on("timeupdate",function(t){var e=g($("audio")[0].currentTime);$(".audioControls .timeDisplay .progress").text(e)}),!1),e=($(".seekCursor").mousedown(function(t){o=!0}),$(window).mousemove(function(t){var e;o&&(e=$(".seekTrack").offset().left,$(".seekTrack").width(),(t=t.pageX-e)<0?$(".seekCursor").css("left",0):t>$(".seekTrack").width()?$(".seekCursor").css("left",$(".seekTrack").width()):$(".seekCursor").css("left",t))}),$(window).mouseup(function(t){var e,a;o&&(o=!1,a=(e=$(".seekCursor").css("left")).indexOf("px"),e=e.substring(0,a),a=parseFloat(e)/$(".seekTrack").width(),$("audio")[0].currentTime=a*$("audio")[0].duration)}),$("audio").on("timeupdate",function(t){var e;o||(e=this.currentTime/this.duration*100,$(this).parent().find(".seekCursor").css("left",e+"%"))}),$(".speedButton").click(function(t){"none"===$(".speedSlider").css("display")?$(".speedSlider").css("display","block"):t.target!==$(".speedSlider")[0]&&$(".speedSlider").css("display","none")}),$(window).click(function(t){t.target!==$(".speedButton")[0]&&t.target!==$(".speedSlider")[0]&&$(".speedSlider").css("display","none")}),100-(e=0<$("audio").length?$("audio")[0].playbackRate:e)/1.5*100),a=($(".speedCursor").css("top",e+"%"),!1);$(".speedCursor").mousedown(function(t){a=!0}),$(window).mousemove(function(t){var e;a&&(e=$(".speedTrack").offset().top,$(".speedTrack").height(),(t=t.pageY-e)<0?$(".speedCursor").css("top",0):t>$(".speedTrack").height()?$(".speedCursor").css("top",$(".speedTrack").height()):$(".speedCursor").css("top",t),t=(e=$(".speedCursor").css("top")).indexOf("px"),e=e.substring(0,t),t=parseFloat(e)/$(".speedTrack").height(),$("audio")[0].playbackRate=1/(2*t))}),$(window).mouseup(function(t){a=!1}),$(".volumeButton").click(function(t){"none"===$(".volumeSlider").css("display")?$(".volumeSlider").css("display","block"):t.target!==$(".volumeSlider")[0]&&$(".volumeSlider").css("display","none")}),$(window).click(function(t){t.target!==$(".volumeButton")[0]&&t.target!==$(".volumeSlider")[0]&&$(".volumeSlider").css("display","none")});var e=100-100*(t=0<$("audio").length?$("audio")[0].playbackRate:t),i=($(".volumeCursor").css("top",e+"%"),!1),r=($(".volumeCursor").mousedown(function(t){i=!0}),$(window).mousemove(function(t){var e;i&&(e=$(".volumeTrack").offset().top,$(".volumeTrack").height(),(t=t.pageY-e)<0?$(".volumeCursor").css("top",0):t>$(".volumeTrack").height()?$(".volumeCursor").css("top",$(".volumeTrack").height()):$(".volumeCursor").css("top",t),t=(e=$(".volumeCursor").css("top")).indexOf("px"),e=e.substring(0,t),t=parseFloat(e)/$(".volumeTrack").height(),$("audio")[0].volume=1-t)}),$(window).mouseup(function(t){i=!1}),$("#serifToggleButton").click(function(t){$("#transcriptionTextArea").hasClass("serif")?($("#transcriptionTextArea").removeClass("serif"),$("#serifToggleInput").val("false")):($("#transcriptionTextArea").addClass("serif"),$("#serifToggleInput").val("true")),$.post($("#serifToggleForm").attr("action"),$("#serifToggleForm").serialize())}),!1),l=null,d=null;function c(){$.post($("#resizeTranscriptionForm").attr("action"),$("#resizeTranscriptionForm").serialize())}$(".splitter").mousedown(function(t){r=!0,s=t.pageX,n=t.pageY,l=$(".task .transcript").height(),d=$(".task .transcript").width()}),$(window).mousemove(function(t){var e,a;r&&($(".task").hasClass("stacked")?(e=t.pageY-n,e=l-e,a=(e=(a=$(".task").height()-21)<e?a:e).toString()+"px",stackedHeight=a,$(".task .transcript").css("height",a)):(e=t.pageX-s,a=(d-e).toString()+"px",unstackedWidth=a,$(".task .transcript").css("width",a)))}),$(window).mouseup(function(){var t;r&&($(".task").hasClass("stacked")?(t=$(".task .transcript").innerHeight().toString(),$("#transcriptionHeight").val(t)):(t=$(".task .transcript").innerWidth().toString(),$("#transcriptionWidth").val(t)),c()),r=!1,d=l=n=s=null});function u(){$("#transcribeForm").append($("<input type='hidden' />").attr({name:"status",id:"userTaskStatus",value:"in progress"}))}$("#previousPageButton").click(function(){var t,e;b(),taskEdit.currentPage=(t=taskEdit.currentPage,(e=taskEdit.pages.indexOf(t)-1)<0?t:taskEdit.pages[e]),v(),C()}),$("#currentPageButton").click(function(){b(),taskEdit.currentPage=taskEdit.editedPage,k(),C()}),$("#nextPageButton").click(function(){var t,e;b(),taskEdit.currentPage=(t=taskEdit.currentPage,(e=taskEdit.pages.indexOf(t)+1)>=taskEdit.pages.length?t:taskEdit.pages[e]),v(),C()}),$(".notify > li.success").delay(4e3).fadeOut("slow"),$(".tasks li").click(function(t){t.preventDefault();var e=$(this).find(".title");t.target===e[0]?window.location=e.attr("href"):(t=$(this).find(".type").attr("href"),window.location=t)}),0==$(".finishedTask").length&&0==$(".skippedTask").length&&$("#transcriptionTextArea").focus(),$("#transcriptionTextArea").bind("paste",function(t){t.preventDefault();var t=t.originalEvent.clipboardData.getData("text/plain");t=t,D($("<div>").text(t).html())});var p=!1,m=($(document).on("click keyup",function(t){17==(t.keyCode||t.which)&&(p=!1),h()}),$(document).on("keydown",function(t){var e,a,s,t=t.keyCode||t.which;return 17==t&&(p=!0),68==t&&1==p?(scrollDown(),!1):85==t&&1==p?(scrollUp(),!1):0==$(".finishedTask").length&&0==$(".skippedTask").length&&83==t&&1==p?(f(),!1):75==t&&1==p?((e=E())&&(e.paused?e.play():e.pause()),!1):74==t&&1==p?((e=E())&&(s=void 0!==s?s:5,e.currentTime=e.currentTime-s),!1):76==t&&1==p?((s=E())&&(a=void 0!==a?a:5,s.currentTime=s.currentTime+a),!1):void 0}),$("#transcriptionTextArea").on("keydown",function(t){var e=t.key||t.which;"Tab"==e?(t.preventDefault(),D("\t")):"Enter"==e&&(t.preventDefault(),-1==navigator.userAgent.indexOf("AppleWebKit")&&-1==navigator.userAgent.indexOf("MSIE")||"\n"!=$("#transcriptionTextArea").text().slice(-1)&&$("#transcriptionTextArea").append("\n"),-1!=navigator.userAgent.indexOf("AppleWebKit")&&N()&&$("#transcriptionTextArea").scrollTop($("#transcriptionTextArea")[0].scrollHeight),D("\n"),-1==navigator.userAgent.indexOf("AppleWebKit"))&&N()&&$("#transcriptionTextArea").scrollTop($("#transcriptionTextArea")[0].scrollHeight)}),$("#transcribeForm #saveButton").click(function(t){return t.preventDefault(),f(),!1}),$("#transcribeForm #finishButton").click(function(t){if(0<$("#transcriptionTextArea span.opts").first().length)return t.preventDefault(),alert('Click the "apply diffs" button before submitting.'),!1;m()}),$("#transcribeForm #skipButton").click(function(t){m()}),function(){$("#transcribeForm").append($("<input type='hidden' />").attr({name:"transcription",id:"userTranscriptionFormInput",value:$("#transcriptionTextArea").html().replace("<br>","")}))}),f=function(){$("#transcribeForm #saveButton").removeClass("saved"),$("#transcribeForm #saveButton").removeClass("failedToSave"),$("#transcribeForm #saveButton").addClass("saving"),m(),u(),$.post($("#transcribeForm").attr("action"),$("#transcribeForm").serialize()).done(function(t){"success"===t.status?(setTimeout(function(){$("#transcribeForm #saveButton").removeClass("saving")},500),$("#transcribeForm #saveButton").removeClass("failedToSave"),$("#transcribeForm #saveButton").addClass("saved")):(setTimeout(function(){$("#transcribeForm #saveButton").removeClass("saving")},500),$("#transcribeForm #saveButton").removeClass("saved"),$("#transcribeForm #saveButton").addClass("failedToSave"),alert("Error: Unable to save.")),$("#transcriptionTextArea").focus()}),$("#userTranscriptionFormInput").remove(),$("#userTaskStatus").remove()},h=($("a.saveTranscription").click(function(){return 0==$("#transcribeForm").length||0!=$(".finishedTask").length||0!=$(".skippedTask").length||(m(),u(),f(),window.location=$(this).attr("href"),!1)}),$("a#toggle").click(function(){return!1}),0==$(".finishedTask").length&&0==$(".skippedTask").length||($("li.finishButton").hide(),$("li.skipButton").hide(),$("li.saveButton").hide()),$("a.reOpenUserTask").click(function(){return event.preventDefault(),$("li.finishButton").show(),$("li.skipButton").show(),$("li.saveButton").show(),$("div.notouch").remove(),$("#transcriptionTextArea").focus(),!1}),$("#toggleLayout").click(function(){return $(".task").hasClass("stacked")?$(".task").hasClass("stacked")&&($("#transcriptionStacked").val("false"),c(),$(".task").removeClass("stacked"),$(".task .transcript").css("height","100%"),$(".task .transcript").css("width",unstackedWidth)):($("#transcriptionStacked").val("true"),c(),$(".task").addClass("stacked"),$(".task .transcript").css("width","100%"),$(".task .transcript").css("height",stackedHeight)),!1}),"boolean"==typeof stacked&&(stacked?($(".task").addClass("stacked"),$("a#stacked").addClass("selected"),$("a#sidebyside").removeClass("selected"),$(".task .transcript").css("height",stackedHeight),$(".task .transcript").css("width","100%")):($(".task").removeClass("stacked"),$("a#stacked").removeClass("selected"),$("a#sidebyside").addClass("selected"),$(".task .transcript").css("height","100%"),$(".task .transcript").css("width",unstackedWidth))),$("span.opt").click(function(t){$(this).hide(0),$(this).addClass("optHidden"),(0==$(this).next(".opt").length?($(this).siblings(".opt").first().removeClass("optHidden"),$(this).siblings(".opt").first().hide(0),$(this).siblings(".opt").first()):($(this).next(".opt").removeClass("optHidden"),$(this).next(".opt").hide(0),$(this).next(".opt"))).fadeIn(250),$(this).siblings(".opt").first().css("display","inline")}),0<$("#transcriptionTextArea span.opts").first().length&&($(".tags button").hide(),$(".tags h3").hide(),$(".tags").append('<div id="diffInstructions"><p class="instructions">Click highlighted areas to choose diffs, or <a id="flipDiffs">flip all diffs</a>.</p><button id="applyDiffs">apply diffs</button></div>')),$("#flipDiffs").click(function(t){$("span.opts span.opt.optHidden").addClass("show"),$("span.opts span.opt").not(".optHidden").addClass("hide"),$("span.opts span.opt.show").css("display","inline"),$("span.opts span.opt.hide").css("display","none"),$("span.opts span.opt.show").removeClass("optHidden"),$("span.opts span.opt.show").removeClass("show"),$("span.opts span.opt.hide").addClass("optHidden"),$("span.opts span.opt.hide").removeClass("hide")}),$("button#applyDiffs").click(function(t){$(".optHidden").remove(),$(".optEmpty").remove(),$(".opt").contents().unwrap(),$(".opts").contents().unwrap(),$(".opts").remove(),$(".tags button").show(),$(".tags h2").show(),$("#diffInstructions").remove()}),function(){var t;x("name","type","person")?$("button[buttonName='Person']").addClass("applied"):$("button[buttonName='Person']").removeClass("applied"),x("name","type","place")?$("button[buttonName='Place']").addClass("applied"):$("button[buttonName='Place']").removeClass("applied"),x("date")?($("button[buttonName='Date']").addClass("applied"),t=S(),t=$(t).closest("date").attr("when"),$("button[buttonName='Date']").html("Date: "+t)):($("button[buttonName='Date']").removeClass("applied"),$("button[buttonName='Date']").html("Date")),x("TEIhead")?$("button[buttonName='Heading']").addClass("applied"):$("button[buttonName='Heading']").removeClass("applied"),x("q")?$("button[buttonName='Quote']").addClass("applied"):$("button[buttonName='Quote']").removeClass("applied"),x("add")?$("button[buttonName='Add']").addClass("applied"):$("button[buttonName='Add']").removeClass("applied"),x("del","rend","overstrike")?$("button[buttonName='Del']").addClass("applied"):$("button[buttonName='Del']").removeClass("applied"),x("note","place","margin")?$("button[buttonName='Note']").addClass("applied"):$("button[buttonName='Note']").removeClass("applied"),x("unclear","reason","illegible")?$("button[buttonName='Unclear']").addClass("applied"):$("button[buttonName='Unclear']").removeClass("applied"),x("hi","rend","underline")?$("button[buttonName='Underline']").addClass("applied"):$("button[buttonName='Underline']").removeClass("applied"),x("hi","rend","bold")?$("button[buttonName='Bold']").addClass("applied"):$("button[buttonName='Bold']").removeClass("applied"),x("hi","rend","italic")?$("button[buttonName='Italic']").addClass("applied"):$("button[buttonName='Italic']").removeClass("applied"),x("hi","rend","sup")?$("button[buttonName='Superscript']").addClass("applied"):$("button[buttonName='Superscript']").removeClass("applied"),x("hi","rend","sub")?$("button[buttonName='Subscript']").addClass("applied"):$("button[buttonName='Subscript']").removeClass("applied")});function g(t){var e=Math.floor(t/60).toString(),t=(1==e.length&&(e="0"+e),Math.floor(t%60).toString());return e+":"+(t=1==t.length?"0"+t:t)}function v(){taskEdit.currentPage===taskEdit.editedPage?k():($("#transcriptDimmer").css("display","block"),$("#transcriptionTextArea").attr("contenteditable",!1))}function k(){$("#transcriptDimmer").css("display","none"),$("#transcriptionTextArea").attr("contenteditable",!0)}function b(){var t=taskEdit.currentPage;t.scrollLeft=$(t.figure).scrollLeft(),t.scrollTop=$(t.figure).scrollTop()}function C(){var t=taskEdit.currentPage;void 0===t.image?t.loadImage(function(){T(t.figure)}):t.figure!==$(".task .source figure").first()&&(T(t.figure),$(t.figure).scrollLeft(t.scrollLeft),$(t.figure).scrollTop(t.scrollTop))}function T(t){$(".task .source figure").first().remove(),$(".task .source").append(t)}$("button[class='insertTags']").click(function(t){t.preventDefault();if(!$(this).hasClass("applied")){t=rangy.getSelection().toHtml();if(""==t)return!1;if("Person"==$(this).attr("buttonName")&&D('<name type="person">'+t+"</name>"),"Place"==$(this).attr("buttonName")&&D('<name type="place">'+t+"</name>"),"Date"==$(this).attr("buttonName")){var e=prompt("Enter a formatted date (YYYY-MM-DD):","YYYY-MM-DD");if(""===e||"YYYY-MM-DD"===e)return!1;D('<date when="'+e+'">'+t+"</date>")}"Heading"==$(this).attr("buttonName")&&D("<TEIhead>"+t+"</TEIhead>"),"Quote"==$(this).attr("buttonName")&&D("<q>"+t+"</q>"),"Add"==$(this).attr("buttonName")&&D("<add>"+t+"</add>"),"Del"==$(this).attr("buttonName")&&D('<del rend="overstrike">'+t+"</del>"),"Note"==$(this).attr("buttonName")&&D('<note place="margin">'+t+"</note>"),"Unclear"==$(this).attr("buttonName")&&D('<unclear reason="illegible">'+t+"</unclear>"),"Page #"==$(this).attr("buttonName")&&D('\n<pb n="'+t+'"/>'),"Underline"==$(this).attr("buttonName")&&D('<hi rend="underline">'+t+"</hi>"),"Bold"==$(this).attr("buttonName")&&D('<hi rend="bold">'+t+"</hi>"),"Italic"==$(this).attr("buttonName")&&D('<hi rend="italic">'+t+"</hi>"),"Superscript"==$(this).attr("buttonName")&&D('<hi rend="sup">'+t+"</hi>"),"Subscript"==$(this).attr("buttonName")&&D('<hi rend="sub">'+t+"</hi>")}}),$("button[class='insertTags']").click(function(t){if($(this).hasClass("applied")){var e=$(this).attr("buttonName"),a=S();switch(e){case"Person":a=$(a).closest("name[type='person']");break;case"Place":a=$(a).closest("name[type='place']");break;case"Date":a=$(a).closest("date");break;case"Heading":a=$(a).closest("TEIhead");break;case"Quote":a=$(a).closest("q");break;case"Add":a=$(a).closest("add");break;case"Del":a=$(a).closest("del[rend='overstrike']");break;case"Note":a=$(a).closest("note[place='margin']");break;case"Unclear":a=$(a).closest("unclear[reason='illegible']");break;case"Underline":a=$(a).closest("hi[rend='underline']");break;case"Bold":a=$(a).closest("hi[rend='bold']");break;case"Italic":a=$(a).closest("hi[rend='italic']");break;case"Superscript":a=$(a).closest("hi[rend='sup']");break;case"Subscript":a=$(a).closest("hi[rend='sub']");break;default:return!1}a&&$(a).contents().unwrap()}});var w={loadImage:function(t){var e=$(new Image),a=(e.attr("draggable",!1),e.attr("crossorigin","anonymous"),e.attr("src",this.url),this);e.on("load",function(){$(a.figure).append(e),a.image=e,t()})}};if("undefined"!=typeof taskEdit)for(var y=0;y<taskEdit.pages.length;y++)Object.setPrototypeOf(taskEdit.pages[y],w);function N(){var t,e,a,s=$("#transcriptionTextArea").get(0),n=!1;return window.getSelection?(a=window.getSelection()).rangeCount&&((e=(t=a.getRangeAt(0)).cloneRange()).selectNodeContents(s),e.setEnd(t.startContainer,t.startOffset),e.toString(),e.selectNodeContents(s),e.setStart(t.endContainer,t.endOffset),n=""==e.toString()||"\n"==e.toString()):document.selection&&"Control"!=document.selection.type&&((e=(t=document.selection.createRange()).duplicate()).moveToElementText(s),e.setEndPoint("EndToStart",t),e.text,e.moveToElementText(s),e.setEndPoint("StartToEnd",t),n=""==e.text||"\n"==e.text),n}function x(t,e,a){var s=S();for(t=t.toUpperCase();s;){if(1==s.nodeType)if(void 0===e||void 0===a){if(s.tagName==t)return 1}else if(s.tagName==t&&s.attributes.getNamedItem(e).value==a)return 1;s=s.parentNode}}function S(){var t=rangy.getSelection().getRangeAt(0);return t=3==(t=t.commonAncestorContainer).nodeType?t.parentNode:t}function D(t){var e,a;if(window.getSelection){if((e=window.getSelection()).getRangeAt&&e.rangeCount){(a=e.getRangeAt(0)).deleteContents();for(var s,n,o=document.createElement("div"),i=(o.innerHTML=t,document.createDocumentFragment());s=o.firstChild;)n=i.appendChild(s);a.insertNode(i),n&&((a=a.cloneRange()).setStartAfter(n),a.collapse(!0),e.removeAllRanges(),e.addRange(a))}}else document.selection&&"Control"!=document.selection.type&&document.selection.createRange().pasteHTML(t)}function E(){var t=!1;return document.getElementsByTagName("audio")[0]?t=document.getElementsByTagName("audio")[0]:document.getElementsByTagName("video")[0]&&(t=document.getElementsByTagName("video")[0]),t}});//# sourceMappingURL=app.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["app.js"],"names":["$","document","ready","prevPageX","prevPageY","click","audio","play","pause","on","removeClass","addClass","e","timeString","getMMSS","duration","text","currentTime","speed","draggingSeekCursor","mousedown","window","mousemove","leftBound","offset","left","cursorX","width","pageX","css","mouseup","index","leftPositionCSS","indexOf","leftPositionStr","substring","positionRatio","leftPosition","trackWidth","percentPosition","this","parent","find","$seekCursor","target","length","playbackRate","percentFromTop","volume","draggingSpeedCursor","topBound","top","cursorY","height","pageY","topPositionCSS","topPositionStr","topPosition","trackHeight","draggingVolumeCursor","mouseY","parseFloat","hasClass","val","attr","serialize","draggingSplitter","startHeight","startWidth","sendTranscriptionForm","post","mouseDeltaY","newHeight","maxHeight","newHeightCss","toString","stackedHeight","newWidthCss","unstackedWidth","setTranscriptionFormFields","saveTranscriptionSize","innerHeight","heightStr","widthStr","innerWidth","savePageInfo","taskEdit","currentPage","previousIndex","pages","totalSeconds","minutes","seconds","Math","floor","updatePageImage","editedPage","nextIndex","updateTranscriptEditable","unblockTranscription","getNextPage","fadeOut","projectLink","location","url","preventDefault","focus","originalEvent","clipboardData","getData","insertHtmlAtCursor","html","htmlEncode","isCtrl","keyCode","which","showActiveTags","scrollUp","myMedia","getRangeContainerNode","paused","containerNode","playPause","saveTranscription","sel","getSelection","getMyMedia","range","deleteContents","jumpBackward","jumpForward","key","navigator","userAgent","slice","append","cursorIsAtEnd","scrollTop","scrollHeight","event","first","alert","addTranscriptionToForm","addStatusInProgrssToForm","name","value","id","replace","done","data","setTimeout","remove","hide","show","stacked","next","siblings","fadeIn","not","contents","unwrap","isCursorInsideElement","getCursorContainerNode","formattedDate","closest","scrollLeft","figure","image","loadImage","setPageFigure","selectedText","rangy","toHtml","closeTag","dateFormatted","prompt","buttonName","pagePrototype","callback","Image","that","currentIndex","i","Object","testRange","get","atEnd","rangeCount","selRange","getRangeAt","cloneRange","setPrototypeOf","el","setEnd","startContainer","startOffset","selectNodeContents","endContainer","endOffset","selection","type","createRange","moveToElementText","date","setEndPoint","escape","readCookie","attributeType","attributeValue","tagName","toUpperCase","c","nameEQ","attributes","getNamedItem","eraseCookie","parentNode","createElement","nodeType","frag","createDocumentFragment","node","firstChild","insertNode","setStartAfter","lastNode","collapse","removeAllRanges","addRange","pasteHTML","setSingleRange","getElementsByTagName"],"mappings":"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","file":"app.js","sourcesContent":["$(document).ready(function() { // start $(document).ready\n\n\t// !variables for keeping track of mouse\n\tvar prevPageX = null;\n\tvar prevPageY = null;\n\n\t// !audio element play/pause button\n\t$('.playButton').click(function() {\n\t\tvar audio = $('audio')[0];\n\t\tif(audio.paused) {\n\t\t\taudio.play();\n\t\t} else {\n audio.pause();\n\t\t}\n\t});\n\t$('audio').on('play', function() {\n\t\t$('.playButton').removeClass('icon-play');\n\t\t$('.playButton').addClass('icon-pause');\n\t});\n\t$('audio').on('pause', function() {\n\t\t$('.playButton').removeClass('icon-pause');\n\t\t$('.playButton').addClass('icon-play');\n\t});\n\n\t// !audio time tracker display\n\t$('audio').on('canplaythrough', function(e) {\n\t\tvar numSeconds = $('audio')[0].duration;\n\t\tvar timeString = getMMSS(numSeconds);\n\t\t$('.audioControls .timeDisplay .totalTime').text(timeString);\n\t\t$('.audioControls .timeDisplay .progress').text('00:00');\n\t});\n\t$('audio').on('error', function(e) {\n\t\t$('.audioControls .timeDisplay .totalTime').text('--:--');\n\t\t$('.audioControls .timeDisplay .progress').text('--:--');\n\t});\n\t$('audio').on('timeupdate', function(e) {\n\t\tvar numSeconds = $('audio')[0].currentTime;\n\t\tvar timeString = getMMSS(numSeconds);\n\t\t$('.audioControls .timeDisplay .progress').text(timeString);\n\t});\n\n\t// !audio seek dragging\n\tvar draggingSeekCursor = false;\n\t$('.seekCursor').mousedown(function(e) {\n\t\tdraggingSeekCursor = true;\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingSeekCursor) {\n\t\t\tvar leftBound = $('.seekTrack').offset().left;\n\t\t\tvar trackWidth = $('.seekTrack').width();\n\t\t\tvar mouseX = e.pageX;\n\t\t\tvar cursorX = mouseX - leftBound;\n\t\t\tif(cursorX < 0) {\n\t\t\t\t$('.seekCursor').css('left', 0);\n\t\t\t} else if(cursorX > $('.seekTrack').width()) {\n\t\t\t\t$('.seekCursor').css('left', $('.seekTrack').width())\n\t\t\t} else {\n\t\t\t\t$('.seekCursor').css('left', cursorX);\n\t\t\t}\n\t\t}\n\t});\n\t$(window).mouseup(function(e) {\n\t\tif(draggingSeekCursor) {\n\t\t\tdraggingSeekCursor = false;\n\t\t\tvar leftPositionCSS = $('.seekCursor').css('left');\n\t\t\tvar index = leftPositionCSS.indexOf('px');\n\t\t\tvar leftPositionStr = leftPositionCSS.substring(0, index);\n\t\t\tvar leftPosition = parseFloat(leftPositionStr);\n\t\t\tvar trackWidth = $('.seekTrack').width();\n\t\t\tvar positionRatio = leftPosition / trackWidth;\n\t\t\t$('audio')[0].currentTime = positionRatio * $('audio')[0].duration;\n\t\t}\n\t});\n\n\t// !audio seek follows audio element's time\n\t$('audio').on('timeupdate', function(e) {\n\t\tif(!draggingSeekCursor) {\n\t\t\tvar percentPosition = 100 * (this.currentTime / this.duration);\n\t\t\tvar $seekCursor = $(this).parent().find('.seekCursor');\n\t\t\t$seekCursor.css('left', percentPosition + '%');\n\t\t}\n\t});\n\n\t// !show/hide speed slider on click\n\t$('.speedButton').click(function(e) {\n\t\tif($('.speedSlider').css('display') === 'none') {\n\t\t\t$('.speedSlider').css('display', 'block');\n\t\t} else if(e.target !== $('.speedSlider')[0]) {\n\t\t\t$('.speedSlider').css('display', 'none');\n\t\t}\n\t});\n\t$(window).click(function(e) {\n\t\tif(e.target !== $('.speedButton')[0] && e.target !== $('.speedSlider')[0]) {\n\t\t\t$('.speedSlider').css('display', 'none');\n\t\t}\n\t});\n\n\t// !audio speed dragging\n\tvar speed;\n\tif($('audio').length > 0) {\n\t\tspeed = $('audio')[0].playbackRate;\n\t}\n\tvar maxSpeed = 1.5;\n\tvar speedPercent = 100 * (speed / maxSpeed);\n\tvar percentFromTop = 100 - speedPercent;\n\t$('.speedCursor').css('top', percentFromTop + '%');\n\tvar draggingSpeedCursor = false;\n\t$('.speedCursor').mousedown(function(e) {\n\t\tdraggingSpeedCursor = true;\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingSpeedCursor) {\n\t\t\tvar topBound = $('.speedTrack').offset().top;\n\t\t\tvar trackHeight = $('.speedTrack').height();\n\t\t\tvar mouseY = e.pageY;\n\t\t\tvar cursorY = mouseY - topBound;\n\t\t\tif(cursorY < 0) {\n\t\t\t\t$('.speedCursor').css('top', 0);\n\t\t\t} else if(cursorY > $('.speedTrack').height()) {\n\t\t\t\t$('.speedCursor').css('top', $('.speedTrack').height())\n\t\t\t} else {\n\t\t\t\t$('.speedCursor').css('top', cursorY);\n\t\t\t}\n\t\t\tvar topPositionCSS = $('.speedCursor').css('top');\n\t\t\tvar index = topPositionCSS.indexOf('px');\n\t\t\tvar topPositionStr = topPositionCSS.substring(0, index);\n\t\t\tvar topPosition = parseFloat(topPositionStr);\n\t\t\tvar trackHeight = $('.speedTrack').height();\n\t\t\tvar positionRatio = topPosition / trackHeight;\n\t\t\tvar maxSpeed = 2;\n\t\t\t$('audio')[0].playbackRate = 1 / (positionRatio * maxSpeed);\n\t\t}\n\t});\n\t$(window).mouseup(function(e) {\n\t\tdraggingSpeedCursor = false;\n\t});\n\n\t// !show/hide volume slider on click\n\t$('.volumeButton').click(function(e) {\n\t\tif($('.volumeSlider').css('display') === 'none') {\n\t\t\t$('.volumeSlider').css('display', 'block');\n\t\t} else if(e.target !== $('.volumeSlider')[0]) {\n\t\t\t$('.volumeSlider').css('display', 'none');\n\t\t}\n\t});\n\t$(window).click(function(e) {\n\t\tif(e.target !== $('.volumeButton')[0] && e.target !== $('.volumeSlider')[0]) {\n\t\t\t$('.volumeSlider').css('display', 'none');\n\t\t}\n\t});\n\n\t// !audio volume dragging\n\tvar volume;\n\tif($('audio').length > 0) {\n\t\tvolume = $('audio')[0].playbackRate;\n\t}\n\tvar volumePercent = 100 * volume;\n\tvar percentFromTop = 100 - volumePercent;\n\t$('.volumeCursor').css('top', percentFromTop + '%');\n\tvar draggingVolumeCursor = false;\n\t$('.volumeCursor').mousedown(function(e) {\n\t\tdraggingVolumeCursor = true;\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingVolumeCursor) {\n\t\t\tvar topBound = $('.volumeTrack').offset().top;\n\t\t\tvar trackHeight = $('.volumeTrack').height();\n\t\t\tvar mouseY = e.pageY;\n\t\t\tvar cursorY = mouseY - topBound;\n\t\t\tif(cursorY < 0) {\n\t\t\t\t$('.volumeCursor').css('top', 0);\n\t\t\t} else if(cursorY > $('.volumeTrack').height()) {\n\t\t\t\t$('.volumeCursor').css('top', $('.volumeTrack').height())\n\t\t\t} else {\n\t\t\t\t$('.volumeCursor').css('top', cursorY);\n\t\t\t}\n\t\t\tvar topPositionCSS = $('.volumeCursor').css('top');\n\t\t\tvar index = topPositionCSS.indexOf('px');\n\t\t\tvar topPositionStr = topPositionCSS.substring(0, index);\n\t\t\tvar topPosition = parseFloat(topPositionStr);\n\t\t\tvar trackHeight = $('.volumeTrack').height();\n\t\t\tvar positionRatio = topPosition / trackHeight;\n\t\t\t$('audio')[0].volume = 1 - positionRatio;\n\t\t}\n\t});\n\t$(window).mouseup(function(e) {\n\t\tdraggingVolumeCursor = false;\n\t});\n\n\t// !serif/sans-serif toggle button\n\t$('#serifToggleButton').click(function(e) {\n\t\tif($('#transcriptionTextArea').hasClass('serif')) {\n\t\t\t$('#transcriptionTextArea').removeClass('serif');\n\t\t\t$('#serifToggleInput').val('false');\n\t\t} else {\n\t\t\t$('#transcriptionTextArea').addClass('serif');\n\t\t\t$('#serifToggleInput').val('true');\n\t\t}\n\t\t$.post($(\"#serifToggleForm\").attr('action'), $(\"#serifToggleForm\").serialize());\n\t});\n\n\t// !make text pane resize when splitter is dragged\n\tvar draggingSplitter = false;\n\tvar startHeight = null;\n\tvar startWidth = null;\n\t$('.splitter').mousedown(function(e) {\n\t\tdraggingSplitter = true;\n\t\tprevPageX = e.pageX;\n\t\tprevPageY = e.pageY;\n\t\tstartHeight = $('.task .transcript').height();\n\t\tstartWidth = $('.task .transcript').width();\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingSplitter) {\n\t\t\t// If it's in the stacked layout, the splitter should\n\t\t\t// split vertically.\n\t\t\tif($('.task').hasClass('stacked')) {\n\t\t\t\tvar mouseDeltaY = e.pageY - prevPageY;\n\t\t\t\tvar newHeight = startHeight - mouseDeltaY;\n\t\t\t\tvar maxHeight = $('.task').height() - 21;\n\t\t\t\tif(newHeight > maxHeight) {\n\t\t\t\t\tnewHeight = maxHeight;\n\t\t\t\t}\n\t\t\t\tvar newHeightCss = newHeight.toString() + 'px';\n\t\t\t\tstackedHeight = newHeightCss;\n\t\t\t\t$('.task .transcript').css('height', newHeightCss);\n\t\t\t}\n\t\t\t// Otherwise, it should split horizontally.\n\t\t\telse {\n\t\t\t\tvar mouseDeltaX = e.pageX - prevPageX;\n\t\t\t\tvar newWidth = startWidth - mouseDeltaX;\n\t\t\t\tvar newWidthCss = newWidth.toString() + 'px';\n\t\t\t\tunstackedWidth = newWidthCss;\n\t\t\t\t$('.task .transcript').css('width', newWidthCss);\n\t\t\t}\n\t\t}\n\t});\n\t$(window).mouseup(function() {\n\t\tif(draggingSplitter) {\n\t\t\tsaveTranscriptionSize();\n\t\t}\n\t\tdraggingSplitter = false;\n\t\tprevPageX = null;\n\t\tprevPageY = null;\n\t\tstartHeight = null;\n\t\tstartWidth = null;\n\t});\n\tfunction saveTranscriptionSize() {\n\t\tsetTranscriptionFormFields();\n\t\tsendTranscriptionForm();\n\t}\n\tfunction setTranscriptionFormFields() {\n\t\tif($('.task').hasClass('stacked')) {\n\t\t\tvar height = $('.task .transcript').innerHeight();\n\t\t\tvar heightStr = height.toString()\n\t\t\t$('#transcriptionHeight').val(heightStr);\n\t\t} else {\n\t\t\tvar width = $('.task .transcript').innerWidth();\n\t\t\tvar widthStr = width.toString();\n\t\t\t$('#transcriptionWidth').val(widthStr);\n\t\t}\n\t}\n\tfunction sendTranscriptionForm() {\n\t\t$.post($(\"#resizeTranscriptionForm\").attr('action'), $(\"#resizeTranscriptionForm\").serialize());\n\t}\n\n\t// !allow user to look at other pages than the one they are transcribing\n\tvar transcriptionBlocked = false;\n\t$('#previousPageButton').click(function() {\n\t\tsavePageInfo();\n\t\ttaskEdit.currentPage = getPreviousPage();\n\t\tupdateTranscriptEditable();\n\t\tupdatePageImage();\n\t});\n\t$('#currentPageButton').click(function() {\n\t\tsavePageInfo();\n\t\ttaskEdit.currentPage = taskEdit.editedPage;\n\t\tunblockTranscription();\n\t\tupdatePageImage();\n\t});\n\t$('#nextPageButton').click(function() {\n\t\tsavePageInfo();\n\t\ttaskEdit.currentPage = getNextPage();\n\t\tupdateTranscriptEditable();\n\t\tupdatePageImage();\n\t});\n\n\t// pause, then hide notify messages\n\t$('.notify > li.success').delay(4000).fadeOut('slow');\n\n\t// !make dashboard tasks (Available and Completed) clickable\n\t$('.tasks li').click(function(e) {\n\t\te.preventDefault(); // disable the anchor link, or Firefox will send 2 requests\n\t\tvar projectLink = $(this).find('.title');\n\t\tif(e.target === projectLink[0]) {\n\t\t\twindow.location = projectLink.attr('href');\n\t\t} else {\n\t\t\tvar url = $(this).find('.type').attr('href');\n\t\t\twindow.location = url;\n\t\t}\n\t});\n\n\t// !set focus to transcription text area\n\t// but don't show focus if it's a finished or skipped task\n\tif($('.finishedTask').length == 0 && $('.skippedTask').length == 0) {\n\t\t$(\"#transcriptionTextArea\").focus();\n\t}\n\n\t// !instead of using the default paste behavior, remove style/RTF\n\t// tags, as well as HTML tags, before inserting text into\n\t// #transcriptionArea from clipboard.\n\t$('#transcriptionTextArea').bind('paste', function(e) { // check for paste event\n\t\te.preventDefault();\n\t\t// get just the text, without tags\n\t\tvar text = e.originalEvent.clipboardData.getData('text/plain');\n\t\ttext = htmlEncode(text);\n\t\t// Note: I tried using document.execCommand('insertText') here\n\t\t// before, but it is no longer here because it caused problems.\n\t\t// If insertText is used, the browser will decide what html to\n\t\t// use to display the content. This is a problem, because we\n\t\t// need to make sure there are no unescaped tags that are\n\t\t// children of the transcriptionTextArea element, and insertText\n\t\t// will add those. So, instead, this function makes a call to\n\t\t// `insertHtmlAtCursor`.\n\t\tinsertHtmlAtCursor(text);\n\t});\n\n\t// !=================\n\t// !KEY BINDINGS\n\tvar isCtrl = false;\n\t$(document).on('click keyup', function(e) {\n\t\tvar keyCode = e.keyCode || e.which;\n\t\t// this is needed to handle control keys properly\n\t if(keyCode == 17) isCtrl=false;\n\t // if the cursor is inside tagged text, show which tags have been applied\n\t\tshowActiveTags();\n\t});\n\t$(document).on('keydown', function(e) {\n\t\tvar keyCode = e.keyCode || e.which;\n\t if(keyCode == 17) isCtrl=true;\n\t\t// scroll down: CTRL+d\n\t\tif(keyCode == 68 && isCtrl == true) {\n\t\t\tscrollDown();\n\t\t\treturn false;\n\t\t}\n\t\t// scroll up: CTRL+u\n\t\tif(keyCode == 85 && isCtrl == true) {\n\t\t\tscrollUp();\n\t\t\treturn false;\n\t\t}\n\t\t// save: CTRL+s\n\t\tif($('.finishedTask').length != 0 || $('.skippedTask').length != 0) {\n\t\t\t// don't do anything if this is a finished task or a skipped task\n\t\t} else {\n\t\t\tif(keyCode == 83 && isCtrl == true) {\n\t\t\t\tsaveTranscription();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t// for audio/video media\n\t\t// play/pause: CTRL+k\n\t\tif(keyCode == 75 && isCtrl == true) {\n\t\t\tplayPause();\n\t\t\treturn false;\n\t\t}\n\t\t// jumpBackward: CTRL+j\n\t\tif(keyCode == 74 && isCtrl == true) {\n\t\t\tjumpBackward();\n\t\t\treturn false;\n\t\t}\n\t\t// jumpForward: CTRL+l\n\t\tif(keyCode == 76 && isCtrl == true) {\n\t\t\tjumpForward();\n\t\t\treturn false;\n\t\t}\n\t});\n\n\t// key bindings for the transcription text area\n\t$('#transcriptionTextArea').on('keydown', function(e) {\n\t\tvar keyCode = e.key || e.which;\n\t\tif (keyCode == \"Tab\") {\n\t\t// !tab key\n\t\t\te.preventDefault();\n\t\t\tinsertHtmlAtCursor('\\t');\n\t\t} else if (keyCode == \"Enter\") {\n\t\t// !return key\n\t\t\t// this is a pain\n\t\t\t// browsers render the return key differently in a contenteditable area:\n\t\t\t// - some create a new div\n\t\t\t// - some create a new p\n\t\t\t// - some create a br tag\n\t\t\t// We don't want any of that! We just a newline character.\n\t\t\t// But it gets complicated... First:\n\t\t\te.preventDefault(); // prevent the default behavior\n\t\t\t// for webkit and IE:\n\t\t\tif(navigator.userAgent.indexOf('AppleWebKit') != -1 || navigator.userAgent.indexOf('MSIE') != -1) {\n\t\t\t\t// !always make sure the last character is a newline\n\t\t\t\t// because we need 2 newlines at the end to register\n\t\t\t\t// a single line break in the viewer.\n\t\t\t\tif ($(\"#transcriptionTextArea\").text().slice(-1) != \"\\n\") {\n\t\t\t\t\t$(\"#transcriptionTextArea\").append(\"\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t// for webkit we scroll to the bottom before adding the second newline:\n\t\t\tif(navigator.userAgent.indexOf('AppleWebKit') != -1) {\n\t\t\t\tif(cursorIsAtEnd()) {\n\t\t\t\t\t$('#transcriptionTextArea').scrollTop($('#transcriptionTextArea')[0].scrollHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// now we can finally insert a newline character!\n\t\t\tinsertHtmlAtCursor('\\n');\n\t\t\t// for non webkit browsers we scroll after adding the newline:\n\t\t\tif(navigator.userAgent.indexOf('AppleWebKit') == -1) {\n\t\t\t\tif(cursorIsAtEnd()) {\n\t\t\t\t\t$('#transcriptionTextArea').scrollTop($('#transcriptionTextArea')[0].scrollHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// !Save, Skip, and Submit buttons\n\t// Save button\n\t$(\"#transcribeForm #saveButton\").click(function(event) {\n\t\t/* stop form from submitting normally */\n\t\tevent.preventDefault();\n\t\t// save\n\t\tsaveTranscription();\n\t\treturn false;\n\t});\n\t// Submit button\n\t$(\"#transcribeForm #finishButton\").click(function(event) {\n\t\t// check if there are diff options that need to be resolved before submit\n\t\tif ($(\"#transcriptionTextArea span.opts\").first().length > 0) {\n\t\t\t// stop the form from submitting\n\t\t\tevent.preventDefault();\n\t\t\t// alert that diffs need to be resolved\n\t\t\talert(\"Click the \\\"apply diffs\\\" button before submitting.\");\n\t\t\treturn false;\n\t\t} else {\n\t\t\taddTranscriptionToForm(); // add hidden input to form with the transcription text\n\t\t\t// submit normally\n\t\t}\n\t});\n\t// Skip button\n\t$(\"#transcribeForm #skipButton\").click(function(event) {\n\t\taddTranscriptionToForm(); // add hidden input to form with the transcription text\n\t\t// submit normally\n\t});\n\n\n\t// !add contents of div#transcriptionTextArea to form as a hidden field\n\t// (done before saving or submitting)\n\tvar addTranscriptionToForm = function() {\n\t $(\"#transcribeForm\").append(\n\t $(\"<input type='hidden' />\").attr({\n\t name: \"transcription\",\n\t id: \"userTranscriptionFormInput\",\n\t\t\t\t// .html() encodes characters like & < > into html\n\t\t\t\t// entities, as long as they are in text nodes. However,\n\t\t\t\t// Firefox will append a <br> tag if the user ever\n\t\t\t\t// removes all text that is in the transcription box\n\t\t\t\t// (sometimes happens when typing the first word of the\n\t\t\t\t// transcription). This <br> tag is not in a text node,\n\t\t\t\t// so it is not html encoded, and must be removed.\n\t value: $(\"#transcriptionTextArea\").html().replace('<br>', '')\n\t })\n\t )\n\t}\n\t// add a hidden input to the form for UserTask status='in progress'\n\t// (we return false when the save button is clicked so it doesn't send it's value in the form, status='in progress')\n\tvar addStatusInProgrssToForm = function() {\n\t\t$(\"#transcribeForm\").append(\n\t\t $(\"<input type='hidden' />\").attr({\n\t\t name: \"status\",\n\t\t id: \"userTaskStatus\",\n\t\t value: 'in progress'\n\t\t })\n\t\t)\n\t}\n\n\t// !save transcription form using AJAX\n\tvar saveTranscription = function() {\n\n\t\t// update the save button class to show that save is in progress\n\t\t$(\"#transcribeForm #saveButton\").removeClass(\"saved\");\n\t\t$(\"#transcribeForm #saveButton\").removeClass(\"failedToSave\");\n\t\t$(\"#transcribeForm #saveButton\").addClass(\"saving\");\n\n\t\t// add a hidden input to the form with transcription text (from contenteditable #transcriptionTextArea)\n\t\taddTranscriptionToForm();\n\t\t// add a hidden input to the form for UserTask status='in progress'\n\t\taddStatusInProgrssToForm();\n\n\t\t/* Send the data using post */\n\t\tvar posting = $.post($(\"#transcribeForm\").attr('action'), $(\"#transcribeForm\").serialize());\n\t\t// check data for success or failure\n\t\tposting.done(function(data) {\n\t\t\tif(data.status === \"success\") {\n\t\t\t\t// on success, update save button class to show success\n\t\t\t\tsetTimeout(function() { $(\"#transcribeForm #saveButton\").removeClass(\"saving\");\t}, 500);\n\t\t\t\t$(\"#transcribeForm #saveButton\").removeClass(\"failedToSave\");\n\t\t\t\t$(\"#transcribeForm #saveButton\").addClass(\"saved\");\n\t\t\t} else {\n\t\t\t\t// on failure: update save button class to show failure, show an error alert\n\t\t\t\tsetTimeout(function() { $(\"#transcribeForm #saveButton\").removeClass(\"saving\");\t}, 500);\n\t\t\t\t$(\"#transcribeForm #saveButton\").removeClass(\"saved\");\n\t\t\t\t$(\"#transcribeForm #saveButton\").addClass(\"failedToSave\");\n\t\t\t\talert(\"Error: Unable to save.\");\n\t\t\t}\n\t\t\t// set focus to transcription area\n\t\t\t$(\"#transcriptionTextArea\").focus();\n\t\t});\n\n\t\t// remove the hidden #transcriptionTextArea form input that we added\n\t\t$(\"#userTranscriptionFormInput\").remove();\n\t\t// remove the hidden UserTask Status input that we added\n\t\t$(\"#userTaskStatus\").remove();\n\t}\n\n\t// !save transcription before following certain links\n $('a.saveTranscription').click(function() {\n \t// does the form exist\n \tif($('#transcribeForm').length == 0) {\n\t\t\treturn true; // no form, so we just follow the link\n\t\t} else if($('.finishedTask').length != 0 || $('.skippedTask').length != 0) {\n\t\t\t // don't save anything for finished or skipped tasks\n\t\t\treturn true;\n\t\t} else {\n\t\t\t// add hidden input to form with the transcription text\n\t\t\taddTranscriptionToForm();\n\t\t\t// add a hidden input to the form for UserTask status='in progress'\n\t\t\taddStatusInProgrssToForm();\n\t\t\t// we submit the form along with a redirect URL in the query string\n\t\t\t// the redirect URL is this link's href value\n\t\t\t// var href = $(this).attr(\"href\");\n\t\t\t// var encodedHref = encodeURIComponent(href);\n\t\t\t// var newFormAction = $('#transcribeForm').attr(\"action\") + \"/?redirectURL=\" + encodedHref;\n\t\t\t// $('#transcribeForm').attr(\"action\", newFormAction);\n\t\t\t// $('#transcribeForm').submit();\n\t\t\tsaveTranscription();\n\t\t\twindow.location = $(this).attr('href');\n\t\t\treturn false;\n\t\t}\n });\n\n\t// !stop following the menu link\n\t$('a#toggle').click(function() {\n\t\treturn false;\n\t});\n\n\t// !hide save, skip, submit buttons if the usertask is finished or skipped\n\tif($('.finishedTask').length != 0 || $('.skippedTask').length != 0) {\n\t\t$('li.finishButton').hide();\n\t\t$('li.skipButton').hide();\n\t\t$('li.saveButton').hide();\n\t}\n\n\t// !reOpenUserTask: re-opens a usertask that was previously skipped\n\t$('a.reOpenUserTask').click(function() {\n\n\t\tevent.preventDefault();\n\n\t\t// show save, skip, submit buttons\n\t\t$('li.finishButton').show();\n\t\t$('li.skipButton').show();\n\t\t$('li.saveButton').show();\n\n\t\t// remove overlay\n\t\t$('div.notouch').remove();\n\n\t\t// focus on transcription\n\t\t$(\"#transcriptionTextArea\").focus();\n\n\t\treturn false;\n\t});\n\n\n\t// !=================\n\t// !LAYOUT\n\t// !Toggle layout (stacked or side by side)\n\t$('#toggleLayout').click(function() {\n\n\t\tif ( !$('.task').hasClass('stacked') ) {\n\t\t\t$('#transcriptionStacked').val('true');\n\t\t\tsendTranscriptionForm();\n\t\t\t$('.task').addClass('stacked');\n\t\t\t$('.task .transcript').css('width', '100%');\n\t\t\t$('.task .transcript').css('height', stackedHeight);\n\n\t\t} else if ( $('.task').hasClass('stacked') ) {\n\t\t\t$('#transcriptionStacked').val('false');\n\t\t\tsendTranscriptionForm();\n\t\t\t$('.task').removeClass('stacked');\n\t\t\t$('.task .transcript').css('height', '100%');\n\t\t\t$('.task .transcript').css('width', unstackedWidth);\n\t\t}\n\t\treturn false;\n\t});\n\t// set the css for stacked or sidebyside viewing in task edit\n\tif(typeof stacked === 'boolean') { // `stacked` only exists in the task edit page\n\t\tif (stacked) {\n\t\t\t$('.task').addClass('stacked');\n\t\t\t$('a#stacked').addClass('selected');\n\t\t\t$('a#sidebyside').removeClass('selected');\n\t\t\t$('.task .transcript').css('height', stackedHeight);\n\t\t\t$('.task .transcript').css('width', '100%');\n\t\t} else {\n\t\t\t$('.task').removeClass('stacked');\n\t\t\t$('a#stacked').removeClass('selected');\n\t\t\t$('a#sidebyside').addClass('selected');\n\t\t\t$('.task .transcript').css('height', '100%');\n\t\t\t$('.task .transcript').css('width', unstackedWidth);\n\t\t}\n\t}\n\n\n\t// !=================\n\t// !VISUAL DIFF\n\t// !cycle thru diff options by clicking them\n $(\"span.opt\").click(function(event){\n\t\t$(this).hide(0);\n\t\t$(this).addClass(\"optHidden\");\n\t if ($(this).next(\".opt\").length == 0) {\n\t\t\t// last element, we need to wrap back to the beginning\n\t\t\t// !TODO: refactor common selectors into a var\n\t\t\t$(this).siblings(\".opt\").first().removeClass(\"optHidden\");\n\t\t\t$(this).siblings(\".opt\").first().hide(0);\n\t\t\t$(this).siblings(\".opt\").first().fadeIn(250);\n\t\t\t$(this).siblings(\".opt\").first().css(\"display\", \"inline\");\n\t\t} else {\n\t\t\t$(this).next(\".opt\").removeClass(\"optHidden\");\n\t\t\t$(this).next(\".opt\").hide(0);\n\t\t\t$(this).next(\".opt\").fadeIn(250);\n\t\t\t$(this).siblings(\".opt\").first().css(\"display\", \"inline\");\n\t\t}\n });\n\n\n\t// !add clickable \"apply\" button if there are text diff options\n\tif ($(\"#transcriptionTextArea span.opts\").first().length > 0) {\n\t\t$(\".tags button\").hide();\n\t\t$(\".tags h3\").hide();\n\t\t$(\".tags\").append('<div id=\"diffInstructions\"><p class=\"instructions\">Click highlighted areas to choose diffs, or <a id=\"flipDiffs\">flip all diffs</a>.</p><button id=\"applyDiffs\">apply diffs</button></div>');\n\t}\n\n\t// flip all the currently visible diff/text options\n $(\"#flipDiffs\").click(function(event){\n\t\t// add some temp classes\n $(\"span.opts span.opt.optHidden\").addClass(\"show\");\n\t\t$(\"span.opts span.opt\").not(\".optHidden\").addClass(\"hide\");\n // show/hide options\n $(\"span.opts span.opt.show\").css(\"display\", \"inline\");\n $(\"span.opts span.opt.hide\").css(\"display\", \"none\");\n $(\"span.opts span.opt.show\").removeClass(\"optHidden\");\n $(\"span.opts span.opt.show\").removeClass(\"show\");\n $(\"span.opts span.opt.hide\").addClass(\"optHidden\");\n $(\"span.opts span.opt.hide\").removeClass(\"hide\");\n });\n\n\t// !apply the currently visible diff/text options\n $(\"button#applyDiffs\").click(function(event){\n\t\t$(\".optHidden\").remove();\n\t\t$(\".optEmpty\").remove();\n\t\t$(\".opt\").contents().unwrap();\n\t\t$(\".opts\").contents().unwrap();\n\t\t$(\".opts\").remove();\n\t\t$(\".tags button\").show();\n\t\t$(\".tags h2\").show();\n\t\t$(\"#diffInstructions\").remove();\n });\n\n\n\t// !=================\n\t// !TAGGING\n\t// !highlight TEI tags if the cursor is inside them\n\tvar showActiveTags = function() {\n\t\t// TEI person\n\t\tif (isCursorInsideElement(\"name\", \"type\", \"person\")) {\n\t\t\t$(\"button[buttonName='Person']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Person']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI place\n\t\tif (isCursorInsideElement(\"name\", \"type\", \"place\")) {\n\t\t\t$(\"button[buttonName='Place']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Place']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI date\n\t\tif (isCursorInsideElement(\"date\")) {\n\t\t\t$(\"button[buttonName='Date']\").addClass(\"applied\");\n\t\t\t// get the \"when\" attribute\n\t\t\tvar containerNode = getCursorContainerNode();\n\t\t\tvar formattedDate = $(containerNode).closest(\"date\").attr(\"when\");\n\t\t\t$(\"button[buttonName='Date']\").html(\"Date: \" + formattedDate);\n\t\t} else {\n\t\t\t$(\"button[buttonName='Date']\").removeClass(\"applied\");\n\t\t\t$(\"button[buttonName='Date']\").html(\"Date\");\n\t\t}\n\t\t// TEI heading\n\t\tif (isCursorInsideElement(\"TEIhead\")) {\n\t\t\t$(\"button[buttonName='Heading']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Heading']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI quote\n\t\tif (isCursorInsideElement(\"q\")) {\n\t\t\t$(\"button[buttonName='Quote']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Quote']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI add\n\t\tif (isCursorInsideElement(\"add\")) {\n\t\t\t$(\"button[buttonName='Add']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Add']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI del\n\t\tif (isCursorInsideElement(\"del\", \"rend\", \"overstrike\")) {\n\t\t\t$(\"button[buttonName='Del']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Del']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI note\n\t\tif (isCursorInsideElement(\"note\", \"place\", \"margin\")) {\n\t\t\t$(\"button[buttonName='Note']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Note']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI unclear\n\t\tif (isCursorInsideElement(\"unclear\", \"reason\", \"illegible\")) {\n\t\t\t$(\"button[buttonName='Unclear']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Unclear']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI underline\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"underline\")) {\n\t\t\t$(\"button[buttonName='Underline']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Underline']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI bold\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"bold\")) {\n\t\t\t$(\"button[buttonName='Bold']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Bold']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI italic\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"italic\")) {\n\t\t\t$(\"button[buttonName='Italic']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Italic']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI Superscript\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"sup\")) {\n\t\t\t$(\"button[buttonName='Superscript']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Superscript']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI Subscript\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"sub\")) {\n\t\t\t$(\"button[buttonName='Subscript']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Subscript']\").removeClass(\"applied\");\n\t\t}\n\t}\n\n\n\t// !add a TEI lite tag to selected text\n $(\"button[class='insertTags']\").click(function(event){\n\t\tevent.preventDefault();\n\t\tvar openTag = '';\n\t\tvar closeTag = '';\n\t\t// only do this if the button is not already \"applied\"\n\t\tif(!$(this).hasClass(\"applied\")) {\n\n\t\t\t// get the selected text\n\t\t\tvar selectedText = rangy.getSelection().toHtml();\n\n\t\t\tif (selectedText == '') {\n\t\t\t\treturn false; // require a selection in order to tag something\n\t\t\t}\n\t\t\t// !TODO: maybe a switch statement here?\n\t\t\tif($(this).attr(\"buttonName\") == 'Person') {\n\t\t\t\tinsertHtmlAtCursor('<name type=\"person\">' + selectedText + '</name>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Place') {\n\t\t\t\tinsertHtmlAtCursor('<name type=\"place\">' + selectedText + '</name>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Date') {\n\t\t\t\tvar dateFormatted = prompt(\"Enter a formatted date (YYYY-MM-DD):\", \"YYYY-MM-DD\");\n\t\t\t\t// some very simple validation\n\t\t\t\tif(dateFormatted === \"\" || dateFormatted === \"YYYY-MM-DD\") return false;\n\t\t\t\tinsertHtmlAtCursor('<date when=\"' + dateFormatted + '\">' + selectedText + '</date>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Heading') {\n\t\t\t\tinsertHtmlAtCursor('<TEIhead>' + selectedText + '</TEIhead>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Quote') {\n\t\t\t\tinsertHtmlAtCursor('<q>' + selectedText + '</q>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Add') {\n\t\t\t\tinsertHtmlAtCursor('<add>' + selectedText + '</add>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Del') {\n\t\t\t\tinsertHtmlAtCursor('<del rend=\"overstrike\">' + selectedText + '</del>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Note') {\n\t\t\t\tinsertHtmlAtCursor('<note place=\"margin\">' + selectedText + '</note>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Unclear') {\n\t\t\t\tinsertHtmlAtCursor('<unclear reason=\"illegible\">' + selectedText + '</unclear>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Page #') {\n\t\t\t\tinsertHtmlAtCursor('\\n<pb n=\"' + selectedText + '\"/>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Underline') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"underline\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Bold') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"bold\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Italic') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"italic\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Superscript') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"sup\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Subscript') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"sub\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t}\n });\n\n\n\t// !remove a TEI lite tag that is surrounding the cursor\n $(\"button[class='insertTags']\").click(function(event){\n \tif($(this).hasClass(\"applied\")) {\n \t\tvar buttonName = $(this).attr(\"buttonName\");\n \t\tvar containerNode = getCursorContainerNode();\n \t\t// get the correct container node based on the button name\n\t\t\tswitch(buttonName)\n\t\t\t{\n\t\t\tcase \"Person\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"name[type='person']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Place\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"name[type='place']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Date\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"Heading\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"TEIhead\");\n\t\t\t\tbreak;\n\t\t\tcase \"Quote\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"q\");\n\t\t\t\tbreak;\n\t\t\tcase \"Add\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"add\");\n\t\t\t\tbreak;\n\t\t\tcase \"Del\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"del[rend='overstrike']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Note\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"note[place='margin']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Unclear\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"unclear[reason='illegible']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Underline\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='underline']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Bold\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='bold']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Italic\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='italic']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Superscript\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='sup']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Subscript\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='sub']\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// unwrap the contents\n \t\tif(containerNode) $(containerNode).contents().unwrap();\n\t\t}\n });\n\n\t\t// Takes as input a number of seconds and returns the corresponding\n\t\t// MM:SS string. Used by the audio player time display\n\t\tfunction getMMSS(totalSeconds) {\n\t\t\tvar minutes = Math.floor(totalSeconds / 60).toString();\n\t\t\tif(minutes.length == 1) minutes = '0' + minutes;\n\t\t\tvar seconds = Math.floor(totalSeconds % 60).toString();\n\t\t\tif(seconds.length == 1) seconds = '0' + seconds;\n\t\t\treturn minutes + ':' + seconds;\n\t\t}\n\n //functions for page switching\n function updateTranscriptEditable() {\n\t\tif(taskEdit.currentPage === taskEdit.editedPage) {\n\t\t\tunblockTranscription();\n\t\t} else {\n\t\t\tblockTranscription();\n\t\t}\n\t}\n\tfunction unblockTranscription() {\n\t\t$('#transcriptDimmer').css('display', 'none');\n\t\t$('#transcriptionTextArea').attr('contenteditable', true);\n\t}\n\tfunction blockTranscription() {\n\t\t$('#transcriptDimmer').css('display', 'block');\n\t\t$('#transcriptionTextArea').attr('contenteditable', false);\n\t}\n\tfunction savePageInfo() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tcurrentPage.scrollLeft = $(currentPage.figure).scrollLeft();\n\t\tcurrentPage.scrollTop = $(currentPage.figure).scrollTop();\n\t}\n\tfunction getPreviousPage() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tvar currentIndex = taskEdit.pages.indexOf(currentPage);\n\t\tvar previousIndex = currentIndex - 1;\n\t\tif(previousIndex < 0) {\n\t\t\treturn currentPage;\n\t\t} else {\n\t\t\treturn taskEdit.pages[previousIndex];\n\t\t}\n\t}\n\tfunction getNextPage() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tvar currentIndex = taskEdit.pages.indexOf(currentPage);\n\t\tvar nextIndex = currentIndex + 1;\n\t\tif(nextIndex >= taskEdit.pages.length) {\n\t\t\treturn currentPage;\n\t\t}\n\t\telse {\n\t\t\treturn taskEdit.pages[nextIndex];\n\t\t}\n\t}\n\tfunction updatePageImage() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tif(typeof currentPage.image === 'undefined') {\n\t\t\tcurrentPage.loadImage(function() {\n\t\t\t\tsetPageFigure(currentPage.figure);\n\t\t\t});\n\t\t} else if(currentPage.figure !== $('.task .source figure').first()) {\n\t\t\tsetPageFigure(currentPage.figure);\n\t\t\t$(currentPage.figure).scrollLeft(currentPage.scrollLeft);\n\t\t\t$(currentPage.figure).scrollTop(currentPage.scrollTop);\n\t\t}\n\t}\n\tfunction setPageFigure(figure) {\n\t\t$('.task .source figure').first().remove();\n\t\t$('.task .source').append(figure);\n\t}\n\n\t// prototype for page objects (functions to manage scrolling)\n\tvar pagePrototype = {\n\t\tloadImage: function(callback) {\n\t\t\tvar image = $(new Image);\n\t\t\timage.attr('draggable', false);\n\t\t\timage.attr('src', this.url);\n\t\t\tvar that = this;\n\t\t\timage.on('load', function() {\n\t\t\t\t$(that.figure).append(image);\n\t\t\t\tthat.image = image;\n\t\t\t\tcallback();\n\t\t\t});\n\t\t},\n\t};\n\tif(typeof taskEdit !== 'undefined') {\n\t\tfor(var i = 0; i < taskEdit.pages.length; i++) {\n\t\t\tObject.setPrototypeOf(taskEdit.pages[i], pagePrototype);\n\t\t}\n\t}\n\n\t// !takes text and html encodes it\n\tfunction htmlEncode(text) {\n\t\treturn $('<div>').text(text).html();\n\t}\n\n\t// !simple js functions for cookies\n\tfunction createCookie(name, value, days) {\n\t if (days) {\n\t var date = new Date();\n\t date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n\t var expires = \"; expires=\" + date.toGMTString();\n\t } else var expires = \"\";\n\t document.cookie = escape(name) + \"=\" + escape(value) + expires + \"; path=/\";\n\t}\n\tfunction readCookie(name) {\n\t var nameEQ = escape(name) + \"=\";\n\t var ca = document.cookie.split(';');\n\t for (var i = 0; i < ca.length; i++) {\n\t var c = ca[i];\n\t while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n\t if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length, c.length));\n\t }\n\t return null;\n\t}\n\tfunction eraseCookie(name) {\n\t createCookie(name, \"\", -1);\n\t}\n\n\t// determine if the cursor is at the end of the transcription text area\n\tfunction cursorIsAtEnd() {\n\t\tvar el = $(\"#transcriptionTextArea\").get(0);\n\t var atStart = false, atEnd = false;\n\t var selRange, testRange;\n\t if (window.getSelection) {\n\t var sel = window.getSelection();\n\t if (sel.rangeCount) {\n\t selRange = sel.getRangeAt(0);\n\t testRange = selRange.cloneRange();\n\n\t testRange.selectNodeContents(el);\n\t testRange.setEnd(selRange.startContainer, selRange.startOffset);\n\t atStart = (testRange.toString() == \"\");\n\n\t testRange.selectNodeContents(el);\n\t testRange.setStart(selRange.endContainer, selRange.endOffset);\n\t atEnd = (testRange.toString() == \"\" || testRange.toString() == \"\\n\");\n\t }\n\t } else if (document.selection && document.selection.type != \"Control\") {\n\t selRange = document.selection.createRange();\n\t testRange = selRange.duplicate();\n\n\t testRange.moveToElementText(el);\n\t testRange.setEndPoint(\"EndToStart\", selRange);\n\t atStart = (testRange.text == \"\");\n\n\t testRange.moveToElementText(el);\n\t testRange.setEndPoint(\"StartToEnd\", selRange);\n\t atEnd = (testRange.text == \"\" || testRange.text == \"\\n\");\n\t }\n\t return atEnd;\n\t}\n\n\t// determine if the cursor is inside a given TEI tag\n\tfunction isCursorInsideElement(tagName, attributeType, attributeValue) {\n\t\tvar containerNode = getCursorContainerNode();\n\t tagName = tagName.toUpperCase();\n\t while (containerNode) {\n\t if (containerNode.nodeType == 1) {\n\t \tif (typeof(attributeType) === 'undefined' || typeof(attributeValue) === 'undefined') {\n\t\t\t\t\t// just check the tagname\n\t\t\t\t\tif (containerNode.tagName == tagName) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t \t} else {\n\t \t\t// check the tagname and attribute type and value\n\t\t\t\t\tif (containerNode.tagName == tagName && containerNode.attributes.getNamedItem(attributeType).value == attributeValue) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t \t}\n\t }\n\t containerNode = containerNode.parentNode;\n\t }\n\t return false;\n\t}\n\t// this function hilights the text in the node that the cursor is within\n\tfunction hilightNodeContents() {\n\t\tvar range = rangy.createRange();\n\t\tvar containerNode = getCursorContainerNode();\n\t\trange.selectNodeContents(containerNode);\n\t\tvar sel = rangy.getSelection();\n\t\tsel.setSingleRange(range);\n\t}\n\t// returns the cursor's container node\n\tfunction getCursorContainerNode() {\n\t\tvar range = rangy.getSelection().getRangeAt(0);\n\t\tvar containerNode = getRangeContainerNode(range);\n\t\treturn containerNode;\n\t}\n\t// helper function for getCursorContainerNode()\n\tfunction getRangeContainerNode(range) {\n\t var containerNode = range.commonAncestorContainer;\n\t if (containerNode.nodeType == 3) {\n\t containerNode = containerNode.parentNode;\n\t }\n\t return containerNode;\n\t}\n\n\t// cross-browser way to insert html\n\tfunction insertHtmlAtCursor(html) {\n\t var sel, range;\n\t if (window.getSelection) {\n\t // IE9 and non-IE\n\t sel = window.getSelection();\n\t if (sel.getRangeAt && sel.rangeCount) {\n\t range = sel.getRangeAt(0);\n\t range.deleteContents();\n\n\t // Range.createContextualFragment() would be useful here but is\n\t // non-standard and not supported in all browsers (IE9, for one)\n\t var el = document.createElement(\"div\");\n\t el.innerHTML = html;\n\t var frag = document.createDocumentFragment(), node, lastNode;\n\t while ( (node = el.firstChild) ) {\n\t lastNode = frag.appendChild(node);\n\t }\n\t range.insertNode(frag);\n\n\t // Preserve the selection\n\t if (lastNode) {\n\t range = range.cloneRange();\n\t range.setStartAfter(lastNode);\n\t range.collapse(true);\n\t sel.removeAllRanges();\n\t sel.addRange(range);\n\t }\n\t }\n\t } else if (document.selection && document.selection.type != \"Control\") {\n\t // IE < 9\n\t document.selection.createRange().pasteHTML(html);\n\t }\n\t}\n\n\n\t// !audio/video functions\n\t// looks for html 5 audio or video media.\n\t// return false if it can't find either one.\n\tfunction getMyMedia() {\n\t\tvar myMedia = false;\n\t\tif(document.getElementsByTagName('audio')[0]) {\n\t\t\tmyMedia = document.getElementsByTagName('audio')[0];\n\t\t} else if (document.getElementsByTagName('video')[0]) {\n\t\t\tmyMedia = document.getElementsByTagName('video')[0];\n\t\t}\n\t\treturn myMedia;\n\t}\n\t// media transport controls\n\tfunction playPause() {\n\t\tvar myMedia = getMyMedia();\n\t\tif(myMedia) {\n\t\t if (myMedia.paused)\n\t\t myMedia.play();\n\t\t else\n\t\t myMedia.pause();\n\t\t}\n\t}\n\tfunction jumpForward(seconds) {\n\t\tvar myMedia = getMyMedia();\n\t\tif(myMedia) {\n\t\t\t// default of 5 seconds\n\t\t\tseconds = typeof seconds !== 'undefined' ? seconds : 5;\n\t\t\tmyMedia.currentTime = myMedia.currentTime + seconds;\n\t\t}\n\t}\n\tfunction jumpBackward(seconds) {\n\t\tvar myMedia = getMyMedia();\n\t\tif(myMedia) {\n\t\t\t// default of 5 seconds\n\t\t\tseconds = typeof seconds !== 'undefined' ? seconds : 5;\n\t\t\tmyMedia.currentTime = myMedia.currentTime - seconds;\n\t\t}\n\t}\n\n\n}); // end of $(document).ready(\n"]}
1
+ {"version":3,"sources":["app.js"],"names":["$","document","ready","volume","prevPageX","prevPageY","draggingSeekCursor","click","audio","paused","play","pause","removeClass","addClass","on","e","timeString","getMMSS","duration","text","currentTime","percentFromTop","mousedown","window","mousemove","leftBound","offset","left","width","cursorX","trackWidth","pageX","mouseX","css","mouseup","positionRatio","index","indexOf","leftPositionCSS","substring","leftPositionStr","leftPosition","parseFloat","percentPosition","this","parent","find","target","speed","length","playbackRate","draggingSpeedCursor","speedPercent","topPositionStr","topBound","top","height","cursorY","trackHeight","pageY","mouseY","topPositionCSS","topPosition","draggingVolumeCursor","draggingSplitter","volumePercent","hasClass","val","post","attr","serialize","startHeight","startWidth","sendTranscriptionForm","mouseDeltaX","newWidthCss","mouseDeltaY","newHeight","newHeightCss","maxHeight","toString","stackedHeight","unstackedWidth","widthStr","heightStr","innerHeight","setTranscriptionFormFields","innerWidth","saveTranscriptionSize","addStatusInProgrssToForm","name","id","value","currentPage","previousIndex","savePageInfo","taskEdit","transcriptionBlocked","pages","updatePageImage","updateTranscriptEditable","editedPage","unblockTranscription","image","setPageFigure","figure","delay","fadeOut","preventDefault","projectLink","url","focus","bind","originalEvent","clipboardData","getData","insertHtmlAtCursor","html","isCtrl","addTranscriptionToForm","keyCode","which","showActiveTags","myMedia","seconds","scrollDown","scrollUp","saveTranscription","jumpBackward","getMyMedia","key","navigator","userAgent","slice","append","cursorIsAtEnd","scrollTop","scrollHeight","event","first","alert","replace","done","data","setTimeout","remove","location","hide","show","stacked","next","siblings","not","unwrap","contents","formattedDate","isCursorInsideElement","containerNode","getCursorContainerNode","closest","totalSeconds","blockTranscription","minutes","currentIndex","scrollLeft","loadImage","pagePrototype","callback","Image","selectedText","rangy","getSelection","toHtml","dateFormatted","prompt","buttonName","that","Object","setPrototypeOf","htmlEncode","i","createCookie","days","testRange","setStart","sel","el","atStart","get","selectNodeContents","atEnd","selRange","selection","createRange","duplicate","setEndPoint","startContainer","startOffset","moveToElementText","endContainer","endOffset","type","tagName","nodeType","attributeType","attributeValue","toUpperCase","hilightNodeContents","attributes","getNamedItem","setSingleRange","range","getRangeAt","rangeCount","commonAncestorContainer","deleteContents","parentNode","node","lastNode","insertNode","collapse","createElement","addRange","removeAllRanges","createDocumentFragment","firstChild","frag","appendChild","cloneRange","setStartAfter","getElementsByTagName","jumpForward"],"mappings":"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","file":"app.js","sourcesContent":["$(document).ready(function() { // start $(document).ready\n\n\t// !variables for keeping track of mouse\n\tvar prevPageX = null;\n\tvar prevPageY = null;\n\n\t// !audio element play/pause button\n\t$('.playButton').click(function() {\n\t\tvar audio = $('audio')[0];\n\t\tif(audio.paused) {\n\t\t\taudio.play();\n\t\t} else {\n audio.pause();\n\t\t}\n\t});\n\t$('audio').on('play', function() {\n\t\t$('.playButton').removeClass('icon-play');\n\t\t$('.playButton').addClass('icon-pause');\n\t});\n\t$('audio').on('pause', function() {\n\t\t$('.playButton').removeClass('icon-pause');\n\t\t$('.playButton').addClass('icon-play');\n\t});\n\n\t// !audio time tracker display\n\t$('audio').on('canplaythrough', function(e) {\n\t\tvar numSeconds = $('audio')[0].duration;\n\t\tvar timeString = getMMSS(numSeconds);\n\t\t$('.audioControls .timeDisplay .totalTime').text(timeString);\n\t\t$('.audioControls .timeDisplay .progress').text('00:00');\n\t});\n\t$('audio').on('error', function(e) {\n\t\t$('.audioControls .timeDisplay .totalTime').text('--:--');\n\t\t$('.audioControls .timeDisplay .progress').text('--:--');\n\t});\n\t$('audio').on('timeupdate', function(e) {\n\t\tvar numSeconds = $('audio')[0].currentTime;\n\t\tvar timeString = getMMSS(numSeconds);\n\t\t$('.audioControls .timeDisplay .progress').text(timeString);\n\t});\n\n\t// !audio seek dragging\n\tvar draggingSeekCursor = false;\n\t$('.seekCursor').mousedown(function(e) {\n\t\tdraggingSeekCursor = true;\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingSeekCursor) {\n\t\t\tvar leftBound = $('.seekTrack').offset().left;\n\t\t\tvar trackWidth = $('.seekTrack').width();\n\t\t\tvar mouseX = e.pageX;\n\t\t\tvar cursorX = mouseX - leftBound;\n\t\t\tif(cursorX < 0) {\n\t\t\t\t$('.seekCursor').css('left', 0);\n\t\t\t} else if(cursorX > $('.seekTrack').width()) {\n\t\t\t\t$('.seekCursor').css('left', $('.seekTrack').width())\n\t\t\t} else {\n\t\t\t\t$('.seekCursor').css('left', cursorX);\n\t\t\t}\n\t\t}\n\t});\n\t$(window).mouseup(function(e) {\n\t\tif(draggingSeekCursor) {\n\t\t\tdraggingSeekCursor = false;\n\t\t\tvar leftPositionCSS = $('.seekCursor').css('left');\n\t\t\tvar index = leftPositionCSS.indexOf('px');\n\t\t\tvar leftPositionStr = leftPositionCSS.substring(0, index);\n\t\t\tvar leftPosition = parseFloat(leftPositionStr);\n\t\t\tvar trackWidth = $('.seekTrack').width();\n\t\t\tvar positionRatio = leftPosition / trackWidth;\n\t\t\t$('audio')[0].currentTime = positionRatio * $('audio')[0].duration;\n\t\t}\n\t});\n\n\t// !audio seek follows audio element's time\n\t$('audio').on('timeupdate', function(e) {\n\t\tif(!draggingSeekCursor) {\n\t\t\tvar percentPosition = 100 * (this.currentTime / this.duration);\n\t\t\tvar $seekCursor = $(this).parent().find('.seekCursor');\n\t\t\t$seekCursor.css('left', percentPosition + '%');\n\t\t}\n\t});\n\n\t// !show/hide speed slider on click\n\t$('.speedButton').click(function(e) {\n\t\tif($('.speedSlider').css('display') === 'none') {\n\t\t\t$('.speedSlider').css('display', 'block');\n\t\t} else if(e.target !== $('.speedSlider')[0]) {\n\t\t\t$('.speedSlider').css('display', 'none');\n\t\t}\n\t});\n\t$(window).click(function(e) {\n\t\tif(e.target !== $('.speedButton')[0] && e.target !== $('.speedSlider')[0]) {\n\t\t\t$('.speedSlider').css('display', 'none');\n\t\t}\n\t});\n\n\t// !audio speed dragging\n\tvar speed;\n\tif($('audio').length > 0) {\n\t\tspeed = $('audio')[0].playbackRate;\n\t}\n\tvar maxSpeed = 1.5;\n\tvar speedPercent = 100 * (speed / maxSpeed);\n\tvar percentFromTop = 100 - speedPercent;\n\t$('.speedCursor').css('top', percentFromTop + '%');\n\tvar draggingSpeedCursor = false;\n\t$('.speedCursor').mousedown(function(e) {\n\t\tdraggingSpeedCursor = true;\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingSpeedCursor) {\n\t\t\tvar topBound = $('.speedTrack').offset().top;\n\t\t\tvar trackHeight = $('.speedTrack').height();\n\t\t\tvar mouseY = e.pageY;\n\t\t\tvar cursorY = mouseY - topBound;\n\t\t\tif(cursorY < 0) {\n\t\t\t\t$('.speedCursor').css('top', 0);\n\t\t\t} else if(cursorY > $('.speedTrack').height()) {\n\t\t\t\t$('.speedCursor').css('top', $('.speedTrack').height())\n\t\t\t} else {\n\t\t\t\t$('.speedCursor').css('top', cursorY);\n\t\t\t}\n\t\t\tvar topPositionCSS = $('.speedCursor').css('top');\n\t\t\tvar index = topPositionCSS.indexOf('px');\n\t\t\tvar topPositionStr = topPositionCSS.substring(0, index);\n\t\t\tvar topPosition = parseFloat(topPositionStr);\n\t\t\tvar trackHeight = $('.speedTrack').height();\n\t\t\tvar positionRatio = topPosition / trackHeight;\n\t\t\tvar maxSpeed = 2;\n\t\t\t$('audio')[0].playbackRate = 1 / (positionRatio * maxSpeed);\n\t\t}\n\t});\n\t$(window).mouseup(function(e) {\n\t\tdraggingSpeedCursor = false;\n\t});\n\n\t// !show/hide volume slider on click\n\t$('.volumeButton').click(function(e) {\n\t\tif($('.volumeSlider').css('display') === 'none') {\n\t\t\t$('.volumeSlider').css('display', 'block');\n\t\t} else if(e.target !== $('.volumeSlider')[0]) {\n\t\t\t$('.volumeSlider').css('display', 'none');\n\t\t}\n\t});\n\t$(window).click(function(e) {\n\t\tif(e.target !== $('.volumeButton')[0] && e.target !== $('.volumeSlider')[0]) {\n\t\t\t$('.volumeSlider').css('display', 'none');\n\t\t}\n\t});\n\n\t// !audio volume dragging\n\tvar volume;\n\tif($('audio').length > 0) {\n\t\tvolume = $('audio')[0].playbackRate;\n\t}\n\tvar volumePercent = 100 * volume;\n\tvar percentFromTop = 100 - volumePercent;\n\t$('.volumeCursor').css('top', percentFromTop + '%');\n\tvar draggingVolumeCursor = false;\n\t$('.volumeCursor').mousedown(function(e) {\n\t\tdraggingVolumeCursor = true;\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingVolumeCursor) {\n\t\t\tvar topBound = $('.volumeTrack').offset().top;\n\t\t\tvar trackHeight = $('.volumeTrack').height();\n\t\t\tvar mouseY = e.pageY;\n\t\t\tvar cursorY = mouseY - topBound;\n\t\t\tif(cursorY < 0) {\n\t\t\t\t$('.volumeCursor').css('top', 0);\n\t\t\t} else if(cursorY > $('.volumeTrack').height()) {\n\t\t\t\t$('.volumeCursor').css('top', $('.volumeTrack').height())\n\t\t\t} else {\n\t\t\t\t$('.volumeCursor').css('top', cursorY);\n\t\t\t}\n\t\t\tvar topPositionCSS = $('.volumeCursor').css('top');\n\t\t\tvar index = topPositionCSS.indexOf('px');\n\t\t\tvar topPositionStr = topPositionCSS.substring(0, index);\n\t\t\tvar topPosition = parseFloat(topPositionStr);\n\t\t\tvar trackHeight = $('.volumeTrack').height();\n\t\t\tvar positionRatio = topPosition / trackHeight;\n\t\t\t$('audio')[0].volume = 1 - positionRatio;\n\t\t}\n\t});\n\t$(window).mouseup(function(e) {\n\t\tdraggingVolumeCursor = false;\n\t});\n\n\t// !serif/sans-serif toggle button\n\t$('#serifToggleButton').click(function(e) {\n\t\tif($('#transcriptionTextArea').hasClass('serif')) {\n\t\t\t$('#transcriptionTextArea').removeClass('serif');\n\t\t\t$('#serifToggleInput').val('false');\n\t\t} else {\n\t\t\t$('#transcriptionTextArea').addClass('serif');\n\t\t\t$('#serifToggleInput').val('true');\n\t\t}\n\t\t$.post($(\"#serifToggleForm\").attr('action'), $(\"#serifToggleForm\").serialize());\n\t});\n\n\t// !make text pane resize when splitter is dragged\n\tvar draggingSplitter = false;\n\tvar startHeight = null;\n\tvar startWidth = null;\n\t$('.splitter').mousedown(function(e) {\n\t\tdraggingSplitter = true;\n\t\tprevPageX = e.pageX;\n\t\tprevPageY = e.pageY;\n\t\tstartHeight = $('.task .transcript').height();\n\t\tstartWidth = $('.task .transcript').width();\n\t});\n\t$(window).mousemove(function(e) {\n\t\tif(draggingSplitter) {\n\t\t\t// If it's in the stacked layout, the splitter should\n\t\t\t// split vertically.\n\t\t\tif($('.task').hasClass('stacked')) {\n\t\t\t\tvar mouseDeltaY = e.pageY - prevPageY;\n\t\t\t\tvar newHeight = startHeight - mouseDeltaY;\n\t\t\t\tvar maxHeight = $('.task').height() - 21;\n\t\t\t\tif(newHeight > maxHeight) {\n\t\t\t\t\tnewHeight = maxHeight;\n\t\t\t\t}\n\t\t\t\tvar newHeightCss = newHeight.toString() + 'px';\n\t\t\t\tstackedHeight = newHeightCss;\n\t\t\t\t$('.task .transcript').css('height', newHeightCss);\n\t\t\t}\n\t\t\t// Otherwise, it should split horizontally.\n\t\t\telse {\n\t\t\t\tvar mouseDeltaX = e.pageX - prevPageX;\n\t\t\t\tvar newWidth = startWidth - mouseDeltaX;\n\t\t\t\tvar newWidthCss = newWidth.toString() + 'px';\n\t\t\t\tunstackedWidth = newWidthCss;\n\t\t\t\t$('.task .transcript').css('width', newWidthCss);\n\t\t\t}\n\t\t}\n\t});\n\t$(window).mouseup(function() {\n\t\tif(draggingSplitter) {\n\t\t\tsaveTranscriptionSize();\n\t\t}\n\t\tdraggingSplitter = false;\n\t\tprevPageX = null;\n\t\tprevPageY = null;\n\t\tstartHeight = null;\n\t\tstartWidth = null;\n\t});\n\tfunction saveTranscriptionSize() {\n\t\tsetTranscriptionFormFields();\n\t\tsendTranscriptionForm();\n\t}\n\tfunction setTranscriptionFormFields() {\n\t\tif($('.task').hasClass('stacked')) {\n\t\t\tvar height = $('.task .transcript').innerHeight();\n\t\t\tvar heightStr = height.toString()\n\t\t\t$('#transcriptionHeight').val(heightStr);\n\t\t} else {\n\t\t\tvar width = $('.task .transcript').innerWidth();\n\t\t\tvar widthStr = width.toString();\n\t\t\t$('#transcriptionWidth').val(widthStr);\n\t\t}\n\t}\n\tfunction sendTranscriptionForm() {\n\t\t$.post($(\"#resizeTranscriptionForm\").attr('action'), $(\"#resizeTranscriptionForm\").serialize());\n\t}\n\n\t// !allow user to look at other pages than the one they are transcribing\n\tvar transcriptionBlocked = false;\n\t$('#previousPageButton').click(function() {\n\t\tsavePageInfo();\n\t\ttaskEdit.currentPage = getPreviousPage();\n\t\tupdateTranscriptEditable();\n\t\tupdatePageImage();\n\t});\n\t$('#currentPageButton').click(function() {\n\t\tsavePageInfo();\n\t\ttaskEdit.currentPage = taskEdit.editedPage;\n\t\tunblockTranscription();\n\t\tupdatePageImage();\n\t});\n\t$('#nextPageButton').click(function() {\n\t\tsavePageInfo();\n\t\ttaskEdit.currentPage = getNextPage();\n\t\tupdateTranscriptEditable();\n\t\tupdatePageImage();\n\t});\n\n\t// pause, then hide notify messages\n\t$('.notify > li.success').delay(4000).fadeOut('slow');\n\n\t// !make dashboard tasks (Available and Completed) clickable\n\t$('.tasks li').click(function(e) {\n\t\te.preventDefault(); // disable the anchor link, or Firefox will send 2 requests\n\t\tvar projectLink = $(this).find('.title');\n\t\tif(e.target === projectLink[0]) {\n\t\t\twindow.location = projectLink.attr('href');\n\t\t} else {\n\t\t\tvar url = $(this).find('.type').attr('href');\n\t\t\twindow.location = url;\n\t\t}\n\t});\n\n\t// !set focus to transcription text area\n\t// but don't show focus if it's a finished or skipped task\n\tif($('.finishedTask').length == 0 && $('.skippedTask').length == 0) {\n\t\t$(\"#transcriptionTextArea\").focus();\n\t}\n\n\t// !instead of using the default paste behavior, remove style/RTF\n\t// tags, as well as HTML tags, before inserting text into\n\t// #transcriptionArea from clipboard.\n\t$('#transcriptionTextArea').bind('paste', function(e) { // check for paste event\n\t\te.preventDefault();\n\t\t// get just the text, without tags\n\t\tvar text = e.originalEvent.clipboardData.getData('text/plain');\n\t\ttext = htmlEncode(text);\n\t\t// Note: I tried using document.execCommand('insertText') here\n\t\t// before, but it is no longer here because it caused problems.\n\t\t// If insertText is used, the browser will decide what html to\n\t\t// use to display the content. This is a problem, because we\n\t\t// need to make sure there are no unescaped tags that are\n\t\t// children of the transcriptionTextArea element, and insertText\n\t\t// will add those. So, instead, this function makes a call to\n\t\t// `insertHtmlAtCursor`.\n\t\tinsertHtmlAtCursor(text);\n\t});\n\n\t// !=================\n\t// !KEY BINDINGS\n\tvar isCtrl = false;\n\t$(document).on('click keyup', function(e) {\n\t\tvar keyCode = e.keyCode || e.which;\n\t\t// this is needed to handle control keys properly\n\t if(keyCode == 17) isCtrl=false;\n\t // if the cursor is inside tagged text, show which tags have been applied\n\t\tshowActiveTags();\n\t});\n\t$(document).on('keydown', function(e) {\n\t\tvar keyCode = e.keyCode || e.which;\n\t if(keyCode == 17) isCtrl=true;\n\t\t// scroll down: CTRL+d\n\t\tif(keyCode == 68 && isCtrl == true) {\n\t\t\tscrollDown();\n\t\t\treturn false;\n\t\t}\n\t\t// scroll up: CTRL+u\n\t\tif(keyCode == 85 && isCtrl == true) {\n\t\t\tscrollUp();\n\t\t\treturn false;\n\t\t}\n\t\t// save: CTRL+s\n\t\tif($('.finishedTask').length != 0 || $('.skippedTask').length != 0) {\n\t\t\t// don't do anything if this is a finished task or a skipped task\n\t\t} else {\n\t\t\tif(keyCode == 83 && isCtrl == true) {\n\t\t\t\tsaveTranscription();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t// for audio/video media\n\t\t// play/pause: CTRL+k\n\t\tif(keyCode == 75 && isCtrl == true) {\n\t\t\tplayPause();\n\t\t\treturn false;\n\t\t}\n\t\t// jumpBackward: CTRL+j\n\t\tif(keyCode == 74 && isCtrl == true) {\n\t\t\tjumpBackward();\n\t\t\treturn false;\n\t\t}\n\t\t// jumpForward: CTRL+l\n\t\tif(keyCode == 76 && isCtrl == true) {\n\t\t\tjumpForward();\n\t\t\treturn false;\n\t\t}\n\t});\n\n\t// key bindings for the transcription text area\n\t$('#transcriptionTextArea').on('keydown', function(e) {\n\t\tvar keyCode = e.key || e.which;\n\t\tif (keyCode == \"Tab\") {\n\t\t// !tab key\n\t\t\te.preventDefault();\n\t\t\tinsertHtmlAtCursor('\\t');\n\t\t} else if (keyCode == \"Enter\") {\n\t\t// !return key\n\t\t\t// this is a pain\n\t\t\t// browsers render the return key differently in a contenteditable area:\n\t\t\t// - some create a new div\n\t\t\t// - some create a new p\n\t\t\t// - some create a br tag\n\t\t\t// We don't want any of that! We just a newline character.\n\t\t\t// But it gets complicated... First:\n\t\t\te.preventDefault(); // prevent the default behavior\n\t\t\t// for webkit and IE:\n\t\t\tif(navigator.userAgent.indexOf('AppleWebKit') != -1 || navigator.userAgent.indexOf('MSIE') != -1) {\n\t\t\t\t// !always make sure the last character is a newline\n\t\t\t\t// because we need 2 newlines at the end to register\n\t\t\t\t// a single line break in the viewer.\n\t\t\t\tif ($(\"#transcriptionTextArea\").text().slice(-1) != \"\\n\") {\n\t\t\t\t\t$(\"#transcriptionTextArea\").append(\"\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t// for webkit we scroll to the bottom before adding the second newline:\n\t\t\tif(navigator.userAgent.indexOf('AppleWebKit') != -1) {\n\t\t\t\tif(cursorIsAtEnd()) {\n\t\t\t\t\t$('#transcriptionTextArea').scrollTop($('#transcriptionTextArea')[0].scrollHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// now we can finally insert a newline character!\n\t\t\tinsertHtmlAtCursor('\\n');\n\t\t\t// for non webkit browsers we scroll after adding the newline:\n\t\t\tif(navigator.userAgent.indexOf('AppleWebKit') == -1) {\n\t\t\t\tif(cursorIsAtEnd()) {\n\t\t\t\t\t$('#transcriptionTextArea').scrollTop($('#transcriptionTextArea')[0].scrollHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// !Save, Skip, and Submit buttons\n\t// Save button\n\t$(\"#transcribeForm #saveButton\").click(function(event) {\n\t\t/* stop form from submitting normally */\n\t\tevent.preventDefault();\n\t\t// save\n\t\tsaveTranscription();\n\t\treturn false;\n\t});\n\t// Submit button\n\t$(\"#transcribeForm #finishButton\").click(function(event) {\n\t\t// check if there are diff options that need to be resolved before submit\n\t\tif ($(\"#transcriptionTextArea span.opts\").first().length > 0) {\n\t\t\t// stop the form from submitting\n\t\t\tevent.preventDefault();\n\t\t\t// alert that diffs need to be resolved\n\t\t\talert(\"Click the \\\"apply diffs\\\" button before submitting.\");\n\t\t\treturn false;\n\t\t} else {\n\t\t\taddTranscriptionToForm(); // add hidden input to form with the transcription text\n\t\t\t// submit normally\n\t\t}\n\t});\n\t// Skip button\n\t$(\"#transcribeForm #skipButton\").click(function(event) {\n\t\taddTranscriptionToForm(); // add hidden input to form with the transcription text\n\t\t// submit normally\n\t});\n\n\n\t// !add contents of div#transcriptionTextArea to form as a hidden field\n\t// (done before saving or submitting)\n\tvar addTranscriptionToForm = function() {\n\t $(\"#transcribeForm\").append(\n\t $(\"<input type='hidden' />\").attr({\n\t name: \"transcription\",\n\t id: \"userTranscriptionFormInput\",\n\t\t\t\t// .html() encodes characters like & < > into html\n\t\t\t\t// entities, as long as they are in text nodes. However,\n\t\t\t\t// Firefox will append a <br> tag if the user ever\n\t\t\t\t// removes all text that is in the transcription box\n\t\t\t\t// (sometimes happens when typing the first word of the\n\t\t\t\t// transcription). This <br> tag is not in a text node,\n\t\t\t\t// so it is not html encoded, and must be removed.\n\t value: $(\"#transcriptionTextArea\").html().replace('<br>', '')\n\t })\n\t )\n\t}\n\t// add a hidden input to the form for UserTask status='in progress'\n\t// (we return false when the save button is clicked so it doesn't send it's value in the form, status='in progress')\n\tvar addStatusInProgrssToForm = function() {\n\t\t$(\"#transcribeForm\").append(\n\t\t $(\"<input type='hidden' />\").attr({\n\t\t name: \"status\",\n\t\t id: \"userTaskStatus\",\n\t\t value: 'in progress'\n\t\t })\n\t\t)\n\t}\n\n\t// !save transcription form using AJAX\n\tvar saveTranscription = function() {\n\n\t\t// update the save button class to show that save is in progress\n\t\t$(\"#transcribeForm #saveButton\").removeClass(\"saved\");\n\t\t$(\"#transcribeForm #saveButton\").removeClass(\"failedToSave\");\n\t\t$(\"#transcribeForm #saveButton\").addClass(\"saving\");\n\n\t\t// add a hidden input to the form with transcription text (from contenteditable #transcriptionTextArea)\n\t\taddTranscriptionToForm();\n\t\t// add a hidden input to the form for UserTask status='in progress'\n\t\taddStatusInProgrssToForm();\n\n\t\t/* Send the data using post */\n\t\tvar posting = $.post($(\"#transcribeForm\").attr('action'), $(\"#transcribeForm\").serialize());\n\t\t// check data for success or failure\n\t\tposting.done(function(data) {\n\t\t\tif(data.status === \"success\") {\n\t\t\t\t// on success, update save button class to show success\n\t\t\t\tsetTimeout(function() { $(\"#transcribeForm #saveButton\").removeClass(\"saving\");\t}, 500);\n\t\t\t\t$(\"#transcribeForm #saveButton\").removeClass(\"failedToSave\");\n\t\t\t\t$(\"#transcribeForm #saveButton\").addClass(\"saved\");\n\t\t\t} else {\n\t\t\t\t// on failure: update save button class to show failure, show an error alert\n\t\t\t\tsetTimeout(function() { $(\"#transcribeForm #saveButton\").removeClass(\"saving\");\t}, 500);\n\t\t\t\t$(\"#transcribeForm #saveButton\").removeClass(\"saved\");\n\t\t\t\t$(\"#transcribeForm #saveButton\").addClass(\"failedToSave\");\n\t\t\t\talert(\"Error: Unable to save.\");\n\t\t\t}\n\t\t\t// set focus to transcription area\n\t\t\t$(\"#transcriptionTextArea\").focus();\n\t\t});\n\n\t\t// remove the hidden #transcriptionTextArea form input that we added\n\t\t$(\"#userTranscriptionFormInput\").remove();\n\t\t// remove the hidden UserTask Status input that we added\n\t\t$(\"#userTaskStatus\").remove();\n\t}\n\n\t// !save transcription before following certain links\n $('a.saveTranscription').click(function() {\n \t// does the form exist\n \tif($('#transcribeForm').length == 0) {\n\t\t\treturn true; // no form, so we just follow the link\n\t\t} else if($('.finishedTask').length != 0 || $('.skippedTask').length != 0) {\n\t\t\t // don't save anything for finished or skipped tasks\n\t\t\treturn true;\n\t\t} else {\n\t\t\t// add hidden input to form with the transcription text\n\t\t\taddTranscriptionToForm();\n\t\t\t// add a hidden input to the form for UserTask status='in progress'\n\t\t\taddStatusInProgrssToForm();\n\t\t\t// we submit the form along with a redirect URL in the query string\n\t\t\t// the redirect URL is this link's href value\n\t\t\t// var href = $(this).attr(\"href\");\n\t\t\t// var encodedHref = encodeURIComponent(href);\n\t\t\t// var newFormAction = $('#transcribeForm').attr(\"action\") + \"/?redirectURL=\" + encodedHref;\n\t\t\t// $('#transcribeForm').attr(\"action\", newFormAction);\n\t\t\t// $('#transcribeForm').submit();\n\t\t\tsaveTranscription();\n\t\t\twindow.location = $(this).attr('href');\n\t\t\treturn false;\n\t\t}\n });\n\n\t// !stop following the menu link\n\t$('a#toggle').click(function() {\n\t\treturn false;\n\t});\n\n\t// !hide save, skip, submit buttons if the usertask is finished or skipped\n\tif($('.finishedTask').length != 0 || $('.skippedTask').length != 0) {\n\t\t$('li.finishButton').hide();\n\t\t$('li.skipButton').hide();\n\t\t$('li.saveButton').hide();\n\t}\n\n\t// !reOpenUserTask: re-opens a usertask that was previously skipped\n\t$('a.reOpenUserTask').click(function() {\n\n\t\tevent.preventDefault();\n\n\t\t// show save, skip, submit buttons\n\t\t$('li.finishButton').show();\n\t\t$('li.skipButton').show();\n\t\t$('li.saveButton').show();\n\n\t\t// remove overlay\n\t\t$('div.notouch').remove();\n\n\t\t// focus on transcription\n\t\t$(\"#transcriptionTextArea\").focus();\n\n\t\treturn false;\n\t});\n\n\n\t// !=================\n\t// !LAYOUT\n\t// !Toggle layout (stacked or side by side)\n\t$('#toggleLayout').click(function() {\n\n\t\tif ( !$('.task').hasClass('stacked') ) {\n\t\t\t$('#transcriptionStacked').val('true');\n\t\t\tsendTranscriptionForm();\n\t\t\t$('.task').addClass('stacked');\n\t\t\t$('.task .transcript').css('width', '100%');\n\t\t\t$('.task .transcript').css('height', stackedHeight);\n\n\t\t} else if ( $('.task').hasClass('stacked') ) {\n\t\t\t$('#transcriptionStacked').val('false');\n\t\t\tsendTranscriptionForm();\n\t\t\t$('.task').removeClass('stacked');\n\t\t\t$('.task .transcript').css('height', '100%');\n\t\t\t$('.task .transcript').css('width', unstackedWidth);\n\t\t}\n\t\treturn false;\n\t});\n\t// set the css for stacked or sidebyside viewing in task edit\n\tif(typeof stacked === 'boolean') { // `stacked` only exists in the task edit page\n\t\tif (stacked) {\n\t\t\t$('.task').addClass('stacked');\n\t\t\t$('a#stacked').addClass('selected');\n\t\t\t$('a#sidebyside').removeClass('selected');\n\t\t\t$('.task .transcript').css('height', stackedHeight);\n\t\t\t$('.task .transcript').css('width', '100%');\n\t\t} else {\n\t\t\t$('.task').removeClass('stacked');\n\t\t\t$('a#stacked').removeClass('selected');\n\t\t\t$('a#sidebyside').addClass('selected');\n\t\t\t$('.task .transcript').css('height', '100%');\n\t\t\t$('.task .transcript').css('width', unstackedWidth);\n\t\t}\n\t}\n\n\n\t// !=================\n\t// !VISUAL DIFF\n\t// !cycle thru diff options by clicking them\n $(\"span.opt\").click(function(event){\n\t\t$(this).hide(0);\n\t\t$(this).addClass(\"optHidden\");\n\t if ($(this).next(\".opt\").length == 0) {\n\t\t\t// last element, we need to wrap back to the beginning\n\t\t\t// !TODO: refactor common selectors into a var\n\t\t\t$(this).siblings(\".opt\").first().removeClass(\"optHidden\");\n\t\t\t$(this).siblings(\".opt\").first().hide(0);\n\t\t\t$(this).siblings(\".opt\").first().fadeIn(250);\n\t\t\t$(this).siblings(\".opt\").first().css(\"display\", \"inline\");\n\t\t} else {\n\t\t\t$(this).next(\".opt\").removeClass(\"optHidden\");\n\t\t\t$(this).next(\".opt\").hide(0);\n\t\t\t$(this).next(\".opt\").fadeIn(250);\n\t\t\t$(this).siblings(\".opt\").first().css(\"display\", \"inline\");\n\t\t}\n });\n\n\n\t// !add clickable \"apply\" button if there are text diff options\n\tif ($(\"#transcriptionTextArea span.opts\").first().length > 0) {\n\t\t$(\".tags button\").hide();\n\t\t$(\".tags h3\").hide();\n\t\t$(\".tags\").append('<div id=\"diffInstructions\"><p class=\"instructions\">Click highlighted areas to choose diffs, or <a id=\"flipDiffs\">flip all diffs</a>.</p><button id=\"applyDiffs\">apply diffs</button></div>');\n\t}\n\n\t// flip all the currently visible diff/text options\n $(\"#flipDiffs\").click(function(event){\n\t\t// add some temp classes\n $(\"span.opts span.opt.optHidden\").addClass(\"show\");\n\t\t$(\"span.opts span.opt\").not(\".optHidden\").addClass(\"hide\");\n // show/hide options\n $(\"span.opts span.opt.show\").css(\"display\", \"inline\");\n $(\"span.opts span.opt.hide\").css(\"display\", \"none\");\n $(\"span.opts span.opt.show\").removeClass(\"optHidden\");\n $(\"span.opts span.opt.show\").removeClass(\"show\");\n $(\"span.opts span.opt.hide\").addClass(\"optHidden\");\n $(\"span.opts span.opt.hide\").removeClass(\"hide\");\n });\n\n\t// !apply the currently visible diff/text options\n $(\"button#applyDiffs\").click(function(event){\n\t\t$(\".optHidden\").remove();\n\t\t$(\".optEmpty\").remove();\n\t\t$(\".opt\").contents().unwrap();\n\t\t$(\".opts\").contents().unwrap();\n\t\t$(\".opts\").remove();\n\t\t$(\".tags button\").show();\n\t\t$(\".tags h2\").show();\n\t\t$(\"#diffInstructions\").remove();\n });\n\n\n\t// !=================\n\t// !TAGGING\n\t// !highlight TEI tags if the cursor is inside them\n\tvar showActiveTags = function() {\n\t\t// TEI person\n\t\tif (isCursorInsideElement(\"name\", \"type\", \"person\")) {\n\t\t\t$(\"button[buttonName='Person']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Person']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI place\n\t\tif (isCursorInsideElement(\"name\", \"type\", \"place\")) {\n\t\t\t$(\"button[buttonName='Place']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Place']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI date\n\t\tif (isCursorInsideElement(\"date\")) {\n\t\t\t$(\"button[buttonName='Date']\").addClass(\"applied\");\n\t\t\t// get the \"when\" attribute\n\t\t\tvar containerNode = getCursorContainerNode();\n\t\t\tvar formattedDate = $(containerNode).closest(\"date\").attr(\"when\");\n\t\t\t$(\"button[buttonName='Date']\").html(\"Date: \" + formattedDate);\n\t\t} else {\n\t\t\t$(\"button[buttonName='Date']\").removeClass(\"applied\");\n\t\t\t$(\"button[buttonName='Date']\").html(\"Date\");\n\t\t}\n\t\t// TEI heading\n\t\tif (isCursorInsideElement(\"TEIhead\")) {\n\t\t\t$(\"button[buttonName='Heading']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Heading']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI quote\n\t\tif (isCursorInsideElement(\"q\")) {\n\t\t\t$(\"button[buttonName='Quote']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Quote']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI add\n\t\tif (isCursorInsideElement(\"add\")) {\n\t\t\t$(\"button[buttonName='Add']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Add']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI del\n\t\tif (isCursorInsideElement(\"del\", \"rend\", \"overstrike\")) {\n\t\t\t$(\"button[buttonName='Del']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Del']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI note\n\t\tif (isCursorInsideElement(\"note\", \"place\", \"margin\")) {\n\t\t\t$(\"button[buttonName='Note']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Note']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI unclear\n\t\tif (isCursorInsideElement(\"unclear\", \"reason\", \"illegible\")) {\n\t\t\t$(\"button[buttonName='Unclear']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Unclear']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI underline\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"underline\")) {\n\t\t\t$(\"button[buttonName='Underline']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Underline']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI bold\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"bold\")) {\n\t\t\t$(\"button[buttonName='Bold']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Bold']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI italic\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"italic\")) {\n\t\t\t$(\"button[buttonName='Italic']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Italic']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI Superscript\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"sup\")) {\n\t\t\t$(\"button[buttonName='Superscript']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Superscript']\").removeClass(\"applied\");\n\t\t}\n\t\t// TEI Subscript\n\t\tif (isCursorInsideElement(\"hi\", \"rend\", \"sub\")) {\n\t\t\t$(\"button[buttonName='Subscript']\").addClass(\"applied\");\n\t\t} else {\n\t\t\t$(\"button[buttonName='Subscript']\").removeClass(\"applied\");\n\t\t}\n\t}\n\n\n\t// !add a TEI lite tag to selected text\n $(\"button[class='insertTags']\").click(function(event){\n\t\tevent.preventDefault();\n\t\tvar openTag = '';\n\t\tvar closeTag = '';\n\t\t// only do this if the button is not already \"applied\"\n\t\tif(!$(this).hasClass(\"applied\")) {\n\n\t\t\t// get the selected text\n\t\t\tvar selectedText = rangy.getSelection().toHtml();\n\n\t\t\tif (selectedText == '') {\n\t\t\t\treturn false; // require a selection in order to tag something\n\t\t\t}\n\t\t\t// !TODO: maybe a switch statement here?\n\t\t\tif($(this).attr(\"buttonName\") == 'Person') {\n\t\t\t\tinsertHtmlAtCursor('<name type=\"person\">' + selectedText + '</name>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Place') {\n\t\t\t\tinsertHtmlAtCursor('<name type=\"place\">' + selectedText + '</name>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Date') {\n\t\t\t\tvar dateFormatted = prompt(\"Enter a formatted date (YYYY-MM-DD):\", \"YYYY-MM-DD\");\n\t\t\t\t// some very simple validation\n\t\t\t\tif(dateFormatted === \"\" || dateFormatted === \"YYYY-MM-DD\") return false;\n\t\t\t\tinsertHtmlAtCursor('<date when=\"' + dateFormatted + '\">' + selectedText + '</date>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Heading') {\n\t\t\t\tinsertHtmlAtCursor('<TEIhead>' + selectedText + '</TEIhead>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Quote') {\n\t\t\t\tinsertHtmlAtCursor('<q>' + selectedText + '</q>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Add') {\n\t\t\t\tinsertHtmlAtCursor('<add>' + selectedText + '</add>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Del') {\n\t\t\t\tinsertHtmlAtCursor('<del rend=\"overstrike\">' + selectedText + '</del>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Note') {\n\t\t\t\tinsertHtmlAtCursor('<note place=\"margin\">' + selectedText + '</note>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Unclear') {\n\t\t\t\tinsertHtmlAtCursor('<unclear reason=\"illegible\">' + selectedText + '</unclear>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Page #') {\n\t\t\t\tinsertHtmlAtCursor('\\n<pb n=\"' + selectedText + '\"/>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Underline') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"underline\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Bold') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"bold\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Italic') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"italic\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Superscript') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"sup\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t\tif($(this).attr(\"buttonName\") == 'Subscript') {\n\t\t\t\tinsertHtmlAtCursor('<hi rend=\"sub\">' + selectedText + '</hi>');\n\t\t\t}\n\t\t}\n });\n\n\n\t// !remove a TEI lite tag that is surrounding the cursor\n $(\"button[class='insertTags']\").click(function(event){\n \tif($(this).hasClass(\"applied\")) {\n \t\tvar buttonName = $(this).attr(\"buttonName\");\n \t\tvar containerNode = getCursorContainerNode();\n \t\t// get the correct container node based on the button name\n\t\t\tswitch(buttonName)\n\t\t\t{\n\t\t\tcase \"Person\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"name[type='person']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Place\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"name[type='place']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Date\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"Heading\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"TEIhead\");\n\t\t\t\tbreak;\n\t\t\tcase \"Quote\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"q\");\n\t\t\t\tbreak;\n\t\t\tcase \"Add\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"add\");\n\t\t\t\tbreak;\n\t\t\tcase \"Del\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"del[rend='overstrike']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Note\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"note[place='margin']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Unclear\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"unclear[reason='illegible']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Underline\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='underline']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Bold\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='bold']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Italic\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='italic']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Superscript\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='sup']\");\n\t\t\t\tbreak;\n\t\t\tcase \"Subscript\":\n\t\t\t\tcontainerNode = $(containerNode).closest(\"hi[rend='sub']\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// unwrap the contents\n \t\tif(containerNode) $(containerNode).contents().unwrap();\n\t\t}\n });\n\n\t\t// Takes as input a number of seconds and returns the corresponding\n\t\t// MM:SS string. Used by the audio player time display\n\t\tfunction getMMSS(totalSeconds) {\n\t\t\tvar minutes = Math.floor(totalSeconds / 60).toString();\n\t\t\tif(minutes.length == 1) minutes = '0' + minutes;\n\t\t\tvar seconds = Math.floor(totalSeconds % 60).toString();\n\t\t\tif(seconds.length == 1) seconds = '0' + seconds;\n\t\t\treturn minutes + ':' + seconds;\n\t\t}\n\n //functions for page switching\n function updateTranscriptEditable() {\n\t\tif(taskEdit.currentPage === taskEdit.editedPage) {\n\t\t\tunblockTranscription();\n\t\t} else {\n\t\t\tblockTranscription();\n\t\t}\n\t}\n\tfunction unblockTranscription() {\n\t\t$('#transcriptDimmer').css('display', 'none');\n\t\t$('#transcriptionTextArea').attr('contenteditable', true);\n\t}\n\tfunction blockTranscription() {\n\t\t$('#transcriptDimmer').css('display', 'block');\n\t\t$('#transcriptionTextArea').attr('contenteditable', false);\n\t}\n\tfunction savePageInfo() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tcurrentPage.scrollLeft = $(currentPage.figure).scrollLeft();\n\t\tcurrentPage.scrollTop = $(currentPage.figure).scrollTop();\n\t}\n\tfunction getPreviousPage() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tvar currentIndex = taskEdit.pages.indexOf(currentPage);\n\t\tvar previousIndex = currentIndex - 1;\n\t\tif(previousIndex < 0) {\n\t\t\treturn currentPage;\n\t\t} else {\n\t\t\treturn taskEdit.pages[previousIndex];\n\t\t}\n\t}\n\tfunction getNextPage() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tvar currentIndex = taskEdit.pages.indexOf(currentPage);\n\t\tvar nextIndex = currentIndex + 1;\n\t\tif(nextIndex >= taskEdit.pages.length) {\n\t\t\treturn currentPage;\n\t\t}\n\t\telse {\n\t\t\treturn taskEdit.pages[nextIndex];\n\t\t}\n\t}\n\tfunction updatePageImage() {\n\t\tvar currentPage = taskEdit.currentPage;\n\t\tif(typeof currentPage.image === 'undefined') {\n\t\t\tcurrentPage.loadImage(function() {\n\t\t\t\tsetPageFigure(currentPage.figure);\n\t\t\t});\n\t\t} else if(currentPage.figure !== $('.task .source figure').first()) {\n\t\t\tsetPageFigure(currentPage.figure);\n\t\t\t$(currentPage.figure).scrollLeft(currentPage.scrollLeft);\n\t\t\t$(currentPage.figure).scrollTop(currentPage.scrollTop);\n\t\t}\n\t}\n\tfunction setPageFigure(figure) {\n\t\t$('.task .source figure').first().remove();\n\t\t$('.task .source').append(figure);\n\t}\n\n\t// prototype for page objects (functions to manage scrolling)\n\tvar pagePrototype = {\n\t\tloadImage: function(callback) {\n\t\t\tvar image = $(new Image);\n\t\t\timage.attr('draggable', false);\n\t\t\timage.attr('crossorigin', 'anonymous'); // Match OpenSeadragon's CORS policy\n\t\t\timage.attr('src', this.url);\n\t\t\tvar that = this;\n\t\t\timage.on('load', function() {\n\t\t\t\t$(that.figure).append(image);\n\t\t\t\tthat.image = image;\n\t\t\t\tcallback();\n\t\t\t});\n\t\t},\n\t};\n\tif(typeof taskEdit !== 'undefined') {\n\t\tfor(var i = 0; i < taskEdit.pages.length; i++) {\n\t\t\tObject.setPrototypeOf(taskEdit.pages[i], pagePrototype);\n\t\t}\n\t}\n\n\t// !takes text and html encodes it\n\tfunction htmlEncode(text) {\n\t\treturn $('<div>').text(text).html();\n\t}\n\n\t// !simple js functions for cookies\n\tfunction createCookie(name, value, days) {\n\t if (days) {\n\t var date = new Date();\n\t date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n\t var expires = \"; expires=\" + date.toGMTString();\n\t } else var expires = \"\";\n\t document.cookie = escape(name) + \"=\" + escape(value) + expires + \"; path=/\";\n\t}\n\tfunction readCookie(name) {\n\t var nameEQ = escape(name) + \"=\";\n\t var ca = document.cookie.split(';');\n\t for (var i = 0; i < ca.length; i++) {\n\t var c = ca[i];\n\t while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n\t if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length, c.length));\n\t }\n\t return null;\n\t}\n\tfunction eraseCookie(name) {\n\t createCookie(name, \"\", -1);\n\t}\n\n\t// determine if the cursor is at the end of the transcription text area\n\tfunction cursorIsAtEnd() {\n\t\tvar el = $(\"#transcriptionTextArea\").get(0);\n\t var atStart = false, atEnd = false;\n\t var selRange, testRange;\n\t if (window.getSelection) {\n\t var sel = window.getSelection();\n\t if (sel.rangeCount) {\n\t selRange = sel.getRangeAt(0);\n\t testRange = selRange.cloneRange();\n\n\t testRange.selectNodeContents(el);\n\t testRange.setEnd(selRange.startContainer, selRange.startOffset);\n\t atStart = (testRange.toString() == \"\");\n\n\t testRange.selectNodeContents(el);\n\t testRange.setStart(selRange.endContainer, selRange.endOffset);\n\t atEnd = (testRange.toString() == \"\" || testRange.toString() == \"\\n\");\n\t }\n\t } else if (document.selection && document.selection.type != \"Control\") {\n\t selRange = document.selection.createRange();\n\t testRange = selRange.duplicate();\n\n\t testRange.moveToElementText(el);\n\t testRange.setEndPoint(\"EndToStart\", selRange);\n\t atStart = (testRange.text == \"\");\n\n\t testRange.moveToElementText(el);\n\t testRange.setEndPoint(\"StartToEnd\", selRange);\n\t atEnd = (testRange.text == \"\" || testRange.text == \"\\n\");\n\t }\n\t return atEnd;\n\t}\n\n\t// determine if the cursor is inside a given TEI tag\n\tfunction isCursorInsideElement(tagName, attributeType, attributeValue) {\n\t\tvar containerNode = getCursorContainerNode();\n\t tagName = tagName.toUpperCase();\n\t while (containerNode) {\n\t if (containerNode.nodeType == 1) {\n\t \tif (typeof(attributeType) === 'undefined' || typeof(attributeValue) === 'undefined') {\n\t\t\t\t\t// just check the tagname\n\t\t\t\t\tif (containerNode.tagName == tagName) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t \t} else {\n\t \t\t// check the tagname and attribute type and value\n\t\t\t\t\tif (containerNode.tagName == tagName && containerNode.attributes.getNamedItem(attributeType).value == attributeValue) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t \t}\n\t }\n\t containerNode = containerNode.parentNode;\n\t }\n\t return false;\n\t}\n\t// this function hilights the text in the node that the cursor is within\n\tfunction hilightNodeContents() {\n\t\tvar range = rangy.createRange();\n\t\tvar containerNode = getCursorContainerNode();\n\t\trange.selectNodeContents(containerNode);\n\t\tvar sel = rangy.getSelection();\n\t\tsel.setSingleRange(range);\n\t}\n\t// returns the cursor's container node\n\tfunction getCursorContainerNode() {\n\t\tvar range = rangy.getSelection().getRangeAt(0);\n\t\tvar containerNode = getRangeContainerNode(range);\n\t\treturn containerNode;\n\t}\n\t// helper function for getCursorContainerNode()\n\tfunction getRangeContainerNode(range) {\n\t var containerNode = range.commonAncestorContainer;\n\t if (containerNode.nodeType == 3) {\n\t containerNode = containerNode.parentNode;\n\t }\n\t return containerNode;\n\t}\n\n\t// cross-browser way to insert html\n\tfunction insertHtmlAtCursor(html) {\n\t var sel, range;\n\t if (window.getSelection) {\n\t // IE9 and non-IE\n\t sel = window.getSelection();\n\t if (sel.getRangeAt && sel.rangeCount) {\n\t range = sel.getRangeAt(0);\n\t range.deleteContents();\n\n\t // Range.createContextualFragment() would be useful here but is\n\t // non-standard and not supported in all browsers (IE9, for one)\n\t var el = document.createElement(\"div\");\n\t el.innerHTML = html;\n\t var frag = document.createDocumentFragment(), node, lastNode;\n\t while ( (node = el.firstChild) ) {\n\t lastNode = frag.appendChild(node);\n\t }\n\t range.insertNode(frag);\n\n\t // Preserve the selection\n\t if (lastNode) {\n\t range = range.cloneRange();\n\t range.setStartAfter(lastNode);\n\t range.collapse(true);\n\t sel.removeAllRanges();\n\t sel.addRange(range);\n\t }\n\t }\n\t } else if (document.selection && document.selection.type != \"Control\") {\n\t // IE < 9\n\t document.selection.createRange().pasteHTML(html);\n\t }\n\t}\n\n\n\t// !audio/video functions\n\t// looks for html 5 audio or video media.\n\t// return false if it can't find either one.\n\tfunction getMyMedia() {\n\t\tvar myMedia = false;\n\t\tif(document.getElementsByTagName('audio')[0]) {\n\t\t\tmyMedia = document.getElementsByTagName('audio')[0];\n\t\t} else if (document.getElementsByTagName('video')[0]) {\n\t\t\tmyMedia = document.getElementsByTagName('video')[0];\n\t\t}\n\t\treturn myMedia;\n\t}\n\t// media transport controls\n\tfunction playPause() {\n\t\tvar myMedia = getMyMedia();\n\t\tif(myMedia) {\n\t\t if (myMedia.paused)\n\t\t myMedia.play();\n\t\t else\n\t\t myMedia.pause();\n\t\t}\n\t}\n\tfunction jumpForward(seconds) {\n\t\tvar myMedia = getMyMedia();\n\t\tif(myMedia) {\n\t\t\t// default of 5 seconds\n\t\t\tseconds = typeof seconds !== 'undefined' ? seconds : 5;\n\t\t\tmyMedia.currentTime = myMedia.currentTime + seconds;\n\t\t}\n\t}\n\tfunction jumpBackward(seconds) {\n\t\tvar myMedia = getMyMedia();\n\t\tif(myMedia) {\n\t\t\t// default of 5 seconds\n\t\t\tseconds = typeof seconds !== 'undefined' ? seconds : 5;\n\t\t\tmyMedia.currentTime = myMedia.currentTime - seconds;\n\t\t}\n\t}\n\n\n}); // end of $(document).ready(\n"]}