/**
 * Steuerung des Mediaplayers
 *
 * @author Thomas Scholz <thomasscholz@maxsysteme.de>
 * @created 13.07.09
 */

/** ID des HTML-Elementes mit dem gesamten Playerfenster */
var ID_PLAYER_WINDOW = "player_window";
/** ID des HTML-Elementes, in welches der Player integriert wird */
var ID_PLAYER_BOX = "player_box";
/** ID des HTML-Elementes des JW-FLV-Mediaplayers */
var ID_PLAYER = "player";
/** ID des HTML-Elementes für den Titel der aktuell gespielten Datei  */
var ID_TITLE = "media_title";
/** ID des HTML-Elementes für die Mediaauswahl */
var ID_SELECTION = "dropdown";

/** Konstante für die Kennzeichnung einer Sound-Datei */
var AUDIO = 1;
/** Konstante für die Kennzeichnung einer Video-Datei */
var VIDEO = 2;

/** Variable für den Player selbst */
var player = null;
/** ID der aktuell angezeigten Mediadatei */
var current_media_id = "";
/** ID der aktuell verwendeten Mediabox */
var current_box_id = "";
/** Array mit die ermittelten Positionen von HTML-Elementen */
var pos_cache = {};
/** Array mit den Parametern für alle Mediadateien */
var params = {};
/** Array mit allen Freikarten */
var freikarten = [];
/** Präfix für Pfade zu Grafiken etc., kann im HTML-Quelltext überschieben werden */
var path_prefix = "";
/** liegt der Opera-Browser vor? */
var IS_OPERA = (navigator && navigator.appName && navigator.appName.toLowerCase() == "opera");

/*
 * Usereinstellungen zum Fader
 */
var FADE_DX_PARENT	= 300;
var FADE_DX			= 188;
var FADE_STEP		= 10;
var FADE_DELAY		= 10;

/*
 * interne Variable für den Fader
 */
var fade_x = 0, fade_y = 0;
var fade_dy, fade_step_y;
var fade_timeout = null;

/**
 * Setzt das Fenster mit dem Mediaplayer
 *
 * @param {Number} media_id ID der Mediadatei
 * @param {String} box_id ID des HTML-Elementes, in dem der Player anzuzeigen ist
 * @param {Number} width Breite
 * @param {Number} height Höhe
 */
function setMediaPlayer(media_id, box_id, width, height)
{
	if (media_id != current_media_id || box_id != current_box_id) {
		// eventuell laufenden Player stoppen
		stopMediaPlayer();

		// ID der Mediadatei und der Mediabox global merken
		current_media_id	= media_id;
		current_box_id		= box_id;

		// Parameter aus dem globalen Parameterarray holen
		var my_params = params[media_id];
		//alert(unescape(my_params.veranstaltung) + ((my_params.beschreibung != "") ? " ("+unescape(my_params.beschreibung)+")" : ""));

		// neuen Player erstellen
		var so = new SWFObject(
			my_params.movie,
			ID_PLAYER,
			(width) ? width : my_params.width,
			(height) ? height : my_params.height,
			my_params.version
		);
		//so.useExpressInstall("lib/jw_flv_player/expressinstall.swf");
		so.addParam("allowscriptaccess", "always");
		so.addParam("allowfullscreen", my_params.fullscreen);
		so.addParam("wmode", my_params.wmode);
		so.addParam("flashvars", my_params.flashvars);
		so.write(ID_PLAYER_BOX);
		registerPlayer();

		// Playerfenster nur positionieren, wenn nötig
		var mediabox		= document.getElementById(box_id);
		var window_style	= document.getElementById(ID_PLAYER_WINDOW).style;
		if (	(parseInt(window_style.left) != getXPos(mediabox))
			||	(parseInt(window_style.top)  != getYPos(mediabox))
		) {
			window_style.left	= getXPos(mediabox) + "px";
			window_style.top	= getYPos(mediabox) + "px";
		}

		// Playerfenster anzeigen, wenn nötig
		if (window_style.visibility != "visible")
			window_style.visibility	= "visible";

		// Titel setzen und positionieren
		var mediatitle = document.getElementById(ID_TITLE);
		if (mediatitle) {
			mediatitle.innerHTML =
				"<div><a href='" + unescape(my_params.href) + "'>" +
					getTitel(my_params) +
				"</a></div>" +
				"<a href='" + unescape(my_params.href) + "'>" +
					"<img src='"+path_prefix+"pic/layout2/info.jpg' width='14' height='14' title='mehr Info' alt='mehr Info' />" +
				"</a>"
			;
			mediatitle.style.left		= (getXPos(mediabox) - 18) + "px";
			mediatitle.style.top		= (getYPos(mediabox) + 99) + "px";
			mediatitle.style.visibility	= "visible";
		}
	}
}

