// ++++++++++ CONFIG ++++++++++++++++++++++++++
// CSS
var sliderPool = "sliderPool"; // id des Kontainer-Divs, in dem die sliderItems enthalten sind
var sliderItemClass = "sliderContent"; // Div-Class, in der die einzelnen Inhalte stehen
var sliderId = "innerModul"; // id des Div, das den Inhalt anzeigt

// Rechs-/ Links- Blättern
var sliderLoop = true; // true: Endlosanimation
var sliderDuration = 0.5; // Dauer der Verschiebung bei Links-/ Rechts-Klick

// Auto-Animation
// sliderDurationAnimation1 > sliderDurationAnimation2 !!!!
// var sliderDurationAnimation1: Auto-Animation alle 2 Sekunden ausführen (wird in der config erstellt!!)
var sliderDurationAnimation2 = 0.5; // =1: Dauer der Verschiebung = 1sec

// Sprung zu einem best. Item
var sliderDurationJump = 0.2; // Dauer der Verschiebung beim sliderJump
var sliderDurationJumpOverlap=false; // true: die Items überlappen sich beim Jump
// ++++++++++ CONFIG ++++++++++++++++++++++++++


// ++++++++++ INIT ++++++++++++++++++++++++++++
var sliderItems = new Array(); // interner Array mit den IDs der Items
var sliderUserClicked = false; // true: der User hat ein Steuerelement angeklickt (Animation!)
var sliderAnimationIsActive = false; // true: Animation läuft gerade 
var sliderAutoAnimationIsActive = false; // true: Auto-Animation läuft gerade 


// in window.onload() ausführen
function sliderInit() {
	if(!$(sliderPool)) return;
	
	$$("."+sliderItemClass).each(function(item, i){ // ids im Array zwischenspeichern
		sliderItems[sliderItems.length] = item.identify(); 
		item.setStyle({"position":"absolute"}); // CSS reicht nicht
		if(i==0) {sliderMoveContent(sliderId, item);}
	});

	$("modulNavigation").observe("mouseover", function(e) {
		sliderShowArrows();
	});

	$("modulNavigation").observe("mouseout", function(e) {
		sliderHideArrows();
	});

	sliderAutoAnimationStart(true);

	sliderHighlightActiveButton(); // ersten Button aktiv setzen
	sliderHideArrows();
}


// ++++++++++++++++ AUTO-ANIMATION ++++++++++++++++

// Auto-Animation starten
// flagLeft=true -> wie Linksklick (= von rechts nach links)
// flagLeft=false -> wie Rechtsklick (= von links nach rechts)
function sliderAutoAnimationStart(flagLeft) {
	if(sliderItems.length<=1) return; // bei einem/keinem Element: keine Animation
	if(sliderAutoAnimationIsActive) return; // es läuft bereits eine Animation
	if(Object.isUndefined(flagLeft)) flagLeft=true; // default

	sliderSetAnimationFalse();
	sliderUserClicked = false;

	
	sliderAutoAnimationIsActive = true;
	sliderAutoAnimation.delay(sliderDurationAnimation1, flagLeft);
}

// sich selbst aufrufende Hauptfunktion
function sliderAutoAnimation(flagLeft) {
	if(sliderUserClicked) {
		sliderAutoAnimationIsActive = false; 
		return; // keine weiteren Aufrufe
	}
	
	var id1 = sliderGetCurrentItemId();
	
	if(flagLeft) {
		var id2 = sliderGetId2(id1, true);
		_sliderMoveLeft(id1, id2, sliderDurationAnimation2, true, Effect.Transitions.sinoidal);
	} else {
		var id2 = sliderGetId2(id1, false);
		_sliderMoveRight(id1, id2, sliderDurationAnimation2, true, Effect.Transitions.sinoidal);
	}
	
	// Schleife, bis User einen Event ausführt
	sliderAutoAnimation.delay(sliderDurationAnimation1, flagLeft);
}


// ++++++++++++++++ FLAGS +++++++++++++++++++++++++
// während einer Animation soll kein weiterer Klick möglich sein
function sliderSetAnimationTrue() {
	sliderAnimationIsActive = true;
	sliderUserClicked = true;
}

// Flags einer einfachen Animation false setzen
function sliderSetAnimationFalse() {
	sliderAnimationIsActive = false;
}

// Auto-Animation Flags false setzen
function sliderSetAutoAnimationFalse() {
	sliderAutoAnimationIsActive=false;
	sliderUserClicked=true; 
}

// ++++++++++++++++ USER EVENTS ++++++++++++++++++
// id1 und id2 sind nicht benachbart => mehrere Divs verschieben
function sliderJump(indexTarget) {
	if(sliderAnimationIsActive) return;
	sliderSetAnimationTrue();
	
	var id1 = sliderGetCurrentItemId(); // aktuelle ID
	var i1 = getTargetIdIndex(id1);
	var i2 = indexTarget;
	
	// aktiver Punkt angeklickt?
	if(i1==i2) {
		sliderSetAnimationFalse();
		return;
	}
	
	var delay = 0;
	var duration = sliderDurationJump;
	if(sliderDurationJumpOverlap) {
		duration = sliderDuration;
		delay = -sliderDurationJump;
	}
	
	if(i2>i1) {
		for(var i=i1; i<i2; i+=1) {
			_sliderMoveLeft.delay(delay, sliderItems[i], sliderItems[i+1], duration, (i==(i2-1)) ? true : false, Effect.Transitions.linear);
			delay+=sliderDurationJump;
		}	
	} else {
		for(var i=i1; i>i2; i-=1) {
			_sliderMoveRight.delay(delay, sliderItems[i], sliderItems[i-1], duration, (i==(i2+1)) ? true : false, Effect.Transitions.linear); 
			delay+=sliderDurationJump;
		}		
	}
}


