// Funktionen um die Durchsichtigkeit eines Elementes zu beeinflussen
//initOpacity([node]): prüft, ob die Node node (default = document) und all ihre Kinder das Attribute "opacity" haben und setzt diese auf den dort angegebenen Wert
// slowShowOpacity(id[,schnelligkeit]): Lässt das Objekt mit der Id id mit der Geschwindigkeit schnelligkeit (1  (Default) bedeutet 3% weniger durchsichtig)
// slowHideOpacity(id[,verstecken[,schnelligkeit]]): wie oben, nur lässt es das Objekt verschwinden. Wenn verstecken = true (default ist false) wird das Objekt am Ende noch auf display = none gestellt
// slowToggleOpacity(id[,vertecken[,schnelligkeit]]): wie oben, nur das immer hin und hergeschaltet wird
// slowOpacity(id,starto,endo[,verstecken[,schnelligkeit]]): lässt das Objekt mit Id id von der Startopacity starto zur Endopacity endo fahren - sonst wie oben
// stopSlowOpacity(id): hält ein das langsame Erscheinen/Verschwinden der Objekts mit Id id an
// node.getOpacity(): gibt die Opacity der Node node zurück
// node.setOpacity(value): setzt die Opacity der Node node
// opaAdd(node): fügt der Node node die notwendigen Eigenschaften hinzu, damit das Paket mit ihr funktioniert

//benötigt nuetzlich.js
(function(){

kkjs.opa = {
	add: function opaAdd(node,kinder){
		var setOpacity = function (value){
		             if (!this.style) return false;
		             if (value != 0 && this.style.display == "none") this.style.display = "";
		             if (this.style.opacity || this.style.opacity == ""){
		                this.style.opacity=value/100;
		                return this;
		             }
		             if (this.style.filter || this.style.filter == ""){
		                this.style.filter="Alpha(opacity="+value+")";
		                return this;
		             }
					 this.setAttribute("opacity", value);
					 this.opacity = value;
		             return false;
		};
		
		var getOpacity = function (){
		             if (!this.style) return false;
		             if (this.style.opacity || this.style.opacity == ""){
		                return (isNaN(this.style.opacity) || this.style.opacity == "")? 100 : this.style.opacity*100;
		             }
		             if (this.style.filter || this.style.filter == ""){
		                this.style.filter.match(/Alpha.*?opacity=(\d*)/);
		                return (isNaN(RegExp.$1) || RegExp.$1 == "")? 100 : RegExp.$1;
		             }
		             return false;
		};

		if (!node || !node.style) return false;

		//Das hier hat eigentlich nichts mit Opacity zu tun, aber der IE will den Filter nicht anwenden, wenn das Objekt keine "Layout" hat  - die eigenschaft zoom gibt ihm solches
		if (node.currentStyle && typeof(node.style.zoom) != "undefined" && !node.currentStyle.hasLayout) {
			node.style.zoom = "100%";
		}

		node.setOpacity = setOpacity;
		node.getOpacity = getOpacity;
		
		if (node.watch) node.watch("opacity", function(o, alt, neu){if (alt != neu) this.setOpacity(neu);})
		kkjs.setzeEvent(node, "propertychange", function(ev){
			if (ev.propertyName == "opacity"){
				if (this.getOpacity() != this.opacity){
					this.setOpacity(this.opacity);
				}
			}
		});
		
		if (kinder){
			for (var i=0;i<node.childNodes.length;i++){
				opaAdd(node.childNodes[i]);
			}
		}
		return node;
	},
	
	init: function opaInit(node){
		if (!node) node = document;
		if (node.getAttribute && node.getAttribute("opacity") != null){
			kkjs.opa.add(node,false);
			node.setOpacity(node.getAttribute("opacity"));
		}
		var kinder = node.childNodes;
		for (var i = 0 ; i < kinder.length; i++){
			kkjs.opa.init(kinder[i]);
		}
	},
	
	slowShow: function opaSlowShow(id,schnelligkeit){
		var objekt = kkjs.$(id);
		if (!objekt) return false;
		if (!objekt.getOpacity){kkjs.opa.add(objekt);}
		if (kkjs.getDisplay(objekt) == "none"){
			objekt.style.display = kkjs.getDefaultDisplay(objekt);
			objekt.setOpacity(0);
		}
		kkjs.opa.stopSlow(id);
		kkjs.opa.slow(id,objekt.getOpacity(),100,false,schnelligkeit);
		return objekt;
	},
	
	slowHide: function opaSlowHide(id,verstecken,schnelligkeit){
		var objekt = kkjs.$(id);
		if (!objekt) return false;
		if (!objekt.getOpacity){kkjs.opa.add(objekt);}
		if (kkjs.getDisplay(objekt) == "none"){
			objekt.style.display = kkjs.getDefaultDisplay(objekt);
			objekt.setOpacity(0);
		}
		kkjs.opa.stopSlow(id);
		kkjs.opa.slow(id,objekt.getOpacity(),0,verstecken,schnelligkeit);
		return objekt;
	},
	
	slowToggle: function opaSlowToggle(id,verstecken,schnelligkeit){
		var objekt = kkjs.$(id);
		if (!objekt) return false;
		if (!objekt.getOpacity){kkjs.opa.add(objekt);}
		if (kkjs.getDisplay(objekt) == "none"){
			objekt.style.display = kkjs.getDefaultDisplay(objekt);
			objekt.setOpacity(0);
		}
		kkjs.opa.stopSlow(id);
		if (objekt.getOpacity() == 0 || objekt.kkjsOpaSlowDirection == "descending"){
			kkjs.opa.slow(id,objekt.getOpacity(),100,verstecken,schnelligkeit);
		}
		else {
			kkjs.opa.slow(id,objekt.getOpacity(),0,verstecken,schnelligkeit);
		}
		return objekt;
	},
	
	timeConstant: 10,
	
	slow: function opaSlow(id,starto,endo,verstecken,schnelligkeit){
		var objekt = kkjs.$(id);
		if (!objekt) return false;
		if (!objekt.getOpacity){opaAdd(objekt);}
		if (isNaN(schnelligkeit)){schnelligkeit = 1;}
		
		objekt.setOpacity(starto);
		if (starto > endo){
			objekt.kkjsOpaSlowDirection = "descending";
		}
		else{
			objekt.kkjsOpaSlowDirection = "ascending";
		}
		if (Math.abs(starto-endo)<=3*schnelligkeit){
		if (verstecken && endo == 0) objekt.style.display = "none";
			objekt.setOpacity(endo);
			kkjs.opa.stopSlow(objekt);
			return objekt;
		}
		else {
			objekt.kkjsOpaSlowTimeout = setTimeout(function(){
				kkjs.opa.slow(id, (parseInt(starto-3*schnelligkeit*Math.abs(starto-endo)/(starto-endo))), parseInt(endo), verstecken, schnelligkeit);
			},kkjs.opa.timeConstant);
		}
		return objekt;
	},

	stopSlow: function opaStopSlow(id){
		var objekt = kkjs.$(id);
		if (objekt.kkjsOpaSlowTimeout) window.clearTimeout(objekt.kkjsOpaSlowTimeout);
	}
};

kkjs.opaAdd = kkjs.opa.add;

}).apply();