/**
 * Registriert einen neuen Player, d.h.
 * belegt die player-Variable und setzt Listener
 */
function registerPlayer()
{
	if (player == null || typeof(player) != "function" || !player.getConfig) {
		player = document.getElementById(ID_PLAYER);
		setTimeout("registerPlayer()", 10);
	}
	else {
		//player.style.zIndex = 9000;
		//alert(player.style.zIndex);
		player.addModelListener("STATE", "listenState");
	}
}

/**
 * Reagiert auf Änderungen des Playerstatus
 * (IDLE, BUFFERING, PLAYING, PAUSED, COMPLETED)
 *
 * @param {Object} event ModelEvent.STATE
 */
function listenState(event)
{
	//alert(event.newstate);
	if (event.newstate == "COMPLETED") {
		//alert("Wiedergabe beendet");
		closeMediaPlayer();
	}
};

/**
 * Stoppt den Mediaplayer
 */
function stopMediaPlayer()
{
	if (player != null && player.sendEvent) {
		// Player stoppen
		player.sendEvent("STOP", "true");
		// Titel ausblenden
		if (document.getElementById(ID_TITLE))
			document.getElementById(ID_TITLE).style.visibility = "hidden";
		// Player-Variable auf null setzen, damit beim nächsten
		// Aufruf der Listener wieder neu initialisiert wird!
		player = null;
		// aktuelle Media-ID zurücksetzen
		current_media_id = 0;
	}
}

/**
 * Stoppt und schließt den Mediaplayer
 */
function closeMediaPlayer()
{
	stopMediaPlayer();
	document.getElementById(ID_PLAYER_WINDOW).style.visibility = "hidden";
}

/**
 * Erzeugt die Auswahl an Mediadateien für eine Rubrik
 *
 * @param {Number} rubrik_id Rubrik-ID
 * @param {Number} typ AUDIO oder VIDEO
 * @param {Bool} is_parent Aktion im Elternframe ausführen
 * @return {String} HTML-Text oder false
 */
function createRubrikMediaSelection(rubrik_id, typ, is_parent)
{
	var offer_id = 0, i = 0, titel, my_params, html = "";

	for (var media_id in params) {
		my_params = params[media_id];

		if ((rubrik_id == 0 || my_params.rubrik_id == rubrik_id) && my_params.typ == typ) {

			// Veranstalter (setzt Gruppierung nach offer_id voraus!)
			if (my_params.offer_id != offer_id) {
				html += "<span "+((i==0)?" class='top'":"")+">" + unescape(my_params.veranstalter) + "</span>";
				offer_id = my_params.offer_id;
			}

			html +=
				"<a class='rubrik"+(my_params.neu?" neu":"")+"' href=\"javascript:"+(is_parent?"main.":"")+"clickMediaSelection('"+media_id+"', true)\">" +
				((my_params.neu) ? "<img src='"+path_prefix+"pic/layout2/neu.jpg' />" : "") +
				getTitel(my_params) + "</a>"
			;
			i++;
		}
	}

	return (html == "") ? false : ("<div class='title'>" + ((typ == AUDIO) ? "Hörbeispiele" : "Videos") + "</div>" + html);
}

/**
 * Öffnet die Auswahl an Mediadateien für eine Rubrik
 *
 * @param {Object} button auslösendes HTML-Element
 * @param {Number} rubrik_id Rubrik-ID
 * @param {Number} typ AUDIO oder VIDEO
 */
function setRubrikMediaSelection(button, rubrik_id, typ)
{
	setMediaSelection(button, rubrik_id, createRubrikMediaSelection(rubrik_id, typ));
}

/**
 * Öffnet die Auswahl an Mediadateien für eine Präsentation
 *
 * @param {Object} button auslösendes HTML-Element
 * @param {Number} rubrik_id Rubrik-ID
 * @param {Number} offer_id Präsentations-ID
 * @param {Number} typ AUDIO oder VIDEO
 */
