﻿// Fonctions des boîte de messages

function MessageBox(htmlNames) {
	if(this == window || this == document) {alert("MessageBox is a constructor function!"); return;}
	var dhtmlFound = false;
	try{if(setStyleProp) dhtmlFound = true} catch(e){}
	if(!dhtmlFound) { alert("MessageBox requires dhtml.js. Please add it prior to initialization."); return;}
	
	// ---- Propriétés ----
	this.messages = new Object(); // Objets de messages
	this.htmlElements = htmlNames; // ID html des éléments (buttonA, buttonB, title, body, hiddenField, messageBox)
	this.shown = false;
	this.messageID = null;
	this.linkedField = null;
	this.ignoreCloseOnce = false;
	this.maxBgOpacity = 70;
	this.maxWidth = 350;
	this.maxHeight = 350;
	this.fadeInDuration = 400;
	this.fadeOutDuration = 200;
	
	// ---- Événements ----
	this.onShow = null;
	this.onClose = null;
	this.eventListeners = new Object();
	
	// PopUp BG
	if(!document.getElementById('popupBG')) document.write('<div id="popupBG" class="popupBG" style="display:none;"></div>');
	
	if(this.htmlElements.messageBox) document.fullscreenCenteredElement.push(this.htmlElements.messageBox);
	
	// ---- Fonctions ----
	
		// Affichage du message demandé
		this.show = function(messageID, linkedField, noFade) {
			//alert("show: " + messageID);
			if(this.messages[messageID]) {
			    if(window.fader) window.fader.start("popupBG", "in", this.maxBgOpacity, (noFade ? 0 : this.fadeInDuration));
				else setStyleProp("popupBG", "display", "block");

				document.getElementById(this.htmlElements.title).innerHTML = this.getTextProp(this.messages[messageID].title);
				document.getElementById(this.htmlElements.body).innerHTML = this.getTextProp(this.messages[messageID].text);
				if(this.messages[messageID].maxWidth) setStyleProp(document.getElementById(this.htmlElements.body), "width", this.messages[messageID].maxWidth + "px");
				else setStyleProp(document.getElementById(this.htmlElements.body), "width", this.maxWidth);
				var mH = (this.messages[messageID].maxHeight ? this.messages[messageID].maxHeight : this.maxHeight);
				setStyleProp(document.getElementById(this.htmlElements.body), "maxHeight", mH + "px");
				setStyleProp(document.getElementById(this.htmlElements.body), "height", 'expression(this.scrollHeight > ' + mH + ' ? "' + mH + 'px" : "auto")');
				var focusOn = null;
				
				// Bouton YES
				this.messages[messageID].labelYesUsable = false;
				var btn = document.getElementById(this.htmlElements.buttonYes);
				if(btn) {
					if(this.messages[messageID].buttonYes == null) { // No button
						setStyleProp(btn, "display", "none");
					} else {
						setStyleProp(btn, "display", "");
						btn.innerHTML = this.messages[messageID].buttonYes;
						if(focusOn == null) focusOn = this.htmlElements.buttonYes;
						// Label seul
						var lbl = document.getElementById(this.htmlElements.labelYes);
						if(lbl) {
							if(this.messages[messageID].buttonYes != null) {
								lbl.innerHTML = this.getTextProp(this.messages[messageID].buttonYes);
								this.messages[messageID].labelYesUsable = true;
							}
							setStyleProp(lbl, "display", "none");
						}
					}
				}
				
				// Bouton NO
				this.messages[messageID].labelNoUsable = false;
				var btn = document.getElementById(this.htmlElements.buttonNo);
				if(btn) { 
					if(this.messages[messageID].buttonNo == null) { // No button
						setStyleProp(btn, "display", "none");
					} else {
						setStyleProp(btn, "display", "");
						btn.innerHTML = this.getTextProp(this.messages[messageID].buttonNo);
						if(focusOn == null) focusOn = this.htmlElements.buttonNo;
						// Label seul
						var lbl = document.getElementById(this.htmlElements.labelNo);
						if(lbl) {
							if(this.messages[messageID].buttonNo != null) {
								lbl.innerHTML = this.getTextProp(this.messages[messageID].buttonNo);
								this.messages[messageID].labelNoUsable = true;
							}
							setStyleProp(lbl, "display", "none");
						}
					}
				}
				
				// Bouton CANCEL
				this.messages[messageID].labelCancelUsable = false;
				var btn = document.getElementById(this.htmlElements.buttonCancel);
				if(btn) { 
					if(this.messages[messageID].buttonCancel == null) { // No button
						setStyleProp(btn, "display", "none");
					} else {
						setStyleProp(btn, "display", "");
						btn.innerHTML = this.getTextProp(this.messages[messageID].buttonCancel);
						if(focusOn == null) focusOn = this.htmlElements.buttonCancel;
						// Label seul
						var lbl = document.getElementById(this.htmlElements.labelCancel);
						if(lbl) {
							if(this.messages[messageID].buttonCancel != null) {
								lbl.innerHTML = this.getTextProp(this.messages[messageID].buttonCancel);
								this.messages[messageID].labelCancelUsable = true;
							}
							setStyleProp(lbl, "display", "none");
						}
					}
				}
				
				var pnl = document.getElementById(this.htmlElements.messageBox);
				setStyleProp(pnl, "display", "block");
				
				if(typeof(window.supersleight) == "object") window.supersleight.run(this.htmlElements.messageBox);
				
				// Enregistrement du message affiché
				var hdn = document.getElementById(this.htmlElements.hiddenField);
				if(hdn) hdn.value = messageID;
				
				this.shown = true;
				this.messageID = messageID;
				this.linkedField = linkedField;
				
				if(this.onShow) this.onShow();
			    this.dispatchEvent("show", messageID);
				if(focusOn != null) document.getElementById(focusOn).focus();
			}
		}
		
		
		// Fermture du message actif
		this.close = function() {
			if(!this.shown) return;
			
			if(this.ignoreCloseOnce) {
				this.ignoreCloseOnce = false;
				return; 
			}
			
			var pnl = document.getElementById(this.htmlElements.messageBox);
		    if(window.fader) window.fader.start("popupBG", "out", this.maxBgOpacity, this.fadeOutDuration);
			else setStyleProp("popupBG", "display", "none");
			setStyleProp(pnl, "display", "none");
			
			var hdn = document.getElementById(this.htmlElements.hiddenField);
			if(hdn) hdn.value = "";
			
			this.shown = false;
			var oldMsg = this.messageID;
			this.messageID = null;
			
			if(this.onClose) this.onClose();
			this.dispatchEvent("close", oldMsg);
			if(this.linkedField) this.linkedField.focus();
		}
		
		
		// Désactivation des boutons (suite à un clic)
		// Pour empêcher des actions multiples ou répétées
		this.disableButtons = function() {
			var btn = document.getElementById(this.htmlElements.buttonYes);
			if(btn && this.messages[this.messageID].labelYesUsable) { // button Yes
				var lbl = document.getElementById(this.htmlElements.labelYes);
				if(lbl) {
					setStyleProp(btn, "display", "none");
					setStyleProp(lbl, "display", "");
				}
			}
			var btn = document.getElementById(this.htmlElements.buttonNo);
			if(btn && this.messages[this.messageID].labelNoUsable) { // button Yes
				var lbl = document.getElementById(this.htmlElements.labelNo);
				if(lbl) {
					setStyleProp(btn, "display", "none");
					setStyleProp(lbl, "display", "");
				}
			}
			var btn = document.getElementById(this.htmlElements.buttonCancel);
			if(btn && this.messages[this.messageID].labelCancelUsable) { // button Yes
				var lbl = document.getElementById(this.htmlElements.labelCancel);
				if(lbl) {
					setStyleProp(btn, "display", "none");
					setStyleProp(lbl, "display", "");
				}
			}
		}
		
		// Valide la fermeture de la fenêtre (validation custom JavaScript qui peut empêcher le postback de la page)
			// La fonction custom spécifié dans le paramètre postBackValidation doit être un string qui sera évalué avec eval.
			// La fonction en question reçevra un Boolean selon le bouton appuyé, soit true pour oui ou false pour cancel ou non.
			// Si votre fonction retourne true (ou qu'elle n'est pas trouvée), le postback sera effectué sans fermeture de la fenêtre.
			// Si votre fonction retourne false, la fenêtre se fermera SANS postback.
		this.validateClose = function(btnClicked) {
			var retVal = true;
			try {
				if(this.messages[this.messageID].postBackValidation) {
					var clickedYes = false; try { clickedYes = (String(btnClicked.id).toLowerCase().indexOf("yes") != -1); } catch(e){}
					var func = eval(this.messages[this.messageID].postBackValidation);
					if(func) {
						retVal = Boolean(func(clickedYes));
						if(!retVal) this.close();
					}
				}
			} catch(e){}
			return retVal;
		}
		
		// Interprète le texte de source dynamique
		this.getTextProp = function(sourceText) {
			var retText = sourceText;
			var dynamicHandler = "javascript:";
			// Texte dynamique
			if(retText.substring(0, dynamicHandler.length) == dynamicHandler) retText = String(eval(retText.substring(dynamicHandler.length, retText.length)));
			return retText;
		}
		
		
		// =========== GESTION D'ÉVÉNEMENTS ===========
		
		// Objet d'événement envoyé
		this.MessageEvent = function(eType, mID, targ) {
	        this.type = eType;
	        this.id = mID;
	        this.target = targ;
	    }
	    
	    
	    // Propagation de l'événement spécifié
		this.dispatchEvent = function(eType, msgID) {
		    if(this.eventListeners[eType]) {
		        for(var i=0; i<this.eventListeners[eType].length; i++) {
		            this.eventListeners[eType][i].f( new this.MessageEvent(eType, msgID, this) );
		            if(this.eventListeners[eType][i].oneTimeCall) {
		                this.removeListener(eType, this.eventListeners[eType][i].f);
		            }
		        }
		    }
		}
		
		// On ajoute un écouteur pour l'événement spécifié
		this.addListener = function(eType, funct, oneTimeCall) {
		    try { if(!this.eventListeners[eType]) this.eventListeners[eType] = new Array(); }
		    catch(e) { this.eventListeners[eType] = new Array(); }
		    this.removeListener(eType, funct);
		    this.eventListeners[eType].push({f:funct,oneTimeCall:Boolean(oneTimeCall)});
		}
		
		// On retire l'écouteur spécifié
		this.removeListener = function(eType, funct) {
		    if(this.eventListeners[eType]) {
		        for(var i=0; i<this.eventListeners[eType].length; i++) {
		            if(this.eventListeners[eType][i].f == funct) {
		                this.eventListeners[eType].splice(i,1);
		                break;
		            }
		        }
		    }
		}
}
