var shift=0;	
var ctrl=0;
var alt =0;
var release;
var lastCursor;
var lastY;
var	fontFamilyIE = 0;

var key = new Array(17);
for (i=0; i < key.length; ++i) key[i] = new Array(4);
key[1][1] = 	65; 	key[1][2] 	= 257; 		key[1][3] 		= 256; 	// a
key[2][1] = 	73;		key[2][2] 	= 299; 	 	key[2][3] 		= 298;	// i
key[3][1] = 	85;		key[3][2] 	= 363; 	 	key[3][3] 		= 362; 	// u
key[4][1] = 	82;		key[4][2] 	= 7771;  	key[4][3] 		= 7770;	// r
key[5][1] = 	69; 	key[5][2] 	= 7773;		key[5][3] 		= 7772;	// e 	(lang r)
key[6][1] = 	76;		key[6][2] 	= 7735;  	key[6][3] 		= 7734; // l 
key[7][1] = 	71;		key[7][2] 	= 7749;  	key[7][3] 		= 7748;	// g 	(guturaler Nasal)
key[8][1] = 	74;		key[8][2] 	= 241; 	 	key[8][3] 		= 209;	// j	(palataler Nasal)
key[9][1] = 	84;		key[9][2] 	= 7789;  	key[9][3] 		= 7788;	// t
key[10][1] = 	68;		key[10][2] 	= 7693;  	key[10][3] 		= 7692;	// d
key[11][1] = 	78;		key[11][2] 	= 7751;  	key[11][3] 		= 7750;	// n 	(cerebraler Nasal)
key[12][1] = 	90;		key[12][2] 	= 347; 	 	key[12][3] 		= 346;	// z	(guturaler Sibilant)
key[13][1] = 	83;		key[13][2] 	= 7779;  	key[13][3] 		= 7778;	// s
key[14][1] = 	77;		key[14][2] 	= 7747;  	key[14][3] 		= 7746; // m
key[15][1] = 	72;		key[15][2] 	= 7717;  	key[15][3] 		= 7716;	// h

var ue = String.fromCharCode(252);
var oe = String.fromCharCode(246);
var ae = String.fromCharCode(228);
var ss = String.fromCharCode(223);

var bbc = new Array(11);
for (i=0; i < bbc.length; ++i) bbc[i] = new Array(5);
bbc[1][1] = 	75; 	bbc[1][2] 	= "<i>"; 																					bbc[1][3] 		="</i>";  		bbc[1][4] 		="Kursiv";
bbc[2][1] = 	70; 	bbc[2][2] 	= "<b>"; 																					bbc[2][3] 		="</b>";  		bbc[2][4] 		="Fett";;
bbc[3][1] = 	85; 	bbc[3][2] 	= "<u>"; 																					bbc[3][3] 		="</u>";  		bbc[3][4] 		="Unterstrichen";
bbc[4][1] = 	65; 	bbc[4][2] 	= "<a>"; 																					bbc[4][3] 		="</a>";  		bbc[4][4] 		="Link";
bbc[5][1] = 	67; 	bbc[5][2] 	= "<span style=\"font-variant\:small-caps\">"; 		bbc[5][3] 		="</span>";  	bbc[5][4] 		="Kapit"+ae+"lchen";
bbc[6][1] = 	76; 	bbc[6][2] 	= "<p style=\"text-align\:left\">"; 							bbc[6][3] 		="</p>";  		bbc[6][4] 		="Links";
bbc[7][1] = 	77; 	bbc[7][2] 	= "<p style=\"text-align\:center\">"; 						bbc[7][3] 		="</p>";  		bbc[7][4] 		="Mitte";
bbc[8][1] = 	82; 	bbc[8][2] 	= "<p style=\"text-align\:right\">"; 							bbc[8][3] 		="</p>";  		bbc[8][4] 		="Rechts";
bbc[9][1] = 	66; 	bbc[9][2] 	= "<p style=\"text-align\:justify\">"; 						bbc[9][3] 		="</p>";  		bbc[9][4] 		="Blocksatz";

document.onmousemove = showDiacritica;
document.onmousedown = storeLastCursor;	
document.onkeydown = keydown;
document.onkeyup = keyup;

