Hi,

ich benötige öfter mal Callback-Funktionen in den Slidern die ich einsetze. Da ich gerne den PK_NoobSlider einsetzte, habe ich das Javascript um 2 Callback-Funktionen erweitert. Ich stelle die beiden Javascripte mal hier zur Verfügung, unter Umständen könnte man die ja mal in Zukunft so einbauen

class.noobSlider.js
Code:
/*
Author:
	luistar15, <leo020588 [at] gmail.com>
	Rainer Ilgen <raineri@gmx.net> Extention for Fading
	Philipp Kaiblinger <philipp.kaiblinger@kaipo.at> Extention for Fading adapting for Contao CMS
	
License:
	MIT License
 
Class
	noobSlide (rev.03-11-10)
	noobSlide Extention for Fading (rev. 23-10-08)
	noobSlide Extension for Fading adapting for Contao CMS (rev. 28-06-2011)

Arguments:
	Parameters - see Parameters below

Parameters:
	box: dom element | required
	items: dom collection | required
	size: int | item size (px) | default: 240
	mode: string | 'horizontal', 'vertical' | default: 'horizontal'
	fade: boolean | default: false
	addButtons:{
		previous: single dom element OR dom collection| default: null
		next:  single dom element OR dom collection | default: null
		play:  single dom element OR dom collection | default: null
		playback:  single dom element OR dom collection | default: null
		stop:  single dom element OR dom collection | default: null
	}
	button_event: string | event type | default: 'click'
	handles: dom collection | default: null
	handle_event: string | event type| default: 'click'
	fxOptions: object | Fx.Tween options | default: {duration:500,wait:false}
	interval: int | for periodical | default: 5000
	autoPlay: boolean | default: false
	onWalk: event | pass arguments: currentItem, currentHandle | default: null
	startItem: int | default: 0

Properties:
	box: dom element
	items: dom collection
	size: int
	mode: string
	fade: boolean
	buttons: object
	button_event: string
	handles: dom collection
	handle_event: string
	previousIndex: int
	nextIndex: int
	fx: Fx.Tween instance
	interval: int
	autoPlay: boolean
	onWalk: function
	
Methods:
	previous(manual): walk to previous item
		manual: bolean | default:false
	next(manual): walk to next item
		manual: bolean | default:false
	play (interval,direction,wait): auto walk items
		interval: int | required
		direction: string | "previous" or "next" | required
		wait: boolean | required
	stop(): stop auto walk
	walk(item,manual,noFx): walk to item
		item: int | required
		manual: bolean | default:false
		noFx: boolean | default:false
	addHandleButtons(handles):
		handles: dom collection | required
	addActionButtons(action,buttons):
		action: string | "previous", "next", "play", "playback", "stop" | required
		buttons: dom collection | required

Requires:
	mootools 1.2 core
*/
var noobSlide = new Class({

	initialize: function(params){
		this.onBefore = params.onBefore || function(){};
		this.onAfter = params.onAfter || function(){};
		this.items = params.items;
		this.mode = params.mode || 'horizontal';
		this.fade = params.fade || false;
		this.modes = {horizontal:['left','width'], vertical:['top','height']};
		this.size = params.size || 240;
		this.box = params.box.setStyle(this.modes[this.mode][1],(this.size*this.items.length)+'px');
		this.divElements = params.divElements;		
		this.button_event = params.button_event || 'click';
		this.handle_event = params.handle_event || 'click';
		this.previewItems_event = params.previewItems_event || 'click'; 
		this.onWalk = params.onWalk || null;
		this.currentIndex = null;
		this.previousIndex = null;
		this.nextIndex = null;
		this.interval = params.interval || 5000;
		this.autoPlay = params.autoPlay || false;
		this._play = null;
		this.handles = params.handles || null;
		this.previewItems = params.previewItems || null;
		this.fadeDuration = params.fadeDuration; 
		
		if(this.handles){
			this.addHandleButtons(this.handles, this.handle_event);
		}
		
		if(this.previewItems){
			this.addHandleButtons(this.previewItems, this.previewItems_event);
		}
		
		this.buttons = {
			previous: [],
			next: [],
			play: [],
			playback: [],
			stop: []
		};
		if(params.addButtons){
			for(var action in params.addButtons){
				this.addActionButtons(action, $type(params.addButtons[action])=='array' ? params.addButtons[action] : [params.addButtons[action]]);
			}
		}
		
		if(this.fade)
		{
			//Prepare Fading
			this.orderItems(params);
			this.fading((params.startItem||0),true,true);
		}
		else
		{
			//original Sliding
			this.fx = new Fx.Tween(this.box,$extend((params.fxOptions||{duration:500,wait:false}),{property:this.modes[this.mode][0]}));
			this.walk((params.startItem||0),true,true);
		}
	},
		
	//new function for Ordering the Items for Fading
	orderItems: function() {
		
		for(i=0;i<this.items.length;i++)
		{	
			$$(this.divElements)[i].setStyle('position', 'absolute');
			$$(this.divElements)[i].setStyle('left', '0px');
			$$(this.divElements)[i].setStyle('z-index', i+1);			
			
			if(i>0)
			{
				$$(this.divElements)[i].fade('out');
				// hidden inactive elements
				$$(this.divElements)[i].setStyle('display', 'none');
			}
			
		}
	},

	addHandleButtons: function(handles, handle_event){
		for(var i=0;i<handles.length;i++){
			if(this.fade)
			{
				handles[i].addEvent(handle_event,this.fading.pass([i,true],this));
			}
			else
			{
				handles[i].addEvent(handle_event,this.walk.pass([i,true],this));
			}
		}
	},

	addActionButtons: function(action,buttons){
		for(var i=0; i<buttons.length; i++){
			switch(action){
				case 'previous': buttons[i].addEvent(this.button_event,this.previous.pass([true],this)); break;
				case 'next': buttons[i].addEvent(this.button_event,this.next.pass([true],this)); break;
				case 'play': buttons[i].addEvent(this.button_event,this.play.pass([this.interval,'next',false],this)); break;
				case 'playback': buttons[i].addEvent(this.button_event,this.play.pass([this.interval,'previous',false],this)); break;
				case 'stop': buttons[i].addEvent(this.button_event,this.stop.create({bind:this})); break;
			}
			this.buttons[action].push(buttons[i]);		
		}
	},

	previous: function(manual){
		if(this.fade)
		{
			this.fading((this.currentIndex>0 ? this.currentIndex-1 : this.items.length-1),manual);
		}
		else
		{
			this.walk((this.currentIndex>0 ? this.currentIndex-1 : this.items.length-1),manual);
		}
	},

	next: function(manual){
		if(this.fade)
		{
			this.fading((this.currentIndex<this.items.length-1 ? this.currentIndex+1 : 0),manual);
		}
		else
		{
			this.walk((this.currentIndex<this.items.length-1 ? this.currentIndex+1 : 0),manual);
		}
	},
	play: function(interval,direction,wait){
		this.stop();
		if(!wait){
			this[direction](false);
		}
		this._play = this[direction].periodical(interval,this,[false]);
	},

	stop: function(){
		$clear(this._play);
	},
	walk: function(item,manual,noFx){
		if(item!=this.currentIndex){
			this.onBefore(item,manual,noFx);
			this.currentIndex=item;
			this.previousIndex = this.currentIndex + (this.currentIndex>0 ? -1 : this.items.length-1);
			this.nextIndex = this.currentIndex + (this.currentIndex<this.items.length-1 ? 1 : 1-this.items.length);
			if(manual){
				this.stop();
			}
			if(noFx){
				this.fx.cancel().set((this.size*-this.currentIndex)+'px');
			}else{
				this.fx.cancel().start(this.size*-this.currentIndex);
			}
			if(manual && this.autoPlay){
				this.play(this.interval,'next',true);
			}
			if(this.onWalk){
				this.onWalk((this.items[this.currentIndex] || null), (this.handles && this.handles[this.currentIndex] ? this.handles[this.currentIndex] : null));
			}
			this.onAfter(item,manual,noFx);
		}
	},
	//Fading
	fading: function(item,manual,noFx){
		if(item!=this.currentIndex){
			this.onBefore(item,manual,noFx);
			this.lastIndex=this.currentIndex;
			this.currentIndex=item;
			this.previousIndex = this.currentIndex + (this.currentIndex>0 ? -1 : this.items.length-1);
			this.nextIndex = this.currentIndex + (this.currentIndex<this.items.length-1 ? 1 : 1-this.items.length);
			
			$$(this.divElements)[this.currentIndex].set('tween', {duration: (this.fadeDuration ? this.fadeDuration : 500)});
			
			if(manual){
				this.stop();
			}
			if(!noFx){
				// fade in and show active element
				$$(this.divElements)[this.currentIndex].fade('in');
				$$(this.divElements)[this.currentIndex].setStyle('display', 'block');
				$$(this.divElements)[this.lastIndex].fade('out');
			}
			if(manual && this.autoPlay){
				this.play(this.interval,'next',true);
			}
			if(this.onWalk){
				this.onWalk((this.items[this.currentIndex] || null), (this.handles && this.handles[this.currentIndex] ? this.handles[this.currentIndex] : null));
			}
			this.onAfter(item,manual,noFx);
		}
	}
});
class.noobSlider.js
Code:
var noobSlide=new Class({initialize:function(b){this.onBefore = b.onBefore || function(){};this.onAfter = b.onAfter || function(){};this.items=b.items;this.mode=b.mode||"horizontal";this.fade=b.fade||false;this.modes={horizontal:["left","width"],vertical:["top","height"]};this.size=b.size||240;this.box=b.box.setStyle(this.modes[this.mode][1],(this.size*this.items.length)+"px");this.divElements=b.divElements;this.button_event=b.button_event||"click";this.handle_event=b.handle_event||"click";this.previewItems_event=b.previewItems_event||"click";this.onWalk=b.onWalk||null;this.currentIndex=null;this.previousIndex=null;this.nextIndex=null;this.interval=b.interval||5000;this.autoPlay=b.autoPlay||false;this._play=null;this.handles=b.handles||null;this.previewItems=b.previewItems||null;this.fadeDuration=b.fadeDuration;if(this.handles){this.addHandleButtons(this.handles,this.handle_event)}if(this.previewItems){this.addHandleButtons(this.previewItems,this.previewItems_event)}this.buttons={previous:[],next:[],play:[],playback:[],stop:[]};if(b.addButtons){for(var a in b.addButtons){this.addActionButtons(a,$type(b.addButtons[a])=="array"?b.addButtons[a]:[b.addButtons[a]])}}if(this.fade){this.orderItems(b);this.fading((b.startItem||0),true,true)}else{this.fx=new Fx.Tween(this.box,$extend((b.fxOptions||{duration:500,wait:false}),{property:this.modes[this.mode][0]}));this.walk((b.startItem||0),true,true)}},orderItems:function(){for(i=0;i<this.items.length;i++){$$(this.divElements)[i].setStyle("position","absolute");$$(this.divElements)[i].setStyle("left","0px");$$(this.divElements)[i].setStyle("z-index",i+1);if(i>0){$$(this.divElements)[i].fade("out");$$(this.divElements)[i].setStyle("display","none")}}},addHandleButtons:function(b,c){for(var a=0;a<b.length;a++){if(this.fade){b[a].addEvent(c,this.fading.pass([a,true],this))}else{b[a].addEvent(c,this.walk.pass([a,true],this))}}},addActionButtons:function(c,b){for(var a=0;a<b.length;a++){switch(c){case"previous":b[a].addEvent(this.button_event,this.previous.pass([true],this));break;case"next":b[a].addEvent(this.button_event,this.next.pass([true],this));break;case"play":b[a].addEvent(this.button_event,this.play.pass([this.interval,"next",false],this));break;case"playback":b[a].addEvent(this.button_event,this.play.pass([this.interval,"previous",false],this));break;case"stop":b[a].addEvent(this.button_event,this.stop.create({bind:this}));break}this.buttons[c].push(b[a])}},previous:function(a){if(this.fade){this.fading((this.currentIndex>0?this.currentIndex-1:this.items.length-1),a)}else{this.walk((this.currentIndex>0?this.currentIndex-1:this.items.length-1),a)}},next:function(a){if(this.fade){this.fading((this.currentIndex<this.items.length-1?this.currentIndex+1:0),a)}else{this.walk((this.currentIndex<this.items.length-1?this.currentIndex+1:0),a)}},play:function(a,c,b){this.stop();if(!b){this[c](false)}this._play=this[c].periodical(a,this,[false])},stop:function(){$clear(this._play)},walk:function(c,b,a){if(c!=this.currentIndex){this.onBefore(c,b,a);this.currentIndex=c;this.previousIndex=this.currentIndex+(this.currentIndex>0?-1:this.items.length-1);this.nextIndex=this.currentIndex+(this.currentIndex<this.items.length-1?1:1-this.items.length);if(b){this.stop()}if(a){this.fx.cancel().set((this.size*-this.currentIndex)+"px")}else{this.fx.cancel().start(this.size*-this.currentIndex)}if(b&&this.autoPlay){this.play(this.interval,"next",true)}if(this.onWalk){this.onWalk((this.items[this.currentIndex]||null),(this.handles&&this.handles[this.currentIndex]?this.handles[this.currentIndex]:null))}this.onAfter(a,b,c);}},fading:function(c,b,a){if(c!=this.currentIndex){this.onBefore(c,b,a);this.lastIndex=this.currentIndex;this.currentIndex=c;this.previousIndex=this.currentIndex+(this.currentIndex>0?-1:this.items.length-1);this.nextIndex=this.currentIndex+(this.currentIndex<this.items.length-1?1:1-this.items.length);$$(this.divElements)[this.currentIndex].set("tween",{duration:(this.fadeDuration?this.fadeDuration:500)});if(b){this.stop()}if(!a){$$(this.divElements)[this.currentIndex].fade("in");$$(this.divElements)[this.currentIndex].setStyle("display","block");$$(this.divElements)[this.lastIndex].fade("out")}if(b&&this.autoPlay){this.play(this.interval,"next",true)}if(this.onWalk){this.onWalk((this.items[this.currentIndex]||null),(this.handles&&this.handles[this.currentIndex]?this.handles[this.currentIndex]:null))}this.onAfter(c,b,a);}}});
Ich hab beide Scripte bearbeitet, da die Kurzversion andere Variablen übergibt und man in der offenen Version meine Änderungen nachvollziehen kann. In beiden Versionen, habe ich lediglich 2 neue Eigenschaften an den Anfang der Instanzierung gesetzt und weiter unten im Code rufe ich dann einfach die Funktionen auf. Im Template kann man somit die Funktionen überschreiben und eigenen Code einsetzten. Es ist somit möglich die Titel der Bilder zu wechseln, oder anhand des Bilderindex, der auch zurückgegeben wird, kann man Container aus/einfaden.

Beispiel:
Ich habe über dem Slider mit 3 Bildern 3 Text-Elemente mit der Klasse index-titletext eingefügt, diese können dann einfach mit der onBefore-Funktion ein-/ausgefadet werden. Der Code ist nur Beispielhaft, den Rest hab ich nicht mit Rauskopiert.
Code:
window.addEvent('domready', function() {
	noobslide<?php echo $this->sliderId; ?> = new noobSlide({
		box: document.getElement('#<?php echo $this->articleId; ?> .ce_noobSlide_container'),
		items: [<?php echo $this->jsElements; ?>],
		onBefore: function(index,b,c){

			$$('.index-titletext').fade(0); /* Erst alle ausblenden */
			$$('.index-titletext')[index].fade(1); /* Element Nummer [index] einblenden */
		}
		/* Mehr Code/Einstellungen hier eintragen */
	});
});
Ist nur ein Vorschlag bzw. ein Tutorial wie man Callbacks einsetzen kann
Die Aufrufe im Fade-/Walk-Block kann man evt auch in den Next-Block stellen, evt um den CurrentIndex zu übergeben, zusätzlich zum nächsten bzw vorherigen Index.

Grüße
Sioweb