Object.extend(Object, (function()
{
	function fromArray(key, array)
	{
		var url = "";
		array.each(function(value)
		{
			if (Object.isArray(value))
			{
				url = url + (url != "" ? "/" : "") + fromArray(key, value);
			}
			else
			{
				url = url + (url != "" ? "/" : "") + key + "/" + String(value).replace("/", "%2F");
			}
		});

		return url;
	}

	return {
		queryParamsToURI: function(url, parameters)
		{
			if (Object.isString(parameters)) parameters = parameters.toQueryParams();
			parameters = parameters || {};

			if (Object.isUndefined(parameters.page)) parameters.page = "start";
			url = url + (url.substr(-1) != "/" ? "/" : "") + parameters.page;
			parameters.page = undefined;

			// cmd
			if (!Object.isUndefined(parameters.cmd))
			{
				url = url + "/" + parameters.cmd;
				parameters.cmd = undefined;
			}

			// values
			Object.keys(parameters).each(function(key)
			{
				if (!Object.isUndefined(parameters[key]))
				{
					if (Object.isArray(parameters[key]))
					{
						url = url + "/" + fromArray(key, parameters[key]);
					}
					else
					{
						url = url + "/" + key + "/" + String(parameters[key]).replace("/", "%2F");
					}
				}
			});

			return url;
		}
	};
})());
Object.extend(String.prototype,
{
	queryParamsToURI: function(url)
	{
		return Object.queryParamsToURI(url, this.toQueryParams());
	},

	uriToQueryParams: function()
	{
		var data = this.replace(Sapodo.startPage, "");
		var name = null;

		if (data.startsWith("/"))
		{
			data = data.substr(1);
		}
		data = $A(data.split("/"));

		// erste ist immer PAGE
		var result = { page: data.shift() };

		// wenn ungerade ist jetzt das erste CMD
		if (data.length % 2 == 1) // mit cmd
		{
			result.cmd = data.shift();
		}

		data.each(function(entry, index)
		{
			if (index % 2 == 0)
			{
				name = entry;
			}
			else
			{
				result[name] = entry;
			}
		});

		return result;
	}
});
window.get = document.get = window.get.wrap(function(proceed, url, parameters) { proceed(Object.queryParamsToURI(url, parameters), {}); });

