/**
* @projectDescription 	XPLAIN.core Library
*
* @author	Florian Weber (florian.weber@xplain.de)
* @version	0.5
*/

var XPLAIN = window.XPLAIN || {};
var jsPath, cssPath, globalPackagesPath, completerResultPath;

var XPLAIN = {
	conf : {
		packages : function() {
			this.debug = false;
			/* Dynamisch im HTML
			jsPath = "../js/";
			cssPath = "../css/";
			globalPackagesPath = "../packages/";*/

			XPLAIN.conf.hasBrowserDetect(true);
			XPLAIN.conf.hasSwfobject(true);
		},


		hasBrowserDetect : function(bool) {
			if(bool) {
				var packageName = "browserdetect";
				var params = new Array(packageName);
				XPLAIN.core.loadScripts(params, true, packageName);
			}
		},

		hasSwfobject : function(bool) {
			if(bool) {
				var packageName = "swfobject";
				var params = new Array(packageName);
				XPLAIN.core.loadScripts(params, true, packageName);
			}
		},

		hasLightwindow : function(bool) {
			if(bool) {
				var packageName = "lightwindow";
				var params = new Array(packageName);
				XPLAIN.core.loadScripts(params, true, packageName);
				XPLAIN.core.loadCss(params, true, packageName);
			}
		}


	 },



	core : {
		/**
		* @classDescription Lädt dynamisch die benötigten Js-Dateien nach
		*
		* @author	Florian Weber (florian.weber@xplain.de)
		* @param {Array} scripts Die Scripte, die eingebunden werden sollen
		* @param {boolean} [isPackage] Ob es sich um ein ganzes Package handelt
		* @param {String} [packageName] Name des Packages, das eingebunden werden soll.
		*/
		loadScripts : function(scripts, isPackage, packageName) {
			var packageJsPath;
			if(isPackage) {
				packageJsPath = globalPackagesPath + packageName + "/js/";
			} else {
				packageJsPath = jsPath;
			}
			for(i=0; i<scripts.length; i++) {
				obj = document.createElement('script');
				obj.setAttribute('type','text/javascript');
				obj.setAttribute('src',packageJsPath + scripts[i]+'.js');
				document.getElementsByTagName('head')[0].appendChild(obj);
			}
		},


		/**
		* @classDescription Lädt dynamisch die benötigten CSS-Dateien nach
		* @param {Array} styles Array mit den CSS-Dateinamen (ohne Suffix)
		* @param {boolean} [isPackage] Ob es sich um ein ganzes Package handelt
		* @param {String} [packageName] Name des Packages, das eingebunden werden soll.

		*/
		loadCss : function(styles, isPackage, packageName) {
			if(isPackage) cssPath = globalPackagesPath + packageName + "/css/";
			for(i=0; i<styles.length; i++) {
				obj = document.createElement('link');
				obj.setAttribute('rel','stylesheet');
				obj.setAttribute('type','text/css');
				obj.setAttribute('media','screen, projection');
				obj.setAttribute('href',cssPath + styles[i]+'.css');
				document.getElementsByTagName('head')[0].appendChild(obj);
			}
		},


	/**
		* @classDescription Bei einem Klick in ein input defaultValue löschen
 		* @author	Florian Weber (florian.weber@xplain.de)
		* @param {event} e [event] Das Event-Object vom Browser
		* @param {Object} ele Das input-Object, welches manipuliert werden soll
		*/
		onFocusCheckEntry : function(e, ele) {
			ele.className = ele.className.replace(/initState/, "");
			if(ele.defaultValue != "") {
				theDefaultValue = ele.defaultValue;
			} else if(ele.getAttribute('defaultjstext')) { //#7183 wenn nicht das value vorgefüllt ist - IE ist langsam mit der JS-Interpretation
				theDefaultValue = ele.getAttribute('defaultjstext');
			}
			if(ele.value == theDefaultValue) {
				ele.value = "";
			}
		},

		/**
		* @classDescription Beim blur, wenn keine Eingabe erfolgte den defaultValue wieder schreiben
		* @author	Florian Weber (florian.weber@xplain.de)
		* @param {event} e [event] Das Event-Object vom Browser
		* @param {Object} ele Das input-Object, welches manipuliert werden soll
		*/
		onBlurCheckEntry : function(e, ele) {
			if(ele.defaultValue != "") {
				theDefaultValue = ele.defaultValue;
			} else if(ele.getAttribute('defaultjstext')) {
				theDefaultValue = ele.getAttribute('defaultjstext');
			}
			if(ele.value == "") {
				ele.className = ele.className + " initState";
				ele.value = theDefaultValue;
			}
		},

		/**
		* @classDescription Geht alle Links den Dokument durch und sucht nach "_blank". Dann ergänzt sie einen eventuell bereits
		* @classDescription vorhandenen Title-Tag um den "neues Fenster"-Text.
		* @author	Joern Hofer
		*/
		changeTitleAndTarget : function() {
			if(!document.getElementsByTagName) return;
			var links = document.getElementsByTagName("a");
			for(i=0; i<links.length; i++) {
				if(links[i].target == "_blank") {
					origLink = links[i].href;
					origTitle = links[i].title;
					if(origTitle != "[neues Fenster]") {
						links[i].title = origTitle + " [neues Fenster]";
					}
					//links[i].onclick = XPLAIN.core.openWindow;
				}
			}
		},

		/**
		* @classDescription öffnet ein neues Browserfenster. Ein eventuell schon vorhandenes Fenster mit dem selben Namen wird vorher geschlossen
 		* @author	Florian Weber (florian.weber@xplain.de)
		* @param {event} e [event] Das Event-Object vom Browser
		* @param {Array} params[0] URL die in dem neuen Fenster geladen werden soll
		* @param {Array} (params[1]) Name des zu öffnenden Fensters
		* @param {Array} (params[2]) gewünschte Breite des Popups
		* @param {Array} (params[3]) gewünschte Höhe des Popups
		*/
		openWindow : function(e, params) {
			url = params[0];
			windowName = (params[1]) ? params[1] : "myWin";
			width = (params[2]) ? params[2] : "400";
			height = (params[3]) ? params[3] : "400";
			scrollbars = (params[4]) ? params[4] : "no";

			options = "width="+width+",height="+height+",toolbar=no,locationbar=no,directories=no,scrollbars="+scrollbars+",status=no,menubar=no,resizable=yes";
			win = eval("window."+windowName);
			if(win) {
				if(!win.closed) win.close();
			}
			eval(windowName +" = window.open(url, windowName, options)");
		},

		/**
		* @classDescription Wechselt einfach nur die Visibility eines übergebenen Objects. (Die Prototype toggle() funktioniert nicht, wenn der übergabe-Parameter vom Typ "Object" ist)
		* @author	Florian Weber (florian.weber@xplain.de)
		* @param {event} e [event] Das Event-Object vom Browser
		* @param [Object, String] ele Das Objekt, welches manipuliert werden soll
		*/
		toggleVisibility : function(e, ele) {
		  if(!ele) return;
			visibility = ($(ele).style.display == "") ? "none" : "";
			$(ele).style.display =  visibility;
		},

		/**
		* @classDescription Entfernt den href und das target / setzt auf das onclick ein return false
		* @classDescription Wird verwendet, wenn dynamisch ein onclick-event auf einen Link gesetzt wird.
		* @author	Florian Weber (florian.weber@xplain.de)
		* @param [object] ele Das Objekt, welches manipuliert werden soll
		*/
		disableHref : function(ele, resetHref) {
			if(ele) {

				//Event.observe(ele, 'click', function(){ return false; }); //IE
				ele.setAttribute('onclick', 'return false;'); //FF
				ele.onclick = function(){ //IE!
					return false;
				};
				ele.setAttribute('target', '');
				if(resetHref) {
					ele.href = "javascript:void(0);";
				}
			}
		},

		/**
		* Nach einem bestimmten "Text" in einer Selectbox suchen und diesen auswählen
		* param [0] - (String) = ID des Select-Elements, welches man durchsuchen möchte
		* param [1] - (String) = Text, der in der Selectbox gesucht werden soll
		*/
		optionAuswahlText : function(e,params) {
			elem = $(params[0]);
			wert = params[1];
			for (i = 0; i < elem.length; i++)	{
				if(elem.options[i].text == wert) {
					elem.selectedIndex = i;
					break;
				}
			}

		},


		/**
		* Nach einem bestimmten "Value" in einer Selectbox suchen und diesen auswählen
		* param [0] - (String) = ID des Select-Elements, welches man durchsuchen möchte
		* param [1] - (String) = Value, der in der Selectbox gesucht werden soll
		*/
		optionAuswahlValue : function(e,params) {
			elem = $(params[0]);
			wert = params[1];
			for (i = 0; i < elem.length; i++)	{
				if(elem.options[i].value == wert) {
					elem.selectedIndex = i;
					break;
				}
			}
		},

		/**
		* Alle Werte aus einer Selectbox löschen
		* param [0] - (Object) = Selectbox-Object, welches man leeren möchte
		*/
		killSelect : function(e, params) {
			boxId = params[0];
			while(boxId.options.length!=0) {
				boxId.options[boxId.options.length-1] = null;
			}
		},


		/**
		* Eine Selectbox mit Werten füllen
		* param [0] - (Object) =  Selectbox-Object, welches man füllen möchte
		* param [1] - (String) =  Text, der in der Selectbox angezeigt werden soll
		* param [2] - (String) =  Value, der dem Text zugeordet sein soll
		*/
		fillSelect : function(e, params) {
			boxId = params[0];
			opt = params[1];
			val = params[2];
			this.newOpt = new Option(opt, val);
			boxId.options[boxId.options.length] = this.newOpt;
			return;
		}

		}

}


/**
* @classDescription Console.Debug shortcut / Soll außerhalb von core, damit man nicht immer XPLAIN.core.cd() schreiben muss
* @author	Florian Weber (florian.weber@xplain.de)
* @param [object/string] uebergabe Ein Object oder String der ausgegeben werden soll.
*/
function cd(uebergabe) {
	if (XPLAIN.conf.debug) {
		if (typeof console != "undefined") { // safari, firebug
			if (typeof console.debug != "undefined") { // firebug
				console.debug(uebergabe);
			}
		} else {
			alert(uebergabe);
		}
	}
}

XPLAIN.conf.packages();
