var DocPublisher = {	openTarget : "_blank",	instances : new Array(),	xslDoc : null,	get : function(url, old, id, forceXSL,title,htmlID) {		var instance = this.getInstance(id);				if (!instance) {			instance = new DocPublisher.instance(id, url, forceXSL,title,htmlID);			this.instances.push(instance);		}		instance.get(url);	},	getInstance : function(id) {		for (var i in this.instances)			if (this.instances[i].id == id)				return this.instances[i];		return null;	},	refresh : function() {		for (var i in this.instances)			this.instances[i].refresh();	},	openDocument : function(e) {		var evtobj = window.event ? event : e;		var button = evtobj.which ? evtobj.which : evtobj.button;		var node = evtobj.target ? evtobj.target : evtobj.srcElement;		var parentID = "";		var noteID = "";		while (node) {			if (node.getAttribute("noteid"))  {				noteID = node.getAttribute("noteid");			} else if (node.getAttribute("id")) {				parentID = node.getAttribute("id");				break;			}			node = node.parentNode;		}				if (parentID != "" && noteID != "") {			for(var i=0;i<DocPublisher.urls.length;i++) {				var x = DocPublisher.urls[i];				if (x[0] == parentID) {					var url = x[1].substring(0,x[1].indexOf(".nsf")+4) + "/(read)/" + "NT00000000".substring(0,10-noteID.length) + noteID;					DocPublisher.openWindow(url);				}			}		}	},		openWindow : function(url) {		var newWin = window.open(url,this.openTarget);		if (newWin && newWin.focus)			newWin.focus();	},	getXSL_Search : function(id,title,htmlID) {		return this._parseTextToXML("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +		"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +		"<xsl:output method=\"html\" indent=\"no\" encoding=\"UTF-8\"/>" +		"<xsl:template match=\"viewentries\">" +		"<xsl:choose>" +		"<xsl:when test=\"@toplevelentries='0'\"><h4>"+title+"<span class=\"s-size\"><xsl:text> No matches.</xsl:text></span></h4></xsl:when>" +		"<xsl:otherwise>" +		"<h4>" +		"<xsl:if test=\"@hasmore='true'\">" +		"<a class=\"s-size right-align\" onclick=\"MultiSearch.reSearch('" + id + "',0)\">" +		"<xsl:text>Show all</xsl:text>" +		"</a>" +		"</xsl:if>" +		title+		"<span class=\"s-size\"> (Found <xsl:value-of select=\"@amount\" /> documents, showing <xsl:value-of select=\"@toplevelentries\" />)</span>"+		"</h4>" +		"</xsl:otherwise>"+		"</xsl:choose>"+		"<ul id=\""+htmlID+"\" class=\"searchrows\" style=\"position:static;z-index:4\">"+		"<xsl:for-each select=\"viewentry\">" +		"<xsl:sort select=\"entrydata[1]/.\"/>" +		"<xsl:call-template name=\"row\" />" +		"</xsl:for-each>" +		"</ul>" +		"</xsl:template>" +		"<xsl:template match=\"errors\">" +		"<xsl:for-each select=\"error\">" +		"<xsl:value-of select=\".\"/>" +		"</xsl:for-each>" +		"</xsl:template>" +		this._getXSLViewEntriesRow() +		this._getXSLViewEntriesData() +		"</xsl:stylesheet>");	},		getXSL_ViewEntries : function() {		var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";		xml += "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">";		xml += "<xsl:output method=\"html\" indent=\"no\" encoding=\"UTF-8\"/>";		xml += "<xsl:template match=\"viewentries\">";		xml += "<ul id=\"search-result-documents\" class=\"searchrows\">";		xml += "<xsl:for-each select=\"viewentry\">";		xml += "<xsl:call-template name=\"row\" />";		xml += "</xsl:for-each>";		xml += "</ul>";		xml += "</xsl:template>";		xml += this._getXSLViewEntriesRow();		xml += this._getXSLViewEntriesData();		xml += "</xsl:stylesheet>";		return this._parseTextToXML(xml);	},		_getXSLViewEntriesRow : function() {		var xml = "<xsl:template name=\"row\">";		xml += "<xsl:param name=\"position\" select=\"@position\" />";		xml += "<xsl:param name=\"descendants\" select=\"@descendants\" />";		xml += "<xsl:param name=\"siblings\" select=\"@siblings\" />";		xml += "<xsl:param name=\"isCategory\" select=\"entrydata[@category]\" />";		xml += "<xsl:param name=\"isExpanded\">";		xml += "<xsl:if test=\"starts-with(following-sibling::viewentry/@position,$position)\">";		xml += "<xsl:text>yes</xsl:text>";		xml += "</xsl:if>";		xml += "</xsl:param>";		 //<!-- Start row here -->		xml += "<li>";		xml += "<xsl:attribute name=\"class\">";		xml += "<xsl:choose>";		xml += "<xsl:when test=\"position() mod 2=0\"><xsl:text>toggle1</xsl:text></xsl:when>";		xml += "<xsl:otherwise><xsl:text>toggle2</xsl:text></xsl:otherwise>";		xml += "</xsl:choose>";		xml += "</xsl:attribute>";		xml += "<xsl:attribute name=\"noteid\"><xsl:value-of select=\"@noteid\"/></xsl:attribute>";		xml += "<xsl:for-each select=\"entrydata\"><xsl:call-template name=\"entrydata\" /></xsl:for-each>";		xml += "</li>";		xml += "<xsl:element name=\"script\">toolTipDialog.attachEvents('<xsl:value-of select=\"@noteid\"/>');</xsl:element>";		xml += "</xsl:template>";		return xml;	},		_getXSLViewEntriesData : function() {		var xml = "<xsl:template name=\"entrydata\"><xsl:apply-templates mode=\"single\"/></xsl:template>";		xml += "<xsl:template match=\"textlist\" mode=\"single\"><xsl:apply-templates mode=\"multi\"/></xsl:template>";		xml += "<xsl:template match=\"text\" mode=\"single\"><xsl:value-of select=\"normalize-space(.)\"/></xsl:template>";		xml += "<xsl:template match=\"text\" mode=\"multi\">";		xml += "<xsl:value-of select=\"normalize-space(.)\"/>";		xml += "<xsl:if test=\"not(position()=last())\"><xsl:text>,</xsl:text></xsl:if>";		xml += "</xsl:template>";		xml += "<xsl:template match=\"datetime\" mode=\"single\"><xsl:value-of select=\"normalize-space(.)\"/></xsl:template>";		xml += "<xsl:template match=\"*\"></xsl:template>";		return xml;	},		getXSL_RSS : function() {		var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";		xml += "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">";		xml += "<xsl:output method=\"html\" indent=\"no\" encoding=\"UTF-8\"/>";		xml += "<xsl:template match=\"rss\">";		xml += "<xsl:for-each select=\"channel/item\">";		xml += "<xsl:call-template name=\"row\" />";		xml += "<xsl:if test=\"not(position()=last())\">";		xml += "<div class=\"page_separator\"></div>";		xml += "</xsl:if>";		xml += "</xsl:for-each>";		xml += "</xsl:template>";				xml += "<xsl:template name=\"row\">";	  //<!-- Start row here -->		xml += "<div class=\"date\">";		xml += "<xsl:apply-templates select=\"pubDate\"/>";		xml += "</div>";		xml += "<div class=\"body\">";		xml += "<b><xsl:value-of select=\"normalize-space(title)\" disable-output-escaping=\"yes\"/></b>";		xml += "<div class=\"br\"></div>";		xml += "<a target=\"_blank\">";		xml += "<xsl:attribute name=\"href\">";		xml += "<xsl:value-of select=\"link\"/>";		xml += "</xsl:attribute>";		xml += "<xsl:text> L\u00E4s mer</xsl:text>";		xml += "</a>";		xml += "</div>";		xml += "</xsl:template>";				xml += "<xsl:template match=\"pubDate\">";		xml += "<xsl:variable name=\"rawMonth\">";		xml += "<xsl:value-of select=\"substring(., 9, 3)\"/>";		xml += "</xsl:variable>";		xml += "<xsl:variable name=\"isoMon\">";		xml += "<xsl:choose>";		xml += "<xsl:when test=\"$rawMonth='Jan'\">01</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Feb'\">02</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Mar'\">03</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Apr'\">04</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='May'\">05</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Jun'\">06</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Jul'\">07</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Aug'\">08</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Sep'\">09</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Oct'\">10</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Nov'\">11</xsl:when>";		xml += "<xsl:when test=\"$rawMonth='Dec'\">12</xsl:when>";		xml += "</xsl:choose>";		xml += "</xsl:variable>";		xml += "<xsl:value-of select=\"concat(substring(., 13, 4),'-',$isoMon, '-', substring(., 6, 2) , ' kl ' , substring(.,18))\"/>";		xml += "</xsl:template>";		xml += "</xsl:stylesheet>";			return this._parseTextToXML(xml);	},		getXSL_Atom : function() {		var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";		xml += "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">";		xml += "<xsl:output method=\"html\" indent=\"no\" encoding=\"UTF-8\"/>";		xml += "<xsl:template match=\"feed\">";		xml += "<xsl:for-each select=\"entry\">";		xml += "<xsl:call-template name=\"row\" />";		xml += "<xsl:if test=\"not(position()=last())\">";		xml += "<div class=\"page_separator\"></div>";		xml += "</xsl:if>";		xml += "</xsl:for-each>";		xml += "</xsl:template>";				xml += "<xsl:template name=\"row\">";	  //<!-- Start row here -->		xml += "<div class=\"date\">";		xml += "<xsl:value-of select=\"normalize-space(pubDate)\" />";		xml += "</div>*";		xml += "<div class=\"body\">";		xml += "<b><xsl:value-of select=\"normalize-space(title)\" disable-output-escaping=\"yes\"/></b>";		xml += "<a>";		xml += "<xsl:attribute name=\"href\">";		xml += "<xsl:value-of select=\"link[@href]\"/>";		xml += "</xsl:attribute>";		xml += "<xsl:text>L\u00E4s mer</xsl:text>";		xml += "</a>";		xml += "</div>";		xml += "</xsl:template>";		xml += "</xsl:stylesheet>";			return this._parseTextToXML(xml);	},		_parseTextToXML : function(text) {		var xml = null;		try {			xml=new ActiveXObject("Microsoft.XMLDOM");			xml.async = "false";			xml.loadXML(text);		}  catch(e) {			try {				var parser = new DOMParser();				xml = parser.parseFromString(text,"text/xml");			} catch(e) {				alert(e.message);				return;			}		}		return xml;	},		_showLoading : function(id,url) {		var path = this.basePath ? this.basePath : (this.basePath = this._getScriptPath());		var el = document.getElementById(id);		if (el)			el.innerHTML = "<img src=\"" + path + "/images/loading.jpg\" style=\"float:left;margin:4px 4px 4px 0;\"/><small style=\"color:grey\">H\u00E4mtar fr\u00E5n: " + url + "</small>";	},		_getScriptPath : function() {		var n = document.getElementsByTagName("head")[0];		if (n) {			var nl = n.getElementsByTagName("script");			var base = this._getScriptPath2(nl);			if (base) return base;		}		nl = document.getElementsByTagName('script');		return this._getScriptPath2(nl);	},		_getScriptPath2 : function(nl) {		var suffix,query,baseURL;		for (var i=0; i<nl.length; i++) {			var n = nl[i];						if (n.src && /DocPublisher.js/.test(n.src)) {				if ((p = n.src.indexOf('?')) != -1)					query = n.src.substring(p + 1);				return n.src.substring(0, n.src.lastIndexOf('/'));			}		}		return null;	}}DocPublisher.instance = function(id, url, forceXSL,title,htmlID) {	this.id = id;	this.url = url;	this.forceXSL = forceXSL;	this.title = title;	this.htmlID = htmlID;}DocPublisher.instance.prototype = {	request : null,	get : function(url) {		if (url) this.url = url;		DocPublisher._showLoading(this.id,this.url);		this.getXMLObject(this.url);	},	getXMLObject : function(url) {		var idx = url.indexOf("://")+3;		if (idx > 2) {			var domain = "";			var idx2 = url.indexOf("/",idx);			var idx3 = url.indexOf(":",idx);			if (idx3 > -1 && idx3 < idx2)				domain = url.substring(idx,idx3);			else				domain = url.substring(idx,idx2);			if (document.domain.toLowerCase() != domain.toLowerCase()) {				url = "/servlet/httpproxy?url=" + url;			}		}		var xml = null;		try {			var self = this;			if(document.implementation && document.implementation.createDocument){				this.request = new XMLHttpRequest();				this.request.onreadystatechange = function() {self.getFinished();}				this.request.open("GET",url+ "&" + new Date().getTime(),true);				this.request.send(null);			} else if(window.ActiveXObject) {				this.request = new ActiveXObject("Microsoft.XMLHTTP");				this.request.onreadystatechange = function() {self.getFinished();}				this.request.open("GET",url+ "&" + new Date().getTime(),true);				this.request.send();			}		} catch (e) {}	},		getFinished : function() {		if (this.request.readyState == 4) {			if (this.request.status == 200) {				var node = document.getElementById(this.id);				var content = this.transform(this.request);				if (content) {					if (typeof(content) == "string") {							node.innerHTML = unescape(content);					} else if(document.implementation && document.implementation.createDocument){						node.innerHTML = "";						node.appendChild(content);						var str = unescape(node.innerHTML);						node.innerHTML = str;					} else if(window.ActiveXObject) {							node.innerHTML = unescape(content);					}					node.ondblclick = DocPublisher.openDocument;					} else {					node.innerHTML = "";				}			} else {				var node = document.getElementById(this.id);				node.innerHTML = "Error " + this.request.status;			}		}	}, 	transform : function(xml) {		if (xml) {			xml = xml.responseXML ? xml.responseXML : xml;			try {				var xslDoc = null;				if (this.forceXSL && this.forceXSL == "search") {					xslDoc = DocPublisher.getXSL_Search(this.id,this.title,this.htmlID);				} else {					var firstNode = xml.documentElement;					var nodeName = firstNode ? firstNode.nodeName : "";					if (nodeName == "viewentries")						xslDoc = DocPublisher.getXSL_ViewEntries();					else if (nodeName == "rss")						xslDoc = DocPublisher.getXSL_RSS();					else if (nodeName == "feed")						return "Atom feeds isn't supported yet!";					else						return "Unknown node: " + nodeName;				}								if (xslDoc) {					if(document.implementation && document.implementation.createDocument){						var xsltProcessor = new XSLTProcessor();						xsltProcessor.importStylesheet(xslDoc);						//alert(xsltProcessor.transformToFragment(xml,document))						return xsltProcessor.transformToFragment(xml,document);					} else if(window.ActiveXObject) {					//alert(xml.transformNode(xslDoc));						return xml.transformNode(xslDoc);					}				}			} catch (e) {				alert("ERROR in transformation!\n" + e);			}		}		return "<h3>An error has occured!</h3>";	},		refresh : function(url) {		this.get(url);	}}