var Sapodo = (function()
{
	var sapodoId		= 0;
	var scripts			= $A([]);
	var styles			= $A([]);
	var translationKeys	= $A([]);

	/**
	 * testet ob das angegebene Script schon geladen ist
	 *
	 * @access private
	 * @return bool
	 **/
	function isScriptLoaded(script)
	{
		if (scripts.length == 0)
			$$("script[src]").each(function(loadedScript)
			{
				scripts.push(
				{
					src:		loadedScript.src.replace(Sapodo.startPage, ""),
					id:			loadedScript.id,
					defer:		loadedScript.defer,
					defaultURL:	false
				});
			});

		return scripts.find(function(loadedScript) { return loadedScript.src == script.src; });
	}

	/**
	 * testet ob das angegebene Style schon geladen ist
	 *
	 * @access private
	 * @return bool
	 **/
	function isStyleLoaded(style)
	{
		if (styles.length == 0)
			$$("link[type=text/css]").each(function(loadedStyle)
			{
				styles.push(
				{
					src:		loadedStyle.href.replace(Sapodo.startPage, ""),
					id:			loadedStyle.id,
					defaultURL:	false
				});
			});

		return styles.find(function(loadedStyle) { return loadedStyle.src == style.src; });
	}

	return Object.extend(
	{
		/**
		 * standard content type für den empfang von ajax daten
		 *
		 * @var string
		 * @access public
		 **/
		AJAX_CONTENTTYPE:	"application/json",

		/**
		 * url zum image pfad
		 *
		 * @var string
		 * @access public
		 **/
		imageUrl: "/ressources",

		/**
		 * das window wurde geladen
		 *
		 * @var bool
		 * @access public
		 **/
		loaded: false,

		/**
		 * URL zum Flash
		 *
		 * @var string
		 * @access private
		 **/
		flashUrl: '/',

		/**
		 * URL zu den Scripten
		 *
		 * @var string
		 * @access private
		 **/
		scriptUrl: '/',

		/**
		 * starturl
		 *
		 * @var string
		 * @public access
		 **/
		startPage:		"/",

		/**
		 * URL zu den Styles
		 *
		 * @var string
		 * @access private
		 **/
		styleUrl: '/',

		/**
		 * fügt beliebig viele übersetzungen hinzu
		 *
		 * @param object|array translations [{key: "", value: ""}, ...]
		 * @access public
		 **/
		addTranslation: function(translations)
		{
			if (translations == null)
			{
				return;
			}
			if (Object.isArray(translations))
			{
				$A(translations).each(Sapodo.addTranslation);
			}
			else
			{
				translationKeys[translations.key] = translations.value;
			}
		},

		/**
		 * ajax request via Prototype mit zusätzlichen optionen
		 * es werden dann an onSuccess nur die JSON Daten geliefert entsprechend evaluiert
		 *
		 *	weitere options
		 *		name		type					default		description
		 *		====================================================================
		 *		dimmer			bool	optional		true		zeigt den dimmer an
		 *		ajaxContentType	string	optional		Sapodo.AJAX_CONTENTTYPE
		 *
		 * @param object options Ajax Request Options see: http://prototypejs.org/api/ajax/options
		 * @return Ajax.Request
		 **/
		ajax: function(options)
		{
			var on =
			{
				create:		options.onCreate	|| function() {},
				complete:	options.onComplete	|| function() {},
				failure:	options.onFailure	|| function() {},
				success:	options.onSuccess	|| function() {}
			};

			options.method = "post";
			options.ajaxContentType = options.ajaxContentType || Sapodo.AJAX_CONTENTTYPE;
			if (Object.isUndefined(options.dimmer)) options.dimmer = true;

			Object.extend(options || {},
			{
				onCreate: function (transport)
				{
					if (options.dimmer) dimmer.show();
					on.create(transport);
				},

				onComplete: function (transport)
				{
					if (transport.getResponseHeader("Content-Type").indexOf(options.ajaxContentType) == -1)
					{
						return;
					}

					if (options.ajaxContentType == "application/json")
					{
						var data = Sapodo.getAjaxResponse(transport.responseJSON, true);
					}

					else if (options.ajaxContentType == "text/plain")
					{
						var data = Sapodo.getAjaxResponse(transport.responseText.evalJSON(), true);
					}

					else if (options.ajaxContentType == "text/html")
					{
						var data = Sapodo.getAjaxResponse(transport.responseText.evalJSON(), true);
					}

					else
					{
						throw "Unkown Ajax Response Content Type in Sapodo.ajax.onComplete!";
					}

					if (Object.isUndefined(data))
					{
						return;
					}

					on.complete(transport);

					if (!Object.isUndefined(window.jControls) && !Prototype.Browser.isIE6)
					{
						jControls.QuickTip.autoload();
					}
					if (!Object.isUndefined(Sapodo.formFix))
					{
						Sapodo.formFix();
					}

					if (options.dimmer)
					{
						dimmer.hide();
					}
				},

				onFailure: function()
				{
					if (on.failure() === false) return;
					Sapodo.alert("tr_ajaxrequest_error_startpage");
					window.get(Sapodo.startPage, { logout: 1 });
				},

				onSuccess: function (transport)
				{
					if (transport.getResponseHeader("Content-Type").indexOf(options.ajaxContentType) == -1)
					{
						if (on.failure() === false) return;
						Sapodo.alert("tr_ajaxrequest_error_startpage");
						window.get(Sapodo.startPage, Object.extend(options.parameters || {}, { ajax: 0 }));
						return;
					}

					if (options.ajaxContentType == "application/json")
					{
						var data = Sapodo.getAjaxResponse(transport.responseJSON);
					}

					else if (options.ajaxContentType == "text/plain")
					{
						var data = Sapodo.getAjaxResponse(transport.responseText.evalJSON());
					}

					else if (options.ajaxContentType == "text/html")
					{
						var data = Sapodo.getAjaxResponse(transport.responseText.evalJSON());
					}

					else
					{
						throw "Unkown Ajax Response Content Type in Sapodo.ajax!";
					}

					if (Object.isUndefined(data))
					{
						return;
					}
					else if(!Object.isUndefined(data.errorResponse) && data.errorResponse === false)
					{
						on.failure();
						return;
					}

					on.success(data);
				}
			});

			// parameters anpassen und das flags ajax=1 setzen
			if (Object.isString(options.parameters)) options.parameters = options.parameters.toQueryParams();
			options.parameters = Object.extend(options.parameters || {}, { ajax: 1 });

			return new Ajax.Request( Sapodo.startPage, options );
		},

		/**
		 * zeigt eine meldung an, wobei aber die meldung via TR Key angegeben wird
		 * und dieser key via Ajax aufgelöst wird
		 *
		 * @param string key der TR Key
		 **/
		alert: function(key)
		{
			alert(this.getTranslation(key));
		},

		/**
		 * confirm via TR key
		 *
		 * @param string key
		 * @return bool
		 **/
		confirm: function(key)
		{
			return confirm(this.getTranslation(key));
		},

		/**
		 * holt sich den Ajax Response und führt ggf. alle Standard Aktionen aus
		 *
		 * @param object ajaxData pure Ajax Daten
		 * @param bool getOnly nur daten holen nicht aktionen ausführen (default = false)
		 * @access public
		 * @return object
		 **/
		getAjaxResponse: function(ajaxData, getOnly)
		{
			function reload()
			{
				//window.get(Sapodo.startPage, window.location.search.toQueryParams());
				window.location.reload();
			}

			if (Object.isUndefined(getOnly))
			{
				getOnly = false;
			}

			// ajax Daten müssen schon irgendwas sein
			if (!ajaxData)
			{
				if (!getOnly)
				{
					reload();
				}
				return;
			}

			// Daten strutkur muss auch da sein vom response
			if (Object.isUndefined(ajaxData.data))
			{
				if (!getOnly)
				{
					throw "Missing Data Struktur in Ajax Response!";
				}
				return;
			}

			// seite neu laden
			if (!Object.isUndefined(ajaxData.reload) && ajaxData.reload)
			{
				if (!getOnly)
				{
					reload();
				}
				return;

			}

			// auf eine andere seite weiterleiten
			if (!Object.isUndefined(ajaxData.redirect) && ajaxData.redirect)
			{
				if (!getOnly)
				{
					window.location.href = ajaxData.redirect;
				}
				return;

			}

			// fehlermeldungen ausgeben
			if (!getOnly && !Object.isUndefined(ajaxData.error_arr))
			{
				if (typeof ajaxData.error_arr == "object" && !Object.isArray(ajaxData.error_arr) && !Object.isString(ajaxData.error_arr))
				{
					ajaxData.error_arr = Object.values(ajaxData.error_arr);
				}

				if (Object.isArray(ajaxData.error_arr))
				{
					alert(ajaxData.error_arr.join("\n\n"));
				}
				else if (Object.isString(ajaxData.error_arr))
				{
					if (ajaxData.error_arr.indexOf("%") != -1)
					{
						(function()
						{
							Sapodo.alert(ajaxData.error_arr);
						}).defer();
					}
					else
					{
						alert(ajaxData.error_arr);
					}
				}

				return {errorResponse: false};
			}

			// CSS Files einbinden
			if (Object.isArray(ajaxData.styles))
			{
				ajaxData.styles.each(function(style)
				{
					Sapodo.insertStyle(
					{
						src:		style,
						defaultUrl:	false
					});
				});
			}

			// CSS Blöcke definieren
			if (Object.isArray(ajaxData.styleDeclaration))
			{
				ajaxData.styleDeclaration.each(function(style) { document.createCSSDeclaration(style); });
			}

			// JS Files einbinden
			if (Object.isArray(ajaxData.scripts))
			{
				ajaxData.scripts.each(function(script)
				{
					Sapodo.insertScript(
					{
						src:		script,
						defaultUrl:	false
					});
				});
			}

			// JS Blöcke evaluieren
			if (Object.isArray(ajaxData.scriptDeclaration))
			{
				ajaxData.scriptDeclaration.each(function(script) { try { eval(script); } catch(e) { } });
			}

			// Meldungen ausgeben
			if (!getOnly && !Object.isUndefined(ajaxData.msg))
			{
				alert(ajaxData.msg.join("\n"));

			}

			// nackte Daten ausgeben
			return ajaxData.data;
		},

		/**
		 * liefert eine eineindeutige ID
		 *
		 * @access public
		 * @return int
		 **/
		getId: function()
		{
			sapodoId++;
			return sapodoId;
		},

		/**
		 * liefert von einem Key die übersetzung für den aktuellen user
		 *
		 * @param string key
		 * @param string key
		 * @param string ...
		 * @return array|string
		 **/
		getTranslation: function()
		{
			var bComplete = false;

			if (arguments.length < 1 && arguments[0] === undefined)
			{
				return "";
			}
			var keys = $A(arguments);
			keys = keys.flatten().uniq();

			var requestKeys = keys.findAll(function(requestKey)
			{
				return Object.isUndefined(translationKeys[requestKey]);
			}, this);
			if (requestKeys.length != 0 && Sapodo.loaded)
			{
				var ajax = this.ajax(
				{
					asynchronous:	false,
					dimmer:			false,
					parameters:
					{
						page:		"tools",
						cmd:		"translate",
						"key[]":	requestKeys
					},
					onSuccess:	(function(data)
					{
						if (Object.isArray(data))
						{
							requestKeys.each(function(requestKey, index)
							{
								translationKeys[requestKey] = data[index];
							}, this);
						}

						else
						{
							requestKeys.each(function(requestKey, index)
							{
								translationKeys[requestKey] = "Error with Translationkey: " + requestKey;
							}, this);
						}

					}).bind(this),
					onFailure:	function()
					{
						requestKeys.each(function(requestKey, index)
						{
							translationKeys[requestKey] = "Error with Translationkey: " + requestKey;
						}, this);
					},
					onComplete:	function()
					{
						bComplete = true;
					}
				});

				while(!bComplete) {}

			}
			else if (requestKeys.length != 0 && !Sapodo.loaded)
			{
				alert("Page is not loaded. No Translation Request possible!!!");
			}

			if (keys.length == 1)
			{
				return translationKeys[keys[0]];
			}
			else
			{
				return keys.inject([], function(acc, key, index)
				{
					acc[index] = translationKeys[key];
					acc[key] = translationKeys[key];
					return acc;
				}, this);
			}
		},

		/**
		 * fügt ein Script nach dem laden hinzu
		 *
		 * @param array|object|string script
		 *		src:			source
		 *		id:				(optional) id des scriptes
		 *		defer:			(optional) false
		 *		defaultUrl: 	(optional) true
		 *		onLoad:			(optiona) callback Function
		 * @access public
		 * @return node|bool
		 **/
		insertScript: function(script)
		{
			if (Object.isUndefined(script) || script == null)
			{
				return;
			}
			if (Object.isArray(script))
			{
				return $A(script).each(function(addScript)
				{
					Sapodo.insertScript(addScript);
				});
			}

			if (Object.isString(script))
			{
				script = {
					src: script
				};
			}
			if (Object.isUndefined(script.defaultUrl))
			{
				script.defaultUrl = true;
			}

			script.onLoad = script.onLoad || Prototype.emptyFunction;

			script.src = (script.defaultUrl ? Sapodo.scriptUrl : "") + script.src;
			if (isScriptLoaded(script))
			{
				script.onLoad(false);
				return true;
			}
			scripts.push(Object.clone(script));

			var element = new Element("SCRIPT",
			{
				id:		(script.id ? script.id : "sapodo_script_" + Sapodo.getId()),
				src:	script.src,
				type:	"text/javascript",
				defer:	(script.defer ? true : false)
			});

			if (Prototype.Browser.isIE)
			{
				element.onreadystatechange = function()
				{
					if (element.readyState == 'loaded'		||
						element.readyState == 'complete'	||
						element.readyState == 4)
					{
						script.onLoad(true);
					}
				};
			}
			else
			{
				element.onload = script.onLoad.curry(true);
			}

			document.body.previousSibling.appendChild(element);

			return element;
		},

		/**
		 * fügt ein Style nach dem laden hinzu
		 *
		 * @param array|bject|string style
		 *		src:		source
		 *		id:			(optional) id des styles
		 *		defaultUrl: (optional) true
		 * @access public
		 * @return node
		 **/
		insertStyle: function(style)
		{
			if (Object.isUndefined(style) || style == null)
			{
				return;
			}
			if (Object.isArray(style))
			{
				return $A(style).each(function(addStyle)
				{
					Sapodo.insertStyle(addStyle);
				});
			}
			if (Object.isString(style))
			{
				style = {
					src: style
				};
			}
			if (Object.isUndefined(style.defaultUrl))
			{
				style.defaultUrl = true;
			}

			style.src = (style.defaultUrl ? Sapodo.styleUrl : "") + style.src;
			if (isStyleLoaded(style))
			{
				return true;
			}
			styles.push(Object.clone(style));

			var element = new Element("link",
			{
				id:		(style.id ? style.id : "sapodo_style_" + Sapodo.getId()),
				href:	style.src,
				rel:	"stylesheet",
				type:	"text/css"
			});
			$$("head")[0].appendChild(element);

			return element;
		},

		/**
		 * ein package nachladen
		 *
		 * @param string|array scripts (achtung es wird relativ Sapodo.scriptUrl verwendet)
		 * @param function callback
		 * @param object options
		 * @access public
		 */
		loadPackage: function(scripts, callback, options)
		{
			Sapodo.onLoad(function()
			{
				if (!Object.isArray(scripts))
				{
					scripts = $A([scripts]);
				}

				scripts.each(function(script)
				{
					if (typeof script != "object")
					{
						script = { src: script };
					}

					if (Object.isFunction(callback))
					{
						script.onLoad = callback.curry(options);
					}
					Sapodo.insertScript(script);
				});
			});
		},

		/**
		 * führt die funktion nach dem laden von window aus, ist window geladen, wird sofort ausgeführt
		 *
		 * @access public
		 **/
		onLoad: function(fn)
		{
			if (!this.loaded)
			{
				document.observe("dom:loaded", function()
				{
					Sapodo.loaded = true;
					fn();
				});
			}
			else
			{
				fn.bind(window).defer();
			}
		},

		/**
		 * zeigt ein Popup window an
		 *
		 *	options
		 *		name		type								default				description
		 *		====================================================================
		 *		height		long					optional						Höhe
		 *		html		string					optional						einzufügender Content und ersetzt/überschreibt url
		 *		parameters	string|object|element	optional						Parameter für die URL
		 *		title		string					optional	Sapodo				Titel des Fensters
		 *		url			string					optional	Sapodo.startPage	URL für die Anzeige
		 *		width		long													Breite
		 *		beliebig viele window.open args
		 *
		 * @param object options
		 * @return window
		 **/
		popup: function (options)
		{
			if (!Object.isUndefined(options.html))
			{
				options.url = "";
			}

			if (Object.isElement(options.parameters) && options.parameters.tagName.toUpperCase() == "A")
			{
				options.parameters = options.parameters.href.uriToQueryParams();
			}

			var win = window.open(
				Object.queryParamsToURI(options.url || this.startPage, options.parameters),
				(!Object.isUndefined(options.title) ? options.title : "Sapodo"),
				Object.keys(options).findAll(function(key)
				{
					return (key != "url" && key != "parameters");
				}).collect(function(key)
				{
					if (key == "width")
					{
						options[key] += 20;
					}
					if (key == "height")
					{
						options[key] += 25;
					}

					var result = "";
					if (Object.isUndefined(options[key]))
					{
						result = key;
					}
					else if (typeof options[key] == "boolean")
					{
						result = key + "=" + (options[key] ? "yes" : "no");
					}
					else
					{
						result = key + "=" + options[key];
					}

					return result;
				}).join(",")
			);
			if (!Object.isUndefined(options.html))
			{
				win.document.open("text/html");
				win.document.write(options.html);
				win.document.close();
			}

			return win;
		}
	}, (function()
	{
		// suchen nach dem skript
		var src = $$("script").find(function(script)
		{
			return script.src.indexOf("sapodo.js") != -1 && script.src.indexOf("common/") != -1;
		}).src;
		if (src.indexOf("?") == -1)
		{
			return; // keine params dann return
		}

		// Params auswerten
		var params = src.toQueryParams();
		Object.keys(params).each(function(key)
		{
			// number convert
			if (!isNaN(parseInt(params[key])) && parseInt(params[key]) == params[key])
			{
				params[key] = parseInt(params[key]);
			}
			else if (!isNaN(parseFloat(params[key])) && parseFloat(params[key]) == params[key])
			{
				params[key] = parseFloat(params[key]);
			}
		});

		// Params ausgeben
		return params;
	})() || {});
})();
Sapodo.onLoad(Prototype.emptyFunction);

