/*
Script : mooVpopin.js
08/2008 - massacred by christopher wait aka virtualgadjo / chris at virtual-gadjo dot com
tourne avec mootools 1.2

Have swing
*/

var mooVpopin = new Class ({

	Implements: [Options, Events],

	options: {
		onComplete      : Class.empty,
		ajaxUrl         : '',
		getUrlData      : false,
		container       : document,
		maskID          : 'vPopmask',
		popID           : 'vPopin',
		popWidth        : 840,
		popHeight       : 500,
		padding         : 0,
		duration        : 500,
		maskOpacity     : 0.75,
		maskDuration    : 200,
		closeID         : 'vPopclose',
		closeCaption    : '',
		closeWidth      : 30,
		closeHeight     : 30,
		closeRight      : -30,
		closeTop        : 0,
		zIndex          : 200
	},

	initialize: function(zilinks, options) {
		this.setOptions(options);
		this.zilinks    = $$('.' + zilinks) || [];

		this.zilinks.each(function(el){
			el.addEvent('click', function(e){
				e.stop();
				this.getCoord();
				if(this.options.ajaxUrl == "") this.ajaxUrl = el.getProperty('href');
				else this.ajaxUrl = this.options.ajaxUrl;

				if(this.options.getUrlData == true) this.ajaxData = el.getProperty('href').split('?')[1];
				else this.ajaxData = "";

				this.closeAll();//en cas de click, pendant l'ouverture d'une autre fenêtre
				this.maskAppear();
				this.popAppear();
			}.bind(this));
		}.bind(this));

		//tradition oblige
		window.document.addEvent('keydown',function(e){
			if(e.key == 'esc'){ this.closeAll(); }
		}.bind(this));
	},

	getCoord: function(){
		this.maskTop    = this.options.container == document ? document.getScroll().y : $(this.options.container).getCoordinates().top;
		this.maskLeft   = this.options.container == document ? document.getScroll().x : $(this.options.container).getCoordinates().left;
		this.maskHeight = this.options.container == document ? document.getCoordinates().height : $(this.options.container).getCoordinates().height;
		this.maskWidth  = this.options.container == document ? document.getCoordinates().width : $(this.options.container).getCoordinates().width;
		this.centerX    = this.maskLeft + (this.maskWidth / 2);
		this.centerY    = this.maskTop + (this.maskHeight / 2);

		this.popTop     = this.maskTop + (this.maskHeight - this.options.popHeight) / 2;
		this.popLeft    = this.maskLeft + (this.maskWidth - this.options.popWidth) / 2;
		this.popWidth   = this.options.popWidth - (2 * this.options.padding);
		this.popHeight  = this.options.popHeight - (2 * this.options.padding);
	},

	maskAppear: function(){
		this.vPopmask = new Element('div', {
			'id'     : this.options.maskID,
			'styles' : {
				'height'   : this.maskHeight,
				'width'    : this.maskWidth,
				'position' : 'absolute',
				'top'      : this.maskTop,
				'left'     : this.maskLeft,
				'z-index'  : this.options.zIndex
			},
			'events' : {
				'click'    : this.closeAll.bind(this)
			}
		});
		this.maskFx = new Fx.Tween(this.vPopmask, { duration: this.options.maskDuration }).set('opacity', 0);
		this.vPopmask.inject(document.body, 'top');
		this.maskFx.start('opacity', 0, this.options.maskOpacity);
	},

	popAppear: function(){
		this.vPopin = new Element('div', {
			'id'     : this.options.popID,
			'styles' : {
				'width'    : 0,
				'height'   : 0,
				'padding'  : this.options.padding,
				'position' : 'absolute',
				'top'      : this.centerY,
				'left'     : this.centerX,
				'z-index'  : this.options.zIndex + 20
			}
		});
		this.vPopin.inject(document.body, 'top');
		this.popFx = new Fx.Morph(this.vPopin, { duration : this.options.duration, onComplete: this.ajaxFill.bind(this) });
		this.popFx.start({
			'left'  : this.popLeft,
			'top'   : this.popTop,
			'width' : this.popWidth,
			'height': this.popHeight
		});
	},

	setCloseLink: function(){
		this.closeLink = new Element('a', {
			'id'     : this.options.closeID,
			'href'   : '#',
			'styles' : {
				'display'    : 'block',
				'width'      : this.options.closeWidth,
				'height'     : this.options.closeHeight,
				'position'   : 'absolute',
				'right'      : this.options.closeRight,
				'top'        : this.options.closeTop,
				'text-align' : 'right',
				'z-index'    : this.options.zIndex + 20,
				'overflow'   : 'hidden'
			},
			'events' : {
				'click'    : function(e){
					e.stop();
					this.closeAll();
				}.bind(this)
			}
		}).inject(this.vPopin, 'top');
		if (this.options.closeCaption != "") this.closeLink.setProperty('title', this.options.closeCaption);
	},

	ajaxFill: function(){
		this.contenu = new Request.HTML({
			url         : this.ajaxUrl,
			method      : 'get',
			evalScripts : true,
			onComplete  : function(responseHTML){
				this.setCloseLink();
				this.fireEvent('onComplete');
			}.bind(this),
			update      : this.vPopin
		}).send(this.ajaxData);
	},

	closeAll: function(){
		if ($(this.options.maskID)){
			this.maskFx.start('opacity', 0);
			(function(){ $(this.options.maskID).dispose(); }.bind(this)).delay(this.options.maskDuration);
		}

		if ($(this.options.popID)){
			$(this.options.popID).empty();
			$(this.options.popID).dispose();
		}
	}
});