var dragging, autoscroll, grenzwert, slider, gallery, element, holder, arrow, picverschiebung, currentpic, currentscroll, faktor = false, popupactive = false, abbruch = false, breakx = 0;
var stoparea = new Array(false, false);
var ie6or7 = (navigator.appName == "Microsoft Internet Explorer" && (parseInt(navigator.appVersion) == 4 || parseInt(navigator.appVersion) == 5) && (navigator.appVersion.indexOf("MSIE 6.0") != -1 || navigator.appVersion.indexOf("MSIE 7.0") != -1)) ? true : false;
var ieall = (navigator.appName == "Microsoft Internet Explorer") ? true : false;

// Angaben für Buttons
var scrolltempo = 15; // Zeiteinheit in Millisekunden
var scrollintervall = 2; // = Step pro Zeiteinheit
//

// Fehlende getElementsByClassName Funktion 
document.getElementsByClassName = function(clsName){
    var retVal = new Array();
    var elements = document.getElementsByTagName("*");
    for(var i = 0;i < elements.length;i++){
        if(elements[i].className.indexOf(" ") >= 0){
            var classes = elements[i].className.split(" ");
            for(var j = 0;j < classes.length;j++){
                if(classes[j] == clsName)
                    retVal.push(elements[i]);
            }
        }
        else if(elements[i].className == clsName)
            retVal.push(elements[i]);
    }
    return retVal;
}
//

var drag = new drag();
var popup = new popup();
var rollen = new rollen();

window.onload = function () {
	// globale Elemente
	try {
		if (document.getElementById("slider")) {slider = document.getElementById("slider")} else throw "falsch";
		if (document.getElementById("gallery")) {gallery = document.getElementById("gallery")} else throw "falsch";
		if (document.getElementById("drag")) {element = document.getElementById("drag")} else throw "falsch";
		if (document.getElementById("holder")) {holder = document.getElementById("holder")} else throw "falsch";
		if (document.getElementById("rearrow")) {arrow = document.getElementById("rearrow")} else throw "falsch";
	} catch (e) {
		if (e == "falsch") return;
	}
	
	for (x=0; cur = document.getElementsByClassName("roll")[x]; x++) {
		cur.style.textIndent = "0px";
	}
	
	for (x=0; cur = document.getElementsByClassName("scrollx")[x]; x++) {
		picanzahl = document.getElementById("roll"+cur.id).getElementsByTagName("IMG").length;
		cur.style.width = (100/picanzahl)+"%";
		cur.style.left = "0px";
		
		if (picanzahl == 1) cur.style.display = "none";
	}
	
	for (x=0; cur = document.getElementsByClassName("scrollxcontainer")[x]; x++) {
		if (navigator.userAgent.search(/Firefox/) >= 0) cur.onmousedown = drag.fixFF; // FireFox Event Fix
	}
	
	document.onmousemove = drag.mouseposition;
	document.getElementById("slider").onclick = function() { drag.autoscroll(true, false); };
	if (navigator.userAgent.search(/Firefox/) >= 0) document.getElementById("drag").onmousedown = drag.fixFF; // FireFox Event Fix

	// Buttons + Popup aktivieren
	if (!ieall) {
		document.getElementById('buttonl').style.opacity = 0; 
		document.getElementById('buttonr').style.opacity = 0;
		document.getElementById('opacity').style.opacity = 0; 
		document.getElementById('rewrap').style.opacity = 0;
		document.getElementById('retextin').style.opacity = 0;
	} else {
		document.getElementById('buttonl').style.filter = "alpha(opacity=0)";
		document.getElementById('buttonr').style.filter = "alpha(opacity=0)";
		document.getElementById('opacity').style.filter = "alpha(opacity=0)";
		document.getElementById('rewrap').style.filter = "alpha(opacity=0)";
		document.getElementById('retextin').style.filter = "alpha(opacity=0)";
	}
	document.getElementById('buttonl').style.display = "block";
	document.getElementById('buttonr').style.display = "block";
	//

	if (!ie6or7) gallery.style.overflow = "hidden";
	if (ie6or7 || gallery.getElementsByTagName("IMG").length < 6) document.getElementById('slidecontainer').style.display = "none";
	
	if (!ie6or7 && gallery.getElementsByTagName("IMG").length > 5) drag.autoscroll(false, false); 

};

// Offset fix IE 6+7
function getoffsetLeft(obj) {

	if (!ie6or7) {
		var curleft = 0;
		if (obj.offsetParent) {
			do {
				curleft += obj.offsetLeft;
			} while (obj = obj.offsetParent);
		}
	}
	else curleft = obj.offsetLeft;

	return curleft;
}

