// ====================================
// Javascript Source File for JS Node Tree
// ====================================

// Load XML Redirection file:
// ------------------------------
	function redirXML(url) {
		document.getElementById('pageHTML').innerHTML='<br /><br /><br /><br /><div style="font-family: verdana; sans-serif; color:#0066CC; text-align:center;"><b>[<i>Loading XML/XHTML</i> ... ]</b></span>';
		if (url!=false) {document.location=url;}
		else {return;}
	}

// load xml/html files from page:
// ------------------------------
function loadXML(dir) {
	var n=getCurrPage();
	var currLoc=document.location + '';
	var redir='';
	redirXML(false);

	// determine navigation direction
	if ((n>1)&&(dir=='prev')) {redir='OEparagraph-' + eval(n-1);} 
	if ((n<5)&&(dir=='next')) {redir='OEparagraph-' + eval(n+1);}
	if (((n==1)&&(dir=='prev'))||((n==5)&&(dir=='next'))) {document.location='index.xml'; return;}

	// determine if: xml or html file
	if (currLoc.indexOf('html')!=-1) {document.location=redir	+ '.html';}
	else {document.location=redir	+ '.xml';}
}

// get relative current page number:
// ------------------------------
function getCurrPage () {
  	var currPage=document.location + '';
	var n=parseInt(currPage.substring(currPage.lastIndexOf('-')+1,currPage.lastIndexOf('.')));
	return n;
}

// menu-panel functioning:
// ------------------------------
function openPanel(n,caption) {
	if (n=='1_0'){var d=1;}
	else {var d=n;}
	var p = document.getElementById('p' + d);
	var c = 	document.getElementById('c' + d);
	if ((c!=null)&&(p!=null)) {
		if (n=='1_0') {
			p.style.display='block';
			c.innerHTML='Hide ' + caption;
			return;
		}
		if (p.style.display=='none') {
			p.style.display='block';
			c.innerHTML='Hide ' + caption;
		}
		else {
			p.style.display='none';
			c.innerHTML='Show ' + caption;
		}
	}
	return;
}

// ====================================
// create main-node object:
var nObj=new nodeObj();

// add child object to array:
// ------------------------------
function nObjAddNode(Kind, Level, Info) {
	var newChild = new addObj(Kind, Level, Info);
	this.objArray.push(newChild);
}

// function prototype: addNode
// ------------------------------
nodeObj.prototype.addNode = nObjAddNode;

// add child object properties:
// ------------------------------
function addObj(Kind, Level, Info){
	this.Kind = Kind;
	this.Level = parseInt(Level);
	this.Expand = false;
	
	// create descriptor array:
	var infoArray = Info.split('|');
	this.Info = new Array();
		for (i=0;i<infoArray.length;i++) {
			if (infoArray[i]!='') {
				this.Info[i]=infoArray[i];
			}
			else {this.Info[i]='&#216;';}
		}
	return this;
}

// create object array property:
// ------------------------------
	function nodeObj() {
		this.objArray = new Array();	
	}

// ====================================

// write selected node tree:
// ------------------------------
function writeNodes(sId) {
	var i=0;
	var c=0;
	var n=0;
	var spId=nObj.objArray.length;
	while ((c<sId)&&(i<nObj.objArray.length)) {
		if (nObj.objArray[i].Kind=='s') {n=i;}
		if (nObj.objArray[i].Kind=='span') {c++;}
		i++;
		if (c==sId)	{var stId=i;}
	}
	while ((i<nObj.objArray.length)&&(nObj.objArray[i].Kind!='s')) {
		i++;
		if ((i<nObj.objArray.length)&&(nObj.objArray[i].Kind=='s')) {spId=i;}
	}
		
	var id=0;																						
	var Result = '';
	var writeIndent = '';
	for (i=stId-2;i<spId;i++) {
		writeIndent = '<span class="nodeSpacing">';
		if (nObj.objArray[i].Kind!='span') {
			for (j=0;j<parseInt(nObj.objArray[i].Level-1);j++)	{
				writeIndent += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
			}
			Result += '<div class="nodeLevel" style=" display:';
			if (i==stId-2) {Result+='block';}
			else {Result+='none';}
			Result += ';" id="n' + i + '"><table><tr><td>' + writeIndent;
			if (parseInt(nObj.objArray[i].Level)>0) {
				Result+= ':.......</span>\n';
			}
			else {Result+='</span>\n';}
			if ((i<nObj.objArray.length-1)&&(parseInt(nObj.objArray[i+1].Level)>parseInt(nObj.objArray[i].Level))) {
				if (nObj.objArray[i].Kind=='s') {id = i+1;}
				else {id = i;}
				Result += '</td><td><span id ="s' + id + '" class="nodeView" onclick="javascript:openNodes(' + id + ')">+</span>';
			}
			else {Result += '</td><td><span class="nodeView">&#183;</span>';}
			Result += '</td><td>&nbsp;[<span style="color:#993300;"><b>' + nObj.objArray[i].Kind + '</b></span>]&nbsp;</td><td style="text-align:left;"><a name="' + i + '" />'  + getText(i) + ' [<span class="getInfo" onmouseout="hidePopUp()" onclick="showPopUp(' + i + ')">?</span>]</td></tr></table></div>\n';
			writeIndent = '';
		}
	}
	// alert(Result);
	document.getElementById('infoPanel').innerHTML='';
	document.getElementById('nodePanel').innerHTML = Result + '<br />';
}

