/* 
	peugeot.lightbox.js
	PeugeotLightBox - Delia 5
  
	Created by Les Argonautes on 2010-03-28.
	Works only with Mootools >1.2
	
	@param obj PeugeotLightBox

	@options
	@object
	@method
*/

PeugeotLightBox = new Class({
	Implements: [Events, Options],
	
	options:
	{
		title: null, 
		content: null, 
		url: null, 
		params: null, 
		destroyOnClose: null,
		forcedWidth: null,
		css: '/defaultSites/peugeot_main/css/peugeot_common/lightbox.peugeot.css',
		closeText: 'Fermer'
	},
	
	// @Initialize
	// @params:
		/*
		*/
	initialize: function(options)
	{
		// #Set options
		this.setOptions(options);
		
		Asset.css(this.options.css);
		
		this._element = new Element('div');
		this._element.addClass('peugeot-lightbox');
		
		this._element.set({
			'styles': {
				'opacity': 0
			}
		});
		
		if(this.options.forcedWidth)
		{
			this._element.setStyle('width', this.options.forcedWidth);
		}
		
		this._element.inject($('pgt_main_wrapper'));
		this._element.store('peugeot-lightbox', this);
		
		var header = new Element('div');
		header.addClass('header');
		header.inject(this._element);
		
		var closeButton = new Element('div');
		closeButton.addClass('close-button');
		closeButton.set('text', this.options.closeText);
		closeButton.inject(header);
		
		if(this.options.title)
		{
			var title = new Element('h2');
			title.set('html', this.options.title);
			title.inject(header);
		}
		
		var clear = new Element('div');
		clear.addClass('clear');
		clear.inject(header);
		
		var content = new Element('div');
		content.addClass('content');
		
		if(this.options.content)
		{
			content.set('html', this.options.content);
		}
		
		content.inject(this._element);
		
		this._element.set('morph', {
			duration: 'normal', 
			transition: Fx.Transitions.Sine.easeOut
		});
		
		var griserHeight = document.getScrollSize().y;
		
		this._griser = new Element('div');
		this._griser.addClass('griser');
		
		this._griser.set({
			'styles': {
				'position': 'absolute',
				'top': 0,
				'left': 0,
				'width': document.getScrollSize().x,
				'height': griserHeight,
				'background-color': '#000000',
				'display': 'none',
				'opacity': 0, 
				'z-index': 500
			}
		});
		
		this._griser.inject($('pgt_main_wrapper'));
		
		this._griser.set('morph', {
			duration: 'normal', 
			transition: Fx.Transitions.Sine.easeOut
		});
		
		this._griser.addEvent('click', function()
		{
			this.close();
		}.bind(this));
		
		closeButton.addEvent('click', function()
		{
			this.close();
		}.bind(this));
		
		$(window).addEvent('resize', function()
		{
			this.checkSize();
			this.center();
		}.bind(this));
		
		$(window).addEvent('scroll', function()
		{
			this.checkSize();
			this.center();
		}.bind(this));
		
		if(this.options.url)
		{
			this.loadPage(this.options.url, this.options.params);
		}
		
		this.keyCloseEvent = function(event)
		{
			if(event.code == 27)
			{
				this.close();
			}
		}.bind(this);
	}, 
	
	loadPage: function(url, params, title, form)
	{
		if(!this.inAction)
		{
			this.inAction = true;
			
			if(!params)
			{
				params = '';
			}
			else if(typeof(params) == 'object')
			{
				params = Hash.toQueryString(params);
			}

			if(form)
			{
				if(params)
				{
					params += '&';
				}
				
				params += form.toQueryString();
			}
			
			new Request.HTML({
				url: url, 
				evalScripts: false, 
				onSuccess: function(tree, elements, html, javascript)
				{
					var content = this._element.getElement('.content')
					content.set('html', html);
					content.setStyle('overflow', 'hidden');
					content.setStyle('height', 'auto');
					
					this._element.setStyle('height', 'auto');
					
					if(title)
					{
						this._element.getElement('.header h2').set('text', title);
					}
					
					this.checkSize();
					this.center();
					
					this.inAction = false;
					
					$exec(javascript);
					
					this.fireEvent('load');
				}.bind(this)
			}).send(params);
		}
	}, 
	
	setTitle: function(title)
	{
		if(!this.inAction)
		{
			this.inAction = true;
			
			this._element.getElement('.header h2').set('text', title);
		}
	}, 
	
	clear: function(url)
	{
		if(!this.inAction)
		{
			this._element.getElement('.content').set('html', '');
		}
	}, 
	
	open: function()
	{
		if(!this.inAction)
		{
			this.inAction = true;
			
			this.morphOpenEvent = function()
			{
				this._element.setStyle('display', 'block');
				
				if(!this.options.forcedWidth)
				{
					this._element.setStyle('width', 'auto');
				
					var firstContentElement = this._element.getElement('.content').getFirst();
					
					if(firstContentElement)
					{
						setTimeout(function()
						{
							if(this._element.hasClass('no-padding'))
							{
								this._element.setStyle('width', firstContentElement.getWidth());
							}
							else
							{
								this._element.setStyle('width', firstContentElement.getWidth() + 20);
							}
							
							this.center();
							
							firstContentElement.setStyle('width', 'auto');
						}.bind(this), 0);
					}
				}else {
					var firstContentElement = this._element.getElement('.content').getFirst();
					var width = this._element.getElement('.content').getWidth() - 40;
					if(firstContentElement)
					{
						setTimeout(function()
						{
							firstContentElement.setStyle('width', width);
						}.bind(this), 0);
					}
				}
				
				this._element.morph({'opacity': 1});
				
				this._griser.get('morph').removeEvent('complete', this.morphOpenEvent);
				
				document.addEvent('keydown', this.keyCloseEvent);
				
				this.checkSize();
				this.center();
				
				this.fireEvent('open');
				
				this.inAction = false;
			}.bind(this);
			
			this._griser.setStyle('height', document.getScrollSize().y);
			this._griser.setStyle('width', document.getScrollSize().x);
			this._griser.morph({'display': 'block', 'opacity': 0.4});
			this._griser.get('morph').addEvent('complete', this.morphOpenEvent);
		}
	}, 
	
	close: function()
	{
		if(!this.inAction)
		{
			this.inAction = true;
			
			this.morphCloseEvent = function()
			{
				this.morphGriserCloseEvent = function()
				{
					this._griser.setStyle('display', 'none');
					this._element.setStyle('display', 'none');
					
					this._element.get('morph').removeEvent('complete', this.morphCloseEvent);
					this._griser.get('morph').removeEvent('complete', this.morphGriserCloseEvent);
					
					document.removeEvent('keypress', this.keyCloseEvent);
					
					this.fireEvent('close');
					
					this.inAction = false;
					
					if(this.options.destroyOnClose)
					{
						this.destroy();
					}
				}.bind(this);
				
				this._griser.morph({'opacity': 0});
				this._griser.get('morph').addEvent('complete', this.morphGriserCloseEvent);
			}.bind(this);
			
			this._element.morph({'opacity': 0});
			this._element.get('morph').addEvent('complete', this.morphCloseEvent);
		}
	}, 
	
	checkSize: function()
	{
		if(this._element)
		{
			var content = this._element;
			var content2 = this._element.getElement('.content');
			
			if(content && content.getHeight)
			{
				if(content.getHeight() > $(window).getHeight())
				{
					content2.setStyle('overflow-x', 'hidden');
					content2.setStyle('overflow-y', 'auto');
					content2.setStyle('height', $(window).getHeight() * 0.8);
				}
				else if(content.getHeight() < $(window).getHeight() * 0.8)
				{
					content2.setStyle('overflow', 'hidden');
					content.setStyle('height', 'auto');
				}
			}
		}
	}, 
	
	center: function()
	{
		if(this._element.getHeight)
		{
			this._griser.setStyle('height', $(document).getScrollSize().y);
			this._griser.setStyle('width', $(document).getScrollSize().x);
			
			this._element.setStyle('top', ($(document).getHeight() / 2) - (this._element.getHeight() / 2) + $(document).getScroll().y);
			this._element.setStyle('left', ($(document).getWidth() / 2) - (this._element.getWidth() / 2));
		}
	}, 
	
	destroy: function()
	{
		this._griser.destroy();
		this._element.destroy();
	}
});
