if(!$defined(Ah)) Ah = {};

Ah.SlideshowTeaser = new Class({
	
	Implements: [Options],
	
	el: null,
	effect:null,
	
	options: {
		effect_options: {
			duration: 500,
			closedOpacity: 0.4
		},
		current_class: 'current',
		default_class: 'default_teaser'
	},
	
	initialize: function(el, options){
		this.el = $(el);
		this.setOptions(options);
		
		if (el.getElement('img')) {
			this.effect = new Ah.Effects.Fade(el.getElement('img'), this.options.effect_options);
			if (this.el.hasClass(this.options.default_class)) {
				this.effect.setOpen();
			}else{
				this.effect.setClosed();
			}
		}
		this.setCurrent( this.el.hasClass(this.options.default_class) ? true : false);
		
		this.el.addEvent('mouseenter', this.onMouseEnter.bindWithEvent(this));
		this.el.addEvent('mouseleave', this.onMouseLeave.bindWithEvent(this));
	},
	
	setCurrent: function(current){
		this.el[(current || false) ? 'addClass' : 'removeClass'](this.options.current_class);
	},
	
	isCurrent: function(){
		return this.el.hasClass(this.options.current_class);
	},
	
	onMouseEnter: function(e){
		if(this.effect) this.effect.open();
	},
	
	onMouseLeave: function(e){
		if( !this.isCurrent() && this.effect ) this.effect.close()
	}
});


Ah.SlideshowTeasers = new Class({
	
	Implements: [Options],
	
	el: null,
	teasers_els: null,
	teasers: [],
	request: null,
	updateEl: null,
	mainLink: null,
	
	options: {
		teaser_class: 'teaser',
		target_id: 'slideshowContainer',
		slideshow_class: 'slideshow'
	},
	
	initialize: function(el, options){
		this.el = $(el);
		this.setOptions(options);
		
		this.teaser_els = this.el.getElements('.' + this.options.teaser_class);
		this.updateEl = $(this.options.target_id);
		if (this.updateEl) {
			this.request = new Request.HTML({
				update: this.updateEl,
				onSuccess: this.onRequestSuccess.bind(this)
			});
		}
		this.setupTeasers();
		this.setupSlideShows();
	},
	
	setupTeasers: function(){
		this.teaser_els.each(function(teaser, i){
			teaser.addEvent('click', this.onTeaserClick.bindWithEvent(this, i));
			this.teasers.push( new Ah.SlideshowTeaser(teaser) );
		}, this);
	},
	
	onTeaserClick: function(e, index){
		e.stop();
		var url;
		this.teasers.each(function(teaser, i){
			if(this.updateEl && i == index && !teaser.isCurrent() ){
				url = teaser.el.get('rel')
			}
			if(teaser.isCurrent() && i != index){
				if(teaser.effect) teaser.effect.close();
			}
			teaser.setCurrent(i == index);
		}, this);
		if(url) this.request.get(url);
	},
	
	onRequestSuccess: function(){
		this.setupSlideShows();
	},
	
	setupSlideShows: function(){
		this.updateEl.getElements('.' + this.options.slideshow_class).each(function(el){
			if(el.retrieve('slideshow_setup')) return;
			Ah.Storage.slideshow = new Ah.Effects.FadeSlideshow( 
				el, 
				Ah.Storage.ss_srcs[el.id], 
				{  
					random: false,
					descriptions: Ah.Storage.ss_alts[el.id],
					duration: 4000,
					effectOptions: {
						duration: 1500, 
						transition: Fx.Transitions.Quad.easeOut
					}
				}
			); 
			el.store('slideshow_setup', true);
		}, this);
	}
	
});
