// globale variable og konstantet
var strHTML = '';
var strBem  = 'Kan kun anvendes i browser der understøtter XML f.eks.:<br>Microsoft Internet Explorer version 5.0 eller nyere';
var objHTMLNewline = /<br>/g;	// regular Expresion HTML ('<br>') 
var objCrLf = /\\n/g;			// regular Expresion Newline
var objTab = /\t/g;				// regular Expresion Tab

function ErrorHandler(err, type) {		// rutine til fejlhåndtering
var strBesked = '';
	if (ErrorHandler.arguments.length == 2) {
		switch (type) {
		case 'xmlfejl':
			strBesked += 'Fejl i XML\n\n' + strBem.replace(objHTMLNewline,'\n');
			break;
		case 'domainfejl':
			strBesked += 'Fejl i XML\n\nKunne ikke behandle domain-<TAG>et';
			break;
		default : 
			strBesked += 'IKKE DEFINERET FEJL';
		}		
	}
	else {	strBesked += 'FEJL:\n\n' + err.description;	}
	// DEBUG -> strBesked += '\n\nFEJL:\n\n' + err.description + '\n\n' + err.number;	// <- DEBUG !!!
	alert(strBesked);
}


function LoadXML() {					//loader xml-dokumentet
	try {
		xmldoc= new ActiveXObject("Microsoft.XMLDOM");
		xmldoc.onreadystatechange = HandleReadyState;
		xmldoc.ondataavailable = HandleData;
		xmldoc.async = true;
		xmldoc.load('data.xml');
	}
	catch (err) {
		if (xmldoc) { xmldoc = null; }	// clear xmldoc hvis defineret
		ErrorHandler(err, 'xmlfejl');	// vis fejl
	}
}


function LoadXMLTextArea() {					//loader xml-dokumentet fra TextArea
	try {
		xmldoc= new ActiveXObject("Microsoft.XMLDOM");
		xmldoc.onreadystatechange = HandleReadyState;
		xmldoc.ondataavailable = HandleData;
		xmldoc.async = true;
		xmldoc.loadXML(document.getElementById("xmlfil").innerText);
	}
	catch (err) {
		if (xmldoc) { xmldoc = null; }	// clear xmldoc hvis defineret
		ErrorHandler(err, 'xmlfejl');	// vis fejl
	}
}


function HandleData() {}		// kaldes når xml-dokumntet er loaded - alertnativ benyttes denne istedet for ReadyState=4


function HandleReadyState() {	// kaldes hver gang xml-dokumentet skifter readystate 
	strHTML = '';

	// readyState ->  1: LOADING, 2: LOADED, 3: INTERACTIVE, 4: COMPLETED
	// readystate 4: data er klar		
	if (xmldoc.readyState == 4) {
		strHTML += document.getElementById("resultat").innerHTML;
		strHTML += '<div class="smalltekst">XML-Document loaded</div>';
		document.getElementById("resultat").innerHTML = strHTML;
    }
}


function ShowXML() {					// viser xml-dokumenter i textarea
var subMenu = '<div><table width="100%"><tr><td class="menupunkt" width="50%" onclick="LoadXML();">Genindlæs XML-Dokumnet</td><td class="menupunkt" width="50%" onclick="LoadXMLTextArea();">Indlæs rettet XML-Dokument</td></tr></table></div>';
var xml = xmldoc.xml;
	try { 
		document.getElementById("resultat").innerHTML = '<div class="header">XML Dokument</div><textarea cols="70" id="xmlfil" rows="20"></textarea>' + subMenu;
		document.getElementById("xmlfil").innerText = xml.replace(objTab,'    ');
	}
	catch (err) {	// vis fejl
		ErrorHandler(err, 'xmlfejl');
	}
}