function getoffsetTop(obj) {

	if (!ie6or7) {
		var curtop = 0;
		if (obj.offsetParent) {
			do {
				curtop += obj.offsetTop;
			} while (obj = obj.offsetParent);
		}
	}
	else curtop = obj.offsetTop;

	return curtop;
}
//

// ############## Beginn Drag Klasse ##############

function drag() {
	
	this.start = function () { 
		dragging = true;
		autoscroll = false;
		if (posX == false) return false;
		
		// Markieren verhindern
		this.disableselection();
		//
		
		document.body.onmousemove = function () { drag.move(); };
		document.body.onmouseup = function () { drag.end(true); };
		
		versetzung = posX-getoffsetLeft(element);
	};
	
	this.mouseposition = function (e) { // liefert globale posX und posY Varialbe
		if (!e) var e = window.event;
		if (document.captureEvents) {
			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;
		}
		
		if (gallery.getElementsByTagName("IMG").length > 5) drag.checkstoparea();
		rollen.checkdifferenz();
	};
	
	this.checkstoparea = function () {
		// Stoparea testen
		xcord = (posX > getoffsetLeft(holder) && posX < (getoffsetLeft(holder) + holder.offsetWidth)) ? true : false;
		ycord = (posY > getoffsetTop(holder) && posY < (getoffsetTop(holder) + holder.offsetHeight)) ? true : false;
		stoparea[0] = stoparea[1];
		stoparea[1] = (xcord == true && ycord == true) ? true : false;
		if (stoparea[0] == false && stoparea[1] == true && autoscroll == true) {
			this.end(false);
			this.flash("ein", "buttonl", undefined); 
			this.flash("ein", "buttonr", undefined);
		} else if (stoparea[0] == true && stoparea[1] == false && dragging == false && popupactive == false) {
			this.autoscroll(false, false);
			this.flash("aus", "buttonl", undefined);
			this.flash("aus", "buttonr", undefined);
		}
	};
	
	this.bilderscrollen = function (element) {
		maxX = (getoffsetLeft(slider) + slider.offsetWidth) - element.offsetWidth;
		
		relativeX = getoffsetLeft(element) - getoffsetLeft(slider); // Relative Position Drag
		bilderanzahl = gallery.getElementsByTagName("IMG").length;
		gesamtbreite = (bilderanzahl*160) + ((bilderanzahl-1)*20);
		overflowbreite = gesamtbreite-952;
		
		faktor = overflowbreite / (maxX - getoffsetLeft(slider));
		
		gallery.style.textIndent = "-"+(relativeX*faktor)+"px";
	};
	
	this.move = function () { // Manuelles scrollen
		if (dragging == false || posX == false) return;
		var nullpunkt = getoffsetLeft(document.getElementById("slider"));
		
		newX = posX-versetzung-nullpunkt;

		// Grenzwerte abfragen
		maxX = slider.offsetWidth - element.offsetWidth;
		if (newX < 0) newX = 0;
		if (newX > maxX) newX = maxX;
		//
		
		// Buttons ausblenden bei Grenzwerten
		if (newX == 0) document.getElementById("buttonl").style.display = "none";
		  else document.getElementById("buttonl").style.display = "block";
		if (newX == maxX) document.getElementById("buttonr").style.display = "none";
		  else document.getElementById("buttonr").style.display = "block";
		//
		
		// Bilder scrollen
		this.bilderscrollen(element);
		//
		
		element.style.left = newX+"px";
	};
	
	this.moveInterval = function (invert, repeat, grenze) { // Automatisches scrollen
		if (dragging == false || (repeat == true && autoscroll == false)) return;
		
		var speed = (grenze == true) ? 14 : 1;
		if (repeat == true) var speed = (invert == 0) ? 0.5 : 4; // Autoscroll Beschleunigung (vor- und rückwärts)
		if (ieall) speed = speed * 2.5; // IE Beschleunigung
		if (repeat == false && grenze == false) speed = speed * 2; // Button Beschleunigung

		relativeX = getoffsetLeft(element) - getoffsetLeft(slider);
		if (invert == 0) newX = relativeX + (speed*scrollintervall);
		  else newX = relativeX - (speed*scrollintervall);

		
		// Grenzwerte abfragen
		maxX = slider.offsetWidth - element.offsetWidth;
		if (newX < 0) {dragging = false; newX = 0; popup.checkarrow();}
		if (newX > maxX) {dragging = false; newX = maxX; popup.checkarrow();}
		
		// Buttons ausblenden bei Grenzwerten
		if (newX == 0) document.getElementById("buttonl").style.display = "none";
		  else document.getElementById("buttonl").style.display = "block";
		if (newX == maxX) document.getElementById("buttonr").style.display = "none";
		  else document.getElementById("buttonr").style.display = "block";
		//
		
		if (grenze == true) { 
			if (newX > grenzwert && invert == 0 && grenzwert < maxX) { newX = grenzwert; dragging = false; popup.checkarrow(); }
			if (newX < grenzwert && invert == 1 && grenzwert > 0) { newX = grenzwert; dragging = false; popup.checkarrow(); }
		}
		//
		
		// Bilder scrollen
		this.bilderscrollen(element);
		//
		
		element.style.left = newX+"px";
		if (dragging == false && repeat == true) { dragging = true; invert = (invert == 1) ? 0 : 1; }
		
		if (invert == 0 && repeat == false && grenze == false) window.setTimeout(function() {drag.moveInterval(0, false, false);}, scrolltempo);
		  else if (invert == 1 && repeat == false && grenze == false) window.setTimeout(function() {drag.moveInterval(1, false, false);}, scrolltempo);
		  	else if (invert == 0 && repeat == true && grenze == false) window.setTimeout(function() {drag.moveInterval(0, true, false);}, scrolltempo);
		  	  else if (invert == 1 && repeat == true && grenze == false) window.setTimeout(function() {drag.moveInterval(1, true, false);}, scrolltempo);
			  	else if (invert == 0 && repeat == false && grenze == true) window.setTimeout(function() {drag.moveInterval(0, false, true);}, scrolltempo);
		  	  	 else if (invert == 1 && repeat == false && grenze == true) window.setTimeout(function() {drag.moveInterval(1, false, true);}, scrolltempo);
	};
	
	
	this.autoscroll = function (grenze, wert) {
		if (ie6or7 || gallery.getElementsByTagName("IMG").length < 6) return; 
		autoscroll= true; 
		dragging = true;
		
		
		if (grenze == true) {
			grenzwert = (wert == false) ? posX - getoffsetLeft(slider) - (element.offsetWidth / 2) : wert;
			
			turn = (grenzwert < (getoffsetLeft(element)-getoffsetLeft(slider))) ? true : false;
			if (turn == true) window.setTimeout(function() {drag.moveInterval(1, false, true);}, scrolltempo);
			  else window.setTimeout(function() {drag.moveInterval(0, false, true);}, scrolltempo);
		} else window.setTimeout(function() {drag.moveInterval(0, true, false);}, scrolltempo);
	};
	
	// ## Buttons ##
	this.clickR = function (button) {
		if (ie6or7 || gallery.getElementsByTagName("IMG").length < 6) return; 
		dragging = true;	
		button.onmouseout = function () {drag.end();};
		window.setTimeout(function() {drag.moveInterval(0, false, false);}, scrolltempo);
	};
	
	this.clickL = function (button) {
		if (ie6or7 || gallery.getElementsByTagName("IMG").length < 6) return; 
		dragging = true;
		button.onmouseout = function () {drag.end();};
		window.setTimeout(function() {drag.moveInterval(1, false, false);}, scrolltempo);
	};
	
	// FadeIn Effekt
	this.flash = function (aktion, id, deckkraft) 
	{
		if (id == "opacity") {
			var maxDeckkraft = 50;
			var tempo = 4;
		} else {
			var maxDeckkraft = 100;
			var tempo = (!ieall) ? 10 : 5;
		}
		if (id == "rewrap") tempo = 4;
		
		tempo = maxDeckkraft/tempo;
		var element = document.getElementById(id);
		if (aktion == "ein") {
			var deckkraft = (deckkraft == undefined) ? tempo : deckkraft;
			if (!ieall) element.style.opacity = deckkraft/100;
			  else element.style.filter = "alpha(opacity="+deckkraft+")";
			deckkraft = deckkraft+tempo;
			if (deckkraft <= maxDeckkraft) window.setTimeout("drag.flash('"+aktion+"', '"+id+"', "+deckkraft+")", 25);
			  else {
				  if (!ieall) element.style.opacity = maxDeckkraft/100;
			        else { element.style.filter = (maxDeckkraft != 100) ?  "alpha(opacity="+maxDeckkraft+")" : ""; }
			  }
		} else {
			var deckkraft = (deckkraft == undefined) ? maxDeckkraft : deckkraft;
			if (!ieall) element.style.opacity = deckkraft/100;
			  else element.style.filter = "alpha(opacity="+deckkraft+")";
			deckkraft = deckkraft-tempo;
			if (deckkraft <= 0) {
				if (!ieall) element.style.opacity = 0;
			  	  else element.style.filter = "alpha(opacity=0)";
				if (id == "opacity") document.getElementById('opacity').style.display = "none";
				if (id == "rewrap") {
					document.getElementById('rewrap').style.display = "none";
					document.getElementById("retextin").innerHTML = "";
				}
			} else window.setTimeout("drag.flash('"+aktion+"', '"+id+"', "+deckkraft+")", 25);
		}
	};
	//
	
	// ## Enable und Disable Selection
	this.disableselection = function () {
		document.body.onselectstart = function() {return false;};
		document.body.unselectable = "on";
		document.body.style.UserSelect = "none";
		document.body.style.KhtmlUserSelect = "none";
		
		document.body.ondrag = function () {return false;}; // IE
		if (navigator.userAgent.search(/Firefox/) < 0) { if (event.preventDefault) event.preventDefault();} // FF, Safari, Chrome
	};
	
	this.enableselection = function () {
		document.body.onselectstart = function() {return true;};
		document.body.unselectable = "off";
		document.body.style.UserSelect = "text";
		document.body.style.KhtmlUserSelect = "normal";
		
		document.body.ondrag = function () {return true;}; // IE
	};
	
	this.fixFF = function (event) { // Firefox fix
		if (event.preventDefault) event.preventDefault();
	};
	//
	
	this.end = function (dragged) {
		dragging = false;
		autoscroll = false;
		this.enableselection();
		document.body.onmousemove = function () {};
		document.body.onmouseup = function () {};
		
		if (dragged == true && stoparea[1] == false) {
			this.autoscroll(false, false);
			this.flash("aus", "buttonl", undefined);
			this.flash("aus", "buttonr", undefined);
		}
	};
}