// node-view functioning:
// ------------------------------
function openNodes(pos) { 
	if (nObj.objArray[pos].Expand) {collapseNode(pos); nObj.objArray[pos].Expand=false;}
	else {expandNode(pos); nObj.objArray[pos].Expand=true;}
}

// branch down node tree:
// ------------------------------
function expandNode(pos) {
	var currentLevel=parseInt(nObj.objArray[pos].Level);
	var id = ''; 
	for (var i=parseInt(pos);i<nObj.objArray.length;i++) {
		//alert('@' + pos + ' :: test position:' + i + ' :: test level:' + nObj.objArray[i].Level + ' :: current level:' + currentLevel);
		if (i==pos) {
			id = 's' + pos;
			var oNode = document.getElementById(id); 
			if (oNode!=null) {oNode.innerHTML='-';}
		}
		if ((i>pos)&&(parseInt(nObj.objArray[i].Level)<=parseInt(currentLevel))) {return;}
		if ((i>pos)&&(parseInt(nObj.objArray[i].Level)==parseInt(currentLevel+1))) {
			id = 'n' + i;
			var oNode = document.getElementById(id); 
			if (oNode!=null) {oNode.style.display='block'; document.location='#' +pos;}
		}
	}
}

// branch up node tree:
// ------------------------------
function collapseNode(pos) {
	var currentLevel=parseInt(nObj.objArray[pos].Level);
	var id = '';
	for (var i=parseInt(pos);i<nObj.objArray.length;i++) {
		// alert('test position:' + i + ' :: test level:' + nObj.objArray[i].Level + ' :: current level:' + currentLevel);
		if (i==pos) {
			id = 's' + pos;
			var oNode = document.getElementById(id); 
			if (oNode!=null) {oNode.innerHTML='+';}
		}
		if ((i>pos)&&(parseInt(nObj.objArray[i].Level)<=currentLevel)) {return;}
		if ((i>pos)&&(parseInt(nObj.objArray[i].Level)>currentLevel)) {
			id = 'n' + i;
			var oNode = document.getElementById(id);
			if (oNode!=null) {oNode.style.display='none'; document.location='#' +pos;}
			id = 's' + i;
			var oNode = document.getElementById(id); 
			if (oNode!=null) {oNode.innerHTML='+'; nObj.objArray[i].Expand=false;}
		}
	}
}

// ====================================

// retrieve text from node tree object:
// ------------------------------
function getText(i) {
	var Result='<span style="font-size:9pt">';
	if ((nObj.objArray[i].Kind=='w')||(nObj.objArray[i].Kind=='m')) {
		Result+= ' <b>' +nObj.objArray[i].Info[0] + '</b>';
	}
	else {
		var j=i+1;
		while ((j<nObj.objArray.length)&&(nObj.objArray[i].Level<nObj.objArray[j].Level)) {
			if (nObj.objArray[j].Kind=='w') {
				Result+= '<b>' + nObj.objArray[j].Info[0] + '</b> ';
			}
			j++;
		}
	}
	return Result + '</span>';
}

// display parts of speech information:
// ------------------------------
function getInfo(i) {
	var Result = '';
	if (i=='empty') {Result='';}
	else {
		Result = '<b>' + translate(nObj.objArray[i].Kind) + '</b><br/>';
		for (k=0;k<nObj.objArray[i].Info.length-1;k++) {
			Result+= '<i>' + translate(nObj.objArray[i].Kind + k) + '</i>&nbsp;-&nbsp;' + translate(nObj.objArray[i].Info[k]) + '<br />';
		}
	}
	document.getElementById('infoPanel').innerHTML=Result + '</ul>';
}