function showDiacritica(){
	if (fontFamilyIE == 0){
		if (document.selection){//IE
			for(var j = 0; j < document.getElementsByTagName('textarea').length; j++) {											
				document.getElementsByTagName('textarea')[j].style.fontFamily = "'arial Unicode MS', verajja, gentium, 'gandhari unicode', vu times";			
			}
			for(var j = 0; j < document.getElementsByTagName('input').length; j++) {											
				document.getElementsByTagName('input')[j].style.fontFamily = "'arial Unicode MS', verajja, gentium, 'gandhari unicode', vu times";			
			}
			fontFamilyIE = "done";			
		}
	}																											
}

function storeLastCursor(event){
	var actualCursor;
	var parent;
	if (document.selection){//IE
		actualCursor = document.selection.createRange();
		parent = actualCursor.parentElement().tagName;		
		actualY = window.event.y;
	}
	else if (window.getSelection){ //Geckos
		actualCursor = event.target;
		parent = actualCursor.nodeName;		
		actualY = event.pageY;
	}

	if (parent == "INPUT" || parent == "TEXTAREA"){
			lastCursor = actualCursor;
			lastY = actualY;
	}
}

function keydown (event) {  
  if (!event) event = window.event;
  
  if (event.which) {
    keyCode = event.which; 
  } 
  
  else if (event.keyCode) {
    keyCode = event.keyCode;
  }
	storeLastCursor(event);
	
	if (keyCode==17) {	//entspricht ctrl
		if (ctrl) {
			ctrl = 0;
		} 
		else {
			ctrl = 1
		}
		return false;
	}	
	
	if (keyCode==16) {	//entspricht shift
		shift = 1;	
		return false;
	}	
	if (keyCode == 18){
		alt = 1;	
		return false;
	}

 	if (ctrl){   		  
  	ctrl=0;
 		var keyChar;
 		var keyCharIndex;
 		var proceed;
		for (i=1; i<=key.length-1; i++) {
			if (key[i][1] == keyCode) {			  
				if (shift){
					keyCharIndex = "3";
				}
				else {
					keyCharIndex = "2";
				}									
				keyChar = String.fromCharCode(key[i][keyCharIndex]);
				proceed = 1;
				break;				
			}
		} 	
		if (alt){						
			for (i=1; i<=bbc.length-1; i++) {
				if (bbc[i][1] == keyCode) {			  
					keyChar = bbc[i][2];
					proceed = "bbc";
					break;						
				}
			}
		} 	
  	if (keyCode==219){
			//if (document.getElementById("shortcutHelp").style.display == "block"){
				//eraseHelp();
			//}			
			help(alt);			
			proceed = "proceed";
			keyChar ="";
  	}		
		if (keyChar || proceed){
			insertValue(keyChar,'key',event.target,proceed);
		}
		if (document.selection){//IE Verhinderung der zunchst gedrckten Taste
			return false;
		}
	}
}

function insertValue(value,from,target,enclose){	

		//MS IE fr Windows 6.0
		if (document.selection){			
			rangeIE(document.selection,value,enclose);	
		}
		
		//Mozilla Firefox 1.0.7, Netscape 7.1
		else if (window.getSelection){  						
			rangeGecko(value,from,target,enclose);
		}
		
		else {
 			window.status = "Input of diacritics is not possible.";
		}	
}

