/*
Popup für Künsterlinks auf Quickview-Seite.

V1.0	07.02.2009	Initiale Version
V1.1	08.02.2009	Popup ohne Srcollbalken darstellen
			Popup schliessen bei Klick in Fenster
V1.2	09.02.2009	Bild immer auf gleicher Hoehe darstellen
V1.3	18.02.2009	Warte 200ms bis Fenster aufgeht
			Mache Fenster zu, wenn Link verlassen wird (onmouseout added)
V1.4	27.02.2009	IE kompatibilitaet hergestellt (Falsche Popup-Position + Bild verzerrt)
				check ob container noch da bevor popup-Elemente geschreiben werden
*/


function popup_init() {

 // wird beim Laden aufgerufen
 // registriert für alle Links, deren id mit kuenstler_ 
 // anfangen, ein mouseover-Ereignis
 var links = document.getElementsByTagName("a");
 if (!links) return false;
 for (var i = 0; i < links.length; i++) {
 	// die ID des Links raussuchen
 	var link = links[i].id;
 	if (link.substring(0,10) == 'kuenstler_') {
 		var kuenstler_id = link.substring(10);
 		//alert (kuenstler_id);
 		links[i].onmouseover = new Function("ereignis", "pause(200); popup.position_ermitteln(ereignis); popupshow('" + kuenstler_id + "');");
 		links[i].onmouseout = new Function("ereignis", "javascript:popup.schliessen();");
 	}
 }
}

function pause(milliseconds) {
	var dt = new Date();
	while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}


function popupshow(nr) {
 // erzeugt den popup-Container und holt die Inhalte
 if (popup.container) popup.schliessen();
 document.getElementsByTagName("body")[0].appendChild(popup.erzeugen());
 popup.popupueber.nodeValue = popup.popupvorspann + nr;
 popup.holen(nr);
}



