﻿channel = function()
{
	// dieses Objekt kontrolliert die Darstellung des Kanals, für das es zuständig ist.

	// arguments:
	
	// channelURL, displayDivId


		this.channelURL = arguments[0];
		this.displayDivId = arguments[1];
		this.callBack = arguments[2];      // die Funktion, die aufgerufen wird, wenn die XML geladen ist.
		this.objName = arguments[3];      // Der Name, den das Objekt nach Erstellung bekommen wird.
	
		this.displayDiv = document.getElementById(this.displayDivId); 
	
		this.displayDivHeight = (this.displayDiv.style.height.substr(0,this.displayDiv.style.height.indexOf("px")));
	
		this.scrollPos = 0; // der aktuelle ScrollIndex im Inhaltsverzeichnis
		this.itemAnzahl = 0;


	// alert(document.getElementById(arguments[1]));

	var me = this;	// wird für die Callbacks gebraucht.

	this.buildHTML = function()
	{
		// erzeugt die nötigen HTML-Inhalte für die Inhalts-Seite.
		var content = document.createElement("div"); content.id = "content";
		// content.setAttribute("style", "overflow:hidden;");
		var contents = document.createElement("div");
		// contents.setAttribute("class", "inhaltsverzeichnis"); 
		contents.style.position  = "absolute";
		contents.style.left = "0px";
		contents.style.top = "0px";
		contents.style.width ="255px";

		// contents.style.backgroundColor="#f00";
		contents.id = me.displayDivId + "_inhaltsverzeichnis";

		

		var content_container = document.createElement("div");
		content_container.style.position = "absolute";
		content_container.style.height = (me.displayDivHeight - 40 - 40) + "px";

		
		content_container.style.position = "absolute";
		content_container.style.padding = "0px 0px 0px 5px";
		content_container.style.left = "0px";
		content_container.style.top = "40px";
		content_container.style.width = "250px";
		content_container.style.backgroundImage = "url(rss/img_rss/lm.gif)";
		content_container.style.backgroundPosition = "right top";
		content_container.style.backgroundRepeat = "repeat-y";
		content_container.style.overflow = "hidden";

		
		// content_container.setAttribute("class", "inhaltsverzeichnis_container"); 
		
		content_container.id = me.displayDivId + "_inhaltsverzeichnis_container";

		// content_container.setAttribute("style", "position:absolute; height:" + (me.displayDivHeight - 40 - 40) + "px;");
		// content_container.style.backgroundColor="#0f0";
		content_container.style.display="block";
		content_container.style.width = "250px";
		
		var rssLink = document.createElement("a");
		rssLink.setAttribute("href",me.channelURL); rssLink.setAttribute("target","_blank");
		
		var rssImg = document.createElement("img"); 
		rssImg.setAttribute("src", "rss/img_rss/rss.png");
		// rssImg.setAttribute("style", "position:absolute; right:30px; left:auto; top:5px; border:0px; padding:0px; margin:0px; border-style:none; cursor:pointer;");
		rssImg.style.position = "absolute";
		rssImg.style.right = "30px";
		rssImg.style.left = "auto";
		rssImg.style.top = "5px";
		rssImg.style.borderStyle = "none";
		rssImg.style.padding = "0px";
		rssImg.style.margin = "0px";
		rssImg.style.borderStyle = "none";
		rssImg.style.cursor = "pointer";


		var rssFooter = document.createElement("div"); 
		// rssFooter.setAttribute("class", "rss_footer"); 

		rssFooter.style.fontWeight = "bold";
		rssFooter.style.position = "absolute";
		rssFooter.style.textAlign = "right";
		rssFooter.style.padding = "0px 20px 0px 20px";
		rssFooter.style.margin = "0px 6px 0px 5px";
		rssFooter.style.lineHeight = "23px";
		rssFooter.style.color = "blue";
		rssFooter.style.display = "block";
		rssFooter.style.right = "auto";
		rssFooter.style.left = "0px";
		rssFooter.style.width = "210px";
		rssFooter.style.height = "40px";
		rssFooter.style.top = (me.displayDivHeight - 40) + "px";
		rssFooter.style.bottom = "auto";
		rssFooter.style.backgroundImage = "url(rss/img_rss/lm.gif)";
		rssFooter.style.backgroundPosition = "right top";
		rssFooter.style.backgroundRepeat ="repeat-y";
		rssFooter.style.cursor = "default";


	/*

	background-color: #fff;
	position: absolute;
	top: auto;
	right: auto;
	bottom: 0px;
	left: 0px;
	height:40px;
	width:210px;
	background: url('img_rss/lm.gif') right top repeat-y;

	*/


		rssFooter.id = me.displayDivId + "_rssFooter";


		var rssFooter_scrollplus = document.createElement("div");
		rssFooter_scrollplus.setAttribute("onclick", me.objName + ".scrollContents(1)");
		// rssFooter_scrollplus.setAttribute("class", "contents_scrollplus");
		rssFooter_scrollplus.style.cursor = "default";		
		rssFooter_scrollplus.style.position = "absolute";
		rssFooter_scrollplus.style.left = "20px";
		rssFooter_scrollplus.style.top = "5px";
		rssFooter_scrollplus.style.width = "22px";
		rssFooter_scrollplus.style.height = "21px";
		rssFooter_scrollplus.style.background = "url(rss/img_rss/button_lh.gif) right top no-repeat";
		
		/*
		
	cursor:default;
	position:absolute;
	left:20px;
	top:5px;
	width:22px;
	height:21px;
	background: url('img_rss/button_lh.gif') right top no-repeat;

		*/
		
		
		rssFooter_scrollplus.id = me.displayDivId + "_scrollplus";
		rssFooter.appendChild(rssFooter_scrollplus);

		var rssFooter_scrollminus = document.createElement("div");
		rssFooter_scrollminus.setAttribute("onclick", me.objName + ".scrollContents(-1)");
		// rssFooter_scrollminus.setAttribute("class", "contents_scrollminus");
		rssFooter_scrollminus.style.cursor = "default";		
		rssFooter_scrollminus.style.position = "absolute";
		rssFooter_scrollminus.style.left = "42px";
		rssFooter_scrollminus.style.top = "5px";
		rssFooter_scrollminus.style.width = "23px";
		rssFooter_scrollminus.style.height = "21px";
		rssFooter_scrollminus.style.background = "url(rss/img_rss/button_rh.gif) right top no-repeat";

/*	cursor:default;
	position:absolute;
	left:42px;
	top:5px;
	width:23px;
	height:21px;
	background: url('img_rss/button_rh.gif') right top no-repeat;
*/

		rssFooter_scrollminus.id= me.displayDivId + "_scrollminus";
		rssFooter.appendChild(rssFooter_scrollminus);

		rssLink.appendChild(rssImg);
		rssFooter.appendChild(rssLink);


		var rssHeader = document.createElement("div"); 
		// rssHeader.setAttribute("class", "rss_header"); 
		rssHeader.style.fontWeight = "bold";
		rssHeader.style.position = "absolute";
		rssHeader.style.textAlign = "right";
		rssHeader.style.padding = "0px 20px 0px 20px";
		rssHeader.style.margin = "0px 6px 0px 5px";
		rssHeader.style.lineHeight = "23px";
		rssHeader.style.color = "blue";
		rssHeader.style.display = "block";
		rssHeader.style.right = "auto";
		rssHeader.style.left = "0px";
		rssHeader.style.width = "210px";
		rssHeader.style.height = "40px";
		rssHeader.style.top = "0px";
		rssHeader.style.bottom = "auto";
		rssHeader.style.backgroundImage = "url(rss/img_rss/lm.gif)";
		rssHeader.style.backgroundPosition = "right top";
		rssHeader.style.backgroundRepeat ="repeat-y";
		rssHeader.style.cursor = "default";
		/*
	position: absolute;
	top: 0px;
	right: auto;
	bottom: auto;
	left: 0px;
	height:40px;
	width:210px;
	background: url('img_rss/lm.gif') right top repeat-y;
		*/
		rssHeader.id = me.displayDivId + "_rssHeader";

		
		var it = document.createElement("div");
		it.style.position = "absolute";
		it.style.visibility ="visible";
		it.style.top = "0px";
		it.style.height = me.displayDivHeight +"px";
	    // it.setAttribute("style","position:absolute; visibility:visible; top:0px; height:" + me.displayDivHeight +"px;");
		
		// it.setAttribute("class","it");
		it.style.margin = "5px";
		it.style.width = "700px";
		it.style.left = "280px";
		it.style.cursor = "default";


	/*	margin:5px;
	width: 700px;
	left:280px;
	cursor:default;
*/		
		
		it.id = me.displayDivId + "_it";
	
		content_container.appendChild(contents);
		content.appendChild(content_container);
		content.appendChild(rssFooter);
		content.appendChild(rssHeader);
		content.appendChild(it);
	
		document.getElementById(me.displayDivId).appendChild(content);
	}


	this.destroyHTML = function()
	{
		document.getElementById(me.displayDivId).innerHTML = "";
	}



	 // ------------------------------------------------------------------------

	this.Items = Array();

	this.showItem = function()
	{

		if (me.channelXML)
		{
		if (me.Items[arguments[0]])
			{
	
			// alert("showing Item");
	
			var itemGuid = arguments[0];
			
			// besser wäre eine itemId; eine unike Zahl, 
			// die als Schlüssel zum Eintrag dient.
			
				if (me.displayDiv)
				{
					if (me.activeItem)
					{
					 var itm = document.getElementById(me.displayDivId + "_headline_" + me.activeItem);
					 itm.style.backgroundImage = "url(rss/img_rss/nosel.gif)";
					 itm.style.backgroundPosition = "right top";
					 itm.style.backgroundRepeat = "no-repeat";
					 // alert(document.getElementById(me.displayDivId + "_headline_" + me.activeItem).style.backgroundImage);
					 // 					 
					}
					me.activeItem = itemGuid;
					 var itm = document.getElementById(me.displayDivId + "_headline_" + me.activeItem);
					itm.style.background = "url(rss/img_rss/sel.gif)";
					itm.style.backgroundPosition = "right top";
					itm.style.backgroundRepeat = "no-repeat";
					document.getElementById(me.displayDivId + "_it").innerHTML = me.Items[me.activeItem]["content"].unescapeHTML();
				} 
				else
				{
					alert("No displayDiv defined.");
				}
			
			} else
			{
 			  // alert("There is no such Item: " + arguments[0]);
			}
		}
		else
		{
			alert("Channel not loaded.");
		}
		
	}

	me.showLastItem = function()
	{

		if (me.Items)
		{

		var guidArray = [];

		for (var itemGuid in me.Items)
		{
			if (me.Items[itemGuid]["isHeadline"] != 1)
			{
				// alert(me.Items[itemGuid]["isHeadline"]);
				guidArray.push(itemGuid);
			}
		}


		// BOOKMARK // 

		// guidArray.sort(me.sortByDate);
		// guidArray.reverse();

		// alert(guidArray);

		// besser wäre eine itemId; eine unike Zahl, 
		// die als Schlüssel zum Eintrag dient.

			me.activeItem = guidArray[0];
			me.showItem(guidArray[0]);
		}
	}

	me.parseXML = function()
	{
	
		var txt = me.channelXML;
	
		var rItem = /<item.*?>([^\0]*?)<\/item>/ig;
		var rTitle = /<title.*?>([^\0]*?)<\/title>/ig;
		var rPubDate = /<pubDate.*?>([^\0]*?)<\/pubDate>/ig;
		var rImage = /<image.*?>([^\0]*?)<\/image>/ig;
		var rIsHeadline = /<isHeadline.*?>([^\0]*?)<\/isHeadline>/ig;
		var rGuid = /<guid.*?>([^\0]*?)<\/guid>/ig;
		var rContent = /<description.*?>([^\0]*?)<\/description.*?>/ig;
		var rSpan = /&lt;span class=&quot;sp_0&quot;&gt;([^\0]*?)&lt;\/span&gt;&lt;span class=&quot;sp_1&quot;&gt;([^\0]*?)&lt;\/span&gt;$/ig;

		var rUeberschrift = /&lt;span class=&quot;ueberschrift&quot;&gt;([^\0]*?)&lt;\/span&gt;/ig;
		var rInfobox = /&lt;span class=&quot;infobox&quot;&gt;([^\0]*?)&lt;\/span&gt;/ig;
		var rUmbruch = /&lt;br \/&gt;/ig;
		var rImg = /&lt;img class=&quot;([^\0]*?)&quot; src=&quot;img\/([^\0]*?)&quot; \/&gt;/ig;

		var Anzahl;
		
		me.Items = [];
		
		// Achtung: ein Punkt '.' in einer RegExp passt nicht auf einen 
		// Zeilenumbruch. Und solche finden in einer XML-Datei ständig statt.
	
	
		Anzahl = txt.match(rItem);

		if (Anzahl)
		{
	
		me.itemAnzahl = Anzahl.length;
	
		// alert(Anzahl.length * 1);
	
		rItem.lastIndex = 0;
	
		for (i = 0; i < Anzahl.length; i++)
		{
	
		var oItem = [];
	
		var Ergebnis = rItem.exec(txt);
		(Ergebnis != null) ? itemText = Ergebnis[1]: itemText = "";
		
	
		rTitle.lastIndex = 0;
		var titleText = rTitle.exec(itemText);
		(titleText != null) ?  oItem["title"] = titleText[1] : oItem["title"] = "";

		rPubDate.lastIndex = 0;
		var pubDateText = rPubDate.exec(itemText);
		(pubDateText != null) ?  oItem["pubDate"] = pubDateText[1] : oItem["pubDate"] = "";
	
		rIsHeadline.lastIndex = 0;
		var isHeadlineText = rIsHeadline.exec(itemText);
		(isHeadlineText != null) ?  oItem["isHeadline"] = isHeadlineText[1] : oItem["isHeadline"] = "0";
	
	
		rContent.lastIndex = 0;
		var contentText = rContent.exec(itemText);
		if (contentText != null)
		{ 
			oItem["content"] = contentText[1];
	
			rSpan.lastIndex = 0;
			var spanText = rSpan.exec(contentText[1]);

			if (spanText != null)
			{
			
				sp1 = spanText[1];
				rUeberschrift.lastIndex = 0; sp1 = sp1.replace(rUeberschrift,"[ue|$1]");
				rInfobox.lastIndex = 0; 	 sp1 = sp1.replace(rInfobox,"[info|$1]");
				rUmbruch.lastIndex = 0;		 sp1 = sp1.replace(rUmbruch,"\r");
				rImg.lastIndex = 0; 		 sp1 = sp1.replace(rImg,"[img|$1]");
				
				sp2 = spanText[2];
				rUeberschrift.lastIndex = 0; sp2 = sp2.replace(rUeberschrift,"[ue|$1]");
				rInfobox.lastIndex = 0; 	 sp2 = sp2.replace(rInfobox,"[info|$1]");
				rUmbruch.lastIndex = 0;		 sp2 = sp2.replace(rUmbruch,"\r");
				rImg.lastIndex = 0; 		 sp2 = sp2.replace(rImg,"[img|$1]");
			
				// alert("HALLO");

				oItem["spanL"] = sp1;
				oItem["spanR"] = sp2;
			} else
			{
				oItem["spanL"] = "nichts L";
				oItem["spanR"] = "nichts R";
			}


			/*
			alert(contentText[1]);

			alert(oItem["spanL"]);
			alert(oItem["spanR"].replace(rUeberschrift,"BOLD$1BOLD"));
			*/

		} 
		else
		{ 
			oItem["content"] = "nichts"; 
		}
	

		rGuid.lastIndex = 0;
		var guidText = rGuid.exec(itemText);
		(guidText != null) ? oItem["guidText"] = guidText[1] : oItem["guidText"] = "0";
		// alert(oItem["content"]);
	
	
		// die Items werden in einen Assoziativen Array gespeichert.
		// schlüssel ist die <guid> in der XML!


		me.Items[guidText[1]] = oItem;
		// Das ist das innerHTML der <item> - Tags
	
	
		}
	
	 }
		 // me.buildContents();
	
	}

	me.buildContents = function()
	{
			
		if (me.Items)
		{

		var guidArray = [];
		var itemGuid = null;

		for (var itemGuid in me.Items)
		{
			guidArray.push(itemGuid);
		}

		// BOOKMARK 2 // 

		// guidArray.sort(me.sortByDate);
		// guidArray.reverse();


		for (var i=0; i < guidArray.length; i++)
		{
			var neu = document.createElement("div");
			// neu.setAttribute("class","iv");
			
			/*	font-weight: bold;
	position: relative;
	text-align: left;
	padding: 0px 20px 0px 20px;
	margin: 0px 6px 0px 5px;
	line-height: 23px;
	height: 23px;
	color: blue;
	display: block;
	background-image: url('img_rss/nosel.gif');
	background-repeat: no-repeat;
	background-position: right top;
	cursor:default;
*/

			neu.style.fontWeight = "bold";
			neu.style.position = "relative";
			neu.style.textAlign = "left";
			neu.style.padding = "0px 20px 0px 20px";
			neu.style.margin = "0px 6px 0px 5px";
			neu.style.display = "block";
			neu.style.cursor = "default";
			neu.style.lineHeight = "23px";
			
			
			if (me.Items[guidArray[i]]["isHeadline"] == 0)
			{
			// falls es sich nicht um eine headline handelt:
			// Link in PostOffice bekannt geben.

			PostOffice.register(me.Items[guidArray[i]]["guidText"],me.showItem,me.Items[guidArray[i]]["guidText"], me.objName);


			// Rendern in HTML
			
			neu.style.color = "blue";
			neu.style.background = "url(rss/img_rss/nosel.gif)";
			neu.style.backgroundPosition = "right top";
			neu.style.backgroundRepeat = "no-repeat";

			neu.param = me.objName + ".showItem('" + me.Items[guidArray[i]]["guidText"] + "')";
			
			// neu.setAttribute("onclick",me.objName + ".showItem('" + me.Items[guidArray[i]]["guidText"] + "')");

			
			neu.onclick = function dummyFunction(evt) 
				{ 
					evt = evt || window.event;
					var target = evt.target || evt.srcElement;
				if (target) 
					{
						param = target.param;
						// alert(param);
						eval(param);
					}
				}
				
	
			}
			else
			{
			// falls es sich um eine headline handelt

			neu.style.color = "#999";
			// neu.stye.fontWeight = "bold";
			// neu.style.background = "url(rss/img_rss/nosel.gif)";
			
			}

			neu.id = me.displayDivId + "_headline_" + me.Items[guidArray[i]]["guidText"];
			
			neu.innerHTML = me.Items[guidArray[i]]["title"];

			document.getElementById(me.displayDivId + "_inhaltsverzeichnis").appendChild(neu);
		}		
		

		}
	
	}

	me.scrollContents = function()
	{
		if (me.Items)
		{
		
		var delta = arguments[0];
		var showFrame = Math.floor((me.displayDivHeight-80) / 23); // anzahl der einträge, die auf einmal dargestellt werden können.
		
		// (((me.scrollPos + delta) >= (me.itemAnzahl - showFrame) ) && ((me.scrollPos + showFrame + delta) >= me.itemAnzahl))

		if ((((me.scrollPos + delta)*-1) <= (me.itemAnzahl - (showFrame))) && ((me.scrollPos + delta) <= 0))
		{
			var contentsDiv = document.getElementById(me.displayDivId + "_inhaltsverzeichnis");
			me.scrollPos = me.scrollPos + delta;

			contentsDiv.style.top = ((me.scrollPos) * 23) +"px";

				document.getElementById(me.displayDivId + "_scrollminus").style.background = "url('rss/img_rss/button_rd.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollminus").style.cursor = "pointer";
				document.getElementById(me.displayDivId + "_scrollplus").style.background = "url('rss/img_rss/button_ld.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollplus").style.cursor = "pointer";
		}
		


			if ((me.scrollPos + delta) >= 0)
			{
				document.getElementById(me.displayDivId + "_scrollminus").style.background = "url('rss/img_rss/button_rd.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollminus").style.cursor = "pointer";
				document.getElementById(me.displayDivId + "_scrollplus").style.background = "url('rss/img_rss/button_lh.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollplus").style.cursor = "default";
			}
		
			if (((me.scrollPos + delta)*-1) > (me.itemAnzahl - (showFrame)))
			{
				document.getElementById(me.displayDivId + "_scrollplus").style.background = "url('rss/img_rss/button_ld.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollplus").style.cursor = "pointer";
				document.getElementById(me.displayDivId + "_scrollminus").style.background = "url('rss/img_rss/button_rh.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollminus").style.cursor = "default";
			}

			if (me.itemAnzahl <= showFrame)
			{
				document.getElementById(me.displayDivId + "_scrollminus").style.background = "url('rss/img_rss/button_rh.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollminus").style.cursor = "default";
				document.getElementById(me.displayDivId + "_scrollplus").style.background = "url('rss/img_rss/button_lh.gif') right top no-repeat";
				document.getElementById(me.displayDivId + "_scrollplus").style.cursor = "default";
			}

		// alert(me.itemAnzahl);

		}
	}


	this.processReqChange = function()
	{ // only if req shows "loaded"

	// alert("change");

		if (me.req.readyState == 4) {
			// only if "OK"
						
			me.channelXML = me.req.responseText;
			me.parseXML();			
			// localme.showLastItem();  // showLastItem
			
			me.callBack();   // ruft eine Funktion im Hauptprogramm auf, die 
									// dann das Inhaltsverzeichnis etc. aufbauen kann.
			
			
			if (me.req.status == 200) {
				// ...processing statements go here...
			} else {
				alert("There was a problem retrieving the XML data:\n" +
					me.req.statusText);
			}
		}
	}


	me.getXML = function() 
	{
	  
	  var url = me.channelURL;
	
	 // var localme = me;
	 me.req = false;
	
	  try {
		me.req = new XMLHttpRequest();
	  } catch (e) {
		me.req = new ActiveXObject("Msxml2.XMLHTTP");
	  }
	
	  try {
		// needed for Mozilla
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	  } catch (e) {
		// ignore
	  }
	  
	  
		// branch for native XMLHttpRequest object
		if(window.XMLHttpRequest) {
			try {
				me.req = new XMLHttpRequest();
			} catch(e) {
				me.req = false;
			}
		// branch for IE/Windows ActiveX version
		} else if(window.ActiveXObject) {
			try {
				me.req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					me.req = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					me.req = false;
				}
			}
		}
		if(me.req) {
			me.req.onreadystatechange = me.processReqChange;
			me.req.open("GET", url, true);
			me.req.send("");
		}
	}
	
	
	
	

	me.show = function ()
	{
	
		// optionaler Parameter gibt den anzuzeigenden Eintrag an
	me.buildHTML();
	me.buildContents();
	

	(arguments[0]) ? me.scrollContents(arguments[0]) : me.scrollContents(0);;
	(arguments[0]) ? me.showItem(arguments[0]) : me.showLastItem();

	}

	me.sortByDate = function()
	{
	
		//alert(me.Items[arguments[0]]["pubDate"] + "<->" + me.Items[arguments[1]]["pubDate"]);
		return Date.parse(me.Items[arguments[0]]["pubDate"]) - Date.parse(me.Items[arguments[1]]["pubDate"]);
	
	}


	// me.getXML(); -- sonst dreht der IE durch.

	return this;

}


// ************************************************************************** //



channel.show = function ()
{

	alert("called edit-function");
}



// ************************************************************************** //

String.prototype.escapeHTML = function() {
	return this;
  }

String.prototype.unescapeHTML = function() {

	var txt = this;

	txt = txt.replace(/\&gt;/gi,">");
	txt = txt.replace(/\&lt;/gi,"<");
	txt = txt.replace(/\&amp;/gi,"&");
	txt = txt.replace(/\&quot;/gi,"\"");
	txt = txt.replace(/<\!\[CDATA\[([^\0]*?)\]\]>/gi,"$1");

	return txt;
  }

