function getJQuery(version, alert){
	if(typeof jQuery != "function"){
		if(alert){
			alert("jQuery nicht gefunden!\n[http://www.jquery.com/]");
		}
		return undefined;
	}

	if(typeof version == "string" && version > jQuery().jquery){
		if(alert){
			alert("jQuery "+version+" benötigt!\nVersion "+jQuery().jquery+" gefunden\n[http://www.jquery.com/]");
		}
		return undefined;
	}
	
	return jQuery;
}
    
function movableOptions(elem){
	var $J = getJQuery();
	
	if(!$J){
		return;
	}
	
	$J(elem+" .to_left").click(function(){
		var selected = $J(elem+" .right").val() || [];
		
		$J(elem+" .right").children().each(function(i, n){
			$J.each(selected, function(index, value){
				if($J(n).val() == value){
					$J(n).remove();
				}
			});
		});
		
		$J.each(selected, function(index, value){
			$J(elem+" .left").append($J("<option>"+value+"</option>"));
		});
		
	});
	
	$J(elem+" .to_right").click(function(){
		var selected = $J(elem+" .left").val() || [];
		
		$J(elem+" .left").children().each(function(i, n){
			$J.each(selected, function(index, value){
				if($J(n).val() == value){
					$J(n).remove();
				}
			});
		});
		
		$J.each(selected, function(index, value){
			$J(elem+" .right").append($J("<option>"+value+"</option>"));
		});
		
	});
}

/*
 slider(selector, delay, duration, type, callback)
 slider(options)
 options = {
	selector: string,
	delay: string or number,
	duration: string or number,
	type: string,
	callback: function,
	endSlide: string or number
	random: boolean
 }
 
 all types need at least 3 slides, except default which needs at least 2
*/
function slider(selector, delay, duration, type, callback, endSlide, random){
	var $J = getJQuery();
	
	if(!$J){
		return;
	}
	
	var options;
	if(typeof selector == "object"){
		options = selector;
		selector = options.selector;
		delay = options.delay;
		duration = options.duration;
		type = options.type;
		callback = options.callback;
		endSlide = options.endSlide;
		random = options.random;
	}
	
	if(typeof delay == "string" || typeof delay == "number"){
		delay = parseInt(delay) || 2000;
	} else {
		delay = 2000;
	}
	
	if(typeof duration == "string" || typeof duration == "number"){
		duration = parseInt(duration) || 500;
	} else {
		duration = 500;
	}
	
	if(typeof callback != "function"){
		callback = function(){};
	}
	
	if(!type){
		type = "fade";
	}
	
	if(random && type !== "fade"){
		throw("randomized slides only available with type fade");
	}
	
	var slides = $J(selector);
	var numSlides = slides.length;
	
	if(typeof endSlide == "string" || typeof endSlide == "number"){
		endSlide = parseInt(endSlide) % numSlides;
		stopSlider(selector);
	} else {
		endSlide = null;
	}
	
	var width = $J(selector).parent().width();
	var height = $J(selector).parent().height();
	
	function slide(index, prev){
		if(endSlide != null){
			delay = 0;
		}
		
		if(typeof prev != "number"){
			prev = (index-1+numSlides)%numSlides;
		}
		var next = (index+1)%numSlides;
		
		if(random){
			do {
				index = Math.floor(Math.random()*numSlides);
			} while(prev === index)
		}
		
		if(prev == endSlide){
			return;
		}
		
		switch(type){
			case "slideleft":
				$J(slides[prev]).delay(delay).animate({ left: -width}, duration, "swing", function(){ $J(slides[prev]).hide(); });
				$J(slides[index]).delay(delay).show().animate({ left: 0 }, duration, "swing", function(){ callback(selector, index); slide(next); });
				$J(slides[next]).delay(delay).css({ left: width });
				break;
			case "slideright":
				$J(slides[prev]).delay(delay).animate({ right: -width}, duration, "swing", function(){ $J(slides[prev]).hide(); });
				$J(slides[index]).delay(delay).show().animate({ right: 0 }, duration, "swing", function(){ callback(selector, index); slide(next); });
				$J(slides[next]).delay(delay).css({ right: width });
				break;
			case "slideup":
				$J(slides[prev]).delay(delay).animate({ top: -height}, duration, "swing", function(){ $J(slides[prev]).hide(); });
				$J(slides[index]).delay(delay).show().animate({ top: 0 }, duration, "swing", function(){ callback(selector, index); slide(next); });
				$J(slides[next]).delay(delay).css({ top: height });
				break;
			case "slidedown":
				$J(slides[prev]).delay(delay).animate({ bottom: -height}, duration, "swing", function(){ $J(slides[prev]).hide(); });
				$J(slides[index]).delay(delay).show().animate({ bottom: 0 }, duration, "swing", function(){ callback(selector, index); slide(next); });
				$J(slides[next]).delay(delay).css({ bottom: height });
				break;
			default:
				$J(slides[prev]).delay(delay).fadeOut(duration);
				$J(slides[index]).delay(delay).fadeIn(duration, function(){ callback(selector, index); slide(next, index); });
				break;
		}
	}
	
	var curSlide = 0;
	for(var i=numSlides-1; i>=0; i--){
		if($J(slides[i]).css("display") != "none"){
			curSlide = i;
		}
	}
	
	switch(type){
		case "slideleft":
			for(var i=1; i<numSlides; i++){
				$J(slides[i]).css({ left: width });
			}
			$J(slides[curSlide]).css({ left: 0 });
			break;
		case "slideright":
			for(var i=1; i<numSlides; i++){
				$J(slides[i]).css({ right: width });
			}
			$J(slides[curSlide]).css({ right: 0 });
			break;
		case "slideup":
			for(var i=1; i<numSlides; i++){
				$J(slides[i]).css({ top: height });
			}
			$J(slides[curSlide]).css({ top: 0 });
			break;
		case "slidedown":
			for(var i=1; i<numSlides; i++){
				$J(slides[i]).css({ bottom: height });
			}
			$J(slides[curSlide]).css({ bottom: 0 });
			break;
	}
	
	if(random && curSlide === 0){
		curSlide = Math.floor(Math.random()*numSlides);
	}
	
	$J(slides[curSlide]).show();
	
	callback(selector, curSlide);
	
	if(numSlides > 1){
		slide((curSlide+1) % numSlides, curSlide);
	}
}

