PeriodicalExecuter.prototype.registerCallback = function() {
    this.intervalID = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
}

PeriodicalExecuter.prototype.stop = function() {
    clearInterval(this.intervalID);
}

function start_slideshow(start_frame, end_frame, delay) {
	setTimeout(switch_slides(start_frame,start_frame,end_frame, delay), delay);
}
             
function switch_slides(frame, start_frame, end_frame, delay) {
	return (function() {
		Effect.Fade('slideshow' + frame);
		if (frame == end_frame) { frame = start_frame; } else { frame = frame + 1; }
		setTimeout("Effect.Appear('slideshow" + frame + "');", 50);
		setTimeout(switch_slides(frame, start_frame, end_frame, delay), delay + 50);
	})
}

function changeLeft(){
	album.previous();
	return false;
}
function changeRight(){
	album.next();
	return false;
}

var album = { 
	start_f: 0,
	end_f: 0,
	current_f: 0,
	pe: null,
	delay_f: 0,
	
	startup: function(start_frame, end_frame, delay) {
		start_f = start_frame;
		end_f = end_frame;
		current_f = start_frame;
		delay_f = delay;
		pe = new PeriodicalExecuter(album.cycle, delay) // change image every delay seconds 
	}, 
	cycle: function() {
		previous_f = current_f;
		
		if (current_f == end_f) {current_f = start_f;} else {current_f++;}
		
		new Effect.Appear('slideshow'+current_f, {
			duration:0.5
		})
		$('slideshow'+previous_f).hide();
	},
	previous: function(){
		pe.stop();
		next_f = current_f;
		
		if (current_f == start_f) {current_f = end_f;} else {current_f--;}
		
		new Effect.Appear('slideshow'+current_f, {
			duration:0.5
		})
		$('slideshow'+next_f).hide();
	},
	next: function(){
		pe.stop();
		this.cycle();
	}
}