<?xml version="1.0" encoding="utf-8"?>
<Module>
  <ModulePrefs
	title="CBGM Pre Statistics"
	title_url="http://ntvmr.uni-muenster.de"
	author_email="scribe777@gmail.com"
	author="Institut für neutestamentliche Textforschung"
	description="Closest related manuscripts"
	screenshot="http://ntvmr.uni-muenster.de/community/images/listescreenshot.png"
	thumbnail="http://ntvmr.uni-muenster.de/community/images/pageicon.gif"
	scrolling="false"
   >
  <Optional feature="pubsub-2">
  <Param name="topics">
    <![CDATA[ 
    ]]>
  </Param>
</Optional>
  <Optional feature="dynamic-height"/>
  <Optional feature="views"/>
  <Optional feature="opensocial-0.8"/>
</ModulePrefs>

<UserPref name="height" datatype="enum" display_name="Gadget Height" default_value="600">
	<EnumValue value="200" display_value="Short"/>
	<EnumValue value="400" display_value="Medium"/>
	<EnumValue value="600" display_value="Tall"/>
	<EnumValue value="-1" display_value="Dynamic"/>
</UserPref>

<UserPref name="testGroup" datatype="string" display_name="Teststellen Group" default_value="1" />

<Content type="html">
<![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<html lang="en">
<head>
	<script type="text/javascript" src="/community/js/jquery/jquery.min.js"></script>
	<script type="text/javascript" src="/community/js/jquery.blockUI.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/vmr-common.js"></script>

</head>
<style>
table {
	border:1px;
}
td {
	text-align:right;
}
label {
	font-weight:bold;
}
</style>
<script>

var MARGIN=40;
var projectID = 0;
var projectName = '';
var projectXML = null;
var siteName = null;

var testGroup = 1;

var isAdmin = false;
var isManager = false;

var segments = [];
var manuscripts = new Set();


function loadData(callback) {
	$.blockUI({ message: '<h2><img src="/community/images/loading.gif" /> Loading data from INTF, please wait...</h2>' });
	VMR.serviceRequest('variant/list', { groupID : testGroup }, function(o) {
		var xml = $.parseXML(o.text);
		$(xml).find('segment').each(function() {
			var seg = {};
			seg.id = $(this).attr('segID');
			seg.verse = $(this).attr('verse');
			seg.contextDescription = $(this).attr('contextDescription');
			seg.readings = [];
			$(this).find('reading').each(function() {
				var reading = {};
				reading.id = $(this).attr('segmentReadingID');
				reading.name = $(this).attr('readingName');
				reading.witnesses = new Set($(this).attr('witnesses').split(' '));
				for (var w of reading.witnesses) manuscripts.add(w);
				reading.text = $(this).text();
				seg.readings.push(reading);
			});
			segments.push(seg);
		});

		// add master readings to other hands (-C, -A, -Com witnesses)
		for (var m of manuscripts) {
			var dash = m.indexOf('-');
			if (dash > -1) {
				var master = m.substring(0, dash);
				for (var j = 0; j < segments.length; ++j) {
					var s = segments[j];
					var present = false;
					for (var k = 0; k < s.readings.length; ++k) {
						var r = s.readings[k];
						if (r.witnesses.has(m)) { present = true; break; }
					}
					if (!present) {
						for (var k = 0; k < s.readings.length; ++k) {
							var r = s.readings[k];
							if (r.witnesses.has(master)) r.witnesses.add(m);
						}
					}
				}
			}
		}
		$.unblockUI();
		if (callback) callback();
	});
}

function computeCloseness(docID) {
	$.blockUI({ message: '<h2><img src="/community/images/loading.gif" /> Computing statistics, please wait...</h2>' });
	var ms = {};
	var segCount = 0;
	var readingCount = 0;
	for (var i = 0; i < segments.length; ++i) {
		var s = segments[i];
		var extant = false;
		for (var j = 0; j < s.readings.length; ++j) {
			var r = s.readings[j];
			++readingCount;
			if (r.witnesses && r.witnesses.has(docID)) {
				extant = true;
				break;
			}
		}
		++segCount;
		for (var j = 0; j < s.readings.length; ++j) {
			var r = s.readings[j];
			var me = r.witnesses && r.witnesses.has(docID);
			for (var m of r.witnesses) {
				if (!ms[m]) ms[m] = { id : m, extant : 0, agree: 0, disagree: 0 };
				ms[m].extant++;
				if (me) ms[m].agree++;
				else if (extant) ms[m].disagree++;
			}
		}
	}
	var msarray = [];
	for (var k in ms) {
		var d = ms[k];
		if (d.id.length < 1) continue;
		d.agreep = (d.agree / d.extant * 100).toFixed(2);
		d.disagreep = (d.disagree / d.extant * 100).toFixed(2);
		d.extantp = (d.extant / segments.length * 100).toFixed(2);
//		if (d.agree == d.extant && d.extant < 10 && d.id != docID) continue;
		msarray.push(d);
	}
	msarray.sort(function(a,b) { return a.id == docID ? -1 : b.id == docID ? 1 : (b.agreep - a.agreep) ? b.agreep - a.agreep : b.extant - a.extant; });
	var h = '<table><thead><tr><th>Manuscript</th><th>Agree</th><th>Agree%</th><th>Disagree</th><th>Disagree%</th><th>Extant</th><th>Extant%</th></tr></thead><tbody>';
	var count = 0;
	for (var i = 0; i < msarray.length; ++i) {
		var d = msarray[i];
		var k = d.id;
		h += '<tr><th>'+k+'</th><td>'+ d.agree + '</td><td>'+ d.agreep + '%</td><td>'+ d.disagree + '</td><td>'+ d.disagreep + '%</td><td>'+ d.extant + '</td><td>'+ d.extantp + '%</td></tr>';
		++count;
	}
	h += '</tbody></table>';
	$('#contentDiv').html(h);
	$('#statusBar').html(count + ' manuscripts analysed at ' + segCount + ' Teststellen with ' + readingCount + ' readings.');
	VMR.refreshHeight();
	$.unblockUI();
}

	// get all data
function loaded() {
	loadData(function() {
		var h = '<option></option>';
		var ms = {};
		for (var i = 0; i < segments.length; ++i) {
			var s = segments[i];
			for (var j = 0; j < s.readings.length; ++j) {
				var r = s.readings[j];
				for (var m of r.witnesses) {
					if (!ms[m]) ms[m] = { id : m, extant : 0, agree: 0, disagree: 0 };
				}
			}
		}
		var msarray = [];
		for (var k in ms) {
			var d = ms[k];
			msarray.push(d);
		}
		msarray.sort(function(a,b) { return a.id < b.id?-1: a.id == b.id ? 0 : 1; });
		for (var i = 0; i < msarray.length; ++i) {
			if (msarray[i].id.length < 1) continue;
			if (msarray[i].id[0] == ' ') continue;
			if (msarray[i].id[0] == '-') continue;
			h += '<option>'+msarray[i].id+'</option>';
		}
		$('#manuscriptID').html(h);
		$('#statusBar').html(segments.length + ' segments loaded.');
		VMR.refreshHeight();
	});
}

VMR.init(function() {

	var pid = parseInt(VMR.prefs.getString('project'));

	VMR.serviceRequest('auth/hasrole', { role : 'VMR Administrator' }, function(o) {
		var xml = $.parseXML(o.text);
		if ($(xml).find('role').attr('hasRole') == 'true') {
			isAdmin = true;
		}
		var postData = {
			role : 'Site Administrator',
			userGroupID : parent.Liferay.ThemeDisplay.getScopeGroupId()
		};
		VMR.serviceRequest('auth/hasrole', postData, function(o) {
			var xml = $.parseXML(o.text);
			siteName = $(xml).find('role').attr('userGroupName');
			if ($(xml).find('role').attr('hasRole') == 'true') {
				isAdmin = true;
			}
			loaded();
		});
	});

	$('#compareBtn').on('click', function() {
		computeCloseness($('#manuscriptID').val(), function() {
		});
	});

	testGroup = VMR.prefs.getString('testGroup');

}, '../../');
</script>
<body>
<label for="manuscriptID">Manuscript:</label> <select name="manuscriptID" id="manuscriptID"><option></option></select><button id="compareBtn">Compare</button>
<div style="overflow:auto; border: none 0px; width:100%;min-height:300px;" class="fillPage" id="contentDiv">
</div>
<div id="statusBar">
</div>
</body>
</html>

]]>
</Content>
</Module>