function stopSlider(selector){
	var $J = getJQuery();
	
	if(!$J){
		return;
	}
	
	$J(selector).clearQueue();
}

var showSlide = slider;

function Slider(sel, del, dur, ty, call){
	
	var options;
	if(typeof selector == "object"){
		options = selector;
		sel = options.selector;
		del = optios.delay;
		dur = options.duration;
		ty = options.type;
		call = options.callback;
	}
	
	var delay;
	if(typeof del == "string" || typeof del == "number"){
		delay = parseInt(del) || 2*1000;
	} else {
		delay = 2*1000;
	}
	
	var duration;
	if(typeof dur == "number" || typeof dur == "number"){
		duration = parseInt(dur) || 500;
	} else {
		duration = 500;
	}
	
	var callback;
	if(typeof call != "function"){
		callback = function(){};
	}
	
	var selector = sel;
	
	var type = ty;
	
	this.start = function(){ slider(selector, delay, duration, type, callback); };
	this.stop = function(){ stopSlider(selector); };
	this.show = function(num){ showSlide(selector, num, delay, duration, type), callback; };
	
	this.duration = function(d){
		if(typeof d == "string" || typeof d == "number"){
			duration = parseInt(d);
		}
		
		return duration;
	};
	
	this.delay = function(d){
		if(typeof d == "string" || typeof d == "number"){
			delay = parseInt(d);
		}
		
		return delay;
	};
	
	this.type = function(t){
		if(typeof t == "string"){
			type = t;
		}
		
		return type;
	};
}

// Animation des Menüs
function initMenu(){
	$(".menu_level_1").mouseenter(function(e) {
		var node = $(this).children(".menu_level_2")[0];
		$(node).attr("style", "");
		$(node).stop().slideDown("fast");
	});
	$(".menu_level_1").mouseleave(function(e) {
		var target = $(getTarget(e))
		var node = $(this).children(".menu_level_2")[0];
		$(node).stop().slideUp('fast');
	});
	
	if(window.attachEvent){
		$(".menu_level_1_item").hover(function(e){
			$(this).addClass("menu_level_1_item_hover");
		},
		function(e){
			$(this).removeClass("menu_level_1_item_hover");
		});
		
		$(".menu_level_2_item").hover(function(e){
			$(this).addClass("menu_level_2_item_hover");
		},
		function(e){
			$(this).removeClass("menu_level_2_item_hover");
		});
	}
}

// ermittelt das Ziel des Events
function getTarget(e){
	var targ;
	if (!e) e = window.event;
	if (e.target) targ = e.target;	// all Browsers
	else if (e.srcElement) targ = e.srcElement;	// IE
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	return targ;
}

// ermittelt die Position des Events relativ zum Viewport
function getEventPos(e) {
	var posx = 0;
	var posy = 0;
	if (!e) e = window.event;
	if (e.pageX || e.pageY) 	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	
	return {x : posx, y : posy};
}

// ermittelt die Größe der Seite
function getPageSize(){
	var x = 0;
	var y = 0;
	
	if(window.innerHeight){
		x = window.innerWidth;
		y = window.innerHeight;
	} else if(document.body.clientHeight){
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	} else {
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	
	return { x : x, y : y };
}

// ermittelt den Versatz der Seite durch Scrolling
function getPageOffset(){
	var x = 0;
	var y = 0;
	
	if(window.innerHeight){
		x = window.innerWidth;
		y = window.innerHeight;
	} else if(document.body.scrollLeft){
		x = document.body.scrollLeft;
		y = document.body.scrollTop;
	} else {
		x = document.documentElement.scrollLeft
		y = document.documentElement.scrollTop;
	}
	
	return { x : x, y : y };
}