function ParseXML() {					// parser XML-dokumentet - og viser som HTML
	strHTML = '';
	try {
		var node = xmldoc.documentElement.firstChild				// første XML-<tag> under rod-elementet i XML-dokumentet

		strHTML += '<table width="80%">';
		strHTML += '<tr><td></td></tr>';
		strHTML += '<tr><td class="header">Parset XML</td></tr>';
		strHTML += '<tr><td></td></tr>';
		strHTML += '<tr><td align="center" class="tablehead">Links:</td></tr>';
		
		// loop gennem alle <domain>-tag og output HTML
		while (node) {	
			// OBS: tekster i et XML-<tag> ligger i en tekst-node (firstChild)
			if (node.hasChildNodes && node.nodeName == 'domain') {	// check om der et childNode (<domain>), så er der tekst
				strHTML += '<tr height="10"><td></td></tr>'
				strHTML += '<tr><td>';
				strHTML += OneDomain(node);
				strHTML += '</td></tr>';
			}
			node = node.nextSibling;
		}

		strHTML += '<tr><td></td></tr>';

		// slut men at finde kommantar og XML-bemærkning
		var node = xmldoc.documentElement	// find rod-elementet i XML-dokumentet
		if (node.selectSingleNode("xml") && node.selectSingleNode("xml").hasChildNodes) { // find XML-bemærkning hvis angives
			var strXML = node.selectSingleNode("xml").firstChild.nodeValue;
			strHTML += '<tr><td align="center" class="ledetekst">'+ strXML.replace(objCrLf,'<br>')+'</td></tr>';
			strHTML += '<tr><td></td></tr>';
		}
		if (node.selectSingleNode("kommentar") && node.selectSingleNode("kommentar").hasChildNodes) { // find kommentar hvis angives
			var strKommentar = node.selectSingleNode("kommentar").firstChild.nodeValue;
			strHTML += '<tr><td align="center" class="smalltekst">'+ strKommentar.replace(objCrLf,'<br>')+'</td></tr>';
			strHTML += '<tr><td></td></tr>';
		}
		strHTML += '</table>';	
		document.getElementById("resultat").innerHTML = strHTML;
	}
	catch (err) {	// vis fejl
		ErrorHandler(err, 'xmlfejl');
	}
}


function OneDomain(node) {				// behandler en forekomt af <domain>-tag'et
var strHTML = '';
	try {

		strHTML += '<table cellspacing="2" border="1" cellpadding="2" width="100%" bordercolor="#FF6666">';

		// find først navn til overskriften, hvis <navn>-tag'et findes og eksisterer
		strHTML += '<tr><td class="tablehead" colspan="2">';
		if (node.selectSingleNode("navn") && node.selectSingleNode("navn").hasChildNodes) {
			strHTML += node.selectSingleNode("navn").firstChild.nodeValue;
		}
		strHTML += '</td></tr>';

		node = node.firstChild;			// finder første child
		while (node) {

			// OBS: tekster i et XML-<tag> ligger i en tekst-node (firstChild)
			if (node.hasChildNodes) {	// check om der et childNode, så er teksten udfyldt
				switch (node.nodeName) {
			
				case 'navn':
					// skal altid være først, findes derfor inden loop'et
					break;
			
				case 'url':
					strHTML += '<tr>'
					strHTML += '<td width="30%" class="ledetekst">';
					strHTML += node.nodeName;
					strHTML += '</td><td>'
					strHTML += '<a href="' + node.firstChild.nodeValue + '" target="_blank">' + node.firstChild.nodeValue + '</a>';
					strHTML += '</td>'
					strHTML += '</tr>';
					break;

				case 'email':
					strHTML += '<tr>'
					strHTML += '<td class="ledetekst">';
					strHTML += node.nodeName;
					strHTML += '</td><td>'
					strHTML += '<a href="mailto:' + node.firstChild.nodeValue + '" target="_blank">' + node.firstChild.nodeValue + '</a>';
					strHTML += '</td>'
					strHTML += '</tr>';
					break;

				case 'kommentar':
					strHTML += '<tr>'
					strHTML += '<td class="fritekst" colspan="2">';
					strHTML += node.firstChild.nodeValue;
					strHTML += '</td>'
					strHTML += '</tr>';
					break;

				default:
					strHTML += '<tr>'
					strHTML += '<td class="ledetekst">';
					strHTML += node.nodeName;
					strHTML += '</td><td class="fritekst">'
					strHTML += node.firstChild.nodeValue;
					strHTML += '</td>'
					strHTML += '</tr>';
					break;
				}
			}
			node = node.nextSibling;
		}
		strHTML += '</table>';
	}
	catch (err) {	// vis fejl
		ErrorHandler(err, 'domainfejl');
	}
	return strHTML;
}
