/*
**	Lightbox
**	This is a script for creating modal dialog windows
**	(like the ones your operating system uses)
*/

var obs;

var Lightbox = {

	focusableElements: new Array,

	/* hideAll - closes all open lightbox windows */
	hideAll: function() {
		showIEObject('SELECT');
		$$('.lbox').each(function(box) { Element.hide(box); });
		if ($('overlay')) {
			Element.remove('overlay');
		}
		// zdjecie obserwera na klawiature
		Event.stopObserving(document, 'keypress', obs);

		if ($('acsearch')) {
			if ($('acsearch').visible()) {
				hideAutoComplete();				
			}
		}
		$('panel-dialog').innerHTML = '';
	},

	kbdHandler: function(e) {
		var node = Event.element(e);
		switch(e.keyCode) {
			case Event.KEY_ESC:
				// zdjecie obserwera na klawiature
				Event.stopObserving(document, 'keypress', obs);
				Lightbox.hideAll();
				break;
			case Event.KEY_TAB:
				if (node == this.focusableElements.last()) {
					Event.stop(e);
					this.moveFocus(); 
				}
				break;
			case 13:
				// zdjecie obserwera na klawiature
				Event.stopObserving(document, 'keypress', obs);
				if (!Element.hasClassName(node, 'button-std') && !Element.hasClassName(node, 'button-opt') && (node.type != 'textarea')) {
					// wylaczenie przed podwojnym wyslaniem i dla textarea
					this.onSubmit();
				}
				break;
			case Event.KEY_RETURN: 	
			case Event.KEY_UP:
			case Event.KEY_DOWN:
			case Event.KEY_PAGEDOWN:
			case Event.KEY_PAGEUP:
			case Event.KEY_HOME:
			case Event.KEY_END:
				if (!['TEXTAREA','SELECT'].include(node.tagName) ||
					(node.tagName == 'INPUT' && (node.type == 'submit' || node.type == 'button')) ) {
						Event.stop(e);
				}
				break;
		}
	},

	onSubmit: function() {
		var ButtonToSubmit = document.getElementsByClassName('button-ok');
		if (ButtonToSubmit[0]) {
			ButtonToSubmit[0].click();
		}
	},

	findFocusableElements: function() {
		this.focusableElements = [];
		elements = $A($('panel-dialog').descendants()).findAll(function(node) {
			return (['INPUT','TEXTAREA','SELECT','BUTTON'].include(node.tagName));
		});
		focuselements = Array();
		elements.each(function(child) {
			if ((child.type != 'hidden') && (child.visible())) {
				focuselements.push(child);
			}
		});		
		this.focusableElements = focuselements;
	},

	moveFocus: function() { 
		if (this.focusableElements.length > 0) {
			var focuselement = this.focusableElements.first();
			if (focuselement && focuselement.visible()) {
				focuselement.focus(); 
			}
		}
		else {
			if ($('close')) {
				$('close').focus(); 
			}
		}
	},

	checkscroll: function() {
		var h = 0;
		var a = null;
		$$('.warning').each(function(el) {
			h = Element.getDimensions(el).height + 20;
		});
		$$('.seccont').each(function(el) {
			if (Element.visible(el)) a = el;
		});

		if (a) {
			if (IE) {
				windowheight = document.body.offsetHeight;
			} else {
				windowheight = window.innerHeight;
			}
			if ((Element.getDimensions(a).height + h) > (windowheight - 90)) {
				a.style.height = (windowheight - 90 - h) + 'px';
			}
		}
	}
}

