<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <%@ page import="org.crosswire.utils.HTTPUtils" %> <%@ page import="org.crosswire.utils.Utils" %> <%@ page import="org.crosswire.xml.XMLBlock" %> <%@ page import="org.crosswire.xml.XMLTag" %> <%@ page import="org.crosswire.xml.XMLDataElement" %> <%! static final String gadgetRoot = "edit"; %> <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="Transcription Editor - Book Names" author_email="workspace@jiscmail.ac.uk" author="Universität Trier" description="Transcription Editor - Book Names" screenshot="http://www.uni-trier.de/fileadmin/templates/inc/logo_universitaet-trier.gif" thumbnail="http://www.uni-trier.de/fileadmin/templates/inc/logo_universitaet-trier.gif" scrolling="false" > <Optional feature="pubsub-2"> <Param name="topics"> <![CDATA[ <Topic title="Transcription Saved" name="interedition.transcription.saved" description="Transcription has been saved" type="void" subscribe="true"/> ]]> </Param> </Optional> <Optional feature="dynamic-height"/> <Require feature="opensocial-0.8"/> </ModulePrefs> <UserPref name="transcriptionOwner" datatype="enum" display_name="Transcription Owner" default_value="user"> <EnumValue value="user" display_value="Current User"/> <EnumValue value="project" display_value="Current Project"/> <EnumValue value="PUBLISHED" display_value="PUBLISHED"/> </UserPref> <UserPref name="unclearDefault" datatype="enum" display_name="Unclear Default" default_value=""> <EnumValue value="" display_value=""/> <EnumValue value="poor image" display_value="Poor Image"/> <EnumValue value="faded ink" display_value="Faded Ink"/> <EnumValue value="damage to page" display_value="Damage To Page"/> <EnumValue value="other" display_value="Other"/> </UserPref> <UserPref name="height" datatype="enum" display_name="Gadget Height" default_value="550"> <EnumValue value="400" display_value="Short"/> <EnumValue value="550" display_value="Medium"/> <EnumValue value="700" display_value="Tall"/> </UserPref> <UserPref name="baseText" datatype="enum" display_name="Base Text" default_value="Project Default"> <EnumValue value="Project Default" display_value="Project Default"/> <% String defaultFontSpec = Utils.getSysConfig(session).getProperty("DefaultFontSpec", "Gentium"); try { String modListURL = "https://www.crosswire.org/study/fetchdata.jsp"; StringBuffer result = HTTPUtils.postURL(modListURL, null); XMLBlock modules = XMLBlock.createXMLBlock(result.toString()); for (XMLDataElement module : modules.getElements("module")) { if ("Biblical Texts".equals(module.getAttribute("category"))) { %><EnumValue value="<%= module.getAttribute("id") %>" display_value="<%= HTTPUtils.canonize(module.getText()) %>"/><% } } } catch (Exception e) {} %> </UserPref> <UserPref name="baseTextDocID" datatype="string" display_name="Base Text DocID" default_value="" /> <UserPref name="baseTextOwner" datatype="enum" display_name="Base Text Owner" default_value="PUBLISHED"> <EnumValue value="user" display_value="Current User"/> <EnumValue value="project" display_value="Current Project"/> <EnumValue value="PUBLISHED" display_value="PUBLISHED"/> </UserPref> <UserPref name="direction" datatype="bool" display_name="Right to Left" default_value="false"/> <UserPref name="baseTextServiceURL" datatype="string" display_name="Base Text Service URL" default_value="https://crosswire.org/study/fetchdata.jsp" /> <UserPref name="announceChanges" datatype="bool" display_name="Announce Changes" default_value="false"/> <UserPref name="autoSave" datatype="bool" display_name="Autosave" default_value="true"/> <UserPref name="loadOnPageSelect" datatype="bool" display_name="Load on Page Select" default_value="true"/> <UserPref name="saveBehavior" datatype="enum" display_name="Save Behavior" default_value="transcriptionRepository"> <EnumValue value="transcriptionRepository" display_value="Save to Transcription Repository"/> <EnumValue value="broadcast" display_value="Broadcast Event Only"/> <EnumValue value="hideButton" display_value="Hide Save Button"/> </UserPref> <UserPref name="hidePublish" datatype="bool" display_name="Hide Publish Button" default_value="false"/> <Content type="html"> <![CDATA[ <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!-- odd path on the include because we use index.jsp here, so if we do not specify the index.jsp on the URL, we are 1 level different on our .. --> <link rel="stylesheet" type="text/css" href="/community/js/jquery-ui/jquery-ui.css"/> <script type="text/javascript" src="/community/js/jquery/jquery.min.js"></script> <script type="text/javascript" src="/community/js/URI.min.js"></script> <script type="text/javascript" src="/community/js/jquery/jquery.cookie.js"></script> <script type="text/javascript" src="/community/js/jquery-ui/jquery-ui.min.js"></script> <script type="text/javascript" src="<%= gadgetRoot %>/js/tinymce/tinymce.js"></script> <script type="text/javascript" src="<%= gadgetRoot %>/wce-ote/wce_editor.js"></script> <script type="text/javascript" src="<%= gadgetRoot %>/wce-ote/wce_charmap.js"></script> <script type="text/javascript" src="<%= gadgetRoot %>/wce-ote/wce_tei.js"></script> <script type="text/javascript" src="/community/js/jquery.blockUI.js"></script> <script type="text/javascript" src="/community/js/vmr-common.js"></script> <title>Workspace for Collaborative Editing</title> <style type="text/css"> <!-- body { margin-left: auto; margin-right: auto; background-color: #666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; } table { border-collapse: collapse; } table#historyTable { border-collapse: collapse; width: 100%; } td, th { padding: 5px 4px; border: 1px solid #CCC; /*overflow: hidden;*/ } .vDate { white-space: nowrap; } thead, tfoot { background-color: #CCC; } tr.rowodd { background-color: #FFF; } tr.roweven { background-color: #F2F2F2; } /* seems this has trouble loading a background image via opensocial proxy or something, so we'll just set it to white */ .ui-widget-content { background: white !important; } --> </style> <script type="text/javascript"> // reset error handling to browser default window.onerror = window.parent.onerror; // record last direction set for editor, this is used to determine if we need to re-initialize editor to switch directions var lastRTL = false; // if no index data for the page, then dialog to ask what content from base text to use var verseRefDialog = null; // should we show all user transcriptions in history var showAllUserTranscriptions = false; // listen for page loaded events from portal and hold on to last page which as loaded var lastPage = null; var workingTranscription = ''; var lastVersion = null; // whoami var viewer = null; var confirmPublish = true; // default values. These really are superfluous. They get set in 'VMR.init...' by configuration parameters // but we'll set them to something in case somehow our reading of config params fails miserably // this is for retrieving base text data this URL will receive posted data params: // mod : Base Text Name, currently either coptic or greek (SahidicBible|PapBasetext) // key : section of text to load, e.g., Rom 6:5-14; Rom 8:9-11 // format : the format in which the data should be returned. currently 'basetext', and means tinyMCE/WFCE/Trier/HTML spans var baseTextServiceURL = 'https://crosswire.org/study/fetchdata.jsp'; var baseTextDocID = null; var baseTextOwner = null; var baseText = "WHNU"; var transcriptionOwner = "user"; var rtl = false; var announceChanges = false; var autoSave = true; var reconciler = 'mergely_reconciler.jsp'; // where or not this user is a VMR Administrator var ignoreUpdateMessages = 0; var autoLoad = true; var saveToRepo = true; var hideSaveButton = true; var hidePublishButton = false; var projectDefaultBasetext = false; </script> </head> <body> <div style="margin: 0px 0px 0px 0px"> <textarea id="wce_editor" rows="28" cols="80" style="width: 100%;"></textarea> </div> <span style="margin: 0 0 0 0; float:left; position:absolute;bottom:2px;left:2px;"> <button style="vertical-align: middle;" id="versionHistoryControl" >Version History</button> <img id="chirho" height="32" style="margin: 0 0 0 0; vertical-align: middle;" src="/community/images/chirho.png"/><input id="palInput" size="8" /> <button style="vertical-align: middle;color:red;" id="publishButton" >Publish</button> <button style="vertical-align: middle;color:red;" id="previewButton" >Preview Last Saved</button> <div id="nonExtandPageTool" style="background-color:lightgray; display:inline-block; border-radius: .15em; padding:0 0 0 .25em; margin-left:5em;">New Non-extant Page: <button style="vertical-align: middle;color:red;" id="newPhantomBefore" >Before</button> <button style="vertical-align: middle;color:red;" id="newPhantomAfter" >After</button> </div> </span> <span style="margin: 0 0 0 0; float:right; position:absolute;bottom:2px;right:2px;"> <!-- <button style="vertical-align: middle;" id="plusOneBeforeButton" >Prepend +1</button> --> <button title="Load editor with basetext, determined from index information" style="vertical-align: middle;" id="populateButton" >From Basetext</button> <button title="Load editor with stripped basetext data" style="vertical-align: middle;" id="populateButtonStripped"><img style="height:1.2em;" src="../../images/stripped.png"/></button> <!-- <button style="vertical-align: middle;" id="plusOneAfterButton" >Append +1</button> --> <span id="discussButtonSpan"><a href="#" onclick="discussTranscription();return false;" title="Discuss This Transcription"><img style="margin: 0 0 0 0; vertical-align: middle;" src="../../images/discuss.png"/></a></span> </span> </body> <script type="text/javascript"> function previewPage() { var url = VMR.httpRoot + 'vmr/api/transcript/show/'; window.open(url+'?docID='+lastPage.docID+'&pageID='+lastPage.pageID+'&userName='+(transcriptionOwner == 'user' ? VMR.userName : transcriptionOwner == 'project' ? VMR.siteName : transcriptionOwner),'transcription', 'titlebar=no,toolbar=no,status=no,scrollbars=yes,resizable=yes,menubar=no,location=yes,directories=no,' + 'width=900,height=768'); } function publishPage() { saveDataToDB(false, false, '', true); } function newPhantom(isAfter) { var pageID = parseInt(''+lastPage.pageID) + (isAfter ? 1 : -1); var postData = { docID : lastPage.docID, pageID: pageID, }; VMR.serviceRequest('metadata/liste/search/', postData, function(o) { var xml = $.parseXML(o.text); var pageExists = parseInt($(xml).find('manuscripts').attr('pagecount')); if (pageExists) { alert('Cannot create a new page immediately ' + (isAfter ? 'after':'before') + '. One already exists.'); return; } var postData = { text : lastPage.indexContent, detail: 'verses', expandRange: true, }; VMR.serviceRequest('metadata/v11n/parse/', postData, function(o) { var xml = $.parseXML(o.text); var verse = $(xml).find('verse:'+(isAfter?'last':'first')).attr('osisRef'); var postData = { docID : lastPage.docID, pageID: pageID, }; VMR.serviceRequest('metadata/manuscript/putpage/', postData, function(o) { var xml = $.parseXML(o.text); if (!$(xml).find('success').length) { alert('Problem creating new non-extant page.'); return; } var postData = { docID : lastPage.docID, pageID: pageID, featureCode : 'Extant', stringVal1: 'Not Extant', }; VMR.serviceRequest('feature/put/', postData, function(o) { var xml = $.parseXML(o.text); if (!$(xml).find('feature').length) { alert('Problem adding Extant status feature to new non-extant page.'); return; } var postData = { docID : lastPage.docID, pageID: pageID, uri: VMR.imagesURL + '/folio_not_extant.jpg', }; VMR.serviceRequest('image/put/', postData, function(o) { var xml = $.parseXML(o.text); if (!$(xml).find('success').length) { alert('Problem setting non-extant image to new non-extant page.'); return; } var postData = { docID : lastPage.docID, pageID: pageID, }; VMR.serviceRequest('image/generatethumb/', postData, function(o) { var xml = $.parseXML(o.text); if (!$(xml).find('success').length) { alert('Problem generating thumbnail for new non-extant page.'); return; } var postData = { docID : lastPage.docID, pageID: pageID, indexContent: verse, userName: VMR.userName, }; VMR.serviceRequest('biblicalcontent/put/', postData, function(o) { var xml = $.parseXML(o.text); if (!$(xml).find('success').length) { alert('Problem adding indexing to new non-extant page.'); return; } var data = { docID : lastPage.docID, pageID: pageID, searchType: 'lookup', }; VMR.publish("interedition.manuscript.selected", data); }); }); }); }); }); }); }); } function saveDataToDB(saveButtonPressed, callback, userName, force) { // can't trust tinymce isDirty var editorTEIData = getTEI(); if (force || saveButtonPressed) { } else if (!lastPage || !tinyMCE.activeEditor.isDirty() || editorTEIData == lastLoadedTEIData) { if (callback) callback(); return; } $.blockUI({ message: '<h3><img src="/community/images/fuzzball.gif" /> Saving, please wait...</h3>' }); var transcriptionData = lastHead + getTEIBody(editorTEIData) + lastTail; var postData = { docID : lastPage.docID, pageID: lastPage.pageID, userName: (typeof userName != 'undefined' ? userName : transcriptionOwner == 'user' ? VMR.userName : transcriptionOwner == 'project' ? VMR.siteName : transcriptionOwner), transcript: transcriptionData }; VMR.publish("interedition.transcription.saverequest", postData); if (saveToRepo) { VMR.serviceRequest('transcript/put/', postData, function (o) { $.unblockUI(); var xml = $.parseXML(o.text); if ($(xml).children('error').length) { alert($(xml).children('error').attr('message')); } if ($(xml).children('success').length) { VMR.publish("interedition.transcription.saved", null); if ($('#historyDialog').dialog('isOpen')) { showVersionHistory(); } } tinymce.activeEditor.isNotDirty = 1; if (callback) callback(); }); } else { tinymce.activeEditor.isNotDirty = 1; if (callback) callback(); } } function showVersionHistory(specificUser) { if (lastPage) { $.blockUI({ message: '<h4><img src="/community/images/fuzzball.gif" /> Loading history...</h4>' }); var postData = { docID : lastPage.docID, pageID: lastPage.pageID, userName: specificUser ? specificUser : transcriptionOwner == 'user' ? VMR.userName : transcriptionOwner == 'project' ? VMR.siteName : transcriptionOwner, history: true, allUsers: showAllUserTranscriptions, }; VMR.serviceRequest('transcript/get/', postData, function (o) { $.unblockUI(); document.body.style.cursor = 'default'; var xml = $.parseXML(o.text); var h = '<table id="historyTable"><thead><th class="selectionCell"><th>Date</th><th>Author</th><th style="width:100%;">Comments</th></thead><tbody>'; var rownum = 1; h += '<tr class="'+(rownum%2?'rowodd':'roweven')+'" style="cursor:pointer;">'; h += '<td height="24" onclick="loadTranscription(\'workingTranscription\');" id="sel_workingTranscription" class="selectionCell">*</td>'; h += '<td onclick="loadTranscription(\'workingTranscription\');" class="vDate">working copy</td>'; h += '<td onclick="loadTranscription(\'workingTranscription\');">' + VMR.userName + '</td>'; h += '<td onclick="loadTranscription(\'workingTranscription\');"></td>'; h += '<td><span class="mergeControl" style="display:none;"><a href="#" onclick="compareCurrentTo(\'workingTranscription\');return false;"><img height="24" src="/community/images/merge.png"/></a></span></td>'; h += '<td class="versionHash" style="display:none;">workingTranscription</td>'; h += '</tr>'; $(xml).find('history').each(function() { ++rownum; var hash = $(this).attr('versionHash'); var author = $(this).attr('author'); var comment = $(this).find('comment').text(); var saveDate = $(this).attr('date'); var userName = (comment && comment.match('^PUBLISHED:')) ? 'PUBLISHED' : author; h += '<tr class="'+(rownum%2?'rowodd':'roweven')+'" style="cursor:pointer;">'; h += '<td height="24" onclick="loadTranscription(\''+hash+'\');" id="sel_'+hash+'_'+userName+'" class="selectionCell"> </td>'; h += '<td onclick="loadTranscription(\''+hash+'\', \''+userName+'\');" class="vDate">'+saveDate+'</td>'; if (specificUser) { h += '<td onclick="loadTranscription(\''+hash+'\', \''+userName+'\');">'+author+'</td>'; } else { h += '<td title="Click to expand full version history for this user" style="color:blue;cursor:pointer;" onclick="showVersionHistory(\''+userName+'\');">'+author+'</td>'; } h += '<td onclick="loadTranscription(\''+hash+'\', \''+userName+'\');">'+comment+'</td>'; h += '<td><span class="mergeControl"><a href="#" onclick="compareCurrentTo(\''+hash+'\', \''+userName+'\');return false;"><img height="24" src="/community/images/merge.png"/></a></span></td>'; h += '<td class="versionHash" style="display:none;">'+hash+'</td>'; h += '</tr>'; }); h += '</tbody></table>'; $('#historyDialogContent').html(h); if (lastVersion) { $('.selectionCell').text(''); $('#sel_'+lastVersion).text('*'); $('.mergeControl').show(''); $('#sel_'+lastVersion).parent().find('.mergeControl').hide(); } $('#historyDialog').dialog('open'); }); } } function onTranscriptionReadOnly(topic, data, subscriberData) { tinymce.activeEditor.setMode(data?'readonly':'design'); } function onTranscriptionScrolled(topic, data, subscriberData) { $(tinymce.activeEditor.getBody()).find('.brea, .commentary').css('background', ''); var i = (data.break == 0) ? 1 : data.break; $(tinymce.activeEditor.getBody()).find('.brea, .commentary').each(function() { if ($(this).hasClass('brea')) --i; else if (this.previousSibling.nodeValue == '↵[') --i; if (i == 0) { $(this).css('background', 'white'); tinymce.activeEditor.selection.scrollIntoView($(this).get(0)); // $(this).get(0).scrollIntoView(); // this.parentNode.scrollTop = this.offsetTop; /* var offset = $(this).offset(); var scrollTop = offset.top-$(this).parent('body').children().first().offset().top-35; $(this).parent('body').animate({ scrollTop: scrollTop }, 'slow'); */ return false; } }); } function onTranscriptionUpdate(topic, data, subscriberData) { if (data.sender == document || ignoreUpdateMessages) return; // assert we didn't publish event lastVersion = null; lastPage = data; workingTranscription = lastPage.transcriptionBody; loadEditorWithTEI(workingTranscription); } function page_select_callback(topic, data, subscriberData) { var pageSelect = function () { document.body.style.cursor = 'wait'; lastPage = data; $('#historyDialog').dialog('close'); lastVersion = null; workingTranscription = ''; var postData = { docID : data.docID, pageID : data.pageID, detail : 'long' }; VMR.serviceRequest('biblicalcontent/get/', postData, function (o) { var xml = $.parseXML(o.text); lastPage.pageIndexContent = xml; if (autoLoad) { loadTranscription(null, data.userID); } }); }; if (autoSave) { saveDataToDB(null, function () { pageSelect(); }); } else pageSelect(); } function getTranscription(versionHash, userName, callback) { if (userName && !showAllUserTranscriptions && userName != 'PUBLISHED') userName = null; var postData = { docID : lastPage.docID, pageID: lastPage.pageID, userName: (userName ? userName : transcriptionOwner == 'user' ? VMR.userName : transcriptionOwner == 'project' ? VMR.siteName : transcriptionOwner), format: 'teiraw', briefTEIHeader : 'true' }; if (versionHash && versionHash.length > 0 && versionHash != 'HEAD') postData.versionHash = versionHash; VMR.serviceRequest('transcript/get/', postData, function (o) { // silliness when sometimes stuff is returned as mime type XML it is stored in 'data' instead of 'text'. stupid var transText = (!o.text || o.text.length < 1) ? o.data : o.text; if (transText.indexOf("<?xml") > 0) transText = transText.substring(transText.indexOf('>', transText.indexOf("<?xml"))+1); if (callback) callback(transText); }); } function loadTranscription(versionHash, userName) { tinymce.activeEditor.isNotDirty = false; if (versionHash == 'workingTranscription' && $('#sel_'+versionHash+'_'+userName).text() == '*') return; if (versionHash) { $('.selectionCell').text(''); $('#sel_'+versionHash+'_'+userName).text('*'); $('.mergeControl').show(''); $('#sel_'+versionHash+'_'+userName).parent().find('.mergeControl').hide(); } if (versionHash == 'workingTranscription') { lastVersion = null; loadEditorWithTEI(workingTranscription); return; } getTranscription(versionHash, userName, function(transText) { var xml = $.parseXML('<response><error message="XML Parse Error"/></response>'); try { xml = $.parseXML(transText); } catch (e) { console.log('Problem parsing XML: ' + e); } if ($(xml).children('error').length) { loadEditorWithTEI('<TEI></TEI>'); // loadEditorWithTEI('<?xml version="1.0" encoding="utf-8"?><TEI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tei-c.org/ns/1.0 http://urts173.uni-trier.de/~gany2d01/test/TEI-NTMSS.xsd" xmlns="http://www.tei-c.org/ns/1.0" ><teiHeader><fileDesc><titleStmt><title/> </titleStmt><publicationStmt><p/></publicationStmt><sourceDesc><msDesc><msIdentifier></msIdentifier></msDesc></sourceDesc></fileDesc></teiHeader><text><body></body></text></TEI>'); } else { if (!lastVersion) { workingTranscription = getTEI(); } loadEditorWithTEI(transText); lastVersion = versionHash+'_'+userName; } document.body.style.cursor = 'default'; }); } // appendWhere 0 - don't append, overwrite; 1 - append after; -1 - prepend function populateFromBasetext(key, appendWhere, stripped) { document.body.style.cursor = 'wait'; if (!appendWhere) tinymce.get('wce_editor').setContent('<img src="/community/images/loading.gif"/>'); var postData = {}; var url = baseTextServiceURL; postData.mod = getBaseText(); if (baseTextDocID == null || (postData.mod !='PapBasetext' && baseText == 'Language Dependent')) { postData.key = key; postData.format = (appendWhere?'basetext':'tei'); } else { url = VMR.servicesURL + 'transcript/get/'; postData.docID = baseTextDocID; postData.indexContent = key; postData.format = 'teiraw'; postData.briefTEIHeader = 'true'; postData.includeEmpty = 'true'; } if (stripped) postData.filterNoise = true; if (baseTextOwner == 'project') { postData.userName = VMR.siteName; } VMR.webRequest(url, postData, function (o) { if (appendWhere) { var content = tinymce.get('wce_editor').getContent(); tinymce.get('wce_editor').setContent((appendWhere>0)?content+o.text:o.text+content); } else { var type = 'page'; if (lastPage.pageName && lastPage.pageName.length > 0) { p = lastPage.pageName; type = 'folio'; } else p = lastPage.pageID; p = ''+p; p = p .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); var wit = lastPage.docID; var header = '<pb n="'+p+'" type="'+type+'" xml:id="P'+p+'-'+wit+'"/><cb n="1" xml:id="P'+p+'C1-'+wit+'"/><lb n="1" xml:id="P'+p+'C1L1-'+wit+'"/>'; var headerInsertOffset = o.text.indexOf('<body'); if (headerInsertOffset < 0) headerInsertOffset = o.text.indexOf('<text'); if (headerInsertOffset < 0) headerInsertOffset = o.text.indexOf('<TEI'); if (headerInsertOffset > -1) headerInsertOffset = o.text.indexOf('>', headerInsertOffset)+1; else headerInsertOffset = 0; var content = o.text.substring(0, headerInsertOffset); content += header; content += o.text.substring(headerInsertOffset); loadEditorWithTEI(content); } }); } function getManuscriptInfo() { var mi = { rtl : lastRTL, font : '<%=defaultFontSpec%>', baseText : baseText, lang : (lastPage && lastPage.lang ? lastPage.lang : false), overlineForAbbr : true, v11n : 'LXXNU' } if (baseText == 'Language Dependent') { baseText = 'PapBasetext', mi.rtl = false; } if (lastPage) { if (lastPage.lang == 'grc' || lastPage.lang == 'g') { /* let's not set a baseText here quite yet until we investigate this more if (baseText == 'Language Dependent') { mi.baseText = 'NA28'; } */ mi.rtl = false; mi.font = 'Gentium'; } else if (lastPage.lang == 'sa' || lastPage.lang == 'bo' || lastPage.lang == 'fa' || lastPage.lang == 'ac' || lastPage.lang == 'ly' || lastPage.lang == 'cw' || lastPage.lang == 'mae') { if (baseText == 'Language Dependent') { mi.baseText = 'SahidicBible'; } mi.rtl = false; mi.font = 'Antinoou, AntinoouWeb'; mi.overlineForAbbr = false; } else if (lastPage.lang == 'chu') { if (baseText == 'Language Dependent') { mi.baseText = 'CSlElizabeth'; } mi.rtl = false; mi.font = 'BukyvedeWeb'; } else if (lastPage.lang == 'la') { if (baseText == 'Language Dependent') { mi.baseText = 'Vulgate'; } mi.rtl = false; } else if (lastPage.lang == 'syc') { if (baseText == 'Language Dependent') { mi.baseText = 'Peshitta'; } mi.rtl = true; mi.font = 'Estrangelo Edessa, EstreWeb'; } else if (lastPage.lang == 'hbo') { if (baseText == 'Language Dependent') { mi.baseText = 'WLC'; } mi.rtl = true; mi.font = 'SBL_HebrewWeb'; } else if (lastPage.lang == 'arb' || lastPage.lang == 'ar' || lastPage.lang == 'ara') { if (baseText == 'Language Dependent') { mi.baseText = 'AraSVD'; } mi.rtl = true; mi.font = 'Arabic, ArabicWeb'; mi.overlineForAbbr = false; } } return mi; } function getBaseText() { return getManuscriptInfo().baseText; } function isRTL() { return getManuscriptInfo().rtl; } function getPreferredFont() { return getManuscriptInfo().font; } function getTEIBody(text) { var body = text; var b = text.indexOf("<body>"); if (b >= 0) { var bend = text.indexOf("</body>"); body = text.substring(b+6, bend); } return body; } function wrapSimpleTEI(text) { var tei = '<?xml version="1.0" encoding="utf-8"?><?xml-model href="TEI-NTMSS.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?><TEI xmlns="http://www.tei-c.org/ns/1.0"><text'+(lastPage.lang?' xml:lang="'+lastPage.lang+'"' : '')+'><body>'+text+'</body></text></TEI>'; return tei; } var lastHead=''; var lastTail=''; var lastLoadedTEIData = ''; function loadEditorWithTEI(teiBlob) { document.body.style.cursor = 'default'; // change text direction of editor if isRTL is different than last RTL set var rtl = isRTL(); if (rtl != lastRTL) { lastRTL = rtl; tinymce.execCommand(rtl?'mceDirectionRTL':'mceDirectionLTR'); tinymce.get('wce_editor').settings.directionality = rtl?'rtl':'ltr'; } lastHead = ''; lastTail = ''; var b = teiBlob.indexOf("<body>"); if (b >= 0) { var bend = teiBlob.indexOf("</body>"); lastHead = teiBlob.substring(0, b+6); lastTail = teiBlob.substring(bend); teiBlob = wrapSimpleTEI(teiBlob.substring(b+6, bend)); } setTEI(teiBlob); lastLoadedTEIData = getTEI(); setPreferredFontFamily(getPreferredFont()); if (tinymce && tinymce.activeEditor && tinymce.activeEditor.settings && tinymce.activeEditor.settings.clientOptions) { var mi = getManuscriptInfo(); tinymce.activeEditor.settings.clientOptions.v11n = mi.v11n; tinymce.activeEditor.settings.clientOptions.checkOverlineForAbbr = mi.overlineForAbbr; } } function populateForLastPageLoaded(stripped) { if (lastPage != null) { if (lastPage.indexContent == null || lastPage.indexContent.length < 2) { verseRefDialog.append = false; verseRefDialog.dialog('open'); } else populateFromBasetext(lastPage.indexContent, false, stripped); } } // this is all the +1 from base text logic. This probably needs to be re-thought. // this assumes a very strict "Book Chapter:Verse" format. // we now have a verse parsing service we should use instead function isAlpha(val) { var re = /^([a-zA-Z])$/; var retVal = (re.test(val)); return retVal; } function isNumeric(val) { var re = /^([0-9])$/; return (re.test(val)); } function plusFromBasetext(count) { if (lastPage != null) { if (lastPage.indexContent == null || lastPage.indexContent.length < 2) { verseRefDialog.append = count; verseRefDialog.dialog('open'); } else { var alpha = false; var i = 0; for (; i < lastPage.indexContent.length; ++i) { if (alpha && !isAlpha(lastPage.indexContent.substring(i,i+1))) { break; } else if (isAlpha(lastPage.indexContent.substring(i,i+1))) { alpha = true; } } var book = lastPage.indexContent.substring(0,i); var rest = lastPage.indexContent.substring(i); var numeric = false; i = 0; var chap = ''; for (; i < rest.length; ++i) { if (numeric && !isNumeric(rest.substring(i,i+1))) { break; } else if (isNumeric(rest.substring(i,i+1))) { numeric = true; chap += rest.substring(i,i+1); } } var rest = rest.substring(i); var numeric = false; i = 0; var verse = ''; for (; i < rest.length; ++i) { if (numeric && !isNumeric(rest.substring(i,i+1))) { break; } else if (isNumeric(rest.substring(i,i+1))) { numeric = true; verse += rest.substring(i,i+1); } } var atLeastOneVerse = false; var atLeastOneChapter = false; var transcriptionData = tinymce.get('wce_editor').getContent(); var xml = $.parseXML('<doc>'+transcriptionData+'</doc>'); // find the last chapter $(xml).find('span[class="chapter_number"]').each(function() { if (count > 0 || !atLeastOneChapter) { chap = $(this).text(); atLeastOneChapter = true; } }); // find the last verse $(xml).find('span[class="verse_number"]').each(function() { if (count > 0 || !atLeastOneVerse) { verse = $(this).text(); atLeastOneVerse = true; } }); verse = parseInt(verse) + (atLeastOneVerse ? count : 0); populateFromBasetext(book+'.'+chap+'.'+verse, count); } } } // end of ugly +1 from base text logic // start of ugly 'discuss this transcription page' logic. // this is highly dependent on liferay being the portal // we should simply not show the discuss button if liferay is not detected function assureCategory(parentCategoryId, name, description) { var catID = -1; var params = { groupId : VMR.siteID, parentCategoryId : parentCategoryId, start : -1, end : -1, serviceParameterTypes : JSON.stringify([ 'long', 'long', 'int', 'int' ]) }; var categories = parent.Liferay.Service.MB.MBCategory.getCategories(params); var i = 0; if (categories) { for (i = 0; i < categories.length; ++i) { if (categories[i].name == name) { catID = categories[i].categoryId; break; } } } if (catID == -1) { params = { parentCategoryId : parentCategoryId, name : name, description : description, displayStyle : 'default', emailAddress : '', inProtocol : '', inServerName : '', inServerPort : 0, inUseSSL : false, inUserName : '', inPassword : '', inReadInterval : 0, outEmailAddress : '', outCustom : false, outServerName : '', outServerPort : 0, outUseSSL : false, outUserName : '', outPassword : '', mailingListActive : false, allowAnonymousEmail : false, serviceContext : JSON.stringify({ scopeGroupId : VMR.siteID, userId : VMR.userID, addGroupPermissions : true, addGuestPermissions : true}) }; var annCat = parent.Liferay.Service.MB.MBCategory.addCategory(params); catID = annCat.categoryId; } return catID; } function discussTranscription() { if (!lastPage) return; // assert we've loaded a page var pageCategoryName = 'Page '+lastPage.pageID + (lastPage.pageName && lastPage.pageName.length > 0 ? (' (folio '+lastPage.pageName+')') : ''); var catID = assureCategory(0, 'Transcriptions', 'Manuscript Transcriptions'); catID = assureCategory(catID, ''+lastPage.docID + ' ('+lastPage.docName+')', ''); catID = assureCategory(catID, pageCategoryName, ''); var params = { groupId : VMR.siteID, categoryId : catID, status : -1, start : -1, end : -1, serviceParameterTypes : JSON.stringify([ 'long', 'long', 'int', 'int', 'int' ]) }; var landingPoint = 'category/'+catID; var messages = parent.Liferay.Service.MB.MBMessage.getCategoryMessages(params); var subject = '' + VMR.userName + ' - ' + lastPage.docID + ' ('+lastPage.docName+') ' + pageCategoryName; var mID = -1; for (i = 0; messages && i < messages.length; ++i) { if (messages[i].subject == subject) { mID = messages[i].messageId; break; } } if (mID < 0) { var transcription = getTEI(); var body = '<p><a href="https://ntvmr.uni-muenster.de/transcribing' + '?docID=' + lastPage.docID + '&pageID=' + lastPage.pageID + '&userName=' + VMR.userName + '" target="_blank">Jump To Artifact</a></p>' + '<br/>' + '<b>Transcription Text:</b>' + '<div style="margins: 5px 20px 5px 20px;">' + transcription + '</div><br/>' + '<p> You should: <b>Edit this message.</b> ' + 'Be sure to leave the above link, and delete this line.</p>'; params = { groupId : VMR.siteID, categoryId : catID, subject : subject, body : body, format : 'html', inputStreamOVPs : JSON.stringify([]), anonymous : false, priority : 0.0, allowPingbacks : true, serviceContext : JSON.stringify({ scopeGroupId : VMR.siteID, userId : VMR.userID, addGroupPermissions : true, addGuestPermissions : true, workflowAction : 0 }) }; var message = parent.Liferay.Service.MB.MBMessage.addMessage(params); landingPoint = 'message/'+message.messageId; } else { landingPoint = 'message/'+mID; } var discussURL = ''; var themeDisplay = parent.Liferay.ThemeDisplay; if (themeDisplay.getLayoutURL().substr(0,'http'.length) !='http') { discussURL = '//'+parent.window.location.href.split('/')[2]; } discussURL += themeDisplay.getLayoutURL() + '/../forum/-/message_boards/'+landingPoint; window.open(discussURL,'Discuss', 'titlebar=no,toolbar=no,status=no,scrollbars=yes,resizable=yes,menubar=no,location=yes,directories=no,' + 'width=1024,height=768'); } function xml2str(xmlNode) { try { // Gecko- and Webkit-based browsers (Firefox, Chrome), Opera. return (new XMLSerializer()).serializeToString(xmlNode); } catch (e) { try { // Internet Explorer. return xmlNode.xml; } catch (e) { //Other browsers without XML Serializer alert('Xmlserializer not supported: ' + e); } } return false; } function simplifyTEI(tei) { var xml = $.parseXML(tei); /* $(xml).find('w').contents().unwrap(); $(xml).find('lb').removeAttr('xml:id'); $(xml).find('supplied[reason="undefined"]').removeAttr('reason'); $(xml).find('supplied[unit="undefined"]').removeAttr('unit'); */ return xml2str(xml); } function compareCurrentTo(versionHash, userName) { /* var reconcilerURL = VMR.getRelativeURL('reconciliation'); var objectPart = $(projectXML).attr('objectPart'); var params = '?projectName='+projectName+'&docID='+docID+'&biblicalContent='+objectPart+'&searchType=pages'; $(projectXML).find('documentGroup[primary="true"]').find('document[docID='+docID+']').children('task').each(function() { var assignee = $(this).attr('assignedTo'); params += '&transcriber='+assignee; }); reconcilerWindow = window.open(reconcilerURL+params, 'reconcile', 'scrollbars=yes,menubar=yes,height=600,width=800,resizable=yes,toolbar=yes,status=yes'); */ var reconcilerURL = VMR.httpRoot+'modules/reconciler/'; var form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", reconcilerURL); form.setAttribute("target", "reconcile"); var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", "lhs"); var tei = getTEI(); tei = simplifyTEI(tei); hiddenField.setAttribute("value", encodeURIComponent(tei)); form.appendChild(hiddenField); hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", "rhs"); if (versionHash == 'workingTranscription') { hiddenField.setAttribute("value", encodeURIComponent(simplifyTEI(workingTranscription))); form.appendChild(hiddenField); document.body.appendChild(form); reconcilerWindow = window.open('/community/images/blank.png', 'reconcile', 'scrollbars=yes,menubar=yes,height=600,width=800,resizable=yes,toolbar=yes,status=yes'); form.submit(); handleReconcilerWindow(); } else { getTranscription(versionHash, userName, function(transText) { hiddenField.setAttribute("value", encodeURIComponent(simplifyTEI(transText))); form.appendChild(hiddenField); document.body.appendChild(form); reconcilerWindow = window.open('/community/images/blank.png', 'reconcile', 'scrollbars=yes,menubar=yes,height=600,width=800,resizable=yes,toolbar=yes,status=yes'); form.submit(); handleReconcilerWindow(); }); } } function handleReconcilerWindow() { if (reconcilerWindow) { if (reconcilerWindow.updateBuffer && reconcilerWindow.updateBuffer.length > 0) { loadEditorWithTEI(reconcilerWindow.updateBuffer); } if (reconcilerWindow.closed) { reconcilerWindow = null; return; } setTimeout('handleReconcilerWindow()', 1000); } } function loadPal(match) { var postData = { featureCode : 'Grapheme', likeMatch : '%'+match+'%', limit : 10 }; VMR.serviceRequest('feature/definition/getvalues/', postData, function(o) { var h1 = '<table><thead></thead><tbody>'; h1 += '<tr style="cursor:pointer;">'; var h = ''; var total = 0; $(o.text).find('value').each( function() { var count = $(this).attr('score'); h += '<td class="palVal" id="pv'+$(this).text()+'" onclick="showPalVal(\''+$(this).text()+'\');">'+$(this).text()+' ('+count+')</td>'; total += parseInt(count); }); h1 += '<td class="palVal" id="pv_'+match+'_" onclick="showPalVal(\'%'+match+'%\');">* '+match+' * ('+total+')</td>'; h += '</tr>'; h += '</tbody></table>'; $('#palResultList').html(h1+h); $('#palResultImages').html(''); showPalVal('%'+match+'%'); }); } function showPalVal(match) { $('#palResultImages').html('<img src="/community/images/loading.gif"/>'); var postData = { detail : 'page', featureCode : 'Grapheme%='+match, featureCodeClipString : 'Grapheme%='+match }; VMR.serviceRequest('metadata/liste/search/', postData, function(o) { var h = '<table style=""><thead></thead><tbody>'; h += '<tr style="cursor:pointer;">'; $(o.text).find('feature').each( function() { var docID = $(this).parent().parent().parent().attr('docID'); var gaNum = $(this).parent().parent().parent().attr('gaNum'); var pageID = $(this).parent().attr('pageID'); var folio = $(this).parent().attr('folio'); var val = $(this).find('stringVal1').text(); var featureID = $(this).attr('featureID'); h += '<td onclick="showDocument('+docID+','+pageID+','+featureID+');"><img title="document: '+gaNum+' ('+docID+')\npage: '+folio + ' ('+pageID+')\nGrapheme: '+val+'" height="48" src="'+$(this).find('regionbox').attr('cacheThumbURL')+'"/></td>'; }); h += '</tr>'; h += '</tbody></table>'; $('#palResultImages').html(h); $('.palVal').css('background-color', '#FFF'); $('#pv'+match.replace(/%/g, '_')).css('background-color', '#E2E2E2'); }); } function showDocument(docID, pageID, featureID) { window.open('https://ntvmr.uni-muenster.de/manuscript-workspace?docID='+docID+((pageID)?('&pageID='+pageID):'')+((featureID)?('&featureID='+featureID):''),'workspace', 'titlebar=no,toolbar=no,status=no,scrollbars=yes,resizable=yes,menubar=no,location=yes,directories=no,' + 'width=1024,height=768'); } var lang = null; VMR.init(function() { reconciler = VMR.prefs.getString('reconciler'); baseTextDocID = VMR.prefs.getString('baseTextDocID'); if (baseTextDocID != null && baseTextDocID.length < 1) baseTextDocID = null; baseTextOwner = VMR.prefs.getString('baseTextOwner'); baseText = VMR.prefs.getString('baseText'); transcriptionOwner = VMR.prefs.getString('transcriptionOwner'); rtl = VMR.prefs.getBool('direction'); announceChanges = VMR.prefs.getBool('announceChanges'); autoSave = VMR.prefs.getBool('autoSave'); autoLoad = VMR.prefs.getBool('loadOnPageSelect'); saveToRepo = 'transcriptionRepository' == VMR.prefs.getString('saveBehavior'); hideSaveButton = 'hideButton' == VMR.prefs.getString('saveBehavior'); hidePublishButton = VMR.prefs.getBool('hidePublish'); $('#publishButton').hide(); VMR.hasRole('Transcription Manager', function(result) { if (result) { showAllUserTranscriptions = true; } VMR.hasRole('Project Transcription Manager', VMR.siteID, function(result) { if (result) { showAllUserTranscriptions = true; } VMR.hasRole('Transcription Publisher', function(result) { if (result) { VMR.isAdmin = true; } if (VMR.isAdmin) { if (!hidePublishButton) { $('#publishButton').show(); } showAllUserTranscriptions = true; } VMR.serviceRequest('projectmanagement/project/get', { projectID : VMR.projectID }, function (o) { var xml = $.parseXML(o.text); projectDefaultBasetext = $(xml).find('project:first').attr('transcriptionBaseDefault'); if (projectDefaultBasetext && !projectDefaultBasetext.trim().length) projectDefaultBasetext = false; if (baseText == 'Project Default') { if (projectDefaultBasetext) { if (projectDefaultBasetext.startsWith('CrossWire:')) { baseText = projectDefaultBasetext.substring('CrossWire:'.length); } else { if (parseInt(projectDefaultBasetext) > 0) { if (baseTextDocID == null) { baseTextDocID = projectDefaultBasetext; } } } } else baseText = 'Language Dependent'; } }); }); }); }); lastRTL = rtl; setupEditor(function() { if (parent && parent.Liferay) $('#discussButtonSpan').show(); else $('#discussButtonSpan').hide(); $('#populateButton').bind('click',function(event){ populateForLastPageLoaded(); }); $('#populateButtonStripped').bind('click',function(event){ populateForLastPageLoaded(true); }); $('#versionHistoryControl').bind('click',function(event){ showVersionHistory(); }); $('#plusOneBeforeButton').bind('click',function(event){ plusFromBasetext(-1); }); $('#plusOneAfterButton').bind('click',function(event){ plusFromBasetext(1); }); $('#publishConfirmButton').bind('click',function(event) { if ($('#publishConfirmDontAsk').is(':checked')) { confirmPublish = false; } $.unblockUI(); publishPage(); }); $('#publishConfirmCancelButton').bind('click',function(event){ $.unblockUI(); }); $('#publishButton').bind('click',function(event){ if (confirmPublish) { $.blockUI({ message: $('#publishConfirm') }); } else publishPage(); }); $('#previewButton').bind('click',function(event){ previewPage(); }); $('#newPhantomBefore').bind('click',function(event){ if (confirm("Are you sure you would like to create a new non-extant page before the current page?")) { newPhantom(); } }); $('#newPhantomAfter').bind('click',function(event){ if (confirm("Are you sure you would like to create a new non-extant page after the current page?")) { newPhantom(true); } }); verseRefDialog = $('#verseRefDialog').dialog({ autoOpen: false, position: 'top', width: Math.min(gadgets.window.getViewportDimensions().width-24, 300), maxHeight: gadgets.window.getViewportDimensions().height-24, title: 'Provide Bible Verse Content' }); verseRefDialog.append = false; $('#doSelectVerseRef').click(function() { verseRefDialog.dialog('close'); if ($('#verseRef').val() != null && $('#verseRef').val().length > 0) { lastPage.indexContent = $('#verseRef').val(); if (verseRefDialog.append > 0 || verseRefDialog.append < 0) { plusFromBasetext(verseRefDialog.append); } else populateForLastPageLoaded(); } return false; }); $('#historyDialog').dialog({ autoOpen: false, position: 'top', width: Math.min(gadgets.window.getViewportDimensions().width-10, 730), maxHeight: gadgets.window.getViewportDimensions().height-24, title: 'Transcription History' }); $('#palDialog').dialog({ autoOpen: false, width: gadgets.window.getViewportDimensions().width-24, height: 156, title: 'Paleography', open: function() { $("#palDialog").dialog("widget").position({ my: 'bottom', at: 'top', of: '#chirho', offset: '0 0', collision: 'fit' }); } }); $('#palInput').bind('input', function(e) { var text = $('#palInput').val(); if (text && text.length > 0) { // odd bug in firefox: if we don't let keystroke event drop through before opening the dialog we get double greek characters (some, e.g., beta) setTimeout(function () { $('#palDialog').dialog('open'); $('#palInput').focus(); }, 100); loadPal($('#palInput').val()); } else $('#palDialog').dialog('close'); }); // tinymce.activeEditor.contentCSS.push(VMR.httpRoot+'modules/transcript/<%= gadgetRoot %>/content-extra.css'); var extraCSS = VMR.httpRoot+'modules/transcript/<%= gadgetRoot %>/content-extra.css'; $('#wce_editor_ifr').contents().find('head').append('<link rel="stylesheet" href="'+extraCSS+'" type="text/css" />'); tinymce.get('wce_editor').on('keyup', function() { if (announceChanges) { var html = getData(); var tei = getTeiByHtml(html, tinymce.get('wce_editor').settings); tei = getTEI(); var endHeaderOffset = tei.indexOf('<body>'); if (endHeaderOffset > -1) tei = tei.substring(endHeaderOffset+6); endHeaderOffset = tei.lastIndexOf('</body>'); if (endHeaderOffset > -1) tei = tei.substring(0, endHeaderOffset); if (lastPage.lang == 'g') lastPage.lang = 'grc'; tei = '<?xml version="1.0" encoding="utf-8"?><?xml-model href="TEI-NTMSS.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?><TEI xmlns="http://www.tei-c.org/ns/1.0"><text'+(lastPage.lang?' xml:lang="'+lastPage.lang+'"' : '')+'><body>'+tei+'</body></text></TEI>'; var postData = { text: tei, docID : lastPage.docID, pageID: lastPage.pageID, }; VMR.serviceRequest('transcript/clean/', postData, function (o) { if (o.text.match('^<TEI')) { o.text = '<?xml version="1.0" encoding="utf-8"?><?xml-model href="TEI-NTMSS.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>' + o.text; } lastPage.transcriptionBody = o.text; lastPage.sender = document; ++ignoreUpdateMessages; setTimeout(function() { --ignoreUpdateMessages; }, 500); VMR.publish("interedition.transcription.updated", lastPage); }); } }); if (hideSaveButton) $('#mceu_4').css('display','none'); }); // document.getElementById(tinymce.activeEditor.id+'_tbl').style.width='100%'; VMR.expandFillPageClientsOrig = VMR.expandFillPageClients; VMR.expandFillPageClients = function() { VMR.expandFillPageClientsOrig(); resizeEditor(); }; VMR.subscribe("interedition.page.selected", page_select_callback); VMR.subscribe("interedition.transcription.updated", onTranscriptionUpdate); VMR.subscribe("interedition.transcription.scrolled", onTranscriptionScrolled); VMR.subscribe("interedition.transcription.readonly", onTranscriptionReadOnly); setTimeout(VMR.refreshHeight, 1000); setTimeout(VMR.refreshHeight, 1200); setTimeout(VMR.refreshHeight, 1400); }, '../../', true); var MARGIN=34; function resizeEditor() { if (tinymce && tinymce.activeEditor && tinymce.activeEditor.iframeElement) { var height = gadgets.window.getViewportDimensions().height; var toolbarHeight = $(tinymce.activeEditor.iframeElement.parentElement.parentElement).children('.mce-toolbar-grp').height(); var statusbarHeight = $(tinymce.activeEditor.iframeElement.parentElement.parentElement).children('.mce-statusbar').height(); tinymce.DOM.setStyle(tinymce.activeEditor.iframeElement, 'height', (height - toolbarHeight - statusbarHeight - 8 - MARGIN) + 'px'); } } function setupEditor(callback) { var lang = (parent && parent.Liferay) ? parent.Liferay.ThemeDisplay.getLanguageId() : 'en'; var mi = getManuscriptInfo(); setWceEditor( 'wce_editor', { rtl : mi.rtl, preferredFont : mi.font, lang : lang, checkOverlineForAbbr : mi.overlineForAbbr, defaultHeightForCapitals : 2, optionsForGapMenu : { suppliedSource : 'transcriber', reason : 'lacuna', sourceOptions : [ { value : 'transcriber', labelEn : 'transcriber', labelDe : 'transcriber', } ] }, defaultValuesForSpaceMenu : { unit : 'char', extent : 2, }, addLineBreaks : true, addSpaces : true, // make this work with a function bookNames : false, // function() {}, defaultReasonForUnclearText : '', // find this transcriptionLanguage : 'coptic', getWitness : function () { return (lastPage) ? lastPage.docName : ''; }, getWitnessLang : function() { return (lastPage.lang == 'g') ? 'grc' : lastPage.lang; }, v11n : false, getBookNameFromBKV : function(ref, context) { if (!context) return false; // check for startsWith(B[0-9]), if not, just return anything before a '.' var contextSegs = context.split('.'); if (contextSegs[0].length < 2 || contextSegs[0][0] != 'B' || contextSegs[0][1] < '0' || contextSegs[0][1] > '9') { return contextSegs[0]; } var bNum = parseInt(context.split('B')[1].split('K')[0]); var kNum = parseInt(context.split('K')[1].split('V')[0]); var vNum = parseInt(context.split('V')[1]); var retVal = 'XXX'; $(lastPage.pageIndexContent).find('indexContent').each(function() { var bookNumber = Math.floor(parseInt($(this).attr('indexContent'))%1000000000/1000000) if (bookNumber == bNum) { var chapterNumber = Math.floor(parseInt($(this).attr('indexContent'))%1000000/1000) if (chapterNumber == kNum) { var verseNumber = Math.floor(parseInt($(this).attr('indexContent'))%1000) if (verseNumber == vNum) { retVal = $(this).attr('osisID').split('.')[0]; } } } }); return retVal; var self = this; if (self.v11n) { // TODO: actually do something here return self.v11n.ref; } // let bookRef; let NTLookup = {"B01": "Matt", "B02": "Mark", "B03": "Luke", "B04": "John", "B05": "Acts", "B06": "Rom", "B07": "1Cor", "B08": "2Cor", "B09": "Gal", "B10": "Eph", "B11": "Phil", "B12": "Col", "B13": "1Thess", "B14": "2Thess", "B15": "1Tim", "B16": "2Tim", "B17": "Titus", "B18": "Phlm", "B19": "Heb", "B20": "Jas", "B21": "1Pet", "B22": "2Pet", "B23": "1John", "B24": "2John", "B25": "3John", "B26": "Jude", "B27": "Rev"}; bookRef = ref.split('K')[0]; return NTLookup[bookRef]; } }, VMR.httpRoot+'modules/transcript/<%= gadgetRoot %>/js/tinymce', function() { var unclearDefault = VMR.prefs.getString('unclearDefault'); if (unclearDefault && unclearDefault.length > 0 && tinymce && tinymce.activeEditor) tinymce.activeEditor.settings.unclear_text_reason_default = unclearDefault; if (callback) callback(); } ); } function getFolio() { return lastPage.pageName; } </script> <div style="font-size: small;" id="historyDialog"> <div id="historyDialogContent"> </div> </div> <div style="font-size: small;" id="palDialog"> <div id="palResultImages" style="width:100%; overflow:auto;"> </div> <div id="palResultList" style="margin: 0 0 0 0; float:left; position:absolute;bottom:2px;left:2px;"></div> </div> <div style="font-size: small;" id="verseRefDialog"> <p style="margin:0px 1px 0px 1px;"> You have selected an image which has not yet been indexed. With what Biblical content would you like me to populate the editor? You can be creative; I'm pretty bright. </p> <p style="margin:0px 1px 0px 1px;"> e.g., Jn 18:1-5 </p> <p> <input id="verseRef" name="verseRef" /> </p> <p> <button id="doSelectVerseRef">Populate</button> </p> </div> <div id="publishConfirm" style="display:none;margin-top:.5em;margin-bottom:.5em;margin-left:.2em;"> <p><h2>Confirm</h2><label>Are you sure you wish to publish?</label> <button id="publishConfirmButton">Yes</button> <button id="publishConfirmCancelButton">Cancel</button></p> <p><input type="checkbox" id="publishConfirmDontAsk" /> <label>Don't ask me again.</label></p> </div> </html> ]]> </Content> </Module>