var imgNo = 0;
var rotateNo = 2;
var cycledelay = "";
var loadImgs = [];
var availImgs = [];

var album = {
	startup: function() {
		new PeriodicalExecuter(function(next){
			cycledelay = false;
			if ($('play')){
				next.stop();
			}else{
				new album.cycle;
			}
		}, showFor);
	},

	controls: function(){
		var controlsUrl = $('pause').src;
		Event.observe($('pause'), 'click', function(){
			if ($('pause')){
				$('pause').id = 'play';
			}else{
				$('play').id = 'pause';
				cycledelay = true;
				new album.cycle;
			}
		});
		for (var i=0; i<imgs.length; i++){
			var newImgDiv = Builder.node('div', [Builder.node('img', {id: i, src: controlsUrl, alt: ''})]);

			if ($('rotator').getElementsByTagName("div")[0].getElementsByTagName("img")[0].src == imgs[i].imgUrl){
				newImgDiv.getElementsByTagName('img')[0].className = 'active';
			}
			$('controls').insert(newImgDiv);

			Event.observe($("" + i), 'click', function(){
				if ($('pause')){
					$('pause').id = 'play';
				}
				if (this.className != 'active'){
					var blockLast = $('rotate' + rotateNo);
					imgNo = parseInt(this.id-1);
					new album.cycle;
				};
			});
		};
	},

	preload: function(){
		for (var i=imgNo+1; i<imgs.length; i++){
			loadImgs.push(imgs[i].imgUrl);
		}
		for (var j=0; j<imgNo+1; j++){
			availImgs.push(imgs[j].imgUrl);
		}
		new album.loadnext;
	},

	cycle: function(){
		var blockLastId = "rotate" + rotateNo;
		rotateNo = (rotateNo == 1 ? 2 : 1);
		var blockFirstId = "rotate" + rotateNo;

		imgNo += 1;
		imgNo = (imgNo == imgs.length ? 0 : imgNo);

		for (var i=0; i<imgs.length; i++){
			if ((imgNo == i) || (imgNo == i - imgs.length)){
				$("" + i).className = 'active';
			}else{
				$("" + i).className = '';
			}
		};

		for (var j=0; j<availImgs.length; j++){
			if (imgs[imgNo].imgUrl == availImgs[j]){
				$(blockLastId).getElementsByTagName("img")[0].src = imgs[imgNo].imgUrl;
				if(links == true){
					$(blockLastId).getElementsByTagName("a")[0].href = imgs[imgNo].linkUrl;
				}
				$(blockLastId).getElementsByTagName("img")[0].alt = imgs[imgNo].imgAlt;
			}
		}

		/*
		if(slide==true){
			var topEffect = new Effect.SlideUp(blockFirstId, {sync: true,});
			var bottomEffect = new Effect.BlindDown(blockLastId, {sync: true,});
		}else{
			var topEffect = new Effect.Fade(blockFirstId, {sync: true,});
			var bottomEffect = new Effect.Appear(blockLastId, {sync: true,});
			var topEffect = "";
		}
		*/
		
		if(slide==true){
			new Effect.Parallel([
				new Effect.SlideUp(blockFirstId, {sync: true,}),
				new Effect.BlindDown(blockLastId, {sync: true,}),
			],{
				duration: speed,
				fps: 50,
				queue: {position: 'end', scope: 'slideshow', limit: 2},
				afterFinish: function(){
					var thisBlock = $(blockFirstId).remove();
					thisBlock.getElementsByTagName("img")[0].src = loadingUrl;
					if(links == true){
						thisBlock.getElementsByTagName("a")[0].href = "";
					}
					if(links==true){
						thisBlock.getElementsByTagName("a")[0].href = "";
					}
					thisBlock.getElementsByTagName("img")[0].alt = "image loading";
					$('rotator').insert(thisBlock);
					if (cycledelay == true){
						cycledelay = false;
						new album.startup;
					}
					if ($(blockLastId).getElementsByTagName("img")[0].src == loadingUrl){
						if (loadImgs.length > 0){
							var beingLoaded = false;
							for (var i=0; i<loadImgs.length; i++){
								if (loadImgs[i] == imgs[imgNo].imgUrl){
									beingLoaded = true;
								}
							}
							if (beingLoaded == false){
								loadImgs.push(imgs[imgNo].imgUrl);
							}
						}else{
							loadImgs.push(imgs[imgNo].imgUrl);
							new album.loadnext;
						}
					}
				}
			});
		}else{
			new Effect.Appear(blockLastId, {
				duration: speed,
				fps: 50,
				queue: {position: 'end', scope: 'slideshow', limit: 2},
				afterFinish: function(){
					var thisBlock = $(blockFirstId).remove();
					thisBlock.getElementsByTagName("img")[0].src = loadingUrl;
					if(links == true){
						thisBlock.getElementsByTagName("a")[0].href = "";
					}
					if(links==true){
						thisBlock.getElementsByTagName("a")[0].href = "";
					}
					thisBlock.getElementsByTagName("img")[0].alt = "image loading";
					$('rotator').insert(thisBlock);
					if (cycledelay == true){
						cycledelay = false;
						new album.startup;
					}
					if ($(blockLastId).getElementsByTagName("img")[0].src == loadingUrl){
						if (loadImgs.length > 0){
							var beingLoaded = false;
							for (var i=0; i<loadImgs.length; i++){
								if (loadImgs[i] == imgs[imgNo].imgUrl){
									beingLoaded = true;
								}
							}
							if (beingLoaded == false){
								loadImgs.push(imgs[imgNo].imgUrl);
							}
						}else{
							loadImgs.push(imgs[imgNo].imgUrl);
							new album.loadnext;
						}
					}
					$(blockFirstId).hide();
				}
			});

		}
	},

	loadnext: function(){
		if (loadImgs.length == 0){return;}
		var thisImgPath = loadImgs.shift();
		var newImgElement = Builder.node('img', {
			src: thisImgPath,
			style: 'display: none',
		});
		document.getElementsByTagName('body')[0].insert(newImgElement);
		Event.observe(newImgElement, 'load', function(){new album.loadedimg(newImgElement);});
	},

	loadedimg: function(thisImg){
		Event.stopObserving(thisImg, 'load', function(){new album.loadedimg(thisImg);});
		availImgs.push(thisImg.src);
		thisImg.remove();
		var blockFirst = $('rotator').getElementsByTagName("div")[0];
		if (blockFirst.getElementsByTagName("img")[0].src == loadingUrl){
			if (imgs[imgNo].imgUrl == thisImg.src){
				blockFirst.getElementsByTagName("img")[0].src = imgs[imgNo].imgUrl;
				if(links == true){
					blockFirst.getElementsByTagName("a")[0].href = imgs[imgNo].linkUrl;
				}
				blockFirst.getElementsByTagName("img")[0].alt = imgs[imgNo].imgAlt;
			}
		}
		new album.loadnext;
	},
};

Event.observe(window, 'load', album.startup);
Event.observe(window, 'load', album.controls);
Event.observe(window, 'load', album.preload);