function rangeGecko(value,from,target,enclose) {

							
	if (!target){//Einfgung durch Klicken auf die Hilfeschaltflchen
		target = lastCursor;
		if (!target){//Beim Laden einer Seite wenn kein Text oder Inputfeld als target vorliegt 
			alertUser();
		}
	}	


	//Aktuellen Fokus, Tag und Nummer ermitteln	
	var tagName = target.nodeName;	
	var tagNr;
	
	
	var rangeGecko = document.createRange();
	// BUG: range.insertNode(node); <-- mozillabug https://bugzilla.mozilla.org/show_bug.cgi?id=135922
	var bool;
	rangeGecko.selectNode(target);	
	 for(var j = 0; j < document.getElementsByTagName(tagName).length; j++) {		
		//Vor Behebung eines mozilla bugs: 
		//bool = rangeGecko.intersectsNode(document.getElementsByTagName(tagName).item(j),1);
		//Nach Behebung des Mozilla bugs (Geändert 4.8.2009, Trikha) Work around: neue funktion unten
		bool = rangeIntersectsNode(rangeGecko, document.getElementsByTagName(tagName)[j]);
		if (bool == true){
			tagNr = j;
			break;									
		}
	}																									
	
	//Diakritisches Zeichen in ermitteltes Feld einfĂÂgen
	var input = document.getElementsByTagName(tagName)[tagNr];            						
	input.focus();
	var start = input.selectionStart;   
	var end = input.selectionEnd;   
	var insert;
	var closeWith;
	var marked = "";
	if (enclose == "bbc"){
			for (i=1; i<=bbc.length-1; i++) {
				if (bbc[i][2] == value) {			  
					closeWith = bbc[i][3];					
					break;						
				}
			}		
		if (value == "<a>"){
			href = prompt('Bitte geben Sie den Pfad f'+ue+'r die Verkn'+ue+'pfung an (z.B. \"www.univie.ac.at\"):');			
			if (href){
				value = "<a href='"+ href +"'>"
			}
		}
		marked = input.value.substring(start, end);
		insert = value + marked + closeWith;				
	}
	else {
		insert = value;	
	}
	
	input.value = input.value.substr(0, start) + insert + input.value.substr(end);
    				
	/* Anpassen der Cursorposition */
	var pos;
	if (marked.length == 0){
		pos = start + value.length;
	}
	else {
		pos = start + insert.length;
	}		
	input.selectionStart = pos;
	input.selectionEnd = pos;	
		
	if (from == "key"){
		//Unterbindung des ursprnglich gedrckten Tastaturzeichens
		input.onkeypress = function() {return false};	
		release = input;    				   	
	}	
}

function rangeIntersectsNode(range, node) {
  	var nodeRange = node.ownerDocument.createRange();
  	try {
    	nodeRange.selectNode(node);
  	}
  	catch (e) {
    	nodeRange.selectNodeContents(node);
  	}	
  	return range.compareBoundaryPoints(Range.END_TO_START, nodeRange) == -1 &&
         range.compareBoundaryPoints(Range.START_TO_END, nodeRange) == 1;
}



function alertUser(){
	alert("Shortcuts: Bitte bewegen Sie den Cursor mit der Maus an die Position, an der Sie das Element einf"+ue+"gen wollen.")
}

function rangeIE(selection,newValue,enclose) {
	var IErange;
	if (selection.type == "None"){//Fokus Verlust bei Einfuegung durch die Maus
		IErange = lastCursor;		
	}		 				
	else if (lastCursor) {
		IErange = document.selection.createRange();		
	}
	else {
		window.status = "No range for IE Explorer."
	}
	if (IErange){
		var parentName = IErange.parentElement().tagName;
		if (parentName == "INPUT" || parentName == "TEXTAREA") {//sonst kann bspw. ueber "Alles markieren" der ganze Bildschirm ausradiert werden
			var selectedText = IErange.text;		
			if (enclose){
				var closeWith = "";
				for (i=1; i<=bbc.length-1; i++) {
					if (bbc[i][2] == newValue) {			  
						closeWith = bbc[i][3];					
						break;						
					}
				}		
				if (newValue == "<a>"){
					href = prompt('Bitte geben Sie den Pfad f'+ue+'r die Verkn'+ue+'pfung an (z.B. \"www.univie.ac.at\"):');			
					if (href){
						newValue = "<a href='"+ href +"'>"
					}
				}
				IErange.text = newValue + selectedText + closeWith;
			}
			else {
				IErange.text = newValue;
			}
			IErange.collapse();		
		}
		else {			
			alertUser();			
		}
	}		
	else {		
		if(newValue){
			alertUser();
		}
	}
}

function helpPosition(node,internal) {
		var s = node.style;
		var y;
		if (lastY){
				y = lastY;
		}
		else {
			y = (internal) ? 69 : (document.selection)? 15 : 35;
		}
		s.top = y + "px";
		var helpWidth = 290;	
		s.width = helpWidth + "px";				
		var corrector = (internal) ? 50 : 90;
		var left = (document.selection)? (internal)? 540 : 585 : window.innerWidth - helpWidth - corrector;
		s.left = left + "px";						
}