function setOfferMediaSelection(button, rubrik_id, offer_id, typ)
{
	var i = 0, css, my_params;
	var html = "<div class='title'>" + ((typ == AUDIO) ? "Hörbeispiele" : "Videos") + "</div>";

	for (var media_id in params) {
		my_params = params[media_id];

		if (my_params.offer_id == offer_id && my_params.typ == typ) {
			css = (i==0) ? "top" : "";
			if (my_params.neu)
				css = (css == "") ? "neu" : " neu";

			html +=
				"<a class='"+css+"' href=\"javascript:clickMediaSelection('"+media_id+"', false)\">" +
				((my_params.neu) ? "<img src='"+path_prefix+"pic/layout2/neu.jpg' />" : "") +
				getTitel(my_params) + "</a>"
			;
			i++;
		}
	}

	setMediaSelection(button, rubrik_id, html);
}

/**
 * Erzeugt die Auswahl an Freikarten
 *
 * @param {Array} freikarten Array mit Freikartenobjekten
 * @param {Bool} is_parent Aktion im Elternframe ausführen
 * @return {String} HTML-Text oder false
 */
function createFreikartenSelection(freikarten, is_parent)
{
	var html = "";

	for (var i = 0, ii = freikarten.length; i < ii; i++)
		html += "<a"+(is_parent?" target='main'":"")+" href='" + freikarten[i].href + "'>" + unescape(freikarten[i].name) + "</a>";

	return (html == "") ? false : ("<div class='title'>Freikarten</div>" + html);
}

/**
 * Öffnet die Auswahl an Freikarten für eine Rubrik
 *
 * @param {Object} button auslösendes HTML-Element
 * @param {Number} rubrik_id Rubrik-ID
 * @param {Array} freikarten Array mit Freikartenobjekten
 */
function setFreikartenSelection(button, rubrik_id, freikarten)
{
	setMediaSelection(button, rubrik_id, createFreikartenSelection(freikarten));
}

/**
 * Öffnet das Lesezeichenmenü für einen Eintrag
 *
 * @param {Object} button auslösendes HTML-Element
 * @param {Number} rubrik_id Rubrik-ID
 * @param {String} url URL für AddThis
 * @param {String} title Titel für AddThis
 */
function setLesezeichen(button, rubrik_id, url, title)
{
	setMediaSelection(button, rubrik_id, my_addthis.createTable(url, unescape(title), true), false, "addthis");
	my_addthis.render("#dropdown", "#atcounter");
}

/**
 * Gibt das HTML-Element zurück, in dem die Auswahlbox generiert wird
 *
 * @param {Bool} is_parent Aktion im Elternframe ausführen
 * @return {Object}
 */
function getSelectElm(is_parent)
{
	return is_parent ? parent.document.getElementById(ID_SELECTION) : document.getElementById(ID_SELECTION);
}

/**
 * Setzt und öffnet die Auswahl an Mediadateien
 *
 * @param {Object} button auslösendes HTML-Element
 * @param {Number} rubrik_id Rubrik-ID
 * @param {String} html Inhalt der Auswahl
 * @param {Bool} is_parent Aktion im Elternframe ausführen
 * @param {String} css individuelle CSS-Klasse
 */
function setMediaSelection(button, rubrik_id, html, is_parent, css)
{
	if (!html)
		return;

	var select = getSelectElm(is_parent);
	if (!select)
		return;

	// alte Auswahl schließen
	closeMediaSelection(is_parent);

	// eventuelle CSS-Klasse(n) entfernen und übergebene setzen
	select.className = (css && css.length > 0) ? css : "default";

	// Inhalt einsetzen
	select.innerHTML = html;

	// Auswahl positionieren und einblenden
	// Button-X-Pos + Buttonbreite (muss IMG sein!) - fester Wert
	var select_style 		= select.style;
	select_style.left		= (is_parent
		? (getXPos(button) - 300)
		: getXPos(document.getElementById("kopf_" + rubrik_id))
	) + "px";
	//if (parent.is_mode_edit) {
		var left			= parseInt(select_style.left);
		select_style.left	= (left + ((left < 100) ? 15 : - 20)) + "px";
	//}
	select_style.top		= (getYPos(button) + 16) + "px";
	select_style.visibility = "visible";

	// Fader initialisieren und starten
	fade_dy		= select.offsetHeight;
	fade_step_y	= Math.round(FADE_STEP * (fade_dy / (is_parent ? FADE_DX_PARENT : FADE_DX)));

	//if (!IS_OPERA)
	//	fadeMediaSelection(is_parent);
}