// ############## Beginn PopUp Klasse ##############

function popup() {
	this.start = function (url, pic) {
		popupactive = true;
		if (!ie6or7 && gallery.getElementsByTagName("IMG").length > 5) drag.end();
		
		arrow.style.visibility = "hidden";
		currentpic = pic;
		if (!ie6or7 && gallery.getElementsByTagName("IMG").length > 5) this.centerpic();
		
		drag.flash("aus", "buttonl", undefined);
		drag.flash("aus", "buttonr", undefined);
		if (!ie6or7) document.getElementById("referenzenpopup").style.height = (getoffsetTop(holder)+45)+"px";
		  else document.getElementById("rewrap").style.top = (getoffsetTop(holder)-510)+"px";
		document.getElementById('opacity').style.display = "block";
		if (ie6or7) document.getElementById('opacity').style.height = document.getElementById("wrap").offsetHeight+"px";
		document.getElementById('rewrap').style.display = "block";
		drag.flash("ein", "opacity", undefined);
		window.setTimeout('drag.flash("ein", "rewrap", undefined);', 200);
		
		this.request(url);
	};
	
	this.request = function (url) {
		// Ajax-Variable initialisieren 
		xmlHttp = null;
		try {
			// Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
			xmlHttp = new XMLHttpRequest();
		} catch(e) {
			try {
				// MS Internet Explorer (ab v6)
				xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				xmlHttp  = null; // kein Ajax
			}
		}
		
		// Datei request
		if (xmlHttp) {
			xmlHttp.open('GET', url, true);
			xmlHttp.onreadystatechange = function () {
				if (xmlHttp.readyState == 4) {
					// window.setTimeout('document.getElementById("retextin").innerHTML = xmlHttp.responseText;drag.flash("ein", "retextin", undefined);', 800); // Datei aufruf erfolgreich
					window.setTimeout('document.getElementById("retextin").innerHTML = xmlHttp.responseText;eval(parseJS(xmlHttp.responseText));drag.flash("ein", "retextin", undefined);', 800); // Datei aufruf erfolgreich
				}
			};
			xmlHttp.send(null);
		}		
	};
	
	this.centerpic = function () {
		if (faktor == false) return;
		minX = getoffsetLeft(gallery)-24;
		maxX = getoffsetLeft(gallery)+gallery.offsetWidth-24;
		if (getoffsetLeft(currentpic) < minX) { // Bild passt nicht
			picverschiebung = (getoffsetLeft(element)-getoffsetLeft(slider)) - ((minX - getoffsetLeft(currentpic))/faktor) - 70; 
			if (picverschiebung < getoffsetLeft(element)) drag.autoscroll(true, picverschiebung);
			  else this.checkarrow();
		} else if ((getoffsetLeft(currentpic)+160) > maxX) { // Bild passt nicht
			picverschiebung = (getoffsetLeft(element)-getoffsetLeft(slider)) + (((getoffsetLeft(currentpic)+160)-maxX)/faktor) + 70; //FEHLER !!
			if (picverschiebung > getoffsetLeft(element)) drag.autoscroll(true, picverschiebung);
			  else this.checkarrow();
		} else this.checkarrow();
		
	};
	
	this.checkarrow = function () {
		if (!currentpic) return;
		newleft = (getoffsetLeft(currentpic)-getoffsetLeft(holder)+63);
		if (newleft < 0) newleft = 0;
		if (newleft > 870) newleft = 870;
		arrow.style.left = newleft+"px";
		arrow.style.visibility = "visible";
	};
	
	this.end = function () {
		drag.flash("aus", "rewrap", undefined);
		drag.flash("aus", "retextin", undefined);
		window.setTimeout('drag.flash("aus", "opacity", undefined);', 200);
		popupactive = false;
		if (stoparea[1] == false && !ie6or7 && gallery.getElementsByTagName("IMG").length > 5) {
			drag.autoscroll(false, false);
		} else if (!ie6or7 && gallery.getElementsByTagName("IMG").length > 5) {
			drag.flash("ein", "buttonl", undefined);
			drag.flash("ein", "buttonr", undefined);	
		}
	};
}
 

