var mbBo2010_const = {
	// overlay final opacity 
	_OVERLAY_OPACITY     : 0.8,
	// the error message displayed when the request has a problem
	_ERROR_MESSAGE       : 'Oops.. there was a problem with your request.<br /><br />Please try again.<br /><br /><em>Click anywhere to close.</em>',
	//Duration of height and width resizing (ms)
	_RESIZE_DURATION     : 1000,
	//Initial width of the box (px)
	_INITIAL_WIDTH       : 300,
	//Initial height of the box (px)
	_INITIAL_HEIGHT      : 250,
	//Actual width of the box (px)
	_CONTENTS_WIDTH      : 500,
	//Actual height of the box (px)
	_CONTENTS_HEIGHT     : 400,
	// Default width of the box (px) - used for resetting when a different setting was used
	_DEF_CONTENTS_WIDTH  : 960,
	// Default height of the box (px) - used for resetting when a different setting was used
	_DEF_CONTENTS_HEIGHT : 591,
	// Enable/Disable caption animation
	_ANIMATE_CAPTION     : false,
	// Option to evaluate scripts in the response text
	_EVAL_SCRIPTS        : false,
	// Option to evaluate the whole response text
	_EVAL_RESPONSE       : false,
	// prefix for HTML-rel-Attributes
	_REL_PREFIX          : 'beilagenBox',
	// prefix for HTML-id-Attributes
	_ID_PREFIX           : 'mbBo2010-',
	// prefix for HTML-class-Attributes
	_CLASS_PREFIX        : 'mbBo2010-'
};

