//===
// Dialogue
//===

//===
// 1. Fonctions générales
//===

//---
// URL parser
//---

function parseUrl(url) {
	var urlParm = {};
	var	o = {
		strictMode: false,
		key: ["source", "protocol", "authority", "userInfo", "user", "password", "host",
			"port", "relative", "path", "directory", "file", "query", "anchor"],
		q: {
			name:   "queryKey",
			parser: /(?:^|&)([^&=]*)=?([^&]*)/g
			},
		parser: {
			strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
			loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
			}
		};
	var m = o.parser[o.strictMode ? "strict" : "loose"].exec(url);
	var i = 14;

	while (i--) {
		urlParm[o.key[i]] = m[i] || "";
	}

	urlParm[o.q.name] = {};
	urlParm[o.key[12]].replace(o.q.parser,
		function ($0, $1, $2)
		{
			if ($1) {
				urlParm[o.q.name][$1] = $2;
			}
		}
		);

	return urlParm;
};


//---
// Validation d'un formulaire
//---

function onVal()
{
	// Initialiser les paramètres optionnels
	var form_name = "";		// Nom du formulaire
	var action = "";		// Nom de l'action à mener par le script cible
	var parm = "";			// Paramètres de l'action à mener par le script cible
	var conf = "";			// Indicateur de confirmation
	var url = "";			// URL cible
	var target = "";		// Fenêtre ou frame cible pour l'exécution de l'URL cible
	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			form_name = arguments[i];
			break;
		case 1:
			action = arguments[i];
			break;
		case 2:
			parm = arguments[i];
			break;
		case 3:
			conf = arguments[i];
			break;
		case 4:
			url = arguments[i];
			break;
		case 5:
			target = arguments[i];
			break;
		}
	}

	// Utiliser l'URL de la fenêtre en cours si l'URL cible n'est pas renseignée
	if (! url) {
		url = window.location;
	}

	// Initialiser les paramètres de l'éventuelle fenêtre cible
	var win_parm = target.split(" ");
	var win_name = "";
	var win_width = 0;
	var win_height = 0;
	var win_top = 0;
	var win_left = 0;
	var win_menu = 0;
	var win_tool = 0;
	for (i = 0; i < win_parm.length; i++) {
		if (i == 0) {
			win_name   = win_parm[i];
		}
		if (i == 1) {
			win_width  = win_parm[i];
		}
		if (i == 2) {
			win_height = win_parm[i];
		}
		if (i == 3) {
			win_top    = win_parm[i];
		}
		if (i == 4) {
			win_left   = win_parm[i];
		}
		if (i == 5) {
			win_menu   = win_parm[i];
		}
		if (i == 6) {
			win_tool   = win_parm[i];
		}
	}

	// Ouvrir l'éventuelle fenêtre cible (son nom doit commercer par "win_", sinon c'est une
	// frame)

	if (win_name.substr(0, 4) == "win_") {
		onPopup(win_name, "", win_width, win_height, win_top, win_left, win_menu, win_tool);
	}

	// Créer un formulaire par défaut s'il n'est pas renseigné
	if (form_name == "") {
		form_name = "temp_form";
		var form_elt = document.createElement("form");
		form_elt.id = form_name;
		form_elt.name = form_name;
		form_elt.method = "post";
		form_elt.action = "";
		document.body.appendChild(form_elt);
	}

	// Ajouter un champ caché contenant le nom de la fenêtre ou frame d'origine
	var winfrom_elt = document.createElement("input");
	winfrom_elt.id = "_window_from";
	winfrom_elt.name = "_window_from";
	winfrom_elt.type = "hidden";
	winfrom_elt.value = window.name;
	document.forms[form_name].appendChild(winfrom_elt);

	// Ajouter un champ caché contenant le nom de la fenêtre ou frame cible
	var window_elt = document.createElement("input");
	window_elt.id = "_window";
	window_elt.name = "_window";
	window_elt.type = "hidden";
	window_elt.value = win_name;
	document.forms[form_name].appendChild(window_elt);

	// Ajouter un champ caché contenant le nom du script appelant
	var script_elt = document.createElement("input");
	script_elt.id = "_script_in";
	script_elt.name = "_script_in";
	script_elt.type = "hidden";
	script_elt.value = parseUrl(url).path;
	document.forms[form_name].appendChild(script_elt);

	// Ajouter un champ caché contenant le nom de l'action à mener par le script cible
	var action_elt = document.createElement("input");
	action_elt.id = "_action";
	action_elt.name = "_action";
	action_elt.type = "hidden";
	action_elt.value = action;
	document.forms[form_name].appendChild(action_elt);

	// Ajouter un champ caché contenant les autres paramètres à transmettre au script cible
	var parm_elt = document.createElement("input");
	parm_elt.id = "_data";
	parm_elt.name = "_data";
	parm_elt.type = "hidden";
	parm_elt.value = parm;
	document.forms[form_name].appendChild(parm_elt);

	// Initialiser le script cible en tenant compte des cas particuliers : 'RETURN', 'QUIT'
	// et 'INDEX'
	target_url = url;
	if (url == window.location) {
		target_url = parseUrl(url).directory;
		if (target_url == "/") {
			target_url = "";
		}
		target_url += "/val/" + parseUrl(url).file;
	}
	var action_old = document.forms[form_name].action;
	document.forms[form_name].action = target_url;
	if (action == "RETURN" || action == "QUIT" || action == "INDEX") {
		document.forms[form_name].action = "/common/dialog/action.php?A=" + action;
	}

	// Initialiser la fenêtre ou la frame cible du script cible
	if (win_name != window.name) {
		if (win_name) {
			document.forms[form_name].target = win_name;
		} else {
			document.forms[form_name].target = window.name;
		}
	}

	// Appeler le script cible sous réserve éventuelle de confirmation
	var submit = true;
	if (conf) {
		if (! confirm("Êtes-vous sûr(e) ?")) {
			submit = false;
		}
	}
	if (submit == true) {
		document.forms[form_name].submit();
	} else {
		document.forms[form_name].action = action_old;
	}
}


