window.addEvent('domready', function() {
	init();
});

window.addEvent('unload', function() {
	uninit();
} );

window.addEvent('resize', function() {
	s.resize();
});

function init()
{
	// initialize map engine
	s = new siteEngine();
	s.init();
	s.initBlock( document );
}

function uninit()
{
	s = null;
}

function siteEngine()
{
	this.init = function()
	{
		this.tabLists = new Array();
		this.body = document.getElement('body');
		
		if ($('forgotten-link'))
		{
			var forg = $('forgotten-link');
			forg.addEvent('click', function() {
				$('forgotten-form').setStyle('display', 'block');
				$('login-form').setStyle('display', 'none');
			});
		}
		if ($('login-link'))
		{
			var login = $('login-link');
			login.addEvent('click', function() {
				$('forgotten-form').setStyle('display', 'none');
				$('login-form').setStyle('display', 'block');
			});
		}
		
		if ($('poll-answer-other') && $('other'))
		{
			var block = $('poll-answer-other');
			block.addEvent('mouseenter', function() { $('other').setStyle('display', 'block'); } );
			block.addEvent('mouseleave', function() { $('other').setStyle('display', 'none'); } );
		}
		//this.resize();
	},
	
	this.resize = function() { },
	
	this.initBlock = function( obj )
	{
		var dyns = obj.getElements('.dynamic');
		for (var i=0; i<dyns.length; i++)
		{
			dyns[i].importProps();
			this.addDynamic( dyns[i] );
		}
		
		var tabs = obj.getElements('.tabbed');
		for (var i=0; i<tabs.length; i++)
		{
			tabs[i].importProps();
			this.addTabs( tabs[i] );
		}
	},
	
	this.addDynamic = function( obj )
	{
		obj.addEvent( ((obj.action == 'over') ? 'mouseover' : 'click'), function( obj ) {
			this.loadDynamic( obj );
		}.pass(obj, this) );
		if (obj.action != 'over')
		{
			obj.addEvent('click', function(e) { new Event(e).stop(); });
		}
	},
	
	this.loadDynamic = function( obj )
	{
		obj.xhr = new Request( {
			url: 'dynamics.php?module='+obj.module+'&'+ obj.query,
			autoCancel: true
		} ).send();
		obj.xhr.addEvent('onComplete', function(obj) {
			$(obj.targetEl).set('html', obj.xhr.response.text);
		}.pass(obj, this) );
	},
	
	this.addTabs = function( obj )
	{
		// getting event
		//if (thisObj.tabLists[i].className.indexOf("over") == -1) thisObj.tabLists[i].event = "onclick"; else thisObj.tabLists[i].event = "onmouseover";
		obj.index = 0;
		obj.togglers = obj.getElements('.tab');
		obj.blocks = obj.getElements('.block');
		
		obj.setStyle('display', 'none');
		obj.tabList = new Element('ul', {'class': 'tabs'}).inject(obj, 'after');
		obj.tabs = new Array();
		for (var j=0; j<obj.togglers.length; j++)
		{
			var css = obj.togglers[j].get('class');
			
			if (obj.togglers[j].hasClass('dltab-active'))
				obj.selectedItem = j;
			obj.tabs[j] = new Element('li').set('html', obj.togglers[j].get('html')).inject( obj.tabList );
			obj.tabs[j].addEvent( (obj.action || 'click'), function( obj, index ) {
				if (obj.loop) $clear( obj.loop );
				this.showTab( obj, index );
			}.pass([obj, j], this) );
		}
		 // create and fill content p
		obj.page = new Element('div', {'class': 'tab-page'}).inject( obj.tabList, ( (obj.tabPosition == 'bottom') ? 'before' : 'after' ) );
		
		this.showTab( obj, obj.selectedItem || 0 );
		
		if (obj.hasClass("loop")) this.startLoop( obj );
	},
	
	this.showTab = function( obj, index )
	{
		obj.page.set('html', obj.blocks[ index ].get('html') );
		for (var i=0; i<obj.togglers.length; i++)
			obj.tabs[i].removeClass('dltab-active');
		obj.tabs[ index ].addClass('dltab-active');
	},
	
	this.startLoop = function( obj )
	{
		var fn = function(obj) {
			obj.index++;
			if (obj.index > obj.tabs.length - 1 )
				obj.index = 0;
			this.showTab( obj, obj.index );
		};
		obj.loop = fn.periodical(5000, this, obj);
	}
}

/******* IMPLEMENTATION ***********/
Element.implement({
	importProps: function()
	{
		this.saveProps( this, this );
	},
	
	copyProps: function( obj )
	{
		this.saveProps( obj, this );
	},
	
	saveProps: function( source, target )
	{
		var trigger = "logics@";
		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(':');
				eval("target."+kv[0]+" = '"+kv[1]+"'");
			}
		}
	},
	
	getURL: function( )
	{
		var uri = (this.tagName == 'A' ? this.getProperty('href') : this.getProperty('action') );
		if (this.urlproto)
			var url = this.urlproto.replace( '[url]', uri + '&' );
		else
			var url = uri;
		return url;
	}
} );