/**
 * Cookie Verwaltung
 **/
Sapodo.Cookies = (function()
{
	var cookies = null;

	/**
	* lädt alle vorhandenen Cookies
	**/
	function load()
	{
		cookies = $A([]);
		var c = document.cookie + ";";
		var re = /\s?(.*?)=(.*?);/g;
		var matches;
		while((matches = re.exec(c)) != null)
		{
			var name = matches[1];
			var value = matches[2];
			if (name && (name.startsWith("sapodo-") || name.startsWith("sapodo_")))
			{
				cookies.push(new Sapodo.Cookies.Cookie(
				{
					name:	name.substr("sapodo-".length),
					value:	value
				}));
			}
		}
		return cookies;
	};

	/**
	* Wrapper funktion für Cookie zugriff
	*
	* @param string name Name des Cookie
	* @return mixed Value
	* @example alert(Sapodo.Cookies('meinCookie').get());
	**/
	return function(name)
	{
		if (cookies == null)
		{
			load();
		}

		var r = cookies.find(function(cookie)
		{
			return cookie.name == name;
		});

		if (Prototype.Browser.isIE6 && !r && !Object.isUndefined(Sapodo[name] || Sapodo["sapodo-" + name] || Sapodo["sapodo_" + name]))
		{
			r = new Sapodo.Cookies.Cookie(
			{
				name:	name,
				value:	Object.toJSON(Sapodo[name] || Sapodo["sapodo-" + name] || Sapodo["sapodo_" + name])
			});
		}
		else if (!r)
		{
			r = new Sapodo.Cookies.Cookie(
			{
				name:	name,
				value:	Object.toJSON(null)
			});

			cookies.push(r);
		}

		return r;
	};
})();