//---
// Ouverture de session
//---

function onLogin()
{
	// Initialiser les paramètres optionnels
	var form_name = "";		// Nom du formulaire
	var sessno = 0;			// Numéro de session à ouvrir
	var target = "";		// Fenêtre cible de la session
	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			form_name = arguments[i];
			break;
		case 1:
			sessno = arguments[i];
			break;
		case 2:
			target = arguments[i];
			break;
		}
	}

	// Initialiser le tag d'ouverture d'une nouvelle fenêtre pour exécuter la session
	var win_tag = false;
	if (document.getElementsByName("c_win_tag")[0].checked) {
		win_tag = true;
	}

	// Initialiser le nom de l'éventuelle fenêtre cible
	target = target + sessno;

	// Appeler la fonction de validation en fonction du tag d'ouverture d'une nouvelle
	// fenêtre
	if (win_tag) {
		onVal(form_name, "LOGIN", sessno, false, "", target + " 9999 9999");
	} else {
		onVal(form_name, "LOGIN", sessno);
	}
}


//---
// Fermeture des sessions en cours
//---

function onLogout()
{
	// Initialiser les paramètres optionnels
	var form_name = "";		// Nom du formulaire
	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			form_name = arguments[i];
			break;
		}
	}

	// Fermer les fenêtres correspondant aux sessions
	for (var i = 0; i < document.getElementsByName("window").length; i++) {
		if (document.getElementsByName("window")[i].value) {
			var winClose = window.open("", document.getElementsByName("window")[i].value);
			winClose.close();
		}
	}

	// Appeler la fonction de validation de la fermeture des sessions
	onVal(form_name, "LOGOUT");
}


//---
// Changement d'onglet dans un groupe d'onglets d'un formulaire
//---

