/**
 * $ function.
 * 
 * Permet de récupérer un élément qu'il soit un objet ou un identifiant. 
 */
function $() {
    elements = [];
    
    for (var i=0, len = arguments.length; i < len; ++i) {
        
        var element = arguments[i];
        
        if (typeof element === 'string') {
            element = document.getElementById(element);
        }
        
        if (arguments.length === 1) {
            return element;
        }
        
        elements.push(element);
    }
    
    return elements;
}


/**
 * Cette fonction retourne la chaine avec suppression des espaces positionnés en début ou en fin de la chaine.
 *
 * @param string string
 * @return string
 */
function trim(string){
    return string.replace(/(^\s*)|(\s*$)/g, '');
}



/**
 * Affiche le message de confirmation pour la déconnexion du portail
 *
 * Renvoie true si l'utilisateur souhaite se déconnecter
 * @return bool
 */
function confirmation()	{
    if (confirm('Etes-vous sûr de vouloir vous déconnecter ?')) return true;
    return false;
}



/**
 * Ouvre une popup centrée
 *
 * @param   string  url                 Url d'accès à la page
 * @param   int     iwidth              Largeur de la popup
 * @param   int     iheight             Hauteur de la popup
 * @param   string  argument optionnel  Permet de personnaliser la popup suivant les propriétés JS
 * @return  void
 */
function openPopUp(url,iwidth,iheight) {

    // Check des paramètres optionnels
    if (openPopUp.arguments.length == 4) options = openPopUp.arguments[3] + ',';
    else                                 options = '';

    var hauteur = (screen.height / 2) - (iheight / 2);
    var largeur = (screen.width / 2) - (iwidth / 2);

    var Infowindow = window.open(url, "Infos" , options + "resizable=yes,top=" + hauteur + ","
                                                                    +   "left=" + largeur + ","
                                                                    +  "width=" + iwidth  + ","
                                                                    + "height=" + iheight);
    Infowindow.focus();
}



// Convertit un nombre décimal dont le séparateur est une virgule en point
function virguleEnPoint(tmp_val) {
    p = /[,]/;

    return tmp_val.replace(p, '\.');
}



/**
 * Les deux fonctions ci-dessous (HideTip & ShowTip)servent à faire apparaître une bulle d'aide
 *
 * <code>
 * <div class="CTooltip" id="tt1"> Un lien se traduit en HTML par l'emploi de la balise [HREF]...</div>
 * <div class="CTooltip" id="tt2"> Un tooltip peut être placé sur n'importe quel élément html, du moment que les évnèments javascript OnmouseOver &amp; ONmouseOut soient acceptés</div>
 * <a href="toto" onmouseover="ShowTip(1);" onmouseout="HideTip(1);">Exemple sur un lien HREF</a>
 * <br>
 * <table border="1">
 *   <tr>
 *     <th colspan="2" onmouseover="ShowTip(2);" onmouseout="HideTip(2);">Entete de colonne</th>
 *   </tr>
 *   <tr>
 *     <td>Colonne 1</td>
 *     <td>Colonne 2</td>
 *   </tr>
 * </table>
 * </code>
 */
function ShowTip(fArg) {
	var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']");
	if (tooltipOBJ != null) {
		var tooltipLft = (document.body.offsetWidth?document.body.offsetWidth:document.body.style.pixelWidth) - (tooltipOBJ.offsetWidth?tooltipOBJ.offsetWidth:(tooltipOBJ.style.pixelWidth?tooltipOBJ.style.pixelWidth:380)) - 30;
		if (navigator.appName != 'Netscape') {
			var tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
			if ((event.clientX > tooltipLft) && (event.clientY < (tooltipOBJ.scrollHeight?tooltipOBJ.scrollHeight:tooltipOBJ.style.pixelHeight) + 10)) {
				tooltipTop = (document.body.scrollTop?document.body.scrollTop:document.body.offsetTop) + event.clientY + 20;
			}
			tooltipOBJ.style.pixelLeft = tooltipLft; tooltipOBJ.style.pixelTop = tooltipTop;
		}
		else {
			var tooltipTop = 10;
			tooltipOBJ.style.left = tooltipLft; tooltipOBJ.style.top = tooltipTop;
		}
		tooltipOBJ.style.visibility = "visible";
	}
}