/**
 * prüft ob cookies aktiviert sind
 *
 * @access public
 * @return bool
 **/
Sapodo.Cookies.enabled = navigator.cookieEnabled;

/**
 * ein cookie
 **/
Sapodo.Cookies.Cookie = Class.create(
{
	domain:		null,
	expires:	new Date((new Date()).getTime() + 7 * 24 * 60  * 60 * 1000),
	name:		null,
	path:		"/",
	secure:		false,
	value:		null,

	/**
	 * konstruktor
	 **/
	initialize: function(options)
	{
		this.name = options.name;
		this.value = this.decodeValue(options.value);
	},

	/**
	 * wert dekodieren
	 **/
	decodeValue: function(value)
	{
		try
		{
			if (value.isJSON())
			{
				return value.evalJSON(true);
			}
			else
			{
				return value;
			}
		}
		catch(e)
		{
			return value;
		}
	},

	/**
	 * wert kodieren
	 **/
	encodeValue: function()
	{
		if(Object.isString(this.value))
		{
			return this.value;
		}
		return Object.toJSON(this.value);
	},

	/**
	 * liefert den Cookie Wert
	 **/
	get: function()
	{
		return this.value;
	},

	/**
	 * setzt den Cookie wert
	 **/
	set: function(value)
	{
		if (typeof value == "undefined" || value === null)
		{
			this.value = null;
			this.clear(this.name);
			return;
		}

		this.value = value;
		this.save();
	},

	/**
	 * speichert das cookie
	 **/
	save: function()
	{
		document.cookie =	"sapodo-" + this.name + "=" + this.encodeValue(this.value) +
							(this.expires == null	? "" : "; expires=" + this.expires.toGMTString()) +
							(this.path == null		? "" : "; path=" + this.path) +
							(this.domain == null	? "" : "; domain=" + this.domain) +
							(this.secure == false	? "" : "; secure");
	},

	/**
	 * löscht das cookie
	 **/
	clear: function()
	{
		document.cookie =	"sapodo-" + this.name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
							(this.path == null		? "" : "; path=" + this.path) +
							(this.domain == null	? "" : "; domain=" + this.domain) +
							(this.secure == false	? "" : "; secure");
	}
});