function help(edit){		
		
		var internal = (document.getElementById("shortcutHelp").className == "internal") ? '1' : '';		

		if (document.getElementById("independentShortcutHelp")){
			 //alert('may all beings be happy');
		}
		else {
			helpNode = document.createElement('div');			
			helpNode.id = "independentShortcutHelp";
			document.getElementsByTagName("body")[0].appendChild(helpNode);		
		}			
		var div = document.getElementById("independentShortcutHelp");
		eraseHelp();						
		var d = div.style;
		d.display = "block";		
		var background = (internal) ? "#E8EBF0" : "white";
		d.backgroundColor = background;		
		var borderColor = (internal) ? "#cccccc" : "black";			
		d.border = 1 + "px solid " + borderColor;				
		d.fontSize = 11 + "px";
		d.padding = 10 + "px";
		d.position = "absolute";
		//d.zIndex = 2 + "px";		IE akzeptiert das nicht		
		helpPosition(div,internal);

				
		
		var header = (edit) ? "Editieroptionen" : "Diakritische Zeichen";
		append('b','Shortcuts: ' + header, div);		
		append('br','',div);
		

		if (edit){
			append('','Um Formatierungen f' + ue + 'r markierten Text einzuf' + ue + 'gen, dr' + ue + 'cken Sie auf Ihrer Tastatur erst auf die Steuerungstaste (\"Strg\") [1], lassen diese wieder los [2] und halten sodann die alt-Taste [3] gemeinsam mit der unten die gew' + ue + 'nschte Formatierung kennzeichnenden Taste gedr' + ue + 'ckt [4].',div);
			append('br','',div);
			append('','Wenn diese Hilfe ge' + oe + 'ffnet ist, k' + oe + 'nnen Sie markierten Text auch durch Klicken auf die entsprechende Schaltfl' + ae + 'che mit der gew' + ue + 'nschten Formatierung kennzeichnen.',div);
		}
		else {						
			append('','Zur Anzeige der diakritischen Zeichen mu'+ ss+' ein Unicode-Zeichensatzes wie arial unicode ms, verajja, gentium, gandhari unicode oder vu times auf Ihrem Rechner installiert sein.',div);
			append('br','',div);
			append('','Um ein Sonderzeichen einzuf' + ue + 'gen, dr' + ue + 'cken Sie auf Ihrer Tastatur erst auf die Steuerungstaste (\"Strg\") [1], lassen diese wieder los [2]  und dr' + ue + 'cken dann auf die unten angef' + ue + 'hrte, das Sonderzeichen aktivierende Taste [3]. ',div);
			append('br','',div);
			append('','Wenn diese Hilfe ge' + oe + 'ffnet ist, k' + oe + 'nnen Sie ein diakritisches Zeichen auch durch Klicken auf die entsprechende Schaltfl' + ae + 'che an der Cursorposition einf' + ue + 'gen.',div);
		}
		append('br','',div);
		append('br','',div);
		
		append('span','',div);
		var span  = div.lastChild;
		var s = span.style;		
		s.textAlign = "left";	
		
		if (edit){
			append('span','Textauszeichnung',div);
			append('br','',div);
			appendEditButton();
		}
		else {
			appendButtonType('2');
			div.appendChild(document.createElement('hr'));	
			appendButtonType('3');
		}
		function appendEditButton(){
			for(var i = 1; i < bbc.length - 1; i++) {				
  			var li= document.createElement("button");	
  			li.style.fontSize = 11 + "px";  			
  			var refer = String.fromCharCode(bbc[i][1]).toLowerCase();
  			var refered = bbc[i][4];
  			var txt = document.createTextNode(refered + " > " + refer);  		  		
  			li["onmouseup"]=new Function("(insertValue('" + bbc[i][2] + "','','','bbc'))");  			  			
  			li.appendChild(txt);
  			div.appendChild(li);  			
  			if (i == 5 || i == 11){
  				append('hr','',div);  			
  				append('span','Absatzausrichtung',div);
  				append('br','',div);
  			}
			}
		}
		
		function appendButtonType(buttonType){								
			for(var i = 1; i < key.length - 1; i++) {				
  			var li= document.createElement("button");	
  			li.style.fontSize = 11 + "px";
  			li.style.fontFamily = "'arial Unicode MS', verajja, gentium, 'gandhari unicode', vu times";
  			var refer = String.fromCharCode(key[i][1]);
  			if (buttonType == 2){ refer = refer.toLowerCase()}
  			var refered = String.fromCharCode(key[i][buttonType]);
  			var txt = document.createTextNode(refered + " > " + refer);  		  		
  			li["onmouseup"]=new Function("(insertValue('" + refered + "'))");  			  			
  			li.appendChild(txt);
  			div.appendChild(li);
  			if (i == 6 || i == 11){
  				div.appendChild(document.createElement('br'));
  			}
  		}  		
		}
	
		append('br','',div);
		append('br','',div);
		var edit_option = (edit) ? 'dr' +ue+' cken der alt-Taste gemeinsam mit ' : '';
		append ('', 'Diese Hilfe kann auch mit Steuerung dr'+ ue + 'cken, Steuerung loslassen und '+ edit_option +'\"?\" ge'+oe+'ffnet werden.', div)
		append('br','',div);
		append('br','',div);
		
		if (internal){		
			var optionTxt = (edit) ? "Diakritische Zeichen" : "Editieroptionen";
			append('','Shortcuts: '+ optionTxt,div);		
			var option = (edit) ? 1 : 2;
			div.lastChild["onclick"]=new Function("(eraseHelp('" + option + "'))");  			  			
			div.lastChild.style.border = 1 + "px solid black";
			div.lastChild.style.padding = 4 + "px";
			div.lastChild.style.cursor = "pointer";		
		}
		append('','Hilfe schlie'+ ss +'en',div);		
		div.lastChild.style.border = 1 + "px solid black";
		div.lastChild.style.padding = 4 + "px";
		div.lastChild.style.position = "relative";
		var position = (edit)? 10 : (internal) ? 40 : 0;
		div.lastChild.style.left = position + "px";		
		div.lastChild.style.cursor = "pointer";
		div.lastChild["onclick"]=new Function("(eraseHelp())");  			  			

}

