if (typeof DEBUG != "function") {
	function DEBUG(message, type) {
		try {
			switch (type) {
				case undefined:
				case "log":
					console.log(message);
					break;
				case "info":
					console.info(message);
					break;
				case "warn":
					console.warn(message);
					break;
				case "error":
					console.error(message);
					break;
				default:
					// don't do anything
			}
		}
		catch (e) {}
	}
}



var Producers = {
	IMAGE1COL: 0,
	IMAGE2COL: 1,
	IMAGE3COL: 2,

	RENDER_PRODUCERS: 1,
	RENDER_PRODUCTS: 2,

	formattedContents: {
		infos: {
			left: {},
			right: {},
			menu: {}
		},
		details: {
			left: {},
			right: {},
			menu: {}
		},
		produkte: {
			left: {},
			right: {},
			menu: {}
		},
		region: {
			left: {},
			right: {},
			menu: {}
		},
		downloads: {
			left: {},
			right: {},
			menu: {}
		},
		video: {
			left: {},
			right: {},
			menu: {}
		},
		presse: {
			left: {},
			right: {},
			menu: {}
		}
	},

	// Funktionen, die nach dem Einfügen der Elemente ausgeführt werden
	runAfterInsert: {
		infos: [],
		details: [],
		produkte: [],
		region: [],
		downloads: [],
		video: [],
		presse: []
	},

	addPagingText: function(spans, text) {
		for (var i = 0; i < spans.length; i++) {
			spans[i].innerHTML = text;
		}
	},

	addTargetToLinks: function(links, target) {
		for (var i = 0; i < links.length; i++) {
			if (target == null) {
//				YAHOO.util.Dom.setAttribute(link[i], "onclick", "return false;");
			}
			else {
				YAHOO.util.Dom.setAttribute(links[i], "href", target);
			}
		}
	},

	calculateImagePosition: function(width, height, size, offset) {
		var styles = {
			w: 0,
			h: 0,
			position: "",
			top: 0
		};

		if (width > height) {
			var ratio = height / width;

			width = width / 12.0;

			if (width > size) {
				width = size;
			}
			height = width * ratio;
		}
		else {
			var ratio = width / height;

			height = height / 12.0;

			if (height > size) {
				height = size;
			}
			width = height * ratio;
		}
		var top = (size - height) / 2 + offset;
		var sign = "";

		styles.w		= "" + width + "em";
		styles.h		= "" + height + "em";
		styles.position = "relative";
		styles.top      = sign + top + "em";

		return styles;
	},

	/**
	 * Calculates the actual position of the centered image.
	 * @param {Object} image
	 * @param {Object} targetSize
	 * @see BBImages.js#Images._public.renderImages
	 */	
	centerImageInBox: function(image, targetSize, minSize) {
			// Taken from BBImages.js
			var imageSizes = new Array();
			var topOffsets = new Array();
			var width  = parseInt(YAHOO.util.Dom.getAttribute(image, "width"));
			var height = parseInt(YAHOO.util.Dom.getAttribute(image, "height"));
			var ratio;
			var top;

			if (width && height) {
				var sizeAndOffset = Producers.getImageSizeAndOffset(targetSize);
				var styles = Producers.calculateImagePosition(width, height, sizeAndOffset.size, sizeAndOffset.offset);

				if (minSize && minSize > 0) {
					if (width > minSize) {
						// Font size: 12px
						var left = (width - minSize) / 12.0 / 2.0;

						image.style.position = "relative";

						if (navigator.userAgent.match(/MSIE/)) {
							left = (left * 0.9759).toFixed(2);
						}
						image.style.left = "-" + left + "em";
					}
					// Font size: 12px
					var top = (minSize - height) / 12.0 / 2.0;

					if (navigator.userAgent.match(/MSIE/)) {
						top = (top * 0.9759).toFixed(2);
					}
					image.style.top = "" + top + "em";
				}
				else {
					image.style.width    = styles.w;
					image.style.height   = styles.h;
					image.style.position = styles.position;
					image.style.top      = styles.top;
				}
			}
			// end of image positioning
	},

	/**
	 * @deprecated
	 * @param {Object} contents
	 */
	collectGalleries: function(contents) {
		for (var category in contents) {
			if (contents[category] && contents[category].length > 0) {
				var galid = contents[category] + "_gallery";

				if (document.getElementById(galid)) {
					try {
						var galleryNode = document.getElementById(galid);
						var gallery = galleryNode.parentNode.removeChild(galleryNode);
						DEBUG("Found Gallery: " + category + " -> "+ gallery);
					}
					catch (e) {
						DEBUG("Error in collectGalleries(): " + e);
					}
				}
			}
		}
	},

	formatNewDetailContent: function(container, target, targetName, renderid) {
		/**
		 * 
		 * container: der div mit der entsprechenden id (die id wird im parameter category übergeben)
		 * 
		 * target: leeres object wie z.b.
		 * 	infos: {
				left: {},
				right: {},
				menu: {}
			}
		 * 
		 * category die ID des elements
		 * 
		 * renderid: was gerendert werden soll: produkte oder produzenten
		 */
		
		
		// Left Column
		var left = YAHOO.util.Dom.getElementsByClassName("leftColumn", "div", container)[0];
		// Right Column
		var right = YAHOO.util.Dom.getElementsByClassName("rightColumn", "div", container)[0];
		// Menu Column
		var menu = YAHOO.util.Dom.getElementsByClassName("menuColumn", "div", container)[0];

		target.left.content = new YAHOO.util.Element(document.createElement("div"));
		target.right.content = new YAHOO.util.Element(document.createElement("div"));
		target.menu.content = new YAHOO.util.Element(document.createElement("div"));

		try {
			if (renderid == Producers.RENDER_PRODUCERS) { // Produzenten
				switch (targetName) {
					case "infos":
						target.left.content.appendChild(ContentRenderer.renderAsText(Producers, left));
						target.right.content.appendChild(ContentRenderer.renderAsGallery(Producers, right));
						break;
					case "products":
						target.left.content.appendChild(ContentRenderer.renderAsText(Producers, left));
						target.right.content.appendChild(ContentRenderer.renderAsGallery(Producers, right));
						break;
					case "region":
						target.left.content.appendChild(ContentRenderer.renderAsText(Producers, left));
						target.right.content.appendChild(ContentRenderer.renderAsGMap(Producers, right, targetName));
						break;
					default:
						target.left.content.appendChild(ContentRenderer.renderAsText(Producers, left));
						target.right.content.appendChild(ContentRenderer.renderAsText(Producers, right));
				}
			}
			else if(renderid == Producers.RENDER_PRODUCTS) {
				switch (targetName) {
					case "infos":
						target.left.content.appendChild(ContentRenderer.renderAsText(Producers, left));
						target.right.content.appendChild(ContentRenderer.renderAsSimpleGallery(Producers, right));
						/*
						var link = ContentRenderer.renderAsProducerLink();
						if (link) {
							target.menu.content.appendChild(link);
						}
						*/
						break;
					default:
						target.left.content.appendChild(ContentRenderer.renderAsText(Producers, left));
						target.right.content.appendChild(ContentRenderer.renderAsText(Producers, right));
				}
			}
		}
		catch(e) {
			DEBUG("Error in formatNewDetailContent(): " + e);
		}
	},

	getImageSizeAndOffset: function(i) {
		var imageSizes = new Array();
		var topOffsets = new Array();

		if (navigator.userAgent.match(/MSIE/)) {
			// ... for Internet Explorer
			imageSizes[0] =  8.7831; /* 108px */
			topOffsets[0] =  0;      /*   0px */
			//imageSizes[1] = 19.1927; /* 236px */
			//topOffsets[1] =  0;      /*   0px */
			imageSizes[1] = 16.2650; /* 200px */
			topOffsets[1] =  1.4639; /*  18px */
			imageSizes[2] = 29.6023; /* 364px */
			topOffsets[2] =  0;      /*   0px */
			imageSizes[3] = 19.52;   /* 240px */
			topOffsets[3] =  0;      /*   0px */
			imageSizes[4] =  3.5783; /*  44px */
			topOffsets[4] =  0;      /*   0px */
			imageSizes[5] =  9.1084; /* 112px */
			topOffsets[5] =  0;      /*   0px */
		}
		else {
			// ... for other browsers
			imageSizes[0] =  9.0000; /* 108px */
			topOffsets[0] =  0;      /*   0px */
			//imageSizes[1] = 19.6667; /* 236px */
			//topOffsets[1] =  0;      /*   0px */
			imageSizes[1] = 16.6667; /* 200px */
			topOffsets[1] =  1.5000; /*  18px */
			imageSizes[2] = 30.3333; /* 364px */
			topOffsets[2] =  0;      /*   0px */
			imageSizes[3] = 20.0000; /* 240px */
			topOffsets[3] =  0;      /*   0px */
			imageSizes[4] =  3.6667; /*  44px */
			topOffsets[4] =  0;      /*   0px */
			imageSizes[5] =  9.3333; /*  112px*/
			topOffsets[5] =  0;      /*   0px */
		}
		return {
			size: imageSizes[i],
			offset: topOffsets[i]
		};
	},

	getProductProducerLink: function() {

	},

	/**
	 * Hide paging controls
	 */
	hidePaging: function() {

	},

	removeAllChildren: function(container) {
		while (container.hasChildNodes()) {
			container.removeChild(container.firstChild);
		}
	},

	renderDetailsMenu: function(contents, names, selected) {
		var menu = new YAHOO.util.Element(document.createElement("div"));
		var menuContent = new YAHOO.util.Element(document.createElement("div"));

		try {
			//menu.addClass("box1Col");
			//menu.addClass("boxBorderTop");

			for (category in contents) {
				if (contents[category].left.content || contents[category].right.content) {
					// Add entry to menu
					var attr = {
						href: "#"
					};
					var link = new YAHOO.util.Element(document.createElement("a"), attr);
					var additionalLinks = null;

					link.on("click", Producers.switchDetailsTab, category);
					link.addClass("aProdFunc");

					if (selected == names[category]) {
						link.addClass("current");
					}
					switch (names[category]) {
						// #################### Produzenten ####################
						case "producerDetail_info":
							link.appendChild(document.createTextNode("Produzenteninfos"));
							break;
						case "producerDetail_produkte":
							link.appendChild(document.createTextNode("Produkte"));
							break;
						case "producerDetail_region":
							link.appendChild(document.createTextNode("Region"));
							break;
						// #################### Produkte ####################
						case "productDetail_info":
							link.appendChild(document.createTextNode("Produktinfos"));

							if (contents[category].menu.content) {
								additionalLinks = contents[category].menu.content;
							}
							break;
					}
					if (link) {
						menuContent.appendChild(link);
					}
					// Zusätzliche Links (z.B. "Produzent")
					if (additionalLinks) {
						menuContent.appendChild(additionalLinks);
					}
				}
			}
			menu.appendChild(menuContent);
		}
		catch (e) {
			DEBUG("Error: " + e);
			menuContent = document.createElement("div");
			menuContent.innerHTML = " ";
		}
		menu.appendChild(menuContent);
		return menu;
	},

	/**
	 * Prepares the markup of the details page
	 */
	renderDetailsPage: function(rawContents) {
		var formattedContents = Producers.formattedContents;

		// Collect all relevant data
		var container = null;

		try {
			container = new YAHOO.util.Element(YAHOO.util.Dom.get("containerContent"));
		}
		catch(e) {
			return;
		}
		if (!container) {
			return;
		}
		for (var category in rawContents) {
			// Collect corresponding markup (if available)
			if (category && category.length > 0 && category != "renderid") {
				var markup = YAHOO.util.Dom.get(rawContents[category]);

				if (markup) {
					//container.removeChild(markup);
					// YAHOO.util.Dom.setAttribute(markup, "style", "display: none;");
					YAHOO.util.Dom.setStyle(markup, "display", "none");
					Producers.formatNewDetailContent(markup, formattedContents[category], category, rawContents["renderid"]);
				}
			}
		}
		
		// Get first available content
		var first = null;

		for (var category in formattedContents) {
			if (formattedContents[category].left.content || formattedContents[category].right.content) {
				// Create menu with respect to available content
				var menu = Producers.renderDetailsMenu(formattedContents, rawContents, rawContents[category]);

				//formattedContents[category].menu.content = menu;

				if (first === null) {
					first = category;
				}
			}
		}
		var newDetailContainer = Producers.renderNewDetailContainer("boxNewDetailContainer", menu);
		var spacer = document.createElement("div");

		container.appendChild(newDetailContainer);
		YAHOO.util.Dom.addClass(spacer, "doublespacer");
		container.appendChild(spacer);

		if (first) {
			Producers.switchDetailsTab(null, first);
		}
	},

	renderGallery: function() {

	},

	renderNewDetailContainer: function(id, menu) {
		var attr = {
			"id": id
		};
		var div = new YAHOO.util.Element(document.createElement("div"), attr);

		//div.addClass("boxSwitchableProducerDetails");

		try {
			var left = new YAHOO.util.Element(document.createElement("div"), {
				"id": id + "_left"
			});
			var menu = new YAHOO.util.Element(document.createElement("div"), {
				"id": id + "_menu"
			});
			var right = new YAHOO.util.Element(document.createElement("div"), {
				"id": id + "_right"
			});

/*
			left.addClass("box3Col");
			left.addClass("boxBorderTop");

			menu.addClass("box1Col");
			menu.addClass("boxBorderTop");

			right.addClass("box2Col");
*/
			//menu.addClass("box1Col");
			//menu.addClass("boxBorderTop");

			div.appendChild(left);
			//div.appendChild(menu);
			div.appendChild(right);
		}
		catch (e) {
			DEBUG("Error in renderNewDetailContainer(): " + e);
		}
		return div;
	},

	renderProducerLeadPage: function() {
		try {
			var newLinks = {
				first: null,
				prev: null,
				next: null,
				last: null,
				currentPage: null,
				totalPages: null
			};

			Producers.renderProductImages();

			// Generate Paging
			var container = new YAHOO.util.Element(YAHOO.util.Dom.get("containerProducerLead"));
			var cmsPaging = YAHOO.util.Dom.getElementsByClassName("navigate", "div", container)[0];
			var oldNavigation = container.removeChild(cmsPaging);
			var remainingPagings = YAHOO.util.Dom.getElementsByClassName("navigate", "div", container);

			for (var p = 0; p < remainingPagings.length; p++) {
				container.removeChild(remainingPagings[p]);
			}
			// get links .. index.html?a-IndexBox_0-pbe_selected_row=55&33pb-id=wd0642c8c5e769619e648633aae12bccd0a8624a51c">&gt;&gt;
			var oldLinks = YAHOO.util.Dom.getChildren(oldNavigation);

			for (var i = 0; i < oldLinks.length; i++) {
				var current = oldLinks[i];

				/**
				 * Filter page numbers
				 * The total number of pages can be extracted from an expression like
				 * <b>20&nbsp;Seiten</b>&nbsp;mit&nbsp;<b>99&nbsp;Portraits</b>
				 * 
				 * The current page is rendered as <b>1</b>
				 */
				if (current.tagName.toLowerCase() == "b") {
					// Check for # of pages
					var regEx_pages = /([0-9]+)&nbsp;([\w^<]+)/;
					var pages = current.innerHTML.match(regEx_pages);

					if (pages != null && pages[2].match(/Seite/)) {
						newLinks.totalPages = pages[1];
					}
					// check current page
					var regEx_currentPage = /^([0-9]+)$/;
					var currentPage = current.innerHTML.match(regEx_currentPage);

					if (currentPage != null) {
						newLinks.currentPage = currentPage[1];
					}
				}
				else if (current.tagName.toLowerCase() == "a") {
					var linkText = current.innerHTML;
					var linkTarget = YAHOO.util.Dom.getAttribute(current, "href");

					// "First"-Link
					if (linkText.match(/^\|&lt;$/)) {
						newLinks.first = linkTarget;
					}
					else if (linkText.match(/^&lt;$/)) {
						newLinks.prev = linkTarget;
					}
					else if (linkText.match(/^&gt;$/)) {
						newLinks.next = linkTarget;
					}
					else if (linkText.match(/^&gt;\|$/)) {
						newLinks.last = linkTarget;
					}
				}
			}
			if (!newLinks.first) {
				newLinks.first = "&a-IndexBox_0-pbe_selected_row=1";
			}
			if (!newLinks.last) {
				newLinks.last = "&a-IndexBox_0-pbe_selected_row=99999";
			}
			if (!newLinks.currentPage) {
				newLinks.currentPage = "1";
			}
		}
		catch (error) {
			if (!newLinks.currentPage) {
				newLinks.currentPage = "1";
			}
			if (!newLinks.totalPages) {
				newLinks.totalPages = "1";
			}
		}
		// Add links to page
		var pagingContainer = YAHOO.util.Dom.get("containerContentInner");
		var first = YAHOO.util.Dom.getElementsByClassName("paging_firstPage", "a", pagingContainer);
		var prev  = YAHOO.util.Dom.getElementsByClassName("paging_prevPage", "a", pagingContainer);
		var next  = YAHOO.util.Dom.getElementsByClassName("paging_nextPage", "a", pagingContainer);
		var last  = YAHOO.util.Dom.getElementsByClassName("paging_lastPage", "a", pagingContainer);
		var currentPage = YAHOO.util.Dom.getElementsByClassName("spanPageNo", "span", pagingContainer);
		var totalPages  = YAHOO.util.Dom.getElementsByClassName("spanPageMax", "span", pagingContainer);

		Producers.addTargetToLinks(first, newLinks.first);
		Producers.addTargetToLinks(prev, newLinks.prev);
		Producers.addTargetToLinks(next, newLinks.next);
		Producers.addTargetToLinks(last, newLinks.last);

		Producers.addPagingText(currentPage, newLinks.currentPage);
		Producers.addPagingText(totalPages, newLinks.totalPages);
	},

	renderProducers: function() {
		var rawContents = {
			renderid: Producers.RENDER_PRODUCERS,
			infos: "producerDetail_info",
			details: "",
			produkte: "producerDetail_produkte",
			region: "producerDetail_region",
			downloads: "producerDetail_downloads",
			video: "producerDetail_video",
			presse: "producerDetail_presse"
		};

		Producers.renderDetailsPage(rawContents);

		// fix DOM according to Galke layout
		try {
			var oGallerySource = document.getElementById("boxNewDetailContainer");
			var oGalleryTarget = YAHOO.util.Dom.getElementsBy(function(elem) {
				return YAHOO.util.Dom.hasClass(elem, "box2Col");
			}, "div", "containerContent")[0];
			var oGallery = YAHOO.util.Dom.getElementsByClassName("boxVianiGallery", "div", oGallerySource)[0];

			YAHOO.util.Dom.replaceClass(oGallery, "boxVianiGallery", "boxPhotoViewer");
			oGalleryTarget.appendChild(oGallery);
			oGallerySource.parentNode.removeChild(oGallerySource);
		}
		catch (e) {}
	},

	/**
	 * Renders the images next to the description properly.
	 */
	renderProductImages: function() {
		try {
			var imageBoxes = YAHOO.util.Dom.getElementsByClassName("boxProducerLeadImages", "div");
			var newImages = new Array();

			for (var i = 0; i < imageBoxes.length; i++) {
				Producers.renderSingleImageBox(imageBoxes[i]);
			}
		}
		catch(e) {
			DEBUG("Error in renderProductImages(): " + e);
		}
	},

	renderProducts: function() {
		var rawContents = {
			renderid: Producers.RENDER_PRODUCTS,
			infos: "productDetail_info",
			details: "productDetail_details",
			produzent: "productDetail_produzent",
			downloads: "productDetail_downloads",
			video: "productDetail_video",
			presse: "productDetail_presse"
		};

		Producers.renderDetailsPage(rawContents);
	},

	/**
	 * Centers the images vertically in their surrounding box and removes the dotted border from images that
	 * do not show products.
	 * @param {Object} box
	 */
	renderSingleImageBox: function(box) {
		var detailLinks = YAHOO.util.Dom.getElementsByClassName("imageGeneralOrProduct", "a", box);

		for (var i = 0; i < detailLinks.length; i++) {
			var anchor = detailLinks[i];
			var image = YAHOO.util.Dom.getFirstChild(anchor);
			if (image) {
				Producers.centerImageInBox(image, 5, 112); // Size ID 5 -> 112x112px
				// check whether this image is a product image or not
/*
				var result = image.src.match(/v[0-9]{4}-[0-9]{2}.*\.[a-zA-Z]{3,4}$/);

				if (result === null && image.width == 108 && image.height == 108) {
					// No product pic, remove border
					var upperLeft = YAHOO.util.Dom.getAncestorByClassName(anchor, "boxProdUL boxUL");
					var lowerRight = YAHOO.util.Dom.getAncestorByClassName(anchor, "boxProdLR boxLR");

					upperLeft = new YAHOO.util.Element(upperLeft);
					lowerRight = new YAHOO.util.Element(lowerRight);

					upperLeft.removeClass("boxUL");
					upperLeft.removeClass("boxProdUL");
					lowerRight.removeClass("boxLR");
					lowerRight.removeClass("boxProdLR");
				}
*/
			}
			// Add Border
			var borderContainer = document.createElement("div");
			var borderOuter = document.createElement("div");
			var borderInner = document.createElement("div");

			YAHOO.util.Dom.addClass(borderOuter, "boxProdUL");
			YAHOO.util.Dom.addClass(borderOuter, "boxUL");
			YAHOO.util.Dom.addClass(borderInner, "boxProdLR");
			YAHOO.util.Dom.addClass(borderInner, "boxLR");
			YAHOO.util.Dom.addClass(borderContainer, "borderOnTop");

			borderOuter.appendChild(borderInner);
			borderContainer.appendChild(borderOuter);

			detailLinks[i].appendChild(borderContainer);
		}
	},

	switchDetailsTab: function(event, newtabid) {
		DEBUG("Switching to tab " + newtabid);

		if (newtabid == null || !Producers.formattedContents[newtabid]) {
			DEBUG("Error: the supplied identifier is invalid. There is no content for this identifier.");
			return;
		}
		try {
			var container_left = YAHOO.util.Dom.get("boxNewDetailContainer_left");
			//var container_menu = YAHOO.util.Dom.get("boxNewDetailContainer_menu");
			var container_right = YAHOO.util.Dom.get("boxNewDetailContainer_right");

			Producers.removeAllChildren(container_left);
			//Producers.removeAllChildren(container_menu);
			Producers.removeAllChildren(container_right);

			container_left = new YAHOO.util.Element(container_left);
			//container_menu = new YAHOO.util.Element(container_menu);
			container_right = new YAHOO.util.Element(container_right);

			var newContent_left = Producers.formattedContents[newtabid].left.content;
			var newContent_right = Producers.formattedContents[newtabid].right.content;

			// Referenz linker Container
			if (Producers.formattedContents[newtabid].left.reference) {
				try {
					var refTabId = Producers.formattedContents[newtabid].left.reference.tabid;
					var refBox = Producers.formattedContents[newtabid].left.reference.box;

					if (Producers.formattedContents[refTabId][refBox].content) {
						newContent_left = Producers.formattedContents[refTabId][refBox].content;
					}
				}
				catch (e) {
					DEBUG("Error while resolving reference (" + newtabid + " - left): " + e);
				}
			}
			// Referenz rechter Container
			if (Producers.formattedContents[newtabid].right.reference) {
				try {
					var refTabId = Producers.formattedContents[newtabid].right.reference.tabid;
					var refBox = Producers.formattedContents[newtabid].right.reference.box;

					if (Producers.formattedContents[refTabId][refBox].content) {
						newContent_right = Producers.formattedContents[refTabId][refBox].content;
					}
				}
				catch (e) {
					DEBUG("Error while resolving reference (" + newtabid + " - right): " + e);
				}
			}
			container_left.appendChild(newContent_left);
			//container_menu.appendChild(Producers.formattedContents[newtabid].menu.content);
			container_right.appendChild(newContent_right);

			if (Producers.runAfterInsert[newtabid] && Producers.runAfterInsert[newtabid].length > 0) {
				for (var i = 0; i < Producers.runAfterInsert[newtabid].length; i++) {
					var fnc = Producers.runAfterInsert[newtabid][i];

					try {
						fnc();
					}
					catch (e) {
						DEBUG("Error in afterInsert-Function " + fnc + "(): " + e);
					}
				}
			}
		}
		catch(e) {
			DEBUG("Error: " + e);
		}
	}
};