/**
 * unser media einblender
 **/
Sapodo.Media = (function()
{
	/**
	 * center to Browser Windows
	 *
	 * @param element element
	 * @access private
	 */
	function posToCenter(element)
	{
		element = $(element);

		var vw = !Prototype.Browser.isIE6 ? document.viewport.getDimensions() : {width: document.body.clientWidth, height: document.body.clientHeight};
		var so = document.viewport.getScrollOffsets();

		element.setXY(
		{
			x:	Math.round(vw.width / 2) - (element.getWidth() / 2) + so[0],
			y:	Math.round(vw.height / 2) - (element.getHeight() / 2) + so[1]
		});
	}

	// beim laden von seite alles machen
	Sapodo.onLoad(function()
	{
		$(document.body).insertBottom(
			new Element("div",
			{
				id:		"contentDiv",
				style:	"display:none;"
			})
		);

		Event.observe(document, "scroll", function()
		{
			posToCenter('contentDiv');
		});

		Event.observe(document, "resize", function()
		{
			posToCenter('contentDiv');
		});
	});

	return {
		/**
		 * hides
		 *
		 * @param bool remove (default false) remove content
		 * @access public
		 */
		hide: function(remove)
		{
			if (Object.isUndefined(remove) || remove)
			{
				if (dimmer.dom.isDisplayed())
				{
					dimmer.hide().dom.show();
					$('contentDiv').fade(
					{
						duration:		0.5,
						afterFinish:	function()
						{
							$('contentDiv').removeChildrens();
						}
					});
				}
			}
			else
			{
				$('contentDiv').hide();
				dimmer.dom.show();
			}
		},

		/**
		 * shows
		 *
		 * @param string data
		 * @access public
		 */
		show: function(data)
		{
			dimmer.show().dom.hide();

			if (data)
			{
				data.applyTo($('contentDiv').appear(
				{
					duration:		0.5,
					afterUpdate:	function()
					{
						posToCenter('contentDiv');
					}
				}));

			}
			else
			{
				$('contentDiv').show();
			}
			// Bild für das Schließen
			if ($('img_close'))
			{
				$('img_close').show().on("click", this.hide);
			}

			// Link für das Schließen
			if ($('link_close'))
			{
				$('link_close').show().on("click", this.hide);
			}
		}
	};
})();