// The MOOdalBox object in its beauty
var MOOdalBoxBeilagenOnline2010 = {
	// init the MOOdalBox
	init : function (options) {
		// init default options
		this.options = $extend({
			overlayOpacity    : mbBo2010_const._OVERLAY_OPACITY,
			errorMessage      : mbBo2010_const._ERROR_MESSAGE,
			resizeDuration    : mbBo2010_const._RESIZE_DURATION,
			initialWidth      : mbBo2010_const._INITIAL_WIDTH,
			initialHeight     : mbBo2010_const._INITIAL_HEIGHT,
			contentsWidth     : mbBo2010_const._CONTENTS_WIDTH,
			contentsHeight    : mbBo2010_const._CONTENTS_HEIGHT,
			defContentsWidth  : mbBo2010_const._DEF_CONTENTS_WIDTH,
			defContentsHeight : mbBo2010_const._DEF_CONTENTS_HEIGHT,
			animateCaption    : mbBo2010_const._ANIMATE_CAPTION,
			evalScripts       : mbBo2010_const._EVAL_SCRIPTS,
			evalResponse      : mbBo2010_const._EVAL_RESPONSE,
			relPrefix         : mbBo2010_const._REL_PREFIX,
			idPrefix          : mbBo2010_const._ID_PREFIX,
			classPrefix       : mbBo2010_const._CLASS_PREFIX
		}, options || {});
		
		// scan anchors for those opening a MOOdalBox
		this.anchors = [];
		$A($$('a')).each(function(el){
			// we use a regexp to check for links that
			// have a rel attribute starting with "moodalboxBo"
			if(el.rel && el.href && el.rel.test('^' + this.options.relPrefix, 'i')) {
				// el.onclick = this.click.pass(el, this);
				el.addEvent('click', this.click.pass(el, this));
				this.anchors.push(el);
			}
		}, this);
		
		/* add event listeners */
		this.eventKeyDown = this.keyboardListener.bindWithEvent(this);
		this.eventPosition = this.position.bind(this);
		/* //add event listeners */
		
		/* init the HTML elements */
		// overlay (clickable to close)
		this.overlay = new Element('div').setProperty('id', this.options.idPrefix + 'overlay').injectInside(document.body);
		// center element
		this.center = new Element('div').setProperty('id', this.options.idPrefix + 'center').setStyles({'width' : this.options.initialWidth + 'px', 'height' : this.options.initialHeight + 'px', 'margin-left' : '-' + (this.options.initialWidth / 2) + 'px', 'display' : 'none'}).injectInside(document.body);
		// center-shadow element
		this.center_shadow = new Element('div').setProperty('id', this.options.idPrefix + 'center-shadow').injectInside(this.center);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowTopLeft').injectInside(this.center_shadow);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowTop').injectInside(this.center_shadow);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowTopRight').injectInside(this.center_shadow);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowLeft').injectInside(this.center_shadow);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowRight').injectInside(this.center_shadow);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowBottomLeft').injectInside(this.center_shadow);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowBottom').injectInside(this.center_shadow);
		new Element('div').setProperty('class', this.options.classPrefix + 'shadowBottomRight').injectInside(this.center_shadow);
		// contents element
		this.contents = new Element('div').setProperty('id', this.options.idPrefix + 'contents').injectInside(this.center);
		// close element (link)
		this.closelink = new Element('a').setProperties({href: '#', title: 'schließen'}).addClass(this.options.classPrefix + 'closelink').set('html', 'schließen').injectInside(this.center);
		
		// attach the close event to the overlay and closelink
		this.overlay.onclick = this.closelink.onclick = this.close.bind(this);
		
		/* init the effects */
		var nextEffect = this.nextEffect.bind(this);
		this.fx = {
			overlay  : new Fx.Tween(this.overlay, {property : "opacity", duration : 500}).set(0),
			resize   : new Fx.Morph(this.center, $extend({duration : this.options.resizeDuration, onComplete : nextEffect}, this.options.resizeTransition ? {transition : this.options.resizeTransition} : {})),
			contents : new Fx.Tween(this.contents, {property : "opacity", duration : 500, onComplete : nextEffect})
		};
		/* //init the effects */
		
		this.ajaxRequest = Class.empty;
		window.addEvents({
			resize : this.setTop.bind(this),
			scroll : this.setTop.bind(this)
		});
	},
	click : function(link) {
		return this.open(link.href, link.title, link.rel);
	},
	open : function(sLinkHref, sLinkTitle, sLinkRel) {
		this.href = sLinkHref;
		this.title = sLinkTitle;
		this.rel = sLinkRel;
		this.position();
		this.setup(true);
		this.center.setStyle('display', '');
		this.setTop();
		this.fx.overlay.start(this.options.overlayOpacity);
		return this.loadContents(sLinkHref);
	},
	position : function() {
		this.overlay.setStyles({top : Window.getScrollTop() + 'px', height : Window.getHeight() + 'px'});
	},
	setup : function(open) {
		//var elements = $A($$('object'));
		//elements.extend($$(window.ActiveXObject ? 'select' : 'embed'));
		var elements = $A($$('object', 'embed'));
		if(window.ActiveXObject) {
			elements.extend($$('select'));
		}
		elements.each(function(el){el.style.visibility = open ? 'hidden' : ''; });
		var fn = open ? 'addEvent' : 'removeEvent';
		window[fn]('scroll', this.eventPosition)[fn]('resize', this.eventPosition);
		document[fn]('keydown', this.eventKeyDown);
		this.step = 0;
	},
	loadContents : function() {
		if(this.step) return false;
		this.step = 1;
		
		// check to see if there are specified dimensions
		// if not, fall back to default values
		var aDim = this.rel.match(/[0-9]+/g);
		this.options.contentsWidth = (aDim && (aDim[0] > 0)) ? aDim[0] : this.options.defContentsWidth;
		this.options.contentsHeight = (aDim && (aDim[1] > 0)) ? aDim[1] : this.options.defContentsHeight;
		/*this.options.contentsWidth = this.options.defContentsWidth;
		this.options.contentsHeight = this.options.defContentsHeight;*/
		
		this.center.addClass(this.options.classPrefix + 'loading');
		
		this.fx.contents.set(0);
		
		if(true) {
			this.contents.set('html', '<iframe frameborder="0" src="' + this.href + '" height="100%" width="100%" marginheight="0" marginwidth="0" scrolling="No"></iframe>');
			this.nextEffect();
		}
		else {
			// AJAX call here
			var nextEffect = this.nextEffect.bind(this);
			var ajaxFailure = this.ajaxFailure.bind(this);
			var ajaxOptions = {
				method       : 'get',
				url          : this.href,
				update       : this.contents,
				evalScripts  : this.options.evalScripts,
				evalResponse : this.options.evalResponse,
				onComplete   : nextEffect,
				onFailure    : ajaxFailure
			};
			this.ajaxRequest = new Request.HTML(ajaxOptions).send();
		}
		return false;
	},
	ajaxFailure : function (){
		this.contents.set('html', '');
		this.error.clone().injectInside(this.contents);
		this.nextEffect();
		this.center.setStyle('cursor', 'pointer');
		this.center.onclick = this.close.bind(this);
	},
	nextEffect: function() {
		switch(this.step++) {
			case 1:
				// remove previous styling from the elements
				// (e.g. styling applied in case of an error)
				this.center.removeClass(this.options.classPrefix + 'loading');
				this.center.setStyle('cursor', 'default');
				
				this.contents.setStyles({ width : this.options.contentsWidth + "px", height : this.options.contentsHeight + "px" });
				this.step++;
			
			case 2:
				//if(this.center.clientWidth != this.contents.offsetWidth || this.center.clientHeight != this.contents.offsetHeight) {
					this.fx.resize.start({
						width: this.contents.offsetWidth, 
						height: this.contents.offsetHeight, 
						marginLeft: -this.contents.offsetWidth/2,
						top: this.getTop()
					});
					break;
				//}
				this.step++;
			
			case 3:
				this.fx.contents.start(1);
				break;
			
			case 4:
				this.step = 0;
		}
	},
	keyboardListener : function(event) {
		// close the MOOdalBox when the user presses CTRL + W, CTRL + X, ESC
		if((event.control && event.key == 'w') || (event.control && event.key == 'x') || (event.key == 'esc')) {
			this.close();
			event.stop();
		}
	},
	close: function() {
		if(this.step < 0) return false;
		this.step = -1;
		for(var f in this.fx) this.fx[f].cancel();
		this.center.style.display = 'none';
		this.center.addClass(this.options.classPrefix + 'loading');
		this.fx.overlay.chain(this.setup.pass(false, this)).start(0);
		return false;
	},
	getTop: function() {
		return Math.max(Window.getScrollTop(), Window.getScrollTop() + (Window.getHeight()-this.contents.offsetHeight) / 2);
	},
	setTop: function() {
		this.center.setStyles({top: this.getTop() + "px"});
	}
};

// startup
window.addEvent('domready', MOOdalBoxBeilagenOnline2010.init.bind(MOOdalBoxBeilagenOnline2010));