Fader = {
	
	FadeData:[],
	CurrentFadeIndex:0,
	FadeId:-1,
	HaltId:-1,
	ActiveImage:null,
	NextImage:null,
	Images:[],
	PreLoadedAmount:0,
	
	// init fader
	Init:function() {
		Fader.SetImages();
		Fader.Preload();
	},
	
	// set images arrays
	SetImages:function() {
		this.FadeData.push({className:"productFloorImage",images:["floor_1","floor_2","floor_3"]});
		this.FadeData.push({className:"productInteriorImage",images:["interior_1","interior_2","interior_3","interior_4","interior_5","interior_6"]});
		this.FadeData.push({className:"productExteriorImage",images:["exterior_1","exterior_2","exterior_3","exterior_4"]});
	},
	
	Preload:function() {
		for (var i=0;i<this.FadeData.length;i++) {
			for (var j=1;j<this.FadeData[i].images.length;j++) {
				var img = new Image();
					img.src = "images/content/" + this.FadeData[i].images[j] + ".jpg";
				
				Event.Observe(img,"load",this.ImagePreLoaded);
				Event.Observe(img,"error",this.ImagePreLoaded);
				
				this.Images.push(img);
			}
		}
	},
	
	ImagePreLoaded:function(e) {
		Fader.PreLoadedAmount++;
		
		var totalAmount = 0;
		
		for (var i=0;i<Fader.FadeData.length;i++) {
			totalAmount += Fader.FadeData[i].images.length -1 ;
		}
		
		if (Fader.PreLoadedAmount == totalAmount) {
			Fader.Halt();
		}
	},
	
	// get the current active image
	GetActiveImage:function(images) {
		for (var i=0;i<images.length;i++) {
			if (!Element.Class.Contains(images[i],"next")) {
				return images[i];
			}
		}
		return null;
	},
	
	// get next image in line to be faded (compare current image name with image array, if image is found, pick next image)
	GetNextImage:function(activeImage,images) {
		var src = activeImage.getAttribute("src");
		var name = src.substr(src.lastIndexOf("/")+1).split(".")[0];
		
		for (var i=0;i<images.length;i++) {
			if (name == images[i]) {
				return (i+1 < images.length ? images[i+1] : images[0]);
			}
		}
		return null;
	},
	
	// initialize fading sequence
	Start:function() {
		var fadeData = this.FadeData[this.CurrentFadeIndex];
		
		var images = $class(fadeData.className);
		
		if (!images) {
			return;	
		}
		
		this.ActiveImage = this.GetActiveImage(images);
		
		if (!this.ActiveImage) {
			return;	
		}
		
		var nextImageName = this.GetNextImage(this.ActiveImage,fadeData.images);
		
		if (!nextImageName) {
			return;	
		}
		
		var imgUrl = "images/content/" + nextImageName + ".jpg";
		
		this.ActiveImage.style.opacity = 1;
		this.ActiveImage.style.filter = "alpha(opacity=100)";
		
		this.NextImage = document.createElement("img");
		this.NextImage.setAttribute("alt","");
		this.NextImage.setAttribute("src",imgUrl);
		this.NextImage.className = fadeData.className + " next";
		
		this.ActiveImage.parentNode.appendChild(this.NextImage);
		
		
		this.FadeId = setInterval(this.Fade,10);
	},
	
	// fade supplied active image
	Fade:function() {
		if (Fader.ActiveImage.style.opacity > 0) {
			Fader.ActiveImage.style.opacity -= 0.01;
			Fader.ActiveImage.style.filter = "alpha(opacity=" + (Fader.ActiveImage.style.opacity * 100) + ")";
		}
		else {
			Fader.Stop();
		}
	},
	
	// called when fading is done
	Stop:function() {
		clearInterval(this.FadeId);
		Element.Remove(this.ActiveImage);
		Element.Class.Remove(this.NextImage,"next");
		this.CurrentFadeIndex = this.CurrentFadeIndex + 1 >= this.FadeData.length ? 0 : this.CurrentFadeIndex+1;
		this.Halt();
	},
	
	// small timeout between foto fades
	Halt:function() {
		this.HaltId = setTimeout(this.Continue,2000);
	},
	
	// continue fading process and clear timeout
	Continue:function() {
		Fader.Start();
	}
}

Event.Observe(window,"load",Fader.Init);