/**
 * unser Flash gedönse
 **/
Sapodo.Flash = {
	/**
	 * espress install url
	 *
	 * @var string
	 * @access public
	 **/
	install: "/ressources/common/flash/expressInstall.swf",

	/**
	 * URL zum Movie
	 *
	 * @var string
	 * @access public
	 */
	serverPath: "/movie",

	/**
	 * flash version
	 *
	 * @var string
	 * @access public
	 **/
	version: "9.0.0",

	/**
	 * create swf element
	 *
	 *		name				type					default				description
	 *		==================================================================================
	 *		attributes			object		optional	{}					Attribute fürs DOM Object
	 *		defaultUrl			bool		optional	true				default flash url verwenden
	 *		element				string|node									DOM Node fürs SWF
	 *		height				string		optional	100px				Höhe
	 *		parameters			object		optional	{}					Flash Variablen
	 *		params				object		optional	{}					Param fürs DOM Object
	 *		src					string										URL zum SWF
	 *		width				string		optional	100%				Breite
	 *
	 * @param object options
	 * @access public
	 **/
	create: function(options)
	{
		var version = swfobject.getFlashPlayerVersion();
		if (version.major == 0 && version.minor == 0 && version.release == 0)
		{
			(
				'<a href="http://www.adobe.com/go/DE-H-M-A2" title="' + Sapodo.getTranslation('tr_hint_install_flash') + ' -&gt; Download Adobe® Flash® Player">' +
					'<img src="http://www.adobe.com/images/shared/download_buttons/get_adobe_flash_player.png" alt="Download Adobe® Flash® Player" />' +
				'</a>'
			).applyTo(options.element);
			return false;
		}
		else
		{
			swfobject.embedSWF(
				(options.defaultUrl || Object.isUndefined(options.defaultUrl) ? Sapodo.flashUrl : "") + options.src + '?' + (new Date()).getTime(),
				(Object.isElement(options.element) ? options.element.id : options.element),
				options.width || "100%",
				options.height || "100px",
				Sapodo.Flash.version,
				Sapodo.Flash.install,
				options.parameters || {},
				options.params || {},
				options.attributes || {}
			);

			return true;
		}
	}
};

/**
 * Pre config Flash Upload
 * Helper function zum erzeugen fals das JS noch nicht geladen ist
 */
Sapodo.Flash.Upload =
{
	create: Sapodo.loadPackage.curry("common/flash.upload.js", function(options)
	{
		Sapodo.Flash.Upload.create(options);
	})
};

/**
 * Pre config Flash Movie
 * Helper function zum erzeugen fals das JS noch nicht geladen ist
 */
Sapodo.Flash.Movie =
{
	show: Sapodo.loadPackage.curry("common/flash.movie.js", function(options)
	{
		Sapodo.Flash.Movie.show(options);
	})
};