/**
 *	Créé par: Chris Campbell
 *	Date: Janvier 2006
 *
 *	Modifié par: Matthieu Thériault
 *	Date: Juillet 2007
 *
 *	Adaptation de l'implémentation de Lightbox Gone Wild trouvée a http://particletree.com/features/lightbox-gone-wild/
 */

/*-------------------------------- VARIABLES GLOBALES -----------------------------------*/

var detect = navigator.userAgent.toLowerCase();
var browser, version, total, thestring;
var verRefIE = 6;
var msgHTML		= 	'<div id="lbMsg"></div>';
var loadingHTML = 	'<div id="lbLoadImg"></div>';
// Modeles de dialogue
var DIALOG_INFO 	= new Template('#{racine}templates/dialog_info.html');
var DIALOG_ALERT 	= new Template('#{racine}templates/dialog_alert.html');
var DIALOG_CONFIRM2 = new Template('#{racine}templates/dialog_confirm2.html');
var DIALOG_CONFIRM3 = new Template('#{racine}templates/dialog_confirm3.html');
var DIALOG_AUTH     = new Template('#{racine}templates/dialog_auth.html');

/*--------------------------- DÉTECTION DE NAVIGATEUR + OS ------------------------------*/

function getBrowserInfo() {
	if (checkIt('konqueror')) {
		browser = "Konqueror";
	}
	else if (checkIt('safari')) browser 	= "Safari";
	else if (checkIt('firefox')) browser 	= "Firefox";
	else if (checkIt('omniweb')) browser 	= "OmniWeb";
	else if (checkIt('opera')) browser 		= "Opera";
	else if (checkIt('webtv')) browser 		= "WebTV";
	else if (checkIt('icab')) browser 		= "iCab";
	else if (checkIt('msie')) browser 		= "Internet Explorer";
	else if (!checkIt('compatible')) {
		browser = "Netscape Navigator";
		version = detect.charAt(8);
	}
	else browser = "Navigateur inconnu";

	if (!version) version = detect.charAt(place + thestring.length);
}

function checkIt(string) {
	place = detect.indexOf(string) + 1;
	thestring = string;
	return place;
}

/*------------------------------------- LIGHTBOX ----------------------------------------*/

document.observe('dom:loaded', getBrowserInfo, false);

var lightbox = Class.create();