function onTab()
{
	// Initialiser les paramètres optionnels
	var form_name = "";		// Nom du formulaire
	var group = "";			// Nom du groupe d'onglets
	var tab = "";			// Identifiant de l'onglet cible
	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			form_name = arguments[i];
			break;
		case 1:
			group = arguments[i];
			break;
		case 2:
			tab = arguments[i];
			break;
		}
	}

	// Initialiser les paramètres de pagination de la liste en champ
	document.forms[form_name][group].value = tab;

	// Appeler la fonction de validation du formulaire
	onVal(form_name);
}


//---
// Entrée par 'prompt' d'un valeur à transmettre au script de validation d'un formulaire
//---

function onInput()
{
	// Initialiser les paramètres optionnels
	var caption = "";		// Etiquette du champ de saisie
	var def_val = "";		// Valeur par défaut du champ de saisie
	var form_name = "";		// Nom du formulaire
	var action = "";		// Nom de l'action à mener par le script cible
	var parm = "";			// Paramètres de l'action à mener par le script cible
	var conf = "";			// Indicateur de confirmation
	var url = "";			// URL cible
	var target = "";		// Fenêtre ou frame cible pour l'exécution de l'URL cible
	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			caption = arguments[i];
			break;
		case 1:
			def_val = arguments[i];
			break;
		case 2:
			form_name = arguments[i];
			break;
		case 3:
			action = arguments[i];
			break;
		case 4:
			parm = arguments[i];
			break;
		case 5:
			conf = arguments[i];
			break;
		case 6:
			url = arguments[i];
			break;
		case 7:
			target = arguments[i];
			break;
		}
	}

	// Afficher le popup de saisie de la valeur à transmettre
	var input;
	input = prompt(caption, def_val);

	// Appeler la fonction de validation du formulaire en y incluant la valeur saisie
	if (input) {
		onVal(form_name, action, input, conf, url, target);
	}
}

//---
// Pagination d'une liste d'un formulaire
//---

function onScroll()
{
	// Initialiser les paramètres optionnels
	var form_name = "";		// Nom du formulaire
	var list = "";			// Nom de la liste à paginer
	var parm = "";			// Paramètres de pagination
	var byentry = false;	// Indicateur de pagination par saisie du numéro de la page cible
	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			form_name = arguments[i];
			break;
		case 1:
			list = arguments[i];
			break;
		case 2:
			parm = arguments[i];
			break;
		case 3:
			byentry = arguments[i];
			break;
		}
	}

	// Initialiser le numéro de la page cible éventuellement saisie
	if (byentry) {
		if (document.forms[form_name]["goto_page"].value) {
			parm = parm.replace(/\"page_no\";i:[0-9]+;/, "\"page_no\";i:" +
				document.forms[form_name]["goto_page"].value + ";");
		}
	}

	// Initialiser les paramètres de pagination de la liste en champ
	document.forms[form_name][list].value = parm;

	// Appeler la fonction de validation du formulaire
	onVal(form_name);
}


//---
// Sélection d'un élément dans une liste d'un formulaire
//---

function onPick()
{
	// Initialiser les paramètres optionnels
	var form_name = "";		// Nom du formulaire
	var list = "";			// Nom de la liste à paginer
	var parm = "";			// Paramètres de sélection
	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			form_name = arguments[i];
			break;
		case 1:
			list = arguments[i];
			break;
		case 2:
			parm = arguments[i];
			break;
		}
	}

	// Initialiser les paramètres de pagination de la liste en champ
	document.forms[form_name][list].value = parm;

	// Appeler la fonction de validation du formulaire
	onVal(form_name, 'PICK_' + list.toUpperCase());
}


//---
// Retour à la page précédente
//---

function onReturn()
{
	var form_name = "";	// Formulaire en cours
	if (arguments.length > 0) {
		form_name = arguments[0];
	}
	onVal(form_name, "RETURN");
}


//---
// Retour à la page d'accueil
//---

function onIndex()
{
	var form_name = "";	// Formulaire en cours
	if (arguments.length > 0) {
		form_name = arguments[0];
	}
	onVal(form_name, "INDEX");
}


//---
// Quitter l'application
//---

