//=================================== FONCTIONS JS DE BASES =================================
//----------------------------------- 15 11 2010 (version minimale)

// ======================================== DEBUG ===========================================
function echoDebug(maVar,commentaireOptionnel,alerte) {
	// ---------- alert avec "aplatissement" en cas d'array ou d'object passé
	// ---------- accepte tout type de variable (object et array compris)
	// ---------- le param 'alerte' affiche le debug en alert JS si TRUE (FALSE par defaut)
	
	if (alerte === undefined) { // permet de passer le param 'alerte' en 2eme parametre
		if (isBoolean(commentaireOptionnel)) {
			alerte = commentaireOptionnel;
			commentaireOptionnel = '';
		}
	}
	
	var resu = (commentaireOptionnel != undefined && commentaireOptionnel != "")? commentaireOptionnel + "\n\n" : "";
	if (maVar == undefined) {
		resu += 'undefined';
	}else if (maVar == null) {
		resu += 'null';
	}else{
		if ((!isString(maVar) && maVar[0] != undefined) || isArray(maVar)) { // pour objects HTML contenus dans array (genre JQuery)
			resu += "Debug de l'array " + " :\n\n";
			resu += aplatiArray(maVar);
		}else if (isObject(maVar)){
			resu += "Debug de l'object :\n\n";
			resu += aplatiObjet(maVar);
		}else if (isString(maVar)){
			resu += "Debug de la chaine " + " :\n\n'" + maVar + "'";
		}else{
			resu += "Debug de la valeur " + " :\n\n" + maVar + "";
		}
	}
	
	// ---------------- affichage
	if (window.hasOwnProperty('console') && console.log) {
		if (alerte !== undefined && alerte) {
			alert(resu);
		}else{
			console.log(resu);
		}
	}else{
		alert(resu);
	}
}

function echo(maVar,commentaireOptionnel,alerte) { // alias et compatibilite
	echoDebug(maVar,commentaireOptionnel,alerte);
}
function echodebug(maVar,commentaireOptionnel,alerte) { // alias et compatibilite
	echoDebug(maVar,commentaireOptionnel,alerte);
}

function aplatiArray(tableau,tab) {
	// --------------------------------------- aplati un array de manière récursive
	tab = tab || ''; // tab optionnel pour l'indentation
	var resu = '';
	for (var arrayElement = 0, arrayElementLength = tableau.length ; arrayElement < arrayElementLength ; arrayElement++) {
		
		if ((!isString(tableau[arrayElement]) && tableau[arrayElement][0] != undefined) || isArray(tableau[arrayElement])) { // syntaxe spéciale pour objets HTML contenus dans array (genre JQuery)
		/////if (typeof tableau[arrayElement] == "object") { // syntaxe normale si l'élément est un Array
			resu += tab + "[" + arrayElement + "] = [\n" + aplatiArray(tableau[arrayElement],tab  + "\t") + tab + "]\n"; // récursivité en ajoutant une tab à la variable tab
		}else{
			resu += tab + "[" + arrayElement + "] = '" + tableau[arrayElement] + "'\n"; // concatènation de resu et chaine
		}
	}
	return resu;
}

function aplatiObjet(objet,tab) {
	// --------------------------------------- aplati un objet de manière récursive
	tab = tab || ''; // tab optionnel pour l'indentation
	var resu = '';
	for (var dObj in objet) { 
		if (typeof objet[dObj] == "object") { // objet
			resu += tab + dObj  + " : {\n" + aplatiObjet(objet[dObj], tab + "\t" ) + tab +  "}\n";
		}else{ // String
			resu +=  tab + dObj + " : '" + objet[dObj] + "'\n";
		}
	}
	return resu;
}

// ======================================= TYPAGE ===========================================

function isBoolean(valeur) { // comportement strict (comme fcn PHP is_bool() : ne reconnait que true ou false
	return (valeur === false || valeur === true);
	// OLD return (Object.prototype.toString.call(valeur) === '[object Boolean]');
}
function isBooleen(valeur) { // alias
	return isBoolean(valeur);
}

function isInteger(valeur,strict,mini,maxi) {
	// 'strict' : si TRUE, la fcn ne traitera que les *vrais* entiers et pas les chaines (FALSE par defaut)
	// si 'mini' et/ou 'maxi' sont definis, la valeur passée doit etre comprise entre ces bornes (ou égale)
	if (strict === true && parseInt(valeur,10) !== valeur) return false;
	
	if (isNaN(parseInt(valeur,10)) || (parseInt(valeur,10) != valeur - 0)) return false;
	if ((mini != undefined) && (mini != null) && ((mini + ' ').length > 1)) {
		if (valeur < mini) return false;
	}
	if ((maxi != undefined) && (maxi != null) && ((maxi + ' ').length > 1)) {
		if (valeur > maxi) return false;
	}
	return true;
}

function isNumber(valeur,strict) {
	// 'strict' : si TRUE, la fcn ne traitera que les *vrais* nombres et pas les chaines (FALSE par defaut)
	// attention : en mode non strict, accepte les espaces de debut et de fin
	if (strict === true) {
		return (Object.prototype.toString.call(valeur) === '[object Number]');
	}else{
		return (valeur == null || valeur === '')? false : (!isNaN(valeur) || valeur === 0);
	}
}

