/** @fileoverview
 * Utilitaires généraux du portail.
 * 
 * Disponibles en standard dans le portail
 * 
 * @author  jean.tabozzi
 * @version $Id$
 */
 
/**
* @addon
* Ajoute la méthode trim() à l'objet String.
* <br>Exemple<pre>
* var toto = ' foo ';
* var trimtoto = toto.trim(); // trimtoto contiendra 'foo'</pre>
*/
String.prototype.trim = function () {
   return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

/**
* Invoque la page courante en lui passant le paramètre GET 'page='fichier
* @param string alias l'alias de la page (correspodance effectuée par la fonction codeValue())
* @param string [autreParametre] si renseigné, ce paramètre sera passé à la page (Exemple : "p=4")
*/
function page(alias) {
	document.location.href='?page=' + alias + (page.arguments.length >1 ? '&' + page.arguments[1] : '');
}

/** 
* Mémo des messages d'erreur pour message javascript de fin de page 
* @private
*/
var err_msg = "";

/** 
* Tableau des fonctions à déclencher sur le body onload 
* @private
*/
var cp_fcts = new Array();

/** 
* Fonction déclenchée sur le body onload 
* @private
*/
function bodyOnLoad() {
	if(err_msg != "") alert(err_msg);
	for(var i=0;i<cp_fcts.length;i++) eval(cp_fcts[i]);
}

/**
* Déclenche la fonction 'laFonction' lors de l'évènement bodyOnload()
* @param string laFonction string contenant l'appel de la fonction concernée (avec les paramètres éventuels)
*/
function activeSurOnload(laFonction){
	if(laFonction.match(/\(.*\)$/)==null) laFonction = laFonction + "()";
	cp_fcts[cp_fcts.length] = laFonction;
}

/**
* Alimente un champ d'un formulaire de la page qui a ouvert le popup
* <pre>alimenteOpener('choix2','frm.val',true);</pre>
* @param string val la valeur à mettre dans le champ
* @param objet formChamp le champ du forulaire (format : nom_formulaire.nom_champ)
* @param boolean ferme true pour fermer la fenêtre popup.
*/
function alimenteOpener(val,formChamp, ferme){ 
	eval("window.opener.document." + formChamp + ".value='" + val + "'"); 
	if(ferme) window.close(); 
} 

/**
* Positionne le selectedIndex sur l'option id du combo combo.
* @return boolean true si cet id a été trouvé et sélectionné
*/ 
function selectCombo(combo, id){
	for(var i=0;i<combo.options.length;i++)
		if(combo.options[i].value==id){combo.selectedIndex=i;return true;break;}
	return false;
}
/**
* Retire l'item séléctionné du combo 'champ'
* @param mixed champ le champ combo à traiter
*/
function retireItemCombo(champ) {
	if(typeof(champ)!="object") return;
	if(champ.type.match(/^select/)==null) return;
	var id = champ.selectedIndex;
	if(id<0) return;
	champ.options[id] = null;
}

/**
* Ajoute un item au combo 'champ'
* @param champ le combo à traiter
* @param libelle le libellé de l'item à ajouter
* @param [valeur] la valeur de l'item à ajouter. Si non renseigné : prend la valeur de libelle
*/
function ajouteItemCombo(champ, libelle, valeur){
	if(typeof(champ)!="object") return;
	if(champ.type.match(/^select/)==null) return;
	if(valeur == undefined) valeur = libelle;
	for(i=0;i<champ.options.length;i++){
		if(champ.options[i].value==valeur){
			return;
		}
	}
	var opt = new Option(libelle,valeur, false, false);
	champ.options[champ.options.length] = opt;
}

/**
* @param string val le string à tester
* @return true si val est un nom de fichier valide, false sinon
*/
function isNomFichierOk(val){
	if(val=="") return false;
	return (val == valideString(val,'éèçà &#"\'<>([|\\)]=}$%*+,;:!\/','____________________________'));
}

/**
* @param string val le string à tester
* @return true si val est un string correct pour XML, false sinon
*/
function isXMLOk(val){
	return (val == valideString(val,'&#"<>([|\\)]=}$%*+,;!\/','_____________________'));
}

/**
* Retourne la chaine de caractères champValue, dans laquelle les caractères trouvés dans badCars 
* sont remplacés par les caractères (place identique) trouvés dans goodCars.
* <pre>valideString(chp,"é#","e_"); => retourne chp avec remplacement de 
* tous les 'é' par des 'e', et de tous les '#' par des '_'</pre>
* @param objet champValue le champ texte ou le string à convertir
* @param string badCars une chaine de caractères invalides
* @param string goodCars une chaine de caractères contenant les caractères de remplacement
* @return string la chaine de caractères champValue modifiée
*/
function valideString(champValue, badCars, goodCars){
	if(badCars.length != goodCars.length){
		alert("badCars et goodCars doivent avoir des longueurs identiques");
		return false;
	}
	var tst = (typeof(champValue)=="object" ? champValue.value : champValue);
	var s1  = "";
	var j   = -1;
	for(var i=0;i<tst.length;i++){
		j = badCars.indexOf(tst.charAt(i));
		if(j>=0) s1 += goodCars.charAt(j);
		else s1 += tst.charAt(i);
	}
	return s1;
}

/**
* Objet permettant de véhiculer une position x / y.
* <br>Utilisé par getAbsolutePos()
* @param int x la position x (pixels)
* @param int y la position y (pixels)
*/
function position(x, y) {this.x = x;this.y = y;}

/**
* @see position
* @param objet el l'objet à interroger
* @param boolean stopIfAbsolute true pour <b>ne pas</b> se positionner par rapport à un container
* @return un objet 'position' contenant la position absolue (en pixels) d'un objet du document courant.
*/
function getAbsolutePos(el, stopIfAbsolute) {
	var res = new position(el.offsetLeft, el.offsetTop);
	if (el.offsetParent) {
		if ((stopIfAbsolute != true ) || ((el.offsetParent.style.position != 'absolute') && (el.offsetParent.style.position != 'relative') && (el.offsetParent.style.overflow != 'auto') && (el.offsetParent.style.overflow != 'scroll'))) {
			var tmp = getAbsolutePos(el.offsetParent, stopIfAbsolute);
			res.x += tmp.x;res.y += tmp.y;
		}
	}
	return res;
}

/**
* Envoie un cookie au client (A utiliser lorsque la commande PHP header() n'est plus utilisable)
* @param string name nom du cookie
* @param string value valeur du cookie
* @param string expiredays date d'expiration du cookie (en nombre de jours)<br>0 = le cookie expire à la fermeture du navigateur
* @param string path le path (si non renseigné : valeur par défaut = /)
*/
function setCookie(name, value, expiredays, path) {
	var ExpireDate = new Date ();
	ExpireDate.setTime(ExpireDate.getTime() + (expiredays * 24 * 3600 * 1000));
	document.cookie = name + "=" + escape(value) +
	      ((expiredays) ? "; expires=" + ExpireDate.toGMTString() : "") +
	      ((path) ? "; path=" + path : "; path=/");
}

/**
* @param string nom le nom du cookie à chercher
* @param string [defaut] la valeur à retourner si le cookie n'existe pas. (retourne une chaine vide pas defaut si cookie non trouvé)
* @return string la valeur du cookie 'nom'
*/
function getCookie(nom) {
	var res = (getCookie.arguments.length >1 ? getCookie.arguments[1] : '');
	var x = document.cookie.split(';');
	for(i=0; i<x.length; i++) {
		v = x[i].split('=');
		if(v[0].trim() == nom) {
			res = unescape(v[1]); 
			break;
		}
	}
	return res;
}

/**
* @param string nomParam le nom du paramètre GET
* @return string la valeur du paramètre GET nomParam du document courant, ou false si nomParam est inexistant dans la liste des paramètres GET
*/
function getParameter(nomParam){
	var re = new RegExp("[&|\?]"+nomParam+"=([^&]*)&{0,1}");
	var matchArray = re.exec(document.location.search);
	if(matchArray!=null) return matchArray[1];
	return false;
}

/**
* Exécute une fonction javascript sur ENTER.
* <pre>onkeydown="kb_execSurEnter(event, 'goLogin()')"</pre>
* @param objet e l'évènement qui a déclenché la fonction. Mettre toujours <b>event</b>
* @param string nomScriptJS le script javascript à déclencher
*/
function kb_execSurEnter(e, nomScriptJS){
	var keyCode = (document.all ? e.keyCode : e.which);
	if(keyCode == 13){
		eval(nomScriptJS);
	}
}

/**
* Alimentation d'un DIV avec le résultat d'une requête Ajax.
* Nécessite <b>/commun/ajax/prototype.js</b>
* @param string idDiv l'ID du div à alimenter
* @param string nomScriptPHP le nom du script PHP qui sera invoqué par la requête Ajax
* @param string [idChamp, idChamp, ...] la liste des <b>ID</b> de champs du formulaire (courant) qui seront passés (POST) au script PHP
* <br>ATTENTION : Les champs doivent obligatoirement posséder un attribut ID (sinon : plantage FireFox)
*/
function alimDivWithAjax(idDiv, nomScriptPHP) {
	if(typeof(Prototype) != 'object') {
		alert('Fonctions Ajax manquantes (Prototype)');
		return;
	}
	var params = { parameters: { idDiv:idDiv }};
	var v = '';
	for(var i=2; i<alimDivWithAjax.arguments.length; i++) {
		v = $F(alimDivWithAjax.arguments[i]);
		eval("params.parameters." + alimDivWithAjax.arguments[i] + "='" + v + "';");
	}
	Element.update(idDiv, '...');
	new Ajax.Updater(idDiv, nomScriptPHP, params);
}

/** 
* Objet permettant l'affichage d'une fenêtre popup.
* Cet objet est instancié dans un variable 'popup' accessible en standard dans le portail
* <pre>Exemple : popup.go('titi.php')</pre>
*/
function Popup(){

	/** Affichage de la toolbar ('yes' ou 'no') */
	this.toolbar="no";			
	/** location ('yes' ou 'no') */
	this.location="no";			
	/** directories ('yes' ou 'no') */
	this.directories="no";		
	/** Affichage de la barre de status ('yes' ou 'no') */
	this.status="no";			
	/** Affichage de la barre de menu ('yes' ou 'no') */
	this.menubar="no";			
	/** Affichage de la scrollbar ('yes' ou 'no') */
	this.scrollbars="yes";		
	/** redimentionnable ('yes' ou 'no') */
	this.resizable="yes";		
	/** Position x (pixels) */
	this.left=10;				
	/** Position y (pixels) */
	this.top=10;				
	/** Largeur (pixels) */
	this.width=640;				
	/** Hauteur (pixels) */
	this.height=480;			
	/** True pour prendre toute la sufrace du navigateur */
	this.full = false;			
	/** Nom de la fenêtre popup */
	this.nomFenetre = "ppup";	
	/** True pour centrer le popup à l'écran */
	this.center = false;		

	/** @private */
	this._wintop;	// La référence de la fenetre ouverte
	
	/**
	* Affiche le popup en utilisant le paramétrage de l'objet
	* @param string page la page à afficher
	* @param string nomFenetre le nom de la fenêtre à ouvrir (si non renseigné le nom par défaut est utilisé)
	*/
	this.go=function(page,nomFenetre){
		if(nomFenetre) this.nomFenetre = nomFenetre;
		this._getDims();
		var params = 'toolbar=' + this.toolbar;
		params += ',location=' + this.location
		params += ',directories=' + this.directories;
		params += ',status=' + this.status;
		params += ',menubar=' + this.menubar;
		params += ',scrollbars=' + this.scrollbars;
		params += ',resizable=' + this.resizable;
		params += ',left=' + this.left;
		params += ',top=' + this.top;
		params += ',width=' + this.width;
		params += ',height=' + this.height;

		this._wintop = window.open(page,this.nomFenetre,params);
		this._wintop.focus();
	}
	
	/** @private */
	this._getDims=function(){
		if(this.center){
			this.left = Math.round((screen.width - this.width)/2);
			this.top  = Math.round((screen.height - this.height)/2);
		}
		if(this.full){
			this.left    = 0;
			this.top     = 0;
			this.width   = screen.availWidth;
			this.height  = screen.availHeight;
		}
	}
	
	/**
	* Rafraichit l'affichage après modification de paramètres
	*/
	this.redraw=function(){
		if(self.name != this.nomFenetre) return;
		this._getDims();
		self.moveTo(this.left,this.top);
		self.resizeTo(this.width, this.height);
	}
	
	/**
	* Fermeture de la fenêtre courante
	*/
	this.close=function(){
		if(this._wintop) this._wintop.close();
		this._wintop = false;
	}
	
}
/**
* Instance de la classe Popup()
*/
var popup = new Popup();