function onQuit()
{
	var form_name = "";	// Formulaire en cours
	if (arguments.length > 0) {
		form_name = arguments[0];
	}
	onVal(form_name, "QUIT");
}


//---
// Appel du traitement d'impression d'un document
//---

function onPrint(url)
{
	onPopup("win_print", url, screen.width, screen.height, 0, 0, 1, 1);
}


//---
// Ouverture d'un popup
//---

function onPopup()
{
	// Initialiser les paramètres optionnels
	var winName = "";		// Nom de la fenêtre
	var winURL = "";		// URL à ouvrir
	var winWidth = 640;		// Largeur de la fenêtre
	var winHeight = 480;	// Hauteur de la fenêtre
	var winTop = 0;			// Position relative par rapport au milieu de la hauteur de l'écran
	var winLeft = 0;		// Position relative par rapport au milieu de la largeur de l'écran
	var menubar = 0;		// Présence de la barre de menu
	var toolbar = 0;		// Présence de la barre d'outils

	for (var i = 0; i < arguments.length; i++) {
		switch (i) {
		case 0:
			winName = arguments[i];
			break;
		case 1:
			winURL = arguments[i];
			break;
		case 2:
			if (arguments[i] >= 0) {			// Largeur minimum autorisée
				winWidth = arguments[i];
			}
			if (winWidth == 0) {
				winWidth = screen.width;
			}
			if (winWidth < 100) {				// Largeur minimum autorisée
				winWidth = 100;
			}
			break;
		case 3:
			if (arguments[i] >= 0) {			// Hauteur minimum autorisée
				winHeight = arguments[i];
			}
			if (winHeight == 0) {
				winHeight = screen.height;
			}
			if (winHeight < 100) {
				winHeight = 100;
			}
			break;
		case 4:
			winTop = arguments[i];
			break;
		case 5:
			winLeft = arguments[i];
			break;
		case 6:
			menubar = arguments[i];
			break;
		case 7:
			toolbar = arguments[i];
			break;
		}
	}

	// Redéfinir le point d'ancrage du popup en valeur absolue
	winTop = (screen.height - winHeight) / 2 + winTop;
	winLeft = (screen.width - winWidth) / 2 + winLeft;

	// Dans le cas d'une URL cible PHP, ajouter le nom de la fenêtre à la liste des
	// paramètres
	var strURL = new String(winURL);
	if (strURL.indexOf(".php") > 0) {
		if (strURL.indexOf("?") > 0) {
			winURL = winURL + "&window=" + winName;
		} else {
			winURL = winURL + "?window=" + winName;
		}
	}

	// Ouvrir le popup
	var winOptions = "width=" + winWidth + ",height=" + winHeight + ",top=" + winTop +
		",left=" + winLeft + ",menubar=" + menubar + ",toolbar=" + toolbar +
		",scrollbars=1";

	newWin = window.open(winURL, winName, winOptions);
	newWin.focus();
}


//---
// Affichage du message d'attente pendant un téléchargement (file upload)
//---

function onUpload(form_name, upload)
{
	var display = false;
	if (document.forms[form_name][upload].length > 0) {
		var i = 0;
		while (i < document.forms[form_name][upload].length) {
			if (document.forms[form_name][upload][i].value != "") {
				display = true;
				break;
			}
			i++;
		}
	} else {
		if (document.forms[form_name][upload].value != "") {
			display = true;
		}
	}
	if (display == true) {
		showWait("Uploading files . . .");
	}
}


//---
// Sélection d'un nouveau fichier à télécharger
//---

function onUploadMore(button, upload)
{
	if (button && button.parentNode && button.parentNode.insertBefore && document.createElement) {
		var fileInput = document.createElement('input');
		fileInput.type = "file";
		fileInput.name = upload;
		fileInput.size = 50;
		button.parentNode.insertBefore(fileInput, button);
		button.parentNode.insertBefore(document.createElement('br'), button);
	}
}


//===
// 2. Listes de sélection
//===

