var f = null;

window.addEvent('domready', function() {
	init();
});

window.addEvent('unload', function() {
	f = null;
});

window.addEvent('load', function() {
	f.initLoad( document );
});

function init()
{
	f = new Engine();
	f.construct();
	
	f.addEvent('content', f.init.bind(f) );
}

var Engine = new Class({
	
	Implements: Events,
	
	construct: function( )
	{
		this.init( document );
	},
	
	init: function( obj )
	{
		this._img = document.getElement('.background img');
		this._img.fx = new Fx.Tween( this._img, {'property': 'opacity', 'link': 'chain'} );
		
		obj.getElements('.accordion').each( this.accordion.bind(this) );
		obj.getElements('.collection').each( this.collection.bind(this) );
		obj.getElements('.filter').each( this.filter.bind(this) );
		obj.getElements('.imgchg').each( this.image.bind(this) );
		
		if (document.getElement('.languages'))
			this.languages();
		
		if (document.getElement('.loading'))
			this.loading();
	},
	
	initLoad: function( obj )
	{
		if (document.getElement('.slide'))
			this.slide();
	},
	
	languages: function( )
	{
		var el = document.getElement('.languages');
		var sel = el.getElement('.language-selected');
		var list = el.getElement('ul');
		var toggler = new Element('h3', {'html': sel.get('text') } ).inject(el.getElement('div'), 'top');
		toggler.addEvent('click', function() { 
			list.toggleClass('ghost');
		} )
		
	},
	
	loading: function( )
	{
		var el = document.getElement('.loading');
		( function() { el.fade('out'); } ).delay(1000);
		( function() { el.dispose(); } ).delay(2000);
	},
	
	slide: function( )
	{
		this._slide_index = null;
		this._slide = {}
		this._slide.delay = parseInt( document.getElement('.slide').get('rel') );
		this._slide.imgs = document.getElements('.slide img').setStyle('display', 'block').setStyle('opacity', 0);
		this._slide.links = document.getElements('.slide a');
		this._slide.intros = document.getElements('.home-prod div').setStyle('opacity', 0);
		if (this._slide.links.length > 0)
			this._slide.button = new Element('a', {'class': 'slide-button'} ).inject( document.getElement('body'), 'top' );
		
		this.slideIn(0);
	},
	
	slideStep: function()
	{ 
		var next = this._slide_index+1;
		if (this._slide_index >= this._slide.imgs.length-1)
			next = 0;
		this.slideIn( next );
	},
	
	slideIn: function( i )
	{
		var img = this._slide.imgs[i];
		var tmp = new Element('img').set('src', img.get('rel'));
		if (tmp.complete) {
			this.slideLoaded( i );
		} else {
			tmp.onload = function(i) { this.slideLoaded( i ); }.pass(i, this)
		}
	},
	
	slideLoaded: function( i )
	{
		var img = this._slide.imgs[i];
		img.set('src', img.get('rel'));
		if (this._slide_index != null)
		{
			this._slide.imgs[this._slide_index].fade('out');
			if (this._slide.intros.length > 0)
				this._slide.intros[this._slide_index].fade('out');
		}
		this._slide.imgs[i].fade('in');
		if (this._slide.intros.length > 0)
			this._slide.intros[i].fade('in');
		if (this._slide.links.length > 0)
			this._slide.button.set('href', this._slide.links[i].get('href') );
		
		this._slide_index = i;
		
		this.slideStep.delay( this._slide.delay, this);
	},
	
	accordion: function( obj )
	{
		obj.acc = new Fx.Accordion( obj, obj.getElements('.toggler'), obj.getElements('.block') );
		obj.acc.addEvent('active', function(toggler, block) {
			toggler.addClass('active');
		} );
		obj.acc.addEvent('background', function(toggler, block) {
			toggler.removeClass('active');
		} )
	},
	
	collection: function( obj )
	{
		obj.setStyle('cursor', 'pointer');
		
		obj.link = obj.getElement('a');
		obj.txt = obj.getElement('.collection-txt').setStyle('opacity', 0);
		obj.addEvent('mouseenter', function(obj) {
			obj.txt.fade('in');
		}.pass(obj, this) );
		obj.addEvent('mouseleave', function(obj) {
			obj.txt.fade('out');
		}.pass(obj, this) );
		obj.addEvent('click', function(obj) {
			self.location.href = obj.link.get('href');
		}.pass(obj, this) );
	},
	
	filter: function( obj )
	{
		obj.toggler = obj.getElement('h4');
		obj.block = obj.getElement('ul').setStyle('opacity', 0);
		obj.addEvent('mouseenter', function(obj) {
			obj.block.fade('in');
		}.pass(obj, this) );
		obj.addEvent('mouseleave', function(obj) {
			obj.block.fade('out');
		}.pass(obj, this) );
	},
	
	image: function( obj )
	{
		obj.addEvent('click', function(e) { e.stop(); } )
		obj.addEvent('click', function(obj) {

			this._img.fx.start( 0 ).chain( function(obj) {
				var tmp = new Element('img').set('src', obj.get('href'));
				if (tmp.complete) {
					this.loaded( tmp );
				} else {
					tmp.onload = function(tmp) { this.loaded( tmp ); }.pass(tmp, this)
				}
			}.pass(obj, this) );
			
		}.pass(obj, this) );
	},
	
	loaded: function( tmp )
	{
		this._img.set('src', tmp.get('src'));
		this._img.fx.start( 1 );
		tmp.destroy();
	}
	
} );



/**** NATIVE IMPLEMENTATIONs ***/
Element.implement( {
	importOptions: function()
	{
		this.saveOptions( this, this );
	},
	
	copyOptions: function( obj )
	{
		this.saveOptions( obj, this );
	},
	
	saveOptions: function( source, target )
	{
		var trigger = "logics@";
		if (!target.options)
			target.options = {}
		if (source.className.indexOf(trigger) !== -1)
		{
			// import rel settings
			var logics = source.className.substring( source.className.indexOf(trigger) + trigger.length );
			var parts = logics.split('|');
			for (var j=0; j<parts.length; j++)
			{
				kv = parts[j].split(':');
				if (kv.length == 2)
				{
					eval("target.options."+kv[0]+" = '"+kv[1]+"'");
				}
			}
		}
	},
	
	getAjaxUrl: function( )
	{
		if (this.get('rel'))
			return this.get('rel');
		var href = this.href;
		if (href.indexOf('?') !== -1)
			href += '&';
		else
			href += '?';
		href += 'client=xhr';
		return href;
	}
} );
