<%@ 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">&nbsp;</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, '&amp;')
				.replace(/</g, '&lt;')
				.replace(/>/g, '&gt;')
				.replace(/"/g, '&quot;')
				.replace(/'/g, '&apos;');
			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> &nbsp; &nbsp; <button id="publishConfirmButton">Yes</button> &nbsp; &nbsp; <button id="publishConfirmCancelButton">Cancel</button></p>
<p><input type="checkbox" id="publishConfirmDontAsk" /> <label>Don't ask me again.</label></p>
</div>

</html>
]]>
</Content>
</Module>