// translate abbreviated information:
// ------------------------------
function translate(abbr) {
	if (abbr=='s'){abbr='sentence';}
	if (abbr=='s0'){abbr='Description';}
	if (abbr=='span'){abbr='translation';}
	if (abbr=='s0'){abbr='Description';}
	if (abbr=='ang'){abbr='Anglo-Saxon';}
	if (abbr=='eng'){abbr='Modern English';}
	if (abbr=='p'){abbr='paragraph';}
	if (abbr=='p0'){abbr='Description';}
	if (abbr=='cl'){abbr='clause';}
	if (abbr=='cl0'){abbr='Type';}
	if (abbr=='cl1'){abbr='Function';}
	if (abbr=='cl2'){abbr='Split Element';}
	if (abbr=='phr'){abbr='phrase';}
	if (abbr=='phr0'){abbr='Type';}
	if (abbr=='phr1'){abbr='Function';}
	if (abbr=='phr2'){abbr='Split Element';}
	if (abbr=='w'){abbr='word';}
	if (abbr=='w0'){abbr='Text';}
	if (abbr=='w1'){abbr='Description';}
	if (abbr=='w2'){abbr='Lemma';}
	if (abbr=='m'){abbr='morpheme';}
	if (abbr=='m0'){abbr='Text';}
	if (abbr=='m1'){abbr='Description';}
	if (abbr=='m2'){abbr='Function';}

	if (abbr=='INDEP'){abbr='independent';}
	if (abbr=='DEP'){abbr='dependent';}
	if (abbr=='NCL'){abbr='noun clause';}
	if (abbr=='ADVCL'){abbr='adverb clause';}
	if (abbr=='ADJCL'){abbr='adjective clause';}
	if (abbr=='VP'){abbr='verb predicate';}
	if (abbr=='NP'){abbr='noun predicate';}
	if (abbr=='PP'){abbr='preposition predicate';}
	if (abbr=='AUX'){abbr='auxillary';}
	if (abbr=='subject'){abbr='subject';}
	if (abbr=='predicate'){abbr='predicate';}
	if (abbr=='complement_subject'){abbr='complement subject';}
	if (abbr=='complement_object'){abbr='complement object';}
	if (abbr=='direct_object'){abbr='direct object';}
	if (abbr=='indirect_object'){abbr='indirect object';}
	if (abbr=='adverbial'){abbr='adverbial';}
	if (abbr.indexOf('split')!=-1) {
		abbr = 'split-element #' + parseInt(abbr.substring(abbr.indexOf('t')+1,abbr.length));
	}
	if (abbr=='ADJ'){abbr='adjective';}
	if (abbr=='ADJP'){abbr='adjective phrase';}
	if (abbr=='ADJC'){abbr='comparative adjective';}
	if (abbr=='ADJS'){abbr='superlative adjective';}
	if (abbr=='ADJSUB'){abbr='substantive adjective';}
	if (abbr=='ADV'){abbr='adverb';}
	if (abbr=='ADVP'){abbr='adverb phrase';}
	if (abbr=='ADVC'){abbr='comparative adverb';}
	if (abbr=='ADVS'){abbr='superlative adverb';}
	if (abbr=='CORR'){abbr='correlative conjunction'}
	if (abbr=='COOR'){abbr='coordinating conjunction'}
	if (abbr=='SUBO'){abbr='subordinating conjunction'}
	if (abbr=='DEFA'){abbr='definite article';}
	if (abbr=='IDFA'){abbr='indefinite article';}
	if (abbr=='DEM'){abbr='demonstrative';}
	if (abbr=='IDPR'){abbr='indefinite pronoun';}
	if (abbr=='INTP'){abbr='interrogative pronoun';}
	if (abbr=='NOUN'){abbr='noun';}
	if (abbr=='PRNN'){abbr='pronoun';}
	if (abbr=='PRNO'){abbr='proper noun';}
	if (abbr=='INTJ'){abbr='interjection';}
	if (abbr=='AUXV'){abbr='auxiliary verb';}
	if (abbr=='PAPT'){abbr='past participle';}
	if (abbr=='PRPT'){abbr='preposition';}
	if (abbr=='VERB'){abbr='verb';}
	if (abbr=='PREP'){abbr='preposition';}
	if (abbr=='RELP'){abbr='relative particle';}
	if (abbr=='RELPR'){abbr='relative pronoun';}
	return abbr;
}

