/* var element = Node( )
	parameter: knoten, tagname, [attribut_1==wert] (..) [attribute_x=wert] [ Text ]

	knoten:	null | DOM-Knoten | String
				null	= wird nicht angehängt
			DOM-Knoten	= wird an diesen Knoten angehängt
					   kann Kind von document oder xml-Dokument sein
				String	= bezieht sich nur auf document
					   wird an Knoten mit ID="stringtext" angehängt,
					   wenn kein Knoten mit dieser ID existiert,
					   wird an erstes Tag mit Bezeichnung "stringtext" angehängt,
					   Bsp. String = "body" hängt an das <body> Tag an
					   (außer es existiert ein Knoten mit ID = "body")

	tagname:	null / "" | String
				null / ""	= es wird ein Textknoten erzeugt
				String	= es wird ein Tag namens "stringtext" erzeugt

	OPTIONAL:
	attribut:	String		 	= "AttributName==AttributWert"
					   ('style'-Attribut funktioniert nicht im IE)
	--	kann beliebig wiederholt genutzt werden

	Text:	String			= Text für Textknoten, der an das erzeugte Tag angehängt wird

	Rückgabe
	var element = object {
			node:		Zeiger auf Node-Knoten ( oder Textknoten )
			textNode:	Zeiger auf Text-Knoten
			remove():		entfernt das element
			replace( Knoten ):	ersetzt das element durch den Knoten
					Knoten kann ein Dokumentenknoten oder ein Node Object sein
			insert( Knoten ):	fügt vor dem element dan Knoten ein
					Knoten kann ein Dokumentenknoten oder ein Node Object sein
			replaceData( Text, [start] ):
					ersetzt den text im Element-Textknoten komplett durch Text oder
					optional: ab Position start (start < 0 von hinten ersetzen)
					optional: Anzahl der im original text zu überschreibenden Zeichen
						Damit kann man teilweise überschreiben und einfügen
						Anzahl = 0 entspricht nur einfügen
			insertData( Text, [start] ):
					hängt Text im Element-Textknoten am Ende an oder
					optional: ab Position start einfügen
						(0 = am Anfang einfg., start < 0 von hinten einfügen )
	}
*/
function Node( knoten,  _tagname ) {
	if ( typeof knoten == 'object'  && knoten ) {	// Die Dokumentenwurzel ermitteln
		var doc = knoten;
		if ( knoten.node ) doc = knoten.node;
		while( doc.parentNode )
			doc = doc.parentNode;
	}
	else
		var doc = document;

	if (  _tagname ) {
		var element = doc.createElement(_tagname);
		if ( element == null) return null;
	}
	var textnode = null;
	for (var i=2; i < arguments.length; i++) {
		var attrib = arguments[i].split("==");
		if (attrib.length > 1) {
			if (attrib[0] == "class") element.className = attrib[1];
			element.setAttribute(attrib[0],attrib[1])
		}
		else {
			textnode = doc.createTextNode(attrib[0]);
			if (  _tagname )
				element.appendChild( textnode );
			else
				element = textnode;
		}
	}
	if (typeof knoten == 'string') {
		var knoten_ = knoten;
		knoten = doc.getElementById( knoten_ );
		if ( knoten == null)
			knoten = doc.getElementsByTagName( knoten_ ) [0];
	}
	if ( knoten )
		if ( knoten.node )
			knoten.node.appendChild( element );
		else
			knoten.appendChild( element );
	return {
		node:element,
		textNode:textnode,
		remove:function() {
			this.node.parentNode.removeChild( this.node );
		},
		insert:function( knoten ) {
			if ( knoten.node ) knoten = knoten.node;
			this.node.parentNode.insertBefore( knoten, this.node );
		},
		replace:function( knoten ) {
			if ( knoten.node ) knoten = knoten.node;
			this.node.parentNode.replaceChild( knoten, this.node );
		},
		replaceData:function( text ) {
			var start = 0; var anzahl = text.length;
			if ( arguments.length > 1) start = arguments[1];
			if ( start < 0 ) start = this.textNode.nodeValue.length + start;
			if ( arguments.length > 2) anzahl = arguments[2];
			this.textNode.replaceData( start, anzahl, text );
		},
		insertData:function( text ) {
			var start = this.textNode.nodeValue.length;
			if ( arguments.length > 1)
				if ( arguments[1] < 0 )
					start +=arguments[1];
				else
					start = arguments[1];
			this.textNode.replaceData( start, 0, text );
		}
	};
}