/**
 * Faderfunktion für das Öffnen der Mediaauswahl
 *
 * @param {Bool} is_parent Aktion im Elternframe ausführen
 */
function fadeMediaSelection(is_parent)
{
	var select		= getSelectElm(is_parent);
	var ready		= true;
	var MY_FADE_DX	= is_parent ? FADE_DX_PARENT : FADE_DX;

	if (fade_x < MY_FADE_DX) {
		fade_x += FADE_STEP;
		ready = false;
	}
	if (fade_y < fade_dy) {
		fade_y += fade_step_y;
		ready = false;
	}

	if (!ready) {
		setClip(select, MY_FADE_DX - fade_x, MY_FADE_DX, 0, fade_y);
		fade_timeout = setTimeout("fadeMediaSelection("+is_parent+")", FADE_DELAY);
	}
	else {
		setClip(select, 0, MY_FADE_DX, 0, fade_dy);
		fade_x = 0;
		fade_y = 0;
		clearTimeout(fade_timeout);
	}
}

/**
 * Reagiert auf das Anklicken eines Links in der Mediaauswahl
 *
 * @param {Number} media_id Media-ID
 * @param {Boolean} scroll Zum Player scrollen
 */
function clickMediaSelection(media_id, scroll)
{
	setMediaPlayer(media_id, "mediabox_" + params[media_id].offer_id);
	closeMediaSelection();
	if (scroll)
		scrollTo(0, getYPos(document.getElementById("mediabox_" + params[current_media_id].offer_id)) - 40);
}

/**
 * Öffnet die Auswahl an Mediadateien
 *
 * @param {Bool} is_parent Aktion im Elternframe ausführen
 */
function showMediaSelection(is_parent)
{
	getSelectElm(is_parent).style.visibility = "visible";
}

/**
 * Schließt die Auswahl an Mediadateien
 *
 * @param {Bool} is_parent Aktion im Elternframe ausführen
 */
function closeMediaSelection(is_parent)
{
	var select_style		= getSelectElm(is_parent).style;
	select_style.visibility	= "hidden";

	// CSS der Auswahl zurücksetzen (nur Titelleiste)
	if (is_parent) {
		select_style.height		= "";
		select_style.maxHeight	= "";
	}
}

/**
 * Setzt die Clip-Styleeigenschaft eines Elementes
 *
 * @param {Object} elm HTML-Element
 * @param {Number} left
 * @param {Number} right
 * @param {Number} top
 * @param {Number} bottom
 */
function setClip(elm, left, right, top, bottom)
{
	elm.style.clip = "rect("+top+"px, "+right+"px, "+bottom+"px, "+left+"px)";
}

/**
 * Gibt den Titel einer Veranstaltung zurück
 * (entweder die Beschreibung oder der Veranstaltungsname)
 *
 * @param {Array} my_params Parameterarray
 * @return {String}
 */
function getTitel(my_params)
{
	return (my_params.beschreibung != "")
		? unescape(my_params.beschreibung)
		: unescape(my_params.veranstaltung)
	;
}

/**
 * Gibt die X-Koordinate eines Elements
 * aus dem Koordinatencache zurück
 *
 * @param {Number}
 */
function getXPos(elm)
{
	if (!pos_cache[elm.id])
		pos_cache[elm.id] = $(elm).offset();

	return pos_cache[elm.id].left;
}

/**
 * Gibt die Y-Koordinate eines Elements
 * aus dem Koordinatencache zurück
 *
 * @param {Number}
 */
function getYPos(elm)
{
	if (!pos_cache[elm.id])
		pos_cache[elm.id] = $(elm).offset();

	return pos_cache[elm.id].top;
}

/**
 * Sortiert zwei Objekte nach Entfernung
 *
 * @param {Object} a 1. Objekt mit der Eigenschaft "distance"
 * @param {Object} b 2. Objekt mit der Eigenschaft "distance"
 * @return {Number}
 */
function sortByDistance(obj1, obj2)
{
	return obj1.distance - obj2.distance;
}

/**
 * Formatiert eine Entfernungsangabe
 *
 * @param {Number} dist Entfernung in Metern
 * @return {String}
 */
function formatDistance(dist)
{
	if (dist > 1000)
		return (dist/1000).toFixed(1).replace(/\./, ",") + " km";
	else
		return Math.round(dist) + " m";
}

/**
 * Gibt zurück, ob die Regionseite vorliegt
 *
 * @return {Bool}
 */
function isRegionseite()
{
	return (location.href.indexOf("_main.php") > -1);
}