lightbox.prototype = {

	yPos : 0,
	xPos : 0,

	initialize: function(msg, type, options) {
		this.content = type;
		this.msg = msg;
		
		this.height = options.height != undefined ? options.height + 'px' : undefined;
		this.width = options.width != undefined ? options.width + 'px' : '400px';
		
		this.top = options.top != undefined ? options.top + 'px' : '50%';
		this.left = options.left != undefined ? options.left + 'px' : '50%';
		
		this.overlay = options.overlay != undefined ? options.overlay : true;
		this.loading = options.loading != undefined ? options.loading : false;
		
		this.autoHide = options.autoHide != undefined ? options.autoHide : true;
		this.onLoad = options.onLoad != undefined ? options.onLoad.bind(this) : undefined;
		this.racine = options.racine != undefined ? options.racine : '';

		if(type == DIALOG_INFO) {
			this.title = options.title != undefined ? options.title : 'Information';
		} else if(type == DIALOG_ALERT) {
			this.title = options.title != undefined ? options.title : 'Avertissement';
			this.labelOK = options.labelOK != undefined ? options.labelOK : 'OK';
			this.fctYes = options.fctYes != undefined ? options.fctYes.bind(this) : undefined;
		} else if(type == DIALOG_CONFIRM2) {
			this.title = options.title != undefined ? options.title : 'Confirmation';
			this.labelYes = options.labelYes != undefined ? options.labelYes : 'Oui';
			this.fctYes = options.fctYes != undefined ? options.fctYes.bind(this) : undefined;
			this.labelNo = options.labelNo != undefined ? options.labelNo : 'Non';
			this.fctNo = options.fctNo != undefined ? options.fctNo.bind(this) : undefined;
		} else if(type == DIALOG_CONFIRM3) {
			this.title = options.title != undefined ? options.title : 'Confirmation';
			this.labelYes = options.labelYes != undefined ? options.labelYes : 'Oui';
			this.fctYes = options.fctYes != undefined ? options.fctYes.bind(this) : undefined;
			this.labelNo = options.labelNo != undefined ? options.labelNo : 'Non';
			this.fctNo = options.fctNo != undefined ? options.fctNo.bind(this) : undefined;
			this.labelCancel = options.labelCancel != undefined ? options.labelCancel : 'Annuler';
		}else if(type == DIALOG_AUTH) {
			this.title = options.title != undefined ? options.title : 'Identification';
			this.labelYes = options.labelYes != undefined ? options.labelYes : 'Connection';
			this.fctYes = options.fctYes != undefined ? options.fctYes.bind(this) : undefined;
			this.labelNo = options.labelNo != undefined ? options.labelNo : 'Annuler';
			this.fctNo = options.fctNo != undefined ? options.fctNo.bind(this) : undefined;
		}
		
		this.activate();
	},
	
	activate: function(){
		if (browser == 'Internet Explorer' && parseInt(version) <= verRefIE){
			this.getScroll();
			this.prepareIE('100%', 'hidden');
			this.setScroll(0,0);
			this.hideSelects('hidden');
		}
		this.displayLightbox();
	},
	
	prepareIE: function(height, overflow){
		bod = document.getElementsByTagName('body')[0];
		bod.style.height = height;
		bod.style.overflow = overflow;
		htm = document.getElementsByTagName('html')[0];
		htm.style.height = height;
		htm.style.overflow = overflow; 
	},
	
	hideSelects: function(visibility){
		selects = document.getElementsByTagName('select');
		for(i = 0; i < selects.length; i++) {
			selects[i].style.visibility = visibility;
		}
	},
	
	getScroll: function(){
		if (self.pageYOffset) {
			this.yPos = self.pageYOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){
			this.yPos = document.documentElement.scrollTop; 
		} else if (document.body) {
			this.yPos = document.body.scrollTop;
		}
	},
	
	reajustOnScroll: function(){
		$('overlay').style.top = iScrollTop = (document.documentElement.scrollTop || document.body.scrollTop) + 'px';
		if($('lightbox').style.top.indexOf('%') != -1) {
			iScroll = parseInt((iScrollTop.split('px'))[0]);
			iClientHeight = parseInt(document.documentElement.clientHeight || document.body.clientHeight);
			$('lightbox').style.top = (((iScroll + (iClientHeight/2)) / iClientHeight)  * 100) + '%';
		}
	},
	
	disableKeyTabReturn: function(event){
		if( (event.keyCode == Event.KEY_RETURN || event.keyCode == Event.KEY_TAB) 
			&& (event.findElement('#' + this.lb.id) == undefined) )
			Event.stop(event);
	},
	
	setScroll: function(x, y){
		window.scrollTo(x, y); 
	},
	
	displayLightbox: function(){
		if(this.overlay == true){
			this.reajustOnScroll();
			$('overlay').show();
		}
		$('lightbox').setStyle({ left: this.left, top: this.top });
			
		Event.observe(window, 'scroll', this.reajustOnScroll);
		Event.observe(window, 'resize', this.reajustOnScroll);
		Event.observe(window, 'keypress', this.disableKeyTabReturn);

		if(this.loading == true) {
			$('lightbox').setStyle({marginLeft: '-62px', marginTop: '-27px' });
			$('lightbox').show();
		}	
		this.loadInfo();
	},
	
	hideLightbox: function(){
		$('overlay').hide();
		$('lightbox').hide();
		
		Event.stopObserving(window, 'scroll', this.reajustOnScroll);
		Event.stopObserving(window, 'resize', this.reajustOnScroll);
		Event.stopObserving(window, 'keypress', this.disableKeyTabReturn);

		$('overlay').remove();
		$('lightbox').remove();
	},

	showWait: function() {
		$('lbLoadImg').show();
	},
	
	hideWait: function() {
		$('lbLoadImg').hide();
	},

	updateMsgOk: function (msg) {
		var divMsg = $('lbMsg');
		divMsg.removeClassName('login_error');
		divMsg.addClassName('login_info');
		divMsg.update(msg);
		divMsg.show();
	},
	
	updateMsgErr: function (msg) {
		var divMsg = $('lbMsg');
		divMsg.removeClassName('login_info');
		divMsg.addClassName('login_error');
		divMsg.update(msg);
		divMsg.show();
	},
	
	hideAlert: function (msg) {
		$('lbMsg').hide();
	},

	showActionBtns: function(){
		$('popupActions').setStyle({visibility: 'visible'});
	},

	hideActionBtns: function(){
		$('popupActions').setStyle({visibility: 'hidden'});
	},

	update: function(msg) {
		$('popupContent').update(msg);
	},
	
	loadInfo: function() {
		new Ajax.Request(this.content.evaluate({racine: this.racine}), { onSuccess: this.processInfo.bindAsEventListener(this) });
	},
	
	processInfo: function(response){
		$('lightbox').update("<div id='lbContent'>" + response.responseText + "</div>");
		
		if(this.height != undefined)
			$('popupInner').setStyle({ height: this.height });
		if(this.width != undefined)
			$('popupInner').setStyle({ width: this.width });
		
		$('popupTitle').update(this.title);
		$('popupContent').insert({top: loadingHTML + msgHTML});
		if(this.msg != '')
			$('popupContent').insert({bottom: this.msg});
		
		iHeight = Element.getHeight($('lightbox'));
		iWidth = Element.getWidth($('lightbox'));
		
		if(this.left == '50%' && this.top == '50%') {
			$('lightbox').setStyle({ marginLeft: (iWidth/2)*-1 + 'px', marginTop: (iHeight/2)*-1 + 'px' });
		} else if(this.left == '50%') {
			$('lightbox').setStyle({ marginLeft: (iWidth/2)*-1 + 'px' });
		} else if(this.top == '50%') {
			$('lightbox').setStyle({ marginTop: (iHeight/2)*-1 + 'px' });
		}

		if(this.content == DIALOG_ALERT) {
			$('btnOK').innerHTML = this.labelOK;	
		} else if(this.content == DIALOG_CONFIRM2 ) {
			$('btnYes').innerHTML = this.labelYes;
			$('btnNo').innerHTML = this.labelNo;
		} else if(this.content == DIALOG_CONFIRM3) {
			$('btnYes').innerHTML = this.labelYes;
			$('btnNo').innerHTML = this.labelNo;
			$('btnCancel').innerHTML = this.labelCancel;
		}
		else if(this.content == DIALOG_AUTH) {
			$('btnYes').innerHTML = this.labelYes;
			$('btnNo').innerHTML = this.labelNo;
		}

		this.hideWait();
		$('lbContent').show();

		this.actions();

		if(this.loading == false)
		{
			$('lightbox').show();
			this.reajustOnScroll();
			if(this.onLoad != undefined)
				this.onLoad();
		}
	},
	
	actions: function(){
		lbActions = $$('a.lbAction');
		for(i = 0; i < lbActions.length; i++) {
			if(lbActions[i].rel == 'deactivate') {
				Event.observe(lbActions[i], 'click', this.deactivate.bindAsEventListener(this), false);
				if(this.fctYes)
					Event.observe(lbActions[i], 'click', this.fctYes.bindAsEventListener(this), false);
				lbActions[i].onclick = function(){return false;};
			} else if(lbActions[i].rel == 'yes') {
				Event.observe(lbActions[i], 'click', this.fctYes.bindAsEventListener(this), false);
				if(this.autoHide)
					Event.observe(lbActions[i], 'click', this.deactivate.bindAsEventListener(this), false);
				lbActions[i].onclick = function(){return false;};
			} else if(lbActions[i].rel == 'no') {
				if(this.fctNo == undefined)
					Event.observe(lbActions[i], 'click', this.deactivate.bindAsEventListener(this), false);
				else 
					Event.observe(lbActions[i], 'click', function(){ this.deactivate(); this.fctNo(); }.bindAsEventListener(this), false);
				lbActions[i].onclick = function(){return false;};
			}
		}
	},
	
	deactivate: function(){
		if (browser == "Internet Explorer" && parseInt(version) <= verRefIE){
			this.setScroll(0,this.yPos);
			this.prepareIE("auto", "auto");
			this.hideSelects("visible");
		}
		this.hideLightbox();
	}
}