//---
// Mise à jour des dépendances suite à sélection dans un champ d'une liste dotée des valeurs
// de ses champs dépendants
//---

function pickList(form_name, controlName, depList)
{
	//---
	// Initialiser le tableau des champs dépendants
	//---

	var depListObj = new String(depList);
	var field = depListObj.split(" ");

	//---
	// Initialiser le tableau des valeurs des champs dépendants
	//---

	var i = document.forms[form_name][controlName].options.selectedIndex;
	var data = new String(document.forms[form_name][controlName].options[i].value);
	var value = data.split("|");

	//---
	// Attribuer les valeurs aux différents champs dépendants
	//---

	for (var j = 0; j < value.length; j++) {
		if (document.forms[form_name][field[j]].name != controlName) {
			document.forms[form_name][field[j]].value = "";
			document.forms[form_name][field[j]].value = value[j];
			if (document.forms[form_name][field[j]].type == "checkbox") {
				document.forms[form_name][field[j]].checked = false;
				if (value[j] == "Y") {
					document.forms[form_name][field[j]].checked = true;
				}
			}
		}
	}
}


//---
// Couleur d'étalonnage
//---

function val_color(val)
{
	color = "";
	switch (val) {
	case "0":
		color = "#7f7f7f";		// Gris
		break;
	case "1":
		color = "#bf0000";		// Rouge
		break;
	case "2":
		color = "#ff7f00";		// Orange
		break;
	case "3":
		color = "#ffff00";		// Jaune
		break;
	case "4":
		color = "#007f00";		// Vert
		break;
	}

	return color;
}


//---
// Couleur de police d'échelle de valeur
//---

function val_fontcolor(val)
{
	color = "";

	switch (val) {
	case "1":
		color = "#ffffff";		// Blanc
		break;
	case "2":
		color = "#ffffff";		// Blanc
		break;
	case "3":
		color = "#000000";		// Noir
		break;
	case "4":
		color = "#ffffff";		// Blanc
		break;
	default:
		color = "#ffffff";		// Blanc
		break;
	}
	return color;
}


//===
// 3. Barre d'activité
//===

//---
// Affichage de la barre d'activité
//---

function showWait(message)
{
	jsWait_defaultInstance = new jsWait('jsWait_defaultInstance', message);
	jsWait_defaultInstance.show();
}

//---
// Définition du type jsWait
//---

/**
* Constructeur
* @param name le nom du composant
* @param message le message a afficher
*/
function jsWait(name, message)
{
	this.name = name;
	this.message = message;
	this.speed = 10;
	this.direction = 2;

	this.waiting = false;

	this.divMessage = document.getElementById("jsWaitMessage");
	this.divArea = document.getElementById("jsWaitArea");
	this.divBlock = document.getElementById("jsWaitBlock");
}


//---
// Méthodes publiques
//---

jsWait.prototype.show = function()
{
	this.divMessage.innerHTML = this.message;
	this.divMessage.style.display = "block";
	this.divArea.style.display = "block";
	this.divBlock.style.display = "block";
	this.divBlock.style.left = "0px";
	this.waiting = true;

	this.loop();
}

jsWait.prototype.setMessage = function(message)
{
	this.message = message;
	this.divMessage.innerHTML = this.message;
}

jsWait.prototype.stop = function()
{
	this.waiting = false;
	this.divMessage.style.display = "none";
	this.divArea.style.display = "none";
	this.divBlock.style.display = "none";
}


//---
// Méthodes privées
//---

jsWait.prototype.loop = function()
{
	myLeft = this.divBlock.style.left;
	myLeft = myLeft.substring(0, myLeft.length-2);
	intLeft = parseInt(myLeft);

	if (intLeft >= 250) {
		this.direction = -2;
	}
	if (intLeft <= 0) {
		this.direction = 2;
	}

	myLeft = "" + (intLeft+this.direction) + "px";
	this.divBlock.style.left = myLeft;

	if (this.waiting) {
		setTimeout(this.name + ".loop()", this.speed);
	}
}