function eraseHelp(otherHelp){
	
	var div = document.getElementById("independentShortcutHelp");	
	
	var kids = div.childNodes.length;
	for(var i = 0; i < kids; i++) {
			div.removeChild(div.firstChild);			
	}	
	div.style.display = "none";
	if (otherHelp == 1){
		help();
	}
	else if (otherHelp == 2){
			help('1');
	}			
}


function append(newElement,txt,appendTo) {					
		
		var unbold;		
		if (newElement.length == 0){
			newElement = "span";
			unbold = 1;
		}
		var appendix = document.createElement(newElement);			
		if (txt){
			appendix.appendChild(document.createTextNode(txt));
		}		
		if (unbold){
			appendix.style.fontWeight = "normal";
		}
		appendTo.appendChild(appendix);		
}


function construction_work(e){
		var t = e.target;     		 		
 		var Selection = window.getSelection();      			
 		v = "";		
		work = 
 			"event: " + e + "-" +  			
 			"event.target (t): " + t  + "-" +  			
 			"t.nodeName: " + t.nodeName + "-" + 
 			"t.parentNode.nodeName: " + t.parentNode.nodeName + "-" + 
 			"window.getSelection (selection): " + Selection + "-" +  			
 			"Selection.anchorNode: " + Selection.anchorNode + "-" + 
 			"Selection.anchorOffset: " + Selection.anchorOffset + "-" + 
 			"Selection.focusNode: " + Selection.focusNode + "-" + 
 			"Selection.focusOffset: " + Selection.focusOffset + "-" + 
 			"Selection.isCollapsed: " + Selection.isCollapsed + "-" + 
			
 			"" + v; 

		construction = document.createTextNode('Dom or Doom?');
		document.getElementById("construction").replaceChild(construction, document.getElementById("construction").firstChild);
		works = work.split("-");
	 	for(var i = 0; i < works.length; i++) {				
  		var LogEintrag = document.createElement("li");	
  		var neuerText = document.createTextNode(works[i]);
  		LogEintrag.appendChild(neuerText);
  		document.getElementById("construction").appendChild(LogEintrag);
  	}
}


function keyup (event) {
  if (!event)
    event = window.event;
  if (event.which) {
    keyCode = event.which;
  } else if (event.keyCode) {
    keyCode = event.keyCode;
  }
	if (keyCode==16) {	
				shift = 0;	
	}	
	if (keyCode==18) {	
				alt = 0;	
	}	

	if (release){//Reaktivierung des fr Mozilla gesperrten Feldes
		release.onkeypress = function() {return true};	
	}	
		//window.status = keyCode;
}

