var B81OverlayFrame = new Class({
	b81_maxWidth:null,
	b81_maxHeight:null,
	mode:null,
	
	getOptions: function(){
		return {
			opacity: 0.7,	 
			transition: Fx.Transitions.linear,			
			duration: 500,
			content_width: 800,
			classadd: null
		};
	},

	//basic build function
	initialize: function(opt) {	
		this.setOptions(this.getOptions(), opt);
		
		//set sizes
		this.b81_maxWidth = window.getWidth();	
		this.b81_maxHeight = window.getHeight();
		
		if(!this.b81_maxWidth) {
			this.b81_maxWidth = window.outerWidth;
		} 
		if(!this.b81_maxHeight) {
			this.b81_maxHeight = window.outerHeight;
		}

	},
	setOverlay: function (content, mode) {
		//build for real content
		this._buildBasicLayer();
		this._buildContentLayer();
		if(mode == 'url') {
			this._getExternalContent(href);
		} else if(mode == 'element') {
			this._getInternalContent(content, 0);	
		} else if(mode == 'html') {
			this._getInternalContent(content, 1);	
		} else if(mode == 'js_element') {
			this._getInternalContent(content, 2);	
		}
	},

	//set the overlay base
	_buildBasicLayer:function() {
		if(!$("b81_Overlay")) {
			var overlay = new Element('div', {
						'styles': {
							'position': 'fixed',
							'width': '100%',
							'height': '100%',
							'z-index': '1000',
							'top': '0px',
							'left': '0px'
						},
						'class': 'b81_Overlay',
						'id': 'b81_Overlay'
						});
			if(this.options.classadd) {
				overlay.addClass(this.options.classadd+'_Overlay');
			}
			overlay.addEvent('click', function() { this._hide(); }.bind(this) );
			overlay.setOpacity(0);
			overlay.injectInside(document.body);
		}
	},

	//set the overlay contentframe
	_buildContentLayer:function() {
		if(!$("b81_OverlayFrame")) {
			var frame = new Element('div', {
						'styles': {
							'display' : 'block',
							'position': 'fixed',
							'z-index': '1001',
							'top': '10px',
							'left': (this.b81_maxWidth - this.options.content_width) /2 + "px",
							'width': this.options.content_width+'px'
						},
						'class': 'b81_OverlayFrame',
						'id': 'b81_OverlayFrame'
						});
			if(this.options.classadd) {
				frame.addClass(this.options.classadd+'_OverlayFrame');
			}
			
			frame.setOpacity(0);
			var cls = this._writeClose();
			cls.injectInside(frame);
			
			var text = this._writeTextFrame();
			text.injectInside(frame);
			
			frame.injectInside(document.body);
		}
	},

	//write close	
	_writeClose:function() {
		if(!$("b81_OverlayClose")) {
			var cls = new Element('div', {
						'styles': {
							'display' : 'block',
							'cursor' : 'pointer'
						},
						'class': 'b81_OverlayClose',
						'id': 'b81_OverlayClose'
						});
			
			if(this.options.classadd) {
				cls.addClass(this.options.classadd+'_OverlayClose');
			}
			cls.setHTML('Schlie&szlig;en');
			cls.addEvent('click', function() { this._hide(); }.bind(this) );
			return cls;
		} else {
			return $("b81_OverlayClose");
		}
	},

	//write text frame
	_writeTextFrame:function(){
		if(!$("b81_OverlayContent")) {
			var tc = new Element('div', {
						'styles': {
							'display' : 'inline',
							'width': '800px'
						},
						'class': 'b81_OverlayContent',
						'id': 'b81_OverlayContent'
						});
			if(this.options.classadd) {
				tc.addClass(this.options.classadd+'_OverlayContent');
			}
			return tc;
		} else {
			return $("b81_OverlayContent");
		}
	},
	
	//get external
	_getExternalContent:function(url) {
		var success  = function(r) { 
			/* try to parse the entry */
			try {
				$("b81_OverlayContent").setHTML(this._parseContent(r));
				this._setContentPosition();
				this._show();
			} catch(e) {
				/* an error was happened, so do simple request by simple method */
				alert('PARSE ERROR:  ' + e);
			}
			
		}
		
		var failure  = function(){ 
			alert('REQUEST ERROR');
		}
		
		var cReq = new Ajax(url, {
						  method: 'get',
						  onComplete:success,
						  onFailure:failure
						  }).request();
	},
	
	//parse loaded content
	_parseContent:function(content) {
		var script, scripts, newScript;
			scripts = [];
			var regexp = /<script[^>]*>([\s\S]*?)<\/script>/gi;
			while ((script = regexp.exec(content))) scripts.push(script[1]);
			scripts = scripts.join('\n');
			
			if(scripts.length > 0) {
				eval(scripts);
				//content = content.replace(regexp2, '');
			}
		return content;
	},
	
	//get internal
	_getInternalContent:function(content, isElement) {
		if(isElement == 0) {
			var html = $(content).innerHTML;
			$("b81_OverlayContent").setHTML(html);
		} else if(isElement == 1) {
			var html = content;	
			$("b81_OverlayContent").setHTML(html);
		} else if(isElement == 2) {
			while($("b81_OverlayContent").getFirst()) $("b81_OverlayContent").getFirst().remove();	
			content.injectInside($("b81_OverlayContent"));	
		}
		
		
		this._setContentPosition();
		this._show();
	},

	
	/////////////////////////////////////// FX & POSITIONING
	//fade overlay in
	_show:function() {
		new Fx.Style($('b81_Overlay'), 'opacity',{duration: this.options.duration/2, transition: Fx.Transitions.sineInOut}).start(0,this.options.opacity);		
		new Fx.Style($('b81_OverlayFrame'), 'opacity',{duration: this.options.duration, transition: Fx.Transitions.sineInOut}).start(0,1);
	},
	
	//fade overlay out
	_hide:function() {
		new Fx.Style($('b81_Overlay'), 'opacity',{duration: this.options.duration, transition: Fx.Transitions.sineInOut}).start(this.options.opacity,0);
		new Fx.Style($('b81_OverlayFrame'), 'opacity',{duration: this.options.duration, transition: Fx.Transitions.sineInOut}).start(1,0);
	},
	
	//calculate position by height
	_calcContentPosition:function() {
		var currHeight = $('b81_OverlayFrame').getStyle('height').toInt();
		var newPos = (this.b81_maxHeight.toInt()/2) - currHeight ;
		return newPos;
	},
	
	//set content position
	_setContentPosition:function() {
		var setPos = 0;
		var newPos = this._calcContentPosition();
		if(newPos > 5){ 
			setPos = newPos;
		} else {
			setPos = 5;
		}		
		$('b81_OverlayFrame').setStyle('top', setPos + "px");
	},
	
	//fade to new content position
	_fadeContentPosition:function() {
		var setPos = 5;
		var oldPos = $('b81_OverlayFrame').getStyle('top').toInt();
		var newPos = this._calcContentPosition();
		
		if(newPos > (oldPos+15) || newPos < (oldPos-15)) {
			if(newPos > 5){ 
				setPos = newPos;
			}	
			new Fx.Style($('b81_OverlayFrame'), 'top',{duration: 1000, transition: Fx.Transitions.Cubic.easeInOut}).start(oldPos, setPos);
		}
	}
});
B81OverlayFrame.implement(new Options);
