var GapaMedia = function() {
	// Referenz zur aktuellen Instanz
	var that = this;
	
	// Private
	var loading = false;
	var galleryItems = null;
	var galleryName = "Galerie";
	var galleryType = 0;
	var currentGallery = null;
	var selectedItemId = null;
	
	function createNewGallery() {
		$("#boxMediaTeaser h3").html(galleryName);
		// Livecams
		loadGallery();
	};
	
	function loadGallery() {
		if (loading) return;
		
		$.ajax({
			url: "/_xml/media.xml",
			cache: false,
			dataType: "xml",
			data: {
				type: galleryType
			},
			
			success: function(data) {
				galleryItems = data;
				showTeaser('');
				loading = false;
				
				// Nachdem die Teaser geladen sind, suche aktivieren
				$('#mediathekSearchQuery').closest('form').submit(function() {
					
					var query = $('#mediathekSearchQuery').val();

					showTeaser(query);
					
					return false;
				});
				
				$('#mediathekSubmitSearch').click(function() {
					$('#mediathekSearchQuery').closest('form').submit();
				});
			},
			
			error: function (XMLHttpRequest, textStatus, errorThrown) {
				loading = false;
			}
			
		});
	};
	
	function showDetail(element) {
		if (!galleryItems) return;
		
		var elementId = $(element).attr("href");
		elementId = elementId.substring(1, elementId.length);

		if (!elementId || elementId <= 0) {
			return;
		}
		
		var detailContainer = $("#mediathekMediaModule");
		
		try {
			var root = galleryItems.getElementsByTagName("mediathek")[0];
			var contentParser = rawContentParser;
			
			if (galleryType == 1) {
				contentParser = videoPlayerParser;
			} else if (galleryType == 2) {
				contentParser = audioPlayerParser;
			} else if (galleryType == 3) {
				contentParser = livecamURLParser;
			} else {
				contentParser = galleryLinkParser;
			}
			
			for (var i = 0; i < root.childNodes.length; i++) {
				var media = root.childNodes[i];

				if (media.nodeName.toLowerCase() == "media") {
					var currentMediaId = media.getAttribute("id");
					var currentMediaType = media.getAttribute("type");
					
					if (currentMediaId == elementId) {
						for (var j = 0; j < media.childNodes.length; j++) {
							var child = media.childNodes[j];
							
							switch (child.nodeName.toLowerCase()) {
								case 'detail':
									var data = contentParser(child.firstChild.nodeValue);
									
									if (!data.doNotRender) {
										detailContainer.html(data.html);
									}
									
									if (data.prepend) {
										$('#mediathekMediaPrepend').html(data.prepend);
									}
									
									if (data.remcont) {
										$("#mediathekMediaInfo").html(data.remcont);
									}
									
									if (currentMediaType == 0) {
										try {
											currentGallery.pause();
										} catch(e) {
											//log(e);
										}
										currentGallery = new GalleryViewer();
										currentGallery.init(data.info, "mediathekMediaModule");
									}
									
								break;
							}
						}
						
						break;
					}
				}
			}
			
		} catch(e) {
			//log("Error rendering detail: " + e);
		}
	};
	
	function showTeaser(filter) {
		if (!galleryItems) return;
		
		if (filter.toLowerCase() == "finden") {
			filter = "";
		}
		
		var teaserContainer = $("#boxMediaTeaser ul");
		teaserContainer.html('');
		// Erstes Element merken und sofort im Detail anzeigen
		var first = null;
		
		try {
			var root = galleryItems.getElementsByTagName("mediathek")[0];
			var countMedia = 0;
			
			for (var i = 0; i < root.childNodes.length; i++) {
				var media = root.childNodes[i];

				if (media.nodeName.toLowerCase() == "media") {
					var currentMediaId = media.getAttribute("id");
					
					for (var j = 0; j < media.childNodes.length; j++) {
						var child = media.childNodes[j];
						
						switch (child.nodeName.toLowerCase()) {
							case 'index':
								if (filter && filter.length > 0) {
									var tmp = $('<span/>').html(child.firstChild.nodeValue);
									var headline = tmp.find('strong').html();
									var text = tmp.find('span').html();
									
									if (text.toLowerCase().indexOf('</strong>') >= 0) {
										var splitted;

										if (navigator.userAgent.match(/MSIE/)) {
											splitted = text.split('</STRONG>');
										}
										else {
											splitted = text.split('</strong>');
										}
										text = splitted[1];
									}
									
									filter = filter.toLowerCase();
									
									if (headline.toLowerCase().indexOf(filter) < 0 && text.toLowerCase().indexOf(filter) < 0) {
										break;
									}
								}
								
								var teaser = $('<li><a href="#"></a></li>');
								teaser.find("a").attr("href", "#" + currentMediaId)
									.html(child.firstChild.nodeValue + "<br/>")
									.click(function() {
										// log(this);
										showDetail(this);
									}
								);

								if (countMedia % 2 == 1) {
									teaser.addClass("even");
								}
								
								teaserContainer.append(teaser);

								if (selectedItemId == 0 && !first) {
									first = teaser;
								} else if (!first && selectedItemId > 0 && selectedItemId == currentMediaId) {
									first = teaser;
								}
								
								countMedia++;
								break;
						}
					}
				}
			}
			
			// Erstes Element anzeigen
			if (first) {
				first.find("a").click();
			}

		} catch(e) {
			//log("Error rendering teaser: " + e);
		}
	};
	
	// Detail parser functions
	function rawContentParser(content) {
		return {html: content, info: null, remcont: null};
	};
	
	function audioPlayerParser(content) {
		var newContent = $(content);
		var container = '';
		var link = newContent.find('a').attr('href');
		var imgData = newContent.find('img');
		
		var flashvars = {
			mp3: link,
			autoplay: true,
			backcolor: '000000',
			frontcolor: 'ffffff'
		};
		var params = {
			allowFullScreen: true
		};
		var attributes = {};
		swfobject.embedSWF("/lib/player.swf", "mediathekMediaModule", "484", "27", "9.0.0", false, flashvars, params, attributes);
		
		var remainder = new Array();
		
		newContent.each(function(i, element) {
			if (!$(element).hasClass("audiolink")) {
				remainder.push(element);
			}
		});
		
		return {html: container, info: null, remcont: remainder, doNotRender: true, prepend: imgData};
	};
	
	function videoPlayerParser(content) {
		var newContent = $(content);
		var container = '';
		var link = newContent.find('a').attr('href');
		
		var flashvars = {
			flv: link,
			autoplay: true,
			backcolor: '000000',
			frontcolor: 'ffffff'
		};
		var params = {
			allowFullScreen: true
		};
		var attributes = {};
		
		setTimeout(function() {
			swfobject.embedSWF("/lib/player.swf", "mediathekMediaModule", "484", "390", "9.0.0", false, flashvars, params, attributes);
		}, 1000);
		
		var remainder = new Array();
		
		newContent.each(function(i, element) {
			if (!$(element).hasClass("videolink")) {
				remainder.push(element);
			}
		});
		
		return {html: container, info: null, remcont: remainder, doNotRender: true};
	};
	
	function livecamURLParser(content) {
		var newContent = $(content);
		var container = $('<div><div class="player"></div><div class="controlbar"></div></div>');
		
		var now = new Date();
		var src_tn = newContent.find('span.thumb').html();
		var src_full = newContent.find('span.full').text();
		
		src_tn += (src_tn.indexOf('?') >= 0 ? '&' : '?') + 'dummy=' + now.getTime().toString(10);
		src_full += (src_full.indexOf('?') >= 0 ? '&' : '?') + 'dummy=' + now.getTime().toString(10);
		

		var image_tn = $('<img alt=""/>');
		image_tn.attr('src', src_tn)
			.css("display", "inline");
		
		
		var link = $('<a rel="livecam"></a>')
			.attr('href', src_full)
			.append(image_tn);
		
		tb_init(link);
		container.find(".player").append(link);

		var remainder = new Array();
		
		newContent.each(function(i, element) {
			if (!$(element).hasClass("mediainfo")) {
				remainder.push(element);
			}
		});
		
		return {html: container, info: null, remcont: remainder};
	};
	
	function galleryLinkParser(content) {
		var newContent = $(content);
		var url = newContent.find(".galleryXMLLink").text();

		var remainder = new Array();
		
		newContent.each(function(i, element) {
			if (!$(element).hasClass("mediainfo")) {
				remainder.push(element);
			}
		});
		
		return {html: "", info: url, remcont: remainder};
	};
	
	
	// Public
	/**
	 * type:
	 * 0 - Bildergalerie
	 * 1 - Videos
	 * 2 - Audio
	 * @param {Object} type
	 */
	this.init = function(type, name, title, selected) {
		if (type >= 0 && type <= 3) {
			galleryType = type;
		}
		
		if (selected && selected >= 0) {
			selectedItemId = selected;
		} else {
			selectedItemId = 0;
		}
		
		// Möglich Klassen: videos/photos/livecams/audio
		
		$(".mediaShow").removeClass("videos").removeClass("photos").removeClass("livecams").removeClass("audio");
		
		var cssclass = "photos";

		if (type == 1) {
			cssclass = "videos";
		} else if (type == 2) {
			cssclass = "audio";
		} else if (type == 3) {
			cssclass = "livecams";
		}
		
		$(".mediaShow").addClass(cssclass);
		
		$(".mediaShow p.top").html(title);
		
		galleryName = name;
	};
	
	this.show = function() {
		createNewGallery();
	};
};

