﻿$DL(function () {
	//Resources.RegisterJsFile(Config.RootUrl+"Js/Controls/OverlayFix.js");
});

var Lightbox=new Class({
	Implements:[Options,Events],

	_element:null,
	options:{
		overlayClass:"lightbox-overlay",
		containerClass:"lightbox-container",
		contentClass:"lightbox-content",
		hideOnEnter:true,
		hideOnEsc:true,
		opacity:0.4,
		relativeTo:null,
		offsetPosition:null,
		onBeforeShow:$empty,
		onAfterShow:$empty,
		onBeforeHide:$empty,
		onAfterHide:$empty
	},

	initialize:function (element,options) {
		this._element=element;
		this._elementOldParent=element.getParent();
		if (this._elementOldParent) this._hiddenAtFirst=!element.get("display");
		this.setOptions(options);
	},

	show:function () {
		if (Lightbox._current) Lightbox._hide();
		Lightbox._current=this;

		this.fireEvent("onBeforeShow");
		Lightbox._show(this._element,this.options);
		this.fireEvent("onAfterShow");
	},
	hide:function () {
		this.fireEvent("onBeforeHide");
		Lightbox._hide();
		this.fireEvent("onAfterHide");
	}
});

// static methods/properties
$extend(Lightbox,{
	_overlay:null,
	_container:null,

	_init:function (options) {
		if (!Lightbox._overlay) {
			Lightbox._overlay=new Element("div").inject(document.form).set({
				styles:{
					backgroundColor:options.backgroundColor || "#000",
					// ie6 doesn't support position:fixed
					position:Browser.Engine.trident4 ? "absolute" : "fixed",
					top:0,
					left:0,
					zIndex:1000
				},
				opacity:options.opacity,
				display:false
			});
		}
		else Lightbox._overlay.className="";
		
		Lightbox._overlay.addClass(options.overlayClass);

		if (!Lightbox._container) {
			Lightbox._container=new Element("div").inject(document.form).set({
				styles:{
					// ie6 doesn't support position:fixed
					position:Browser.Engine.trident4 ? "absolute" : "fixed",
					top:0,
					left:0,
					zIndex:1001
				},
				display:false
			});
		}
		else Lightbox._container.className="";
		Lightbox._container.addClass(options.containerClass);

		if (!Lightbox._fix) Lightbox._fix=new OverlayFix(Lightbox._overlay);
	},
	
	_onScroll:function () {
		if (!Lightbox._current) removeEvent("scroll",arguments.callee);
		// since ie6 doesn't support position:fixed we need to take care of re-position overlay and container when scrolling
		Lightbox.adjustPositions();
	},
	_onResize:function () {
		if (!Lightbox._current) removeEvent("resize",arguments.callee);
		// re define the w/h of the overlay if the page's w/h has changed
		Lightbox._setOverlayHeight();
		Lightbox.adjustPositions();
	},
	_setOverlayHeight:function () {
		var size=document.getSize();
		Lightbox._overlay.setStyles({
			width:size.x,
			height:size.y
		});
	},

	_show:function (element,options) {
		Lightbox._init(options);

		Lightbox.fireEvent("onBeforeShow");

		element.set({
			visibility:false,
			display:true
		});

		Lightbox._overlay.show();
		Lightbox._container.show();

		Lightbox._fix.show();

		Lightbox._container.empty().adopt(new Element("div").addClass(options.contentClass).adopt(element));
		
		
		// keep set them when resizing
		addEvent("resize",Lightbox._onResize);
		Lightbox._setOverlayHeight();
		if (Browser.Engine.trident4) addEvent("scroll",Lightbox._onScroll);
		
		Lightbox.adjustPositions();

		element.set("visibility",true);

		Lightbox.fireEvent("onAfterShow");
		var lightboxKeydown=$(document.documentElement).retrieveOrStore("lightboxKeydown",function () {
			return function (e) {
				if (["input","textarea","select"].contains(Element.get(e.target,"tag"))) return;
				switch (e.key) {
					case "esc":
						Lightbox.fireEvent("onEsc",e); // e could be extended with cancel=true and lightbox won't get closed!
						if (options.hideOnEsc && !e.cancel) Lightbox._hide();
						break;
					case "enter":
						Lightbox.fireEvent("onEnter",e);
						if (options.hideOnEnter && !e.cancel) Lightbox._hide();
						break;
				}
			};
		});
		$(document.documentElement).addEvent("keydown",lightboxKeydown);
	},

	_hide:function () {
		Lightbox.fireEvent("onBeforeHide");

		Lightbox._overlay.set("display",false);
		Lightbox._container.set("display",false);
		
		Lightbox._fix.hide();

		$(document.documentElement).removeEvent("keydown",$(document.documentElement).retrieve("lightboxKeydown"));

		Lightbox.fireEvent("onAfterHide");
		
		if (Lightbox._current) {
			if (Lightbox._current._hiddenAtFirst) Lightbox._current._element.set("display",false);
			// re place the element in its original parent if any
			if (Lightbox._current._elementOldParent) Lightbox._current._elementOldParent.adopt(Lightbox._current._element);
		}

		Lightbox._current=null;
	},

	hide:function () {
		Lightbox._hide();
	},

	adjustPositions:function () {
		if (!Lightbox._current) return;
	
		var element=Lightbox._current._element,
			relativeTo=Lightbox._current.options.relativeTo,
			offsetPosition=Lightbox._current.options.offsetPosition;

		var pos={};

		// if this lightbox should open relative to another element get element's position
		if (relativeTo) Hash.merge(pos,relativeTo.getPosition());
		// otherwise, centerize it
		else {
			// center the lightbox horizontally
			pos.x=(document.getSize().x-element.offsetWidth)/2;
			pos.y=(document.getSize().y-element.offsetHeight)/2;
		}
		if (offsetPosition) {
			pos.x+=offsetPosition.x;
			pos.y+=offsetPosition.y;
		}

		pos.x=Math.max(0,pos.x);
		pos.y=Math.max(0,pos.y);

		if (Browser.Engine.trident4) {
			var scrollTop=document.documentElement.scrollTop;
			Lightbox._overlay.setStyle("top",scrollTop);
			pos.y+=scrollTop;
		}

		Lightbox.fireEvent("onPositioning",[Lightbox._container,pos]);

		Lightbox._container.position(pos);

		Lightbox._fix.show();
	}
});
Events.makeObjectEventable(Lightbox);
Options.makeClassOptionable(Lightbox);

/*
-- js
var lb=new Lightbox(element);
lb.show();

lb.hide();
or Lightbox.hide();

Lightbox
*/

if (typeof(Sys)!=="undefined") Sys.Application.notifyScriptLoaded();
