/********************************************************************************
 *	overlay class - prototype.js based plugin
 *	@requires: prototype.js v1.6.1 or later
 *	@author: Joris van Montfort
 *
 *	Prototype.js at : http://www.prototypejs.org/download
 ********************************************************************************/
var overlay = {
	active: false,
	MBoverlay: null,
	MBcontent: null,
	options: {
		overlayClose: true, // Close modal box by clicking on overlay
		overlayOpacity: .80, // Default overlay opacity
		overlayId: 'MB_overlay',
		contentId: 'MB_content',
		onComplete: function(){},
		onHide: function(){}
	},
	_hideObjects: [],
	_restoreOverflow: null,
	
	// Show a modal overlay
	show: function(content, options) {
		overlay.active = true;
		Object.extend(overlay.options, options || {});
		
		//Create the overlay
		overlay.MBoverlay = new Element("div", {id: overlay.options.overlayId});
		overlay.MBoverlay.setStyle({opacity: overlay.options.overlayOpacity});
		
		// Create the content box
		overlay.MBcontent = new Element("div", {id: overlay.options.contentId}).update(content);
		
		
		// Get embed tags and hide if needed
		// overlay wil be undone when closing the modalbox
		overlay._hideObjects = [];
		var embeds = document.getElementsByTagName('embed');
		for (var i=0; i < embeds.length; i++) {
			if (embeds[i].visible()) {
				overlay._hideObjects.push(embeds[i]);
				embeds[i].style.visibility = 'hidden';
			}
		}
		
		// Get object tags and hide them
		// overlay wil be undone when closing the modalbox
		var objects = document.getElementsByTagName('object');
		for (var i=0; i < objects.length; i++) {
			overlay._hideObjects.push(objects[i]);
			objects[i].style.visibility = 'hidden';
		} 
		
		// Inserting into DOM.
		var body = $(document.body);
		
		// Get overflow for the body to restore them later on
		overlay._restoreOverflow = body.getStyle('overflow');
		
		// Set overflow to hidden for now
		body.setStyle({overflow: 'hidden'});
		
		// Insert into body
		body.insert({'top':overlay.MBoverlay});
		body.insert({'top':overlay.MBcontent});
		
		//Adding event observers
		overlay.hideObserver = this._hideObserver.bindAsEventListener(overlay);
		overlay.kbObserver = this._kbObserver.bindAsEventListener(overlay);
		overlay._initObservers();
	
		// Call onComplete callback
		overlay.options.onComplete();
	},
	
	_initObservers: function() {
		overlay.MBoverlay.observe("click", overlay.hideObserver);
		Event.observe(document, "keydown", overlay.kbObserver);
	},
	
	_stopObservers: function() {
		overlay.MBoverlay.stopObserving("click", overlay.hideObserver);
		Event.stopObserving(document, "keydown", overlay.kbObserver);
	},
	
	_kbObserver: function(e) {
		// Esc
		if (e.keyCode == 27) {
			overlay.hide();
		}
	},
	
	_hideObserver: function(e) {
		e.stop();	
		if(e.element().id == overlay.options.overlayId && overlay.options.overlayClose) {
			overlay.hide()	
		}
	},
	
	hide: function() {
		overlay.active = false;
		overlay.MBcontent.remove();
		overlay.MBoverlay.remove();
		
		// Reactivate flash and objects
		for (var i=0; i < overlay._hideObjects.length; i++) {
			overlay._hideObjects[i].style.visibility = 'visible';
		}
		
		// Restore overflow properties for the body
		var body = $(document.body);
		body.setStyle({overflow: overlay._restoreOverflow});
		
		// Stop observers
		overlay._stopObservers();
		
		// Call onHide callback
		overlay.options.onHide();
	},
	
	update: function(content) {
		overlay.options.contentId.update(content);
	},
	
	getPageSize: function() {
		return [overlay.MBoverlay.getWidth(),overlay.MBoverlay.getHeight()];
	}
};