Lightbox.base = Class.create({
	initialize: function(element, options) {
		$$('.lbox').each(function(box) { Element.hide(box); });
		if ($('overlay')) {
			Element.remove('overlay');
		}
		this.element = $(element);
		this.options = Object.extend({
			lightboxClassName : 'lightbox',
			closeOnOverlayClick : false,
			externalControl : false
		}, options || {} );

		if ($('handler')) {
			new Draggable('panel-dialog', { revert: false, handle: 'handler' });
		}

		//create the overlay
		Element.insert(this.element, {before: '<div id="overlay" style="display:none;"></div>'});

		Element.addClassName(this.element, this.options.lightboxClassName);

		//also add a default lbox class to the lightbox div so we can find and close all lightboxes if we need to
		Element.addClassName(this.element, 'lbox');
		
		var closer = document.createElement('img');
		closer.src = ImgRoot + "spacer.gif";

		var acloser = document.createElement('a');
		acloser.id  = 'close';
		acloser.className = 'tab-close-on';
		acloser.appendChild(closer);
		this.element.appendChild(acloser);

		// Close lightbox
		Event.observe(closer, 'click', this.hideBox.bindAsEventListener(this) );
		if (this.options.closeOnOverlayClick) {
			Event.observe($('overlay'), 'click', this.hideBox.bindAsEventListener(this) );
		}
		if (this.options.externalControl) {
			Event.observe($(this.options.externalControl), 'click', this.hideBox.bindAsEventListener(this) );
		}

		this.showBox();
	},

	showBox: function() {
		// show the overlay
		Element.show('overlay');

		// center the lightbox
		this.center();

		return false;
	},

	hideBox: function(evt) {
		if ($('acsearch')) {
			if ($('acsearch').visible()) {
				hideAutoComplete();				
			}
		}
		Element.removeClassName(this.element, this.options.lightboxClassName);
		Element.hide(this.element);
		// remove the overlay element from the DOM completely
		Element.remove('overlay');
		showIEObject('SELECT');
		$('panel-dialog').innerHTML = '';
		return false;
	},

	center: function() {
		Element.hide(this.element);
		this.element.style.display  = 'none';
		this.element.style.position = 'absolute';
		this.element.style.zIndex   = 99;

		Effect.Appear('panel-dialog', { 
			duration: 0.6,
			afterFinish: function() {
				Lightbox.findFocusableElements();
				Lightbox.moveFocus(); 

				// obser powinien byc ustawiony tylko jesli wczesniej nie ma drugiego
				obs = Lightbox.kbdHandler.bindAsEventListener(Lightbox);
				Event.observe(document, 'keypress', obs);
				
				Lightbox.checkscroll();
			}
		});

		var my_width  = 0;
		var my_height = 0;

		if (typeof(window.innerWidth) == 'number') {
			my_width  = window.innerWidth;
			my_height = window.innerHeight;
		}
		else if (document.documentElement.clientWidth || document.documentElement.clientHeight) {
			my_width  = document.documentElement.clientWidth;
			my_height = document.documentElement.clientHeight;
		}

		var scrollY = 0;
		//tylko pod IE wyliczmy, pod FF działa width height 100%

		if (document.documentElement && document.documentElement.scrollTop) {
			scrollY = document.documentElement.scrollTop;
		}
		else if (document.body && document.body.scrollTop) {
			scrollY = document.body.scrollTop;
		}
		else if (window.pageYOffset) {
			scrollY = window.pageYOffset;
		}
		else if (window.scrollY) {
			scrollY = window.scrollY;
		}
		if (navigator.userAgent.toLowerCase().indexOf('msie') != -1) {
			$('overlay').style.width  = my_width + 'px';

			if ($('panel-dialog') && IE) {
				$('panel-dialog').style.width = '1000px';
			}
		} 
		$('overlay').style.height = document.body.clientHeight + 100 + 'px';

		var overlayDimensions = Element.getDimensions('overlay');
		overlayheight = overlayDimensions.height;

		var elementDimensions = Element.getDimensions(this.element);
		this.element.style.width  = elementDimensions.width + 'px';

		var setX = (my_width  - elementDimensions.width) / 2;
		var setY = (my_height - elementDimensions.height + scrollY) / 2 + (scrollY / 2);

		if (overlayheight < elementDimensions.height) {
			// jak sie nie miesci panel-dialog w overflow
			$('overlay').style.height = elementDimensions.height + 'px';
		}

		setX = ( setX < 0 ) ? 0 : setX;
		setY = ( setY < 0 ) ? 0 : setY;

		this.element.style.left = setX + 'px';
		this.element.style.top  = setY + 'px';

//		hideIEObject('SELECT', $('overlay'));
	}
});

