/*
 * Gallery Class
 * @author: Daniel Auener <daniel@internetavdelningen.se>
 */
var Gallery = Class.create({ 

	initialize: function(galleryElement) { 	
		this.galleryElement = galleryElement;	
		this.list = this.galleryElement.select("li");
		
		this.changing = false;
		
		if (this.list.size() > 0) {
			this.galleryElement.up(".galleryWrapper").setStyle({display:"block"});
		}
		
		this.iterator = 0;
		this.effect = this.galleryElement.readAttribute("data-effect");
		this.effects = new Array("fade","blind","slide","fold","drop","puff","shrink","squish");
	},
	
	change: function() {				
		
		if (!this.changing) {
			this.changing = true;
			// get direction		
			var direction = ($A(arguments).size() > 1) ? $A(arguments)[1] : null;
	
			// save current index
			var current = this.iterator;
	
			// adjust layer level
			this.list[current].setStyle({zIndex:"2"});
	
			// increase iterator
			if (direction == "prev") this.iterator = (this.iterator-1 < 0) ? this.list.size()-1 : this.iterator-1;
			else this.iterator = (this.iterator+1 >= this.list.size()) ? 0 : this.iterator+1;
	
			this.list[this.iterator].setStyle({display:"block",zIndex:"1"});
	
			var effect = (this.effect != "random") ? this.effect : this.effects[Math.ceil(Math.random()*this.effects.size())-1];
	
			// use effect to change the image
			switch (effect) {
				case "fade": new Effect.Fade(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;
				case "blind": new Effect.BlindUp(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;
				case "slide": new Effect.SlideUp(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;
				case "fold": new Effect.Fold(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;			
				case "drop": new Effect.DropOut(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;
				case "puff": new Effect.Puff(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;						
				case "shrink": new Effect.Shrink(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;						
				case "squish": new Effect.Squish(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;						
				default: new Effect.Fade(this.list[current],{afterFinish:function() {this.changing = false;}.bind(this)}); break;
			}	
		}
	}
	
});



/*
 * GalleryAutoChange Class
 * @author: Daniel Auener <daniel@internetavdelningen.se>
 */
var GalleryAutoChange = Class.create(Gallery, { 

	initialize: function($super,galleryElement) { 			
		
		$super(galleryElement);
		this.startIntervall = this.galleryElement.readAttribute("data-startintervall") 
			? this.galleryElement.readAttribute("data-startintervall") : 2;
		this.changeIntervall = this.galleryElement.readAttribute("data-changeintervall") 
			? this.galleryElement.readAttribute("data-changeintervall") : 2;
		
		// position settings for picturefader
		if (this.list.size() > 1) {
			new PeriodicalExecuter(function(pe) {
				new PeriodicalExecuter(this.change.bind(this), this.changeIntervall);
				this.change();
				pe.stop();
			}.bind(this), this.startIntervall);
		}
	}
	
});


/*
 * GalleryClickChange Class
 * @author: Daniel Auener <daniel@internetavdelningen.se>
 */
var GalleryClickChange = Class.create(Gallery, { 

	initialize: function($super,galleryElement) { 			
		
		$super(galleryElement);
		
		this.nextElement = this.galleryElement.up(".galleryWrapper").down(".next");
		this.prevElement = this.galleryElement.up(".galleryWrapper").down(".prev");
		
		if (this.list.size() > 1) {
			// position settings for picturefader
			if (this.nextElement && this.prevElement) {
				this.nextElement.observe("click",this.change.bindAsEventListener(this,"next"));		
				this.prevElement.observe("click",this.change.bindAsEventListener(this,"prev"));		
			}
		} else {
			if (this.nextElement) this.nextElement.setStyle({display:"none"});
			if (this.prevElement) this.prevElement.setStyle({display:"none"});
		}
	}
	
});


/*
 * Inits and controlls all galleries on the website.
 * @author: Daniel Auener <daniel@internetavdelningen.se>
 */
var GalleryController = Class.create({ 

	initialize: function(selectorClass) { 		
		
		// get all galleries with selectorClass
		this.galleryElements = $$("ul."+selectorClass);
		this.galleries = new Array();

		// initialize all galleries
		this.galleryElements.each(function(gallery) {
			var galleryInstance = null;
			switch (gallery.readAttribute("data-type")) {
				case "autoChange" : galleryInstance = new GalleryAutoChange(gallery); break;
				case "clickChange" : galleryInstance = new GalleryClickChange(gallery); break;
				default: galleryInstance = new GalleryAutoChange(gallery); break;
			}
			this.galleries.push(galleryInstance);
		}.bind(this));
		
	}

});