// parts of speech highlighting:
// ------------------------------
	var HLC = new HLColours();
	function Highlight(Src,id){ 
		var WhichType = Src.value;
		var Show = Src.checked;
		if (Show == true){
			Src.style.backgroundColor = HLC[WhichType];
			var tab = document.getElementById(id);
			if (tab!=null) {tab.style.backgroundColor = HLC[WhichType];}
		}
		else{
			Src.style.backgroundColor = '#EED';
			var tab = document.getElementById(id);
			if (tab!=null) {tab.style.backgroundColor = '#EED';}
		}
		var Els = document.getElementsByTagName('span'); 
		for (var i=0; i<Els.length; i++){
			if ((Els[i].className!=null)&&(WhichType=='SAMEAS')&&(Els[i].className!='senHi')&&(Els[i].className!='senLo')){
				if (Els[i].className.indexOf('split')!=-1) {
					if (Show == true) {
						var sClr = Math.abs(16777000 - 1000*parseInt(Els[i].className.substring(Els[i].className.indexOf('t')+1,Els[i].className.length)));
						Els[i].style.backgroundColor = "#" + sClr.toString(16);
					}
					else{
						Els[i].style.backgroundColor = 'transparent';
					}
				}
			}
			else {
				if ((Els[i].className!=null)&&(Els[i].className==WhichType)&&(Els[i].className!='senHi')&&(Els[i].className!='senLo')){
					if (Show == true){	 
						Els[i].style.backgroundColor = HLC[WhichType];
					}
					else{
						Els[i].style.backgroundColor = 'transparent';
					}
				}
			}
		}
	}

// indexed highlighting colours:
// ------------------------------
function HLColours(){
	this.NOUN = '#ffffdd';
	this.VERB = '#dddddd';
	this.ADJ = '#ffddbb';
	this.ADJSUB = '#fffeee';
	this.ADJP = "#ccffee";
	this.ADJC = "#cceeff";
	this.ADJS = "eeaaff";
	this.ADV = '#ffbbdd';
	this.ADVC = '#ffffbb';
	this.ADVS = "#bbbbff"
	this.PREP = '#bbffdd';
	this.DEFA = '#ddffbb';
	this.DEM = '#bbddff';
	this.IDFA = '#ddbbff';
	this.ADJC = '#ffdddd';
	this.ADJS = '#ddffdd';
	this.ADVC = '#ddddff';
	this.ADVS = '#ddffff';
	this.AUXV = '#ffddff';
	this.CONJ = '#ffffdd';
	this.COOR = '#dddddd';
	this.CORR = '#ddaadd';
	this.IDPR = '#ffddbb';
	this.INTJ = '#ffbbdd';
	this.INTP = '#bbffdd';
	this.PAPT = '#ddffbb';
	this.PRPT = '#bbddff';
	this.PRNN = '#ddbbff';
	this.PRNO = '#ffdddd';
	this.RELP = '#ddffdd';
	this.RELPR = '#eeffee';
	this.SUBO = "#cceedd";
	this.AUXV = "#aaffee";
}

// display modern-english translation:
// ------------------------------
function viewTranslation(tId) {	
	var tObj=document.getElementById('trans' + tId)
	if (tObj.style.display=='none') {
		document.getElementById('trans' + tId).style.display='block';
	}
	else {document.getElementById('trans' + tId).style.display='none';}
}

// reference pop-ups:
// -----------------------------------------------
function showPopUp (i) {
	var rObj = document.getElementById('n' + i);
	var aObj = document.getElementById('nodePanel');
	var PopUp=document.getElementById('infoPanel');
	var rY = rObj.offsetTop;
	var rW = rObj.offsetWidth;
	var dX = aObj.offsetLeft;
	var dY = aObj.offsetTop;
	var dW = aObj.offsetWidth;
	var dH = aObj.offsetHeight;

	// pop-up position displacement:
	var dpX=eval(dX+rW);
	var dpY=0;
	//alert('obj-X: ' + rX + ' objY: ' + rY + ' nPanelX: ' + dX + ' nPanelY: ' + dY + ' nPanelH: ' + dH);
	if (rY>dH) {dpY=rY;}
	else {dpY=eval(rY+dY);}

	if ((aObj!=null)&&(rObj!=null)&&(PopUp!=null)) {
		// show + position pop-up:
		PopUp.style.left = Math.floor(dpX)+'px';
		PopUp.style.top = Math.floor(dpY)+'px';
		PopUp.style.display = 'block';
		getInfo(i);
	}
}

function hidePopUp (ref) {
	var PopUp=document.getElementById('infoPanel');
	if (PopUp!=null) {
		// hide pop-up:
		PopUp.style.display='none';
	}
}