/**
 * Gibt zurück, ob nicht die Terminsuche vorliegt
 *
 * @return {Bool}
 */
function isNotTerminsuche()
{
	return (location.href.indexOf("_rubrik.php") == -1);
}

$(document).ready(function()
{
	// Mediaauswahl-Element für onmouseleave registrieren
	if (document.getElementById(ID_SELECTION))
		onMouseLeave(ID_SELECTION);

	// auf parent kann u.U. kein Zugriff möglich sein, deshalb try...catch
	try {
		// möglicherweise geöffnetes Dropdown im Elternframe schließen
		parent.dropdown.hide();

		// Buttons für Mediaauswahl im Elternframe setzen (nur aus der Regionseite heraus)
		// => da dies auch aus den Landing- und Domainpages heraus funktionieren muss,
		// wird nicht nach Regionseite getestet, sondern nach "nicht Terminsuche"!
		if (isNotTerminsuche() && parent && parent.document && parent.dropdown) {
			parent.setUmkreisButton();
			parent.document.getElementById("Tourismus_Button").style.display = show_tourismus ? "inline" : "none";

			var i, elm,
				buttons	= ["Freikarten", "Video", "Sound"],
				html = [
					createFreikartenSelection(freikarten, true),
					createRubrikMediaSelection(0, VIDEO, true),
					createRubrikMediaSelection(0, AUDIO, true)
				];

			for (i = 0, ii = buttons.length; i < ii; i++) {
				elm	= parent.document.getElementById(buttons[i]);

				if (html[i]) {
					// HTML-Text als Elementeigenschaft setzen, damit er
					// innerhalb der onmouseover-Funktion zur Verfügung steht
					elm.html			= html[i];
					elm.style.display	= "inline";
					elm.onmouseover		= function() {
						parent.dropdown.show(parent.document.getElementById(this.id+"_Button"), 0, this.html);
					};
				}
				else
					elm.style.display = "none";
			}
		}
	}
	catch (e) {}

	// Umkreisbuttons berechnen und belegen
	if (typeof umkreis == "object") {
		var dist_count = 0;
		var dist_cache = {};

		$("img[id^='inst_button_']").each(function() {
			var id 		= $(this).attr("id").split("_")[3];
			var offer	= umkreis.offers[id];
			if (offer == undefined)
				return true;

			var _offers	= new Array();
			var _offer;

			// Präsentationen durchlaufen
			for (var _id in umkreis.offers) {
				// sich selbst ignorieren
				if (_id == id)
					continue;

				_offer = umkreis.offers[_id];
				if (_offer == undefined)
					continue;

				// Rubrik zur Präsentation zuordnen
				if (!_offer.rubrik)
					_offer.rubrik = umkreis.rubriken[_offer.rubrik_id];

				// ignorieren, wenn "umkreislose" Rubrik
				if (!_offer.rubrik.is_umkreis)
					continue;

				// Entfernung über Entfernungscache -
				// Optimierung durch Vertauschen der Schlüsselpaare
				var dist = dist_cache[id+"_"+_id];
				if (!dist)
					dist = dist_cache[_id+"_"+id];
				if (!dist) {
					dist = google.maps.geometry.spherical.computeDistanceBetween(
						new google.maps.LatLng(offer.lat, offer.lng),
						new google.maps.LatLng(_offer.lat, _offer.lng)
					);
					dist_cache[id+"_"+_id] = dist;
					dist_count++;
				}

				if (dist <= umkreis.radius) {
					_offer.distance = dist;
					_offers.push(_offer);
				}
			}

			// wenn es Institutionen in der Nähe gibt
			if (_offers.length > 0) {
				// Institutionen sortieren
				_offers.sort(sortByDistance);

				// HTML-Code erzeugen und am Präsentationsobjekt speichern
				var html = "<div class='title'>Was ist in der Nähe?</div>";
				for (var i = 0, ii = _offers.length; i < ii; i++) {
					_offer = _offers[i];
					html += "<a href='"+getTourismusLink(offer.kuerzel+"_"+_offer.kuerzel)+"'>"
						+ formatDistance(_offer.distance)
						+ " - " + unescape(_offer.titel)
						+ " (" + unescape(_offer.rubrik.name) + ")</a>";
				}

				// Button belegen und einblenden
				$(this).mouseover(function() { setMediaSelection(this, offer.rubrik_id, html);}).show();
			}
		});
		//alert(dist_count);
	}
});