// bei Linksklick
function sliderMoveLeft(setAnimationFlag) {
	if(Object.isUndefined(setAnimationFlag)) setAnimationFlag=true; // default

	if(sliderAnimationIsActive) return;
	if(setAnimationFlag) sliderSetAnimationTrue();

	var id1 = sliderGetCurrentItemId();
	var id2 = sliderGetId2(id1, true);

	// wenn Auto-Animation läuft, dann verzögerter Aufruf des Befehls
	if(sliderAutoAnimationIsActive) {sliderSetAutoAnimationFalse(); sliderSetAnimationFalse(); sliderMoveLeft.delay(sliderDurationAnimation2, setAnimationFlag);}
	else _sliderMoveLeft(id1, id2, sliderDuration, true, Effect.Transitions.sinoidal);
}

// bei Rechtklick
function sliderMoveRight(setAnimationFlag) {
	if(Object.isUndefined(setAnimationFlag)) setAnimationFlag=true; // default

	if(sliderAnimationIsActive) return;
	if(setAnimationFlag) sliderSetAnimationTrue();

	var id1 = sliderGetCurrentItemId();
	var id2 = sliderGetId2(id1, false);
	
	// wenn Auto-Animation läuft, dann verzögerter Aufruf des Befehls
	if(sliderAutoAnimationIsActive)  {sliderSetAutoAnimationFalse(); sliderSetAnimationFalse(); sliderMoveRight.delay(sliderDurationAnimation2, setAnimationFlag);}
	else _sliderMoveRight(id1, id2, sliderDuration, true, Effect.Transitions.sinoidal);
}

// die nachfolgende/vorausgehende id berechnen
function sliderGetId2(id1, flagMoveLeft) {
	var id2 = false;

	if(flagMoveLeft) {
		for(var i=0; i<sliderItems.length; i++) {
			if(sliderItems[i]==id1) {
				if(i<sliderItems.length-1) {
					id2=sliderItems[i+1];
				} else {
					if(sliderLoop) id2 = sliderItems[0];
				}
			}
		}	
	} else {
		for(var i=0; i<sliderItems.length; i++) {
			if(sliderItems[i]==id1) {
				if(i>0) {
					id2=sliderItems[i-1];
				} else {
					if(sliderLoop) id2 = sliderItems[sliderItems.length-1];
				}
			}
		}	
	}
	
	return id2;
}

// ++++++++++++++ SLIDER MOVEMENT FUNCTIONS ++++++++++++++++++++
// Helper für sliderMoveLeft
function _sliderMoveLeft(id1, id2, duration, setAnimationFalse, eff) {
	if(!id1 || !id2) return false;

	sliderMoveContent(sliderId, id2);
	$(id2).setStyle({"left":$(id2).getStyle("width")});
	_sliderMove(id1, id2, "-"+$(id1).getStyle("width"), "0px", duration, setAnimationFalse, eff);
	return true;
}

// Helper für sliderMoveRight
function _sliderMoveRight(id1, id2, duration, setAnimationFalse, eff) {
	if(!id1 || !id2) return false;

	sliderMoveContent(sliderId, id2);
	$(id2).setStyle({"left":"-" + $(id2).getStyle("width")});
	_sliderMove(id1, id2, $(id1).getStyle("width"), "0px", duration, setAnimationFalse, eff);
	return true;
}

// die eigentliche Animation ausführen
function _sliderMove(id1, id2, id1Left, id2Left, duration, setAnimationFalse, eff) {
//var eff = Effect.Transitions.sinoidal;
	$(id1).morph({ left:id1Left}, {duration:duration, transition:eff}); // sinoidal linear
	$(id2).morph({ left:id2Left}, {duration:duration, transition:eff, afterFinish:function(){
		sliderMoveContent(sliderPool, id1);
		if(setAnimationFalse) sliderSetAnimationFalse(); // sliderJump: Flag nicht zurücksetzen
		sliderHighlightActiveButton();
	}});
}


// +++++++++++++ HELPER ++++++++++++++++++++++++++++++
// die ID des aktuell angezeigten Items zurückgeben
function sliderGetCurrentItemId() {
	return $(sliderId).down("."+sliderItemClass).identify();
}

// returns: index in sliderItems[] OR -1
function getTargetIdIndex(id) {
	for(var i=0; i<sliderItems.length; i++) {
		if(sliderItems[i]==id) {
			return i;
		}
	}
	return -1;
}

// Verschieben von idSource nach idTarget
function sliderMoveContent(idTarget, idSource) {
	$(idTarget).insert($(idSource)); 
}

function sliderLog(txt) {
	$("logger").insert(txt+"<br />\r\n");
}

// +++++++++++++ NAVIGATOR ++++++++++++++++++++++++++++++
// den aktuellen Button anders darstellen
function sliderHighlightActiveButton() {
	var i = getTargetIdIndex(sliderGetCurrentItemId());
	var id = sliderItems[i];
	$$("#modulBall>img").each(function(item, index){
		if(i==index) item.writeAttribute({src:"/libImages/global/modulBall-act.png"});
		else item.writeAttribute({src:"/libImages/global/modulBall.png"});
	});
}

// Pfeil links und rechts ausblenden
function sliderHideArrows() {
	$("arrowBack").setStyle({ visibility: 'hidden' });
	$("arrowNext").setStyle({ visibility: 'hidden' });
}

// Pfeil links und rechts einblenden
function sliderShowArrows() {
	$("arrowBack").setStyle({ visibility: 'visible' });
	$("arrowNext").setStyle({ visibility: 'visible' });
}