function HideTip(fArg) {
	var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']");
	if (tooltipOBJ != null) {
		tooltipOBJ.style.visibility = "hidden";
	}
}



/**
 * Fonction pour remplacer les caractères spéciaux de word, codés en UTF 16, avec leur équivalent ASCII.
 * Cette fonction doit être appliquée avant tout autre fonction se basant sur le nombre de caractères du
 * champ (car un caractère comme les 3 points de suspensions en UTF 16 deviennent 3 caractères du point traditionnel).
 *
 * @param champ objet (textarea, input...)
 * @return string
 */
function filtreWordCar(champ) {
    chaine = champ.value;

    aCarSpeciaux = new Array(
        8230,
        32  ,
        171 ,
        187
    );

    aAsciiSwitch = new Array(
        "...",
        " "  ,
        "\"" ,
        "\""
    );

    for (j=0; j < aCarSpeciaux.length; j++) {
        MyReg  = new RegExp(eval("String.fromCharCode(aCarSpeciaux[j])"), "g");
        chaine = chaine.replace(MyReg, aAsciiSwitch[j]);
    }

    champ.value = chaine;
}



/**
 * Affiche les propriétés de l'objet "elm"
 *
 * @param   objet   elm
 * @return  void
 */
function inspect(elm) {
    var str = "";

    for (var i in elm)
        str += i + ": " + elm.getAttribute(i) + "<br>";

    document.write(str);
}



/**
 * Permet d'arrondir un nombre avec la précision passée en paramètre
 *
 * @param nbr precision
 * @return float
 */
function arrondir(nbr) {

	var precision;

    // Check des paramètres optionnels
    if (arrondir.arguments.length == 2) precision = arrondir.arguments[1];
    else                                precision = 2;

	if (isNaN(nbr)) {
		throw("La valeur '"+nbr+"' est incorrecte car non numérique");
		return 0;
	}
	else if (isNaN(precision)) {
		throw("Le paramètre de précision de la fonction arrondir '"+precision+"' est incorrecte car non numérique");
		return 0;
	}

	return new Number(nbr).toFixed(precision);
}

/**
 * Convertit les caractères spéciaux HTML
 */
function cleanHTMLSpecialChars(str) {
    str = str.replace(/(&)/g, '&amp;');
    str = str.replace(/(\")/g, '&quot;');
    str = str.replace(/(\')/g, '&#039;');
    str = str.replace(/(<)/g, '&lt;');
    str = str.replace(/(>)/g, '&gt;');

    return str;
}

/**
 * Convertit en caractères spéciaux HTML
 */
function toHTMLSpecialChars(str) {
    str = str.replace(/(&amp;)/g, '&');
    str = str.replace(/(&quot;)/g, '"');
    str = str.replace(/(&#039;)/g, '\'');
    str = str.replace(/(&lt;)/g, '<');
    str = str.replace(/(&gt;)/g, '>');

    return str;
}


/**
 * Passe la première lettre de la chaîne en majuscule, et le reste en minuscule
 */
 function ucfirst(str)
 {
 	return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase(); 
 }


/**
 * Passe la première lettre de chaque mot de la chaîne en majuscule et le reste en minuscule
 * Les mots sont séparés par le séparateur passé en paramètre, par défaut l'espace
 */
 function ucwords(str, sep)
 {
 	if (sep == null)
 		sep = ' ';
 		
	str = str.split(sep);
	for (var i=0; i<str.length; i++)
	   str[i] = ucfirst(str[i]);
	str = str.join(sep);
	if (str.indexOf(sep) == 0)
		str = str.substring(1);
	return str; 
 }

