/*============================================================================================
 Fichier Javascript
 Fichier contenant divers Fonction de manipulation de texte

 AUTEUR:					Alban BALLIEUX
 CREATION:					20/02/2009
 VARIABLE GLOBALES:
 MODIFICATIONS:
 			Joanny HARRANT - 04/06/2009 - Modification de la fonction Str_pos()
 			Alban BALLIEUX - 23/12/2009 - Ajout de la Fonction TestHeure()
===============================================================================================
	copyright 2009 Alban BALLIEUX - ballieuxa@laon.noirot
	http://www.phpmyportal.info

	This file is part of phpMyPortal.

    phpMyPortal is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2.1 of the License, or
    any later version.

    phpMyPortal is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with phpMyPortal; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===============================================================================================*/
/**
 * Recupére la selection d'un input
 * 
 * @param {Object} 			Id			Identifiant de l'input
 * @return {Object/bool}				Tableau contenant la position
 */
function GetSelection(Id){
	Id = GetPtId(Id);
	if (isset(Id.selectionStart)){
		return Array(Id.selectionStart, Id.selectionEnd);
	}else{
		return false;
	}
}

/**
 * Force la selection dans un input
 * 
 * @param {Object} 			Id			Identifiant de l'input
 * @param {Object} 			TPos		Tableau contenant la position
 * 
 * @return void
 */
function SetSelection(Id, TPos){
	Id = GetPtId(Id);
	if (isset(Id.selectionStart) && isObject(TPos)){
		Id.selectionStart=TPos[0];
		Id.selectionEnd=TPos[1];
	}
}

/**
 * Force la selection dans un input de tout le texte
 * 
 * @param {Object} 			Id			Identifiant de l'input
 * 
 * @return void
 */
function SelectionAll(Id){
	Id = GetPtId(Id);
	if (Id){
		Id.selectionStart=0;
		Id.selectionEnd=Id.value.length;
	}
}

/**
 * Change la casse d'un champs texte en majuscule
 * 
 * @param {char} id		pointeur de la zone que l'on souhaite modifier
 */
function CUpper(id,remetcurseur){
	if(!isset(remetcurseur)){
		remetcurseur = true; 
	}
// je transforme l'identifiant
	id=GetPtId(id);

	if (id) {
		// sauvegarde de la position du curseur
		TPos = GetSelection(id);
		// Mise en majuscule
		if (id.value != id.value.toUpperCase()) {
			id.value = id.value.toUpperCase();
		}
		// restauration de la position du curseur
		if (remetcurseur == true) {
			SetSelection(id, TPos);
		}
	}
}

/**
 * Change la casse d'un champs texte en minuscule
 * 
 * @param {char} id		pointeur de la zone que l'on souhaite modifier
 */
function CLower(id,remetcurseur){
// je transforme l'identifiant
	id=GetPtId(id);
	if(!isset(remetcurseur)){
		remetselection = true; 
	}
	if (id){
	// sauvegarde de la position du curseur
		TPos=GetSelection(id);
	// Mise en minuscule
		if (id.value != id.value.toLowerCase()) {
			id.value = id.value.toLowerCase();
		}
	// restauration de la position du curseur
		if (remetcurseur == true) {
			SetSelection(id, TPos);
		}
	}
}
/**
 * retourne le resultat de l'expression reguliere
 * @param {Object} e		pointeur sur l'element
 * @param {Object} n		expression reguliere
 * @param {Object} t		si l'expression reguliere est global et sensible a la casse
 */
function test_preg(e,n,t){
	if (!isset(t))	t = 'gi';
	exp=new RegExp(n,'i');
	res=e.value.match(exp);
	if (e.value!=res){
		e.value=res;
	}
}
/**
 * replace les elements trouvés dans l'expression reguliere
 * @param {Object} e		pointeur sur l'element
 * @param {Object} n		expression reguliere
 * @param {Object} t		si l'expression reguliere est global et sensible a la casse
 */
function replace_preg(e,n,t){
	if (!isset(t))	t = 'gi';
	exp=new RegExp(n,t);
	res=e.value.replace(exp,'');
	if(e.value!=res){
		e.value=res;
	}
}

/**
 * fonction de suppression de tag HTML pour recupere le code (equivalent a textcontent qui lui est non compatible IE)
 * @param {Object} Ch
 */
function Supprime_Tag(Ch){
	exp=new RegExp('([<][^>]*[>])','gi');
	return Ch.replace(exp,'');
}

/**
Permet d'obtenir la position d'une chaine dans un autre chaine
haystack 	La chaine dans laquelle on recherche
needle	La chaine recherchée.

return integer	La position de needle dans haystack, commence à 0.
*/
function Str_pos(haystack,needle){
	if(needle=='.'){
		needle = '[\.]';
	}
	if (haystack.replace(new RegExp('(.*)('+needle+')(.*)', 'gi'),'') == haystack) return -1;
	
	haystack = haystack.replace(new RegExp('(.*)('+needle+')(.*)', 'gi'),'$1');
	return haystack.length;
}

/**
 * Incremente une zone input 
 * 
 * @param {Object} id			Identifiant de la zone
 * @param {Object} pas			Pas d'increment
 */