// ############## Beginn Rollen Klasse ##############

function rollen() {
	this.effekt = function (von, zu, idd)
	{
		var v = 20; // Pixel pro Zeiteinheit = Geschwindigkeit
		var el = document.getElementById(idd);
	
		if (von > zu) {
			var neu = ((von-v) < zu) ? zu : (von-v);
			el.style.textIndent = neu+"px";	
			if (neu != zu) setTimeout(function() {rollen.effekt(neu, zu, idd);}, 20);
		} else {
			var neu = ((von+v) > zu) ? zu : (von+v);
			el.style.textIndent = neu+"px";
			if (neu != zu) setTimeout(function() {rollen.effekt(neu, zu, idd);}, 20);
		}
	};
	
	this.checkdifferenz = function () {
		if (!currentscroll) return;
		differenz = posX - breakx;
		
		picanzahl = document.getElementById("roll"+currentscroll.id).getElementsByTagName("IMG").length;
		verzoegerung = 0.6;
		jumper = 100/picanzahl;
		// Breite des Scrollers:
		jumper = Math.floor(285*(jumper/100)); 
		
		var indent = currentscroll.style.left;
		indent = parseInt(indent.substr(0, indent.length-2));
		
		if (differenz >= (jumper*verzoegerung) && indent != (jumper*(picanzahl-1))) {
			breakx = posX + (jumper*(1-verzoegerung)); 
			currentscroll.style.left = (indent+jumper)+"px";
			this.start(1, 'roll'+currentscroll.id);
		} else if (differenz <= (-1*jumper*verzoegerung) && indent != 0) {
			breakx = posX - (jumper*(1-verzoegerung)); 
			currentscroll.style.left = (indent-jumper)+"px";
			this.start(0, 'roll'+currentscroll.id);
		}
	};
	
	this.pushed = function (object) {
		if (navigator.userAgent.search(/Firefox/) >= 0) drag.fixFF;
		currentscroll = object;
		drag.disableselection();
		breakx = posX;
		
		document.body.onmouseup = function () { rollen.drop(); };
	};
	
	this.drop = function () {
		drag.enableselection();
		document.body.onmouseup = function () {};
		currentscroll = false;
	};

	this.start = function (richtung, idd) 
	{
		var el = currentscroll;
		var c = 285;
		var indent = el.style.left;
		indent = parseInt(indent.substr(0, indent.length-2));
		
		picanzahl = document.getElementById("roll"+currentscroll.id).getElementsByTagName("IMG").length;
		quot = Math.floor(c/picanzahl);
		stand = (indent/quot); 
		
		// nach rechts scrollen
		if (richtung == 1) {
			indent = -(stand-1)*c;
			b = -1*stand*c;
			this.effekt(indent, b, idd); 
		}
		//nach links scrollen
		if (richtung == 0) {
			indent = -(stand+1)*c;
			b = -1*stand*c;
			this.effekt(indent, b, idd);
		}
	};
}

function parseJS(_regsearch)
{
	var parsedJS = '';
	var _myregex = /<script[^>]*>([\s\S]*?)<\/script>/gi;
	_regsearch = _regsearch.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){
					if (_regsearch !== null)
					{
						parsedJS += arguments[1] + '\n';
					}
					return '';
				});
	return parsedJS;
}