// popup-Layer-Objekt
var popup = {
 // Das popup soll von aussen zugaenglich sein:
 container: null,		// DIV-Container
 popupvorspann: "Lade KÃ¼nstler ",	// Ãœberschrift-Vorspann
 popupueber: null,		// Ãœberschriftentext
 popupabsatz: null,		// Absatz fÃ¼r popuptext
 ajax: false,			// XMLHttpRequest-Objekt
 mausX: 0,			// horizontale und ...
 mausY: 0,			// vertikale Mausposition
 div_breite: 450,		// Breite und ...
 div_hoehe: 130,		// Höhe des popup-Containers
 				// beim Aendern der div-Höhe auch <p>-Hoehe in css anpassen !
 abstandX: 10,			// horizontaler und ...
 abstandY: 10,			// vertikaler Abstand von Mauszeiger
 rollX: 0,			// horizontale und ...
 rollY: 0,			// vertikale Scrollposition


 erzeugen: function() {
  // Der FuÃŸnoten-Layer wird bei jedem Aufruf neu erzeugt.
  // Alternativ kÃ¶nnte er mit den Stylesheet-Eigenschaften
  // visibility oder display aus- und eingeblendet werden.
  // erzeugt Div-Container
  popup.container = document.createElement("div");
  popup.container.id = "popup_window";
  popup.container.style.width = popup.div_breite + "px";
  popup.container.style.height = popup.div_hoehe + "px";
  // Positionieren, abhÃ¤ngig von Mauszeiger und Browserfenster
  // Der Kasten soll rechts vom Mauszeiger erscheinen, wenn dort
  // noch Platz ist oder links kein Platz ist
  var pos_x = (popup.mausX + popup.abstandX + popup.div_breite < window.innerWidth || popup.div_breite + popup.abstandX > popup.mausX)?
   popup.mausX + popup.abstandX :	// rechts von Mauszeiger
   popup.mausX - popup.div_breite - popup.abstandX;	// links
  // Der Kasten soll Ã¼ber dem Mauszeiger erschein, wenn Platz ist
  var pos_y = (popup.div_hoehe + popup.abstandY > popup.mausY)?
   popup.mausY + popup.abstandY :	// unter Mauszeiger
   popup.mausY - popup.div_hoehe - popup.abstandY;	// darÃ¼ber
  //alert('roll: '+popup.rollX + ' ' + popup.rollY);// + "\npos: "+ pos_x + ' ' + pos_y + "\nmaus: "+ popup.mausX + ' ' + popup.mausY);
  popup.container.style.left = popup.rollX + pos_x + "px";
//alert("left : " +   popup.container.style.left);
  popup.container.style.top = popup.rollY + pos_y + "px";
//alert("top : " +   popup.container.style.top);
  // Container ohne Scroll-Balken darstellen
  popup.container.style.overflow = "hidden";
  
  // FuÃŸnoten-Ãœberschrift
  popup.titel = document.createElement("h1");
  popup.popupueber = document.createTextNode(popup.popupvorspann);
  popup.titel.appendChild(popup.popupueber);
  // Link zum SchlieÃŸen
  var popup_link = document.createElement("a");
  popup_link.setAttribute("href", "javascript:popup.schliessen()");
  
  // content Container 
  popup.content = document.createElement("div");
  popup.content.setAttribute("id","Popup_Content");
  popup.content.setAttribute("onClick","javascript:popup.schliessen();");
  
  // zusammensetzen
  popup.titel.appendChild(popup_link);
  popup.container.appendChild(popup.titel);
  	
  // Ereignis registrieren
  // *verbessert* gegenÃ¼ber ursprÃ¼nglicher Fassung:
  // popup.anfasser ist das Element, das auf die Maus reagiert
  popup.anfasser = popup.titel; // oder ... = popup.container
  popup.anfasser.onmousedown = popup.ziehen_vorbereiten;
  popup.anfasser.style.cursor = "move";
  // zurÃ¼ckgeben
  return popup.container;
 },

  // holt Inhalt für Popup
 holen: function(nr) {
     
  // Ajax-Verbindung herstellen
  try {			// W3C-Standard
   popup.ajax = new XMLHttpRequest();
  } catch(w3c) {
   try {			// Internet Explorer
    popup.ajax = new ActiveXObject("Msxml2.XMLHTTP");
   } catch(msie) {
    try {		// Internet Explorer alt
     popup.ajax = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(msie_alt) {
     alert("Ihr Browser kann keine Popups anzeigen.");
     return false;	// !!! Link auf XML-Dokument
    }
   }
  }
  
  // uebergebenen String zerlegen . ID-datum
  var param = nr.split("-");
  var URL = '/b2b/xml/show.php?zeile=' + param[0] + '&datum=' + param[1] + '&picture=0';
  //alert (URL);
  // Datei anfordern (asynchron)
  popup.ajax.open('GET', URL , true);
  popup.ajax.setRequestHeader('Content-Type', 'text/xml');
  // umgeht Internet Explorers Caching von GET-Anfragen
  popup.ajax.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
  popup.ajax.send(null);
  // nach Status-Ã„nderungen der Verbindung
  // werden die empfangenen Inhalte geparst
  popup.ajax.onreadystatechange = function() {
   // wenn Antwort komplett empfangen ist ...
   if (popup.ajax.readyState == 4) {
    // Dokument nicht gefunden (Code 0 fÃ¼r lokale Tests):
     if (popup.ajax.status != 200 && popup.ajax.status != 0) {
       popup.content.firstChild.nodeValue = "Nichts gefunden";
       return false;
     }

	// Kuenstler in Titelzeile schreiben
     	var kuenstler = popup.ajax.responseXML.getElementsByTagName("artist");
     	//alert (kuenstler[0].firstChild.nodeValue);
     	popup.popupueber.nodeValue = kuenstler[0].firstChild.nodeValue;

	var exceptionCode="";
	try {
		var pic_URL = popup.ajax.responseXML.getElementsByTagName("pictureURL")[0].firstChild.nodeValue;
		pic_URL = pic_URL + "&hoehe=116";
		if (pic_URL.length == 0) {
			throw "URL zu kurz";
		}
	}
	catch(e) {
		//alert ("keine BilderURL: " + e);
		exceptionCode=e;
		// wenn kein Bild vorhanden, soll Text links stehen
		popup.content.setAttribute("style","margin-left : 10px" , false);
	}
	finally {    
		if (!exceptionCode) {

			//alert ("Und jetzt malen: " + pic_URL);
		
			var myIMG = document.createElement("img");
			myIMG.setAttribute("alt", kuenstler[0].firstChild.nodeValue);
			myIMG.setAttribute("src", pic_URL);
			myIMG.setAttribute("height", "116");
			myIMG.removeAttribute("width");
			popup.content.appendChild(myIMG);
			//popup.popupabsatz.appendChild(myIMG);
		}
	}
	// Absatz fÃ¼r Text vorbereiten
	if (popup.container) {  popup.popupabsatz = document.createElement("p"); }
	if (popup.container) {  popup.popupabsatz.setAttribute("id","Popup_Absatz"); }
	if (popup.container) {  popup.content.appendChild(popup.popupabsatz); }
	if (popup.container) {  popup.container.appendChild(popup.content); }
  
   //alert("wait");
  
	// Programminfo in Textfeld schreiben
     	if (popup.container) {  popup.anhaengen("title");  }
	if (popup.container) {  popup.anhaengen("subtitle"); }
	if (popup.container) {  popup.anhaengen("subtitle2"); }
	if (popup.container) {  popup.anhaengen("location"); }
     
    
     }
   }
 },


 schliessen: function() {
  if (popup.container) {
  // löcht den popup-Container
  document.getElementsByTagName("body")[0].removeChild(popup.container);
  popup.container = null;
  }
 },

 position_ermitteln: function(ereignis) {
  // ermittelt die Position des Mauszeigers
  // (Pixel von der linken oberen Fensterecke)
  if (!ereignis) var ereignis = window.event;
  popup.mausX = ereignis.clientX;
  popup.mausY = ereignis.clientY;
//alert ("MausX: " + popup.mausX);
//alert ("MausY: " + popup.mausY);
  popup.roll();
  // Safari rechnet clientX/Y vom Dokumentenanfang aus
  if (popup.mausX > popup.rollX && popup.rollX >= window.innerWidth) popup.mausX -= popup.rollX;
  if (popup.mausY > popup.rollY && popup.rollX >= window.innerHeight) popup.mausY -= popup.rollY;
 },

 roll: function() {
  // Gibt die horizontale oder vertikale Scroll-Verschiebung zurÃ¼ck
  if (isFinite(self.pageYOffset)) {	// DOM
   popup.rollX = self.pageXOffset;
   popup.rollY = self.pageYOffset;
//alert ("DOM");
  } else if (isFinite(document.documentElement && document.documentElement.scrollTop)) {	// IE neu
   popup.rollX = document.documentElement.scrollLeft;
   popup.rollY = document.documentElement.scrollTop;
   popup.rollX = window.document.body.scrollLeft;
   popup.rollY = window.document.body.scrollTop;
   
//alert ("IE neu");
  } else if (isFinite(document.body.scrollTop)) {	// IE alt
   popup.rollX = document.body.scrollLeft;
   popup.rollY = document.body.scrollTop;
//alert ("IE alt");
  }
//alert ("RollX: " + popup.rollX);
//alert ("RollY: " + popup.rollY);  
 },
 

 ziehen_vorbereiten: function(ereignis) {
  // registriert die ziehen-Funktion fÃ¼r Mausbewegungen,
  // Abbruch bei Loslassen der Maustaste
  if (!ereignis) var ereignis = window.event;
  popup.position_ermitteln(ereignis);
  document.onmousemove = popup.ziehen;
  document.onmouseup = popup.stopp;
 },

 ziehen: function(ereignis) {
  // verschiebt den FuÃŸnoten-Container parallel zu Mausbewegungen
  if (!ereignis) var ereignis = window.event;
  // SicherheitsmaÃŸnahme: manche Browser kommen mit den Ereignissen
  // durcheinander, z.B. beim Scrollen in Ã¼berlangen FuÃŸnoten
  // (Safari) oder bei Maus-Hektik (IE); in diesem Fall lÃ¶st ein
  // Mausklick den am Zeiger klebenden Container.
  document.onmousedown = popup.stopp;
  // 1.) aktuelle Position ermitteln
  var kastenX = parseInt(popup.container.style.left.slice(0,-2));
  var kastenY = parseInt(popup.container.style.top.slice(0,-2));
  // 2.) alte Mausposition speichern
  var mausX_alt = popup.mausX;
  var mausY_alt = popup.mausY;
  // 3.) neue Mausposition ermitteln
  popup.position_ermitteln(ereignis);
  // 4.) um die Differenz verschieben
  popup.container.style.left = kastenX + popup.mausX - mausX_alt + "px";
  popup.container.style.top = kastenY + popup.mausY - mausY_alt + "px";
 },

 stopp: function() {
  // lÃ¶scht Event-Handler, lÃ¤sst FuÃŸnoten-Container los
  document.onmousemove = null;
  document.onmouseup = null;
  // gleicht SicherheitsmaÃŸnahme in FN.ziehen() aus
  if (document.onmousedown) {
   // *korrigiert* gegenÃ¼ber ursprÃ¼nglicher Version
   document.onmousedown = null;
   popup.anfasser.onmousedown = popup.ziehen_vorbereiten;
  }
 },
 
 anhaengen: function(nodename) {
	// sucht den Tag mit dem Namen <nodename> in der Response
	// und trägt diesen in das Textfeld 'popupabsatz'
	
	var exceptionCode="";
	try {
		var node = popup.ajax.responseXML.getElementsByTagName(nodename)[0].firstChild.nodeValue;
	}
	catch(e) {
		exceptionCode=e;
	}
	finally {    
		if (!exceptionCode) {
			//alert ("Anhängen: " + node);
			var subknoten = document.createTextNode(node);
			popup.popupabsatz.appendChild(subknoten);
			var myBR = document.createElement("br");
			popup.popupabsatz.appendChild(myBR);
			
		}
	}
     
 }

};


function klonen(quelle, ziel) {
 // Hilfsfunktion fÃ¼r Popup-Darstellung im DOM
 // Einfaches cloneNode() funktioniert nicht bei komplexen
 // Gebilden; eine Schleife baut den Teilbaum nach.
 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));
    for (var j = 0; j < knoten.attributes.length; j++) {
     neu.setAttribute(knoten.attributes[j].nodeName, knoten.attributes[j].nodeValue);
    }
    klonen(knoten, neu);
    break;
   case 3:	// Textknoten
    subknoten = document.createTextNode(knoten.nodeValue);
    ziel.appendChild(subknoten);
   // andere Knotentypen sind nicht relevant
  }
 }
}



// Aufruf der init-Funktion beim Laden
window.onload = popup_init;