function IncrementeChaine(id,pas){
// J'extrait la valeur à incrementer
	var val 		= GetPtId(id).value.match(new RegExp("([0-9.]*)$", "ig"))[0];
	var prec		= GetPtId(id).value.replace(new RegExp("(.*)" + val + "$", "ig"), '$1');
	var longueur	= val.length;
	if (val==''){
		return;
	}
// J'incremente
	val 			= (parseFloat(val)+pas);
// Je complete de '0' j'ajoute la chaine precedente et je retourne le resultat
	GetPtId(id).value=prec+str_pad(val, longueur, '0');
}

/**
 * Décremente une zone input 
 * 
 * @param {Object} id			Identifiant de la zone
 * @param {Object} pas			Pas de déincrement
 */
function DecrementeChaine(id,pas){
	val = GetPtId(id).value.match(new RegExp("([0-9.]*)$", "ig"))[0];
	prec= GetPtId(id).value.replace(new RegExp("(.*)" + val + "$", "ig"), '$1');
	if (val==''){
		return;
	}
	GetPtId(id).value=prec+(parseFloat(val)-pas);
}

/**
 * Incremente une zone input 
 * 
 * @param {Object} id			Identifiant de la zone
 * @param {Object} pas			Pas d'increment
 */
function Incremente(id,pas){
// J'extrait la valeur à incrementer
	var val 		= parseFloat(GetPtId(id).value);
	GetPtId(id).value = val+pas;
}

/**
 * Décremente une zone input 
 * 
 * @param {Object} id			Identifiant de la zone
 * @param {Object} pas			Pas de déincrement
 */
function Decremente(id,pas){
// J'extrait la valeur à incrementer
	var val 		= parseFloat(GetPtId(id).value);
	GetPtId(id).value = val-pas;
}

/**
 * Permet de convertir un nombre decimal dans une autre base
 * 
 * @param {Object} dec			Valeur decimal a convertir
 * @param {Object} base			Base de destination
 */
function Dec2Base(dec,base){
	res = '';
// Si je suis en dessous de la base 36 je passe la chaine en majuscule pour ne pas avoir de problème
	/*if (base<=36){
		dec = parseString(dec).toUpperCase();
	}*/
	if(dec >= 0 && base <= 62 && base > 1)
	{
		var exposant = 0;
		var table = new Array();
		
	// Je regarde le nombre de chiffre dans la base de destination
		for(n = 0; parseInt(dec/(Math.pow(base,n))) != 0; n++)
		{
			if(parseInt(dec/(Math.pow(base,(n+1)))) == "0"){exposant = (n + 1);}
		}
	// Je converti le chiffre dans un tableau dans la base final (toujours en decimal)
		for(i = 0; i < exposant; i++)
		{
			table[i] = parseInt((dec/Math.pow(base,i)) % base);
		}
	// Je converti le chiffre dans la base de destination
		for(z = (table.length - 1); z >= 0; z--)
		{
			res += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".charAt(table[z]) + "";
		}
	}
	return res;
}


/**
 * Permet de convertir un nombre d'une base en base decimal
 * 
 * @param {Object} valeur			Valeur dans la base à convertir en decimal
 * @param {Object} base				Base de source
 */
function Base2Dec(valeur,base)
{
	if(base <= 62 && base > 1)
	{
		var decimal = 0;
		var caracteres = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		
		for(i = 0; i < valeur.length; i++)
		{
			for(n = 0; n < base; n++)
			{
				if(caracteres.charAt(n) == valeur.charAt(i)){
					decimal += parseInt(n * Math.pow(base,(valeur.length-1-i)));
				}
			}
		}
		return decimal;
	}
}

/**
 * Complete une chaine jusqu'a la longeur voulu
 *
 * Attention je n'ai pas géré le % lorsque la chaine 'pad_string' fait plus d'un caractere ... a finir ;-)
 * 
 * @param {Object} input			Chaine de départ
 * @param {Object} pad_length		Longueur souhaité
 * @param {Object} pad_string		Chaine completant
 * @param {Object} pad_type			Je complete a droite ou a gauche ...
 */
function str_pad (input, pad_length, pad_string, pad_type) {
	var nb	= parseInt((pad_length - String(input).length)/pad_string.length);
	var left = '';
	var right = '';
	var cpt = '';
// si la longueur du pad est inferieur a 0 je retourne la chaine de départ
	if (nb < 0) return input;
// Je prépare les chaines de gauche et de droite
	switch (pad_type){
		default:
		case 'STR_PAD_LEFT':
			while(cpt<nb){
				left = pad_string + left;
				cpt++;
			}
		break;
		case 'STR_PAD_RIGHT':
			while(cpt<b){
				right = pad_string + left;
				cpt++;
			}
		break;
	}
// Je renvoie le resultat
	return left + input + right;
}

/**
 * Permet de tester un Champ Heure.
 * 
 * @param {Object} e				L'événement
 */
function TestHeure(e) {
	if (!isset(e))e=event;
	Val = e.currentTarget.value;
	exp = new RegExp('^([0-9]{1,2}):([0-9]{1,2})$', 'gi');
	if(Val=='')return 1;
	if (!Val.match(exp, '$1')){e.currentTarget.value='00:00';return 0;}
	H = Val.replace(exp, '$1');
	M = Val.replace(exp, '$1');
	if (!(H>='00'&&H<='23'&&M>='00'&&M<='59')){e.currentTarget.value='00:00';return 0;}
	return 1;
}