/*---------------------------------------------------------------------------------------*/

function Info(msg, options){
	addLightboxMarkup();
	if(options == undefined)
		options = {};
	valid = new lightbox(msg, DIALOG_INFO, options);
}

function Alert(msg, options){
	addLightboxMarkup();
	if(options == undefined)
		options = {};
	valid = new lightbox(msg, DIALOG_ALERT, options);
}

function Confirm2(msg, options){
	addLightboxMarkup();
	if(options == undefined)
		options = {};
	valid = new lightbox(msg, DIALOG_CONFIRM2, options);
}

function Confirm3(msg, options){
	addLightboxMarkup();
	if(options == undefined)
		options = {};
	valid = new lightbox(msg, DIALOG_CONFIRM3, options);
}

function Auth(options){
	addLightboxMarkup();
	if(options == undefined)
		options = {};
	valid = new lightbox('', DIALOG_AUTH, options);
}

function addLightboxMarkup() {
	var bod 				= document.getElementsByTagName('body')[0];
	var overlay 			= document.createElement('div');
	overlay.id				= 'overlay';
	overlay.style.display	= 'none';
	var lb					= document.createElement('div');
	lb.style.display		= 'none';
	lb.id					= 'lightbox';
	bod.appendChild(overlay);
	bod.appendChild(lb);
}