function isString(chaine) {
	return (Object.prototype.toString.call(chaine) === '[object String]');
}

function isArray(monArray) {
	return (Object.prototype.toString.call(monArray) === '[object Array]');
}

function isObject(monObjet) {
	return (Object.prototype.toString.call(monObjet) === '[object Object]');
}

function isID(valeur) { // requiert une valeur entière stricte et supérieure à 0
	return isInteger(valeur,false,1);
}

// -------------------------- accepte tout type de variable (chaine, numerique, array ou objet)
function isEmpty(variable) {
	if (Object.prototype.toString.call(variable) === '[object Object]') {
		for (var temp in variable) {
			return false;
		}
		return true;
	}else{
		return (variable !== null ) ? variable.length === 0 : true;
	}
}

// ======================================== DIVERS ==========================================

function remplaceStr(texte,oldChaine,newChaine) {
	// l'utilisation d'une RegExp permet de remplacer *toutes* les occurences de oldChaine
	var maReg = new RegExp(oldChaine,"gi");
	return texte.replace(maReg,newChaine);
}

function kwote(chaine) {
	return '"' + chaine + '"';
}

function kwoteSimple(chaine) {
	return "'" + chaine + "'";
}

function trim(chaine) {
	// supprime les espaces de debut et fin
	// remplace les multiples espaces a l'interieur par un seul espace
	return chaine.replace(/^\s+|\s+$/g,'');
}

function normaliseChaine(chaine,caractereDeRemplacement,suiteDeMauvaisCaracteres) {
	// remplace tous les caracteres de 'suiteDeMauvaisCaracteres' par le caractere 'caractereDeRemplacement'
	var remplacerPar = caractereDeRemplacement || ''; // effacement par defaut
	var charsAremplacer = suiteDeMauvaisCaracteres || ' ?,;:/"\'*+=()'; // defaut
	var laReg = new RegExp('[' + charsAremplacer + ']+','g');
	var chaineResu = chaine.replace(laReg,remplacerPar);
	
	if (remplacerPar != '') {
		if (chaineResu.charAt(0) == remplacerPar) chaineResu = chaineResu.substring(1);
		if (chaineResu.charAt(chaineResu.length - 1) == remplacerPar) chaineResu = chaineResu.substr(0,(chaineResu.length - 1));
	}
	return chaineResu;
}

function inArray(valeur,monArray) { // identique a PHP in_array() mais sans mode strict
	for (var i=0, taille=monArray.length; i< taille; i++) {
		if (monArray[i] == valeur) return true;
	}
	return false;
}

function stripZeros(nombre) {
	// supprime les zeros initiaux (pour non nombres octal)
	var resu = '' + nombre;
	while (resu.charAt(0) == '0') {
		var resu = resu.substring(1,resu.length);
	}
	return resu;
}

function fillZerosG(chaine,tailleChaine) {
	var resu = '' + chaine;
	while (resu.length < tailleChaine){
		resu = '0' + resu;
	}
	return resu;
}

function addslashes(str,echapperSimpleQuote) {
	// Escapes single quote, double quotes and backslash characters in a string with backslashes
	// version: 909.322. discuss at: http://phpjs.org/functions/addslashes
	// modif Thierry : pour transmettre une chaine JSON, il ne faut pas échapper les single quotes, d'où l'ajout du paramètre opionnel 'echapperSimpleQuote'
	if (echapperSimpleQuote !== undefined && echapperSimpleQuote) {
		return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\u0000/g, "\\0"); // version d'origine
	}else{
		return (str+'').replace(/([\\"])/g, "\\$1").replace(/\u0000/g, "\\0");
	}
}

// -------------------------- renvoit la longueur d'une chaine, d'un nombre, d'un array ou d'un objet
function count(variable) {
	var leType = Object.prototype.toString.call(variable);
	if (leType === '[object Object]' || leType === '[object Array]') { // objet ou array
		var counter = 0;
		for (var temp in variable) {
			counter++;
		}
		return counter;
	}else if (Object.prototype.toString.call(variable) !== '[object String]') { // valeur numerique : renvoit le nbre de caracteres
		return (variable == null)? 0 : variable.toString().length;
	}else{ // chaine : renvoit le nbre de caracteres
		return (variable == null)? 0 : variable.length;
	}
}

// ------------------------- renvoit la partie entière (délimitée par 'delimiter' d'une chaine)
// ---------- exemple : DOM element ID 'element_23'. var idElement = getElementID('element_23','_') // => 23
function getElementID(chaine,delimiter) {
	// attention : delimiter ne peut être un opérateur de regex (comme *) !
	// renvoit vide si delimiter n'est pas trouvé dans la chaine
	if (delimiter == undefined) delimiter = '_';
	if (chaine == undefined) {
		chaine = delimiter;
	}else{
		chaine = chaine.toString();
		if (chaine.indexOf(delimiter,0) < 0) chaine = chaine + delimiter;
	}
	var regexp = new RegExp('.*' + delimiter);
	return chaine.replace(regexp,'');
}

// -------------------------------- eMail verif ------------------------------------
// ---------------------------------------------------------------------------------
function isEmail(chaine) {
	var emailReg = /^[a-z]+[\w-]*(\.[\w-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,5})+$/i
	return (emailReg.test(chaine));
}