var $ = {
	id:function( idstring ) {
		return( document.getElementById( idstring) );
	},
	tagname:function( tagnamestring ) {
		var doc = document;
		if ( arguments.length > 1 ) {
			doc = arguments[1];
		}
		return( doc.getElementsByTagName( tagnamestring ) );
	},
	body: function() {
		return this.tagname( "body" )[0];
	},
	killchilds: function( doc ) {
		while( doc.lastChild ) {
			doc.removeChild( doc.lastChild );
		}
	},
	killme: function( doc ) {
		if ( typeof doc == "string" ) {
			doc = this.id( doc );
		}
		if ( doc ) {
			if ( doc.parentNode ) {
				doc.parentNode.removeChild( doc );
			}
		}
	},
	classmatch: function( element, klasse ) {
		var klassen = element.className.split( " " );
		for(var k = 0; k < klassen.length; k++) {
			if ( klassen[k] == klasse )
				return true;
		}
		return false;
	}
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function setPos(obj, x, y) {
	var _obj = obj;
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	_obj.style.position = "absolute";
	_obj.style.left =  (x - curleft) + "px";
	_obj.style.top  = (y - curtop) + "px";	
}

function previousNode(knoten) {
	do {
		knoten = knoten.previousSibling;
		if ( knoten && knoten.nodeType == 1 ) {
				return knoten;
		}
	} while ( knoten );
	return null;
}
function nextNode(knoten) {
	do {
		var knoten = knoten.nextSibling;
		if (knoten) {
			if (knoten.nodeType == 1)
				return knoten
		}
	} while ( knoten );
	return null;
}
function setOpacity(obj, opacity) {
  opacity = (opacity == 100)?99.999:opacity;
  
  // IE/Win
  obj.style.filter = "alpha(opacity:"+opacity+")";
  
  // Safari<1.2, Konqueror
  obj.style.KHTMLOpacity = opacity/100;
  
  // Older Mozilla and Firefox
  obj.style.MozOpacity = opacity/100;
  
  // Safari 1.2, newer Firefox and Mozilla, CSS3
  obj.style.opacity = opacity/100;
}

function _addEventHandler2(obj,evt,fn) {
	if (obj.addEventListener)
		obj.addEventListener(evt,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent('on'+evt,fn);
}

function _addEventHandler(element, event, handler) {
  var _tmp, _onevent;
  if (!element || !event )
    return false;
  if (element.addEventListener)   // DOM-konform
    element.addEventListener(event, handler, false);
  else {
    _onevent = 'on'+event;
    if (element.attachEvent)      // IE
      element.attachEvent(_onevent, handler);
    else {                        // ältere Browser
      _tmp = element[_onevent];
      element[_onevent] = typeof _tmp == 'function' 
        ? (function() { _tmp(); handler(); }) 
        : handler;
    }
  }
}
function klonen(quelle, ziel) {
	for(var i = 0; i < quelle.childNodes.length; i++) {
		var knoten = quelle.childNodes[i];
		switch (knoten.nodeType) {
			case 1:	// Elementknoten
				var neu = ziel.appendChild(document.createElement(knoten.nodeName));
				var attribAnzahl;
				try {
					var attribAnzahl = knoten.attributes.length;
				}
				catch(fehler) {
					var attribAnzahl = 0;
				}
				for (var j = 0; j < attribAnzahl; j++) {
					neu.setAttribute(knoten.attributes[j].nodeName, knoten.attributes[j].nodeValue);
					neu.className = knoten.className;
				}
				klonen( knoten, neu );
				break;
			case 3:	// Textknoten
				subknoten = document.createTextNode(knoten.nodeValue);
				ziel.appendChild(subknoten);
		}
	}
}

function getElementsByAttrib(quellknoten, einAttribName) {
	var einAttribWert = "";
	if (arguments.length > 2)
		var einAttribWert = arguments[2];
	einAttribName = einAttribName.toUpperCase();  // fix opera-bug
	var ergebnis = new Array();
	for(var i = 0; i < quellknoten.childNodes.length; i++) {
		var knoten = quellknoten.childNodes[i];
		switch (knoten.nodeType) {
			case 1: // Elementknoten
				 try {
					var attribAnzahl = knoten.attributes.length;
				}
				catch(fehler) {
					var attribAnzahl = 0;
				}
				for (var j = 0; j < attribAnzahl; j++) {
					var nodeNameUcase = knoten.attributes[j].nodeName.toUpperCase();
					if( nodeNameUcase == einAttribName ) {
						if (einAttribWert != "" ) {
							/* nur bei Atrribut "class" gesondert vorgehen, da class mehrere Klassennamen 
							   haben kann, z.B. <div id="beitrag gross">(...)</div> */
							if ( einAttribName == "CLASS" ) {
								var atrribwert = knoten.attributes[j].nodeValue;
								var klassen = atrribwert.split( " " );
								for(var k = 0; k < klassen.length; k++) {
									if ( klassen[k] == einAttribWert ) {
										ergebnis.push( knoten );
										break;
									}
								}
							}
							else {
								if ( knoten.attributes[j].nodeValue.indexOf(einAttribWert) > -1)
									ergebnis.push( knoten );
							}
						}
						else {
							ergebnis[ergebnis.length] = knoten;	
						}
					}
				}
				var weitere = getElementsByAttrib(knoten, einAttribName, einAttribWert);
				var ergebnis = ergebnis.concat(weitere);
				break;
		}
	}
	return ergebnis;
}

var TOOLTIP = {	// BUGGY IN IE-EXPLORER FOR RELATIVE POSITIONED ELEMENTS
	timeout: [],
	on: function( id ) {
		$.id( id ).style.display = "";
	},
	targ: function( e ) {
		var targ;
		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		return targ
	},
	init: function() {
			var knoten = document.getElementsByTagName( "body" )[0];
			var tip = getElementsByAttrib( knoten, "class", "tooltip" );
			for ( var i = 0; i < tip.length; i++ ) {
				var tippos = findPos( tip[i] );
				var prev = previousNode( tip[i] );
				var previd = prev.getAttribute( "id" )
				if (!previd ) {
					previd = "tooltipparent"+i;
					prev.setAttribute( "id", previd );
				} 
				var tipwidth = tip[i].offsetWidth;
				//	alert( "tooltip x: "+tip[i].offsetLeft + " - y: "+tip[i].offsetTop + "\nfindPos x: "+tippos[0]+" - y: "+tippos[1] );
				var body = $.tagname( "Body" )[0];
				var ziel = body.appendChild(document.createElement( "div" ));
				ziel.className = "tooltip";
				klonen( tip[i], ziel );
				$.killme( tip[i] );
				ziel.style.position = "absolute";
				ziel.style.width = tipwidth+"px";
				ziel.setAttribute( "id", "tooltip"+previd );
				//alert( "previd "+previd );
				setPos( ziel, tippos[0]+8, tippos[1] + 8);
				ziel.style.display = "none";
				_addEventHandler( prev, "mouseover", function(e) {
						TOOLTIP.timeout[i] = window.setTimeout("TOOLTIP.on('tooltip"+TOOLTIP.targ(e).getAttribute( "id" )+"')", 1000);
					} );
				_addEventHandler( prev, "mouseout", function(e) {
						window.clearTimeout(TOOLTIP.timeout[i]);
						var tooltip = $.id( "tooltip"+TOOLTIP.targ(e).getAttribute( "id" ) );
						tooltip.style.display = "none";
					} );
			}
		}
}

/* ############################################
Name: 	linkNeuesFenster
Hinweis:	alle (externen) Links, die nicht mit http://localhost bzw http://(www.)radio-meilensteine.de
	beginnen UND NICHT den Klassennamen "nopopup" haben werden mit Popup versehen
*/
function linkNeuesFenster() {
	var links = document.getElementsByTagName("a");
	for (i = 0; i < links.length; i++ ) {
		var url = links[i].href;
		if ( url ) {
			var hitme = true;
			if ( url.match( /http:\/\/localhost/i ) || url.match( /http:\/\/radio-meilensteine/i ) || url.match( /http:\/\/www\.radio-meilensteine/i ) ) {
				hitme = false;
			}

			var klassen = links[i].className.split( " " );
			for(var k = 0; k < klassen.length; k++) {
				if ( klassen[k] == "nopopup" ) {
					hitme = false;
					break;
				}
				if ( klassen[k] == "popup" ) {
					hitme = true;
					break;
				}
			}
			if ( hitme )
				links[i].onclick = erzeugePopup;
		}
	}
}
function erzeugePopup() {
	neuesFenster = window.open( this.href );
	neuesFenster.focus();
	return false;
}

function makeFlashPlayer() {
	if ( typeof SWFObject != "undefined" ) {
		var so = new Array();
		var links = getElementsByAttrib( $.body(), "class", "flash" );
		for (i =links.length-1 ; i >-1 ; i--) {

			/* Link in einen DIV-Container kopieren, wird von SWFobject benötigt */
			var div = Node( null, "div", "id==flashcontainer"+i );
			links[i].parentNode.insertBefore( div.node, links[i] );
			var text = links[i].firstChild.data;
			var flashlink = Node( div, "a", "href=="+links[i].getAttribute( "href" ), text );

			/* urspruenglichen Link löschen */
			links[i].parentNode.removeChild( links[i] );

			/* SWF-Objekt erstellen */
			so[i] = new SWFObject('/gn/swf/soundplayer.swf?src='+links[i].href, "flashcontainer"+i , '220', '30', '0', '#241813' );
			so[i].write( "flashcontainer"+i );

			//so[i].addParam("play", "true");
		}
	} 
}

function linkPrintList() {
	var content = $.id( "content" );
	if ( content ) {
		var url= new Array();
		var links = $.tagname( "a", content );
		for ( var i=0; i < links.length; i++) {
			if ( $.classmatch( links[i], "noprint" ) == false && $.classmatch( links[i], "noprintlinklist" ) == false ) {
				var uri = links[i].getAttribute( "href" );
				if ( uri.indexOf( "htt" ) < 0 && uri.indexOf( "mailto:" )<0 ) {
					uri = "http://"+window.location.hostname+uri;
				}
				if ( uri.indexOf( "mailto:" ) == 0 && $.classmatch( links[i], "convertme" ) == true ) {
					uri = uri.replace( /mailto:/, "" );
					links[i].firstChild.data = uri;
				}
				else {
					var nomatch = true;
					for ( var m=0; m < url.length; m++ ) {
						if ( url[m].url == uri )
							nomatch = false;
					}
					if ( nomatch )
						url.push( { linktext:links[i].firstChild.data, "url":uri } );
					var hinweis = Node( links[i], "dfn", "class==noscreen", " ("+url.length+")" );
				}
			}
		}
		if ( url.length) {
			var container = Node( content, "div",  "class==noscreen", "id==linkliste" );
			var titel = Node( container, "h4", "Linkliste" );
			var list = Node( container, "dl" );
			for ( var i=0; i < url.length; i++) {
				//var listelement = Node( list, "li", url[i] );
				var listelement = Node( list, "dt", (i+1)+". "+url[i].linktext+":" );
				var listelement = Node( list, "dd", url[i].url );
			}
		}
	}
}