Class.Mutators.Singleton = function(self,flag){
	if(!flag) return;
	self.constructor.__instance = undefined;
	if($defined(self.initialize) && $type(self.initialize) == 'function') var init = self.initialize;
	self.initialize = function(){
		if(!$defined(this.constructor.__instance)){
			if($defined(init) && $type(init) == 'function') init.apply(this,arguments);
			this.constructor.__instance = this;
		}
		return this.constructor.__instance;
	}
}

var Esa = new Class({
	Singleton: true,
	Implements: Options,
	options: {
		accordion: {
			replaceAnchorsWith: 'span'
		},
		lang: 'de',
		i18n: {
			de: {
				closeWindow: 'Fenster schließen'
			},
			en: {
				closeWindow: 'Close window'
			}
		}
	},
	yamoodow: null,
	initialize: function(options){
        this.setOptions(options);
        window.addEvent('domready', function () { 
        	this.registerLightBoxLinks();
        	this.registerInlineAccords();
        	this.registerSortableTables();
        	this.setupFairs();
        }.bind(this));
    },
    
    setupFairs: function() {
    	var items = $$('#rightFairs dl');
    	var width = 194;
    	var container = $('rightFairs');
    	container.setStyle('width', width*items.length);
    	
    	var parent = new Element('div', {'class':'listScroller'}).inject(container, 'before').wraps(container);
    	
    	var scrollLeft = new Element('div', {'class':'scrollerLeft'}).inject(parent);
    	var scrollRight = new Element('div', {'class':'scrollerRight'}).inject(parent);
    	
    	var marginLeft = 0;
    	
    	
    	var scrollEvent = function(event) {
    		if (!event && this.paused) {
    			return;
    		}
    		var direction = event && event.target.hasClass('scrollerLeft') ? 1 : -1;
    		var newMargin = marginLeft + direction * width;
    		var zeroLeft = -1 * width * items.length;
    		if (newMargin > 0) {
    			marginLeft = zeroLeft;
    			newMargin = zeroLeft + width;
    		}else
    		if (newMargin <= zeroLeft) {
    			marginLeft = width;
    			newMargin = 0;
    		}
			container.tween('margin-left', marginLeft, newMargin);
			marginLeft = newMargin;
    	}
    	scrollLeft.addEvent('click', scrollEvent);
    	scrollRight.addEvent('click', scrollEvent);
    	
    	var bindToScroll = {paused: false};

    	if (items.length > 1) {
    		scrollEvent.periodical(5000, bindToScroll);
    	}
    	parent.addEvent('mouseover', function() {
    		bindToScroll.paused = true;
    	});
    	parent.addEvent('mouseout', function() {
    		bindToScroll.paused = false;
    	});
    },
    
    registerSortableTables: function() {
    	var fileSizeMatch = /([0-9]+[,|\.]?[0-9]+)\s*(k|m|g)b/i;
    	HtmlTable.defineParsers({
    	    link: {
    	        match: /foo/,
    	        convert: function(){ return this.getElement('a').get('text'); },
    	        number: false
    	    },
    	    myDate: {
    	    	match: /foo/,
    	        convert: function(){ 
    	    		var parts = this.get('text').split('.');
    	    		var number = 0;
    	    		if (parts.length == 3) {
    	    			number += parts.shift().toInt();
    	    		}
    	    		if (parts.length == 2) {
    	    			number += parts.shift().toInt() * 30;
    	    		}
    	    		if (parts.length) {
    	    			number += parts.shift().toInt() * 30 * 12;
    	    		}
    	    		return number;
    	    	},
    	        number: true
    	    },
    	    fileSize: {
    	    	match: fileSizeMatch,
    	    	convert: function(){
    	    		var result = this.get('text').match(fileSizeMatch);
    	    		if (!result || result.length != 3) {
    	    			return 0;
    	    		}
	    			var size = result[1].toFloat();
	    			var unit = result[2].toLowerCase();
	    			switch(unit) {
	    				case 'k':
	    					return size*1024;
	    				case 'm':
	    					return size*1024*1024;
	    				case 'g':
	    					return size*1024*1024*1024;
	    				default:
	    					return size;
	    			}
    	    	},
    	    	number: true
    	    }
    	});
    	var tables = $$('table.fileLinks');
    	tables.each(function(item) {
    		var table = new HtmlTable(item, {
    			parsers: [
    			    'link',
    			    'myDate',
    			    'fileSize'
    			]    			          
    		});
    		table.enableSort();
    		table.sort(0, false);
    	});
    },
    
    registerInlineAccords: function() {
    	var togglers = $$('.inlineAccordToggler');
    	var count = togglers.length;
    	if (count > 0) {
    		var elements = $$('.inlineAccordElement');
    		
    		var togglerSection = new Array();
    		var elementSection = new Array();
    		
    		var section = new Element('div',{'class':'inlineAccord'}).inject(togglers[0],'before');
    		
    		for (var i = 0; i < count; i++) {
    			var next = elements[i].getNext();
    			if (next.get('tag') == 'a') {
    				next = next.getNext();
    			}
    			togglerSection.push(togglers[i].inject(section));
    			elementSection.push(elements[i].inject(section));
    			if (next == null || !next.hasClass('inlineAccordToggler')) {
    				new Accordion(
						togglerSection, 
						elementSection, 
						section, 
						{
							alwaysHide: true, 
							display: -1,
							onActive: function(toggler, element) {
								toggler.addClass('inlineAccordActiveToggler');
								element.addClass('inlineAccordActiveElement');
							},
							onBackground: function(toggler, element) {
								toggler.removeClass('inlineAccordActiveToggler');
								element.removeClass('inlineAccordActiveElement');
							}
						}
    				);
    				togglerSection = new Array();
    	    		elementSection = new Array();
    	    		if (i+1 < count) {
    	    			section = new Element('div',{'class':'inlineAccord'}).inject(togglers[i+1],'before');
    	    		}
    			}
    		};
    	}
    },
	
	makeAccordion: function(id) {
    	var togglers = $$('#'+id+' dt');
		var elements = $$('#'+id+' dd');
		var container = $$('#'+id+' dl')[0];
		var active = -1;
		togglers.each(function(el, i) {
			if (!elements[i]) {
				elements[i] = new Element('dd').inject(togglers[i],'after');
			}
			if (el.getProperty('id') == 'akkordActiveToggler') {
				el.removeProperty('id');
				active = i;
			}
			var links = el.getElements('a');
			links.each(function(el) {
				el.addEvent('click', function(event) { event.target.blur(); }); 
				if ('#'+el.getProperty('name') == window.location.hash) {
					active = i;
				}
				var str = el.get('text');
				var arr = str.split('  ');
				el.set('html', arr.join('<br />'));
			});
		});
		var accordeon = new Accordion(
			togglers,
			elements,
			container,
			{
				display: active,
				alwaysHide: true,
				//show: (active > -1) ? active : false,
				//initialDisplayFx: false,
				onActive: function(toggler, element) {
					toggler.addClass('akkordContainerActiveToggler');
					element.addClass('akkordContainerActiveElement');
				},
				onBackground: function(toggler, element) {
					toggler.removeClass('akkordContainerActiveToggler');
					element.removeClass('akkordContainerActiveElement');
				}
			}
		);
	},
	translate: function(msgid) {
		return this.options.i18n[this.options.lang][msgid];
	},
	openLightbox: function(event, i) {
		event.preventDefault();
		event.target.blur();
		this.yamoodow.openWin(i);
	},
	registerLightBoxLinks: function() {
		var links = new Array();
		$$('a.lightBoxLink').each(function(el, i) {
			var link = el.getProperty('href');
			link += (link.contains('?')) ? '&' : '?';
			link += 'type=40';
			links.push({url:link, title: 'Test'});
			el.addEvent('click', this.openLightbox.bindWithEvent(this, i));
		}.bind(this));
		this.yamoodow = new yamoodow(links, {
			buildTabs:false, 
			cache: false,
			width: 762,
			height: 'auto',
			template: '<div id="{cssPrefix}Head"><div id="{cssPrefix}CloseHandle">'+this.translate('closeWindow')+'</div></div><div class="content">{content}</div>'
		});
	}
});

var myEsa = new Esa();