var GalleryViewer = function() {
	// Referenz zur aktuellen Instanz
	var that = this;
	
	var source = null;
	var containerId = null;
	var reloadCounter = 0;
	
	var galleryXML = null;
	var galleryItems = [];
	
	var currentImage = 0;
	var numImages = 0;
	var player = $('<div class="player"></div>');
	
	var galleryInterval;
	
	function loadGallery() {
		$.ajax({
			url: (source.charAt(0) == "/" ? "" : "/") + source,
			cache: false,
			dataType: "xml",
			
			success: function(data) {
				galleryXML = data;
				prepareGallery();
			},
			
			error: function (XMLHttpRequest, textStatus, errorThrown) {
				reloadCounter++;
				
				if (reloadCounter <= 2) {
					loadGallery();
				}
			}
			
		});
	};
	
	
	function prepareGallery() {
		if (!galleryXML) return;
		
		try {
			var root = galleryXML.getElementsByTagName("photos")[0];
			
			for (var i = 0; i < root.childNodes.length; i++) {
				var photo = root.childNodes[i];

				var photoObject = {
					thumb: null,
					full: null
				};
				
				for (var j = 0; j < photo.childNodes.length; j++) {
					var info = photo.childNodes[j];
					
					switch (info.tagName.toLowerCase()) {
						case 'fullsource':
							photoObject.full = info.firstChild.nodeValue;
						break;
						
						case 'thumbsource':
							photoObject.thumb = info.firstChild.nodeValue;
						break;
					}
				}
				
				if (photoObject.thumb && photoObject.full) {
					galleryItems.push(photoObject);
				}
			}
		
			renderGallery();
		
		} catch(e) {
			//log("Error preparing gallery: " + e);
		}
	};
	
	function renderGallery() {
		if (!galleryItems || galleryItems.length == 0) return;
		
		// Fallback
		if (!gallery_picture) gallery_picture = "Bild";
		if (!gallery_of) gallery_of = "von";
		
		var player = $('#' + containerId).html('<div class="player">Player</div><div class="controlbar">' +
			'<a class="prev" href="javascript:void(0);"><img src="/img/content/prev.gif" alt=""/></a>' +
			'<a style="display:none;" class="pause" href="javascript:void(0);"><img src="/img/content/pause.gif" alt=""/></a>' +
			'<a class="play" href="javascript:void(0);"><img src="/img/content/play.gif" alt=""/></a>' +
			'<a class="next" href="javascript:void(0);"><img src="/img/content/next.gif" alt=""/></a>' +
			'<span class="leftcon" style="float:left;">' + gallery_picture + '  <span class="current">1</span> ' + gallery_of + ' <span class="total">1</span></span>' +
			'<span class="rightcon" style="float:right;"><a class="fullscreen" href="javascript:void(0);"><img src="/img/content/fullscreen.gif" alt=""/></a></span></div>');
		
		var list = $("<span></span>");
		var hiddenContainer = $("<span></span>");
		
		for (var i = 0; i < galleryItems.length; i++) {
			var pic = galleryItems[i];
			
			var link = $('<a rel="gapa-gallery"/>').attr("href", pic.full)
				.append(
					$('<img alt=""/>')
				);

			list.append(link);
			hiddenContainer.append(link);
			tb_init(link);
			galleryItems[i].html = link;
		}
		
		$("#mediathekImageContainer").html(hiddenContainer);
		
		currentImage = 0;
		numImages = galleryItems.length;
		that.showPicture(currentImage);
		
		// Add functions
		
		$('#' + containerId).find('a.prev').click(function() {
			that.prev();
		});
		
		$('#' + containerId).find('a.next').click(function() {
			that.next();
		});
		
		$('#' + containerId).find('span.total').html(numImages);
		
		$('#' + containerId).find('a.play').click(function() {
			that.play();
		});
		
		$('#' + containerId).find('a.pause').click(function() {
			that.pause();
		});
		
		$('#' + containerId).find('a.fullscreen').click(function() {
			that.fullscreen();
		});
	};
	
	// Public
	this.init = function(sourceXML, renderTo) {
		source = sourceXML;
		containerId = renderTo;
		
		if ($('#' + containerId)) {
			loadGallery();
		}
		
		
		// $('#' + containerId).html(player)
	};
	
	this.showPicture = function(num) {
		currentImage = num;
		if (currentImage < 0) {
			currentImage = (numImages - 1 < 0 ? 0 : numImages - 1);
		}
		
		if (currentImage >= numImages) {
			currentImage = 0;
		}
		
		$('#' + containerId).find('span.current').html(currentImage + 1);
		var player = $('#' + containerId + ' .player');
		
		try {
			var pic = galleryItems[currentImage];
			$(pic.html).find('img').attr('src', pic.thumb)
			
			var clone = pic.html.clone();
			var rel = clone.attr('rel');
			clone.attr('rel', '').attr('relref', rel);
			
			tb_init(clone);
			player.html(clone);
		} catch(e) {
			//log("Error in 'this.showPicture': " + e);
		}
	};
	
	this.next = function() {
		that.showPicture(currentImage + 1);
	};
	
	this.prev = function() {
		that.showPicture(currentImage - 1);
	};
	
	this.play = function() {
		$('#' + containerId).find('a.play').hide();
		$('#' + containerId).find('a.pause').show();
		
		that.next();
		galleryInterval = window.setInterval(function() {
			that.next();
		}, 6000);
	};
	
	this.pause = function() {
		$('#' + containerId).find('a.pause').hide();
		$('#' + containerId).find('a.play').show();
		try {
			window.clearInterval(galleryInterval);
		} catch (e) {}
	};
	
	this.fullscreen = function() {
		try {
			var link = galleryItems[currentImage].html;
			link.click();
		} catch(e) {
			//log("Undefined image # " + currentImage);
		}
		
		that.pause();
		
	};
	
};
