/**
* Ce fichier fait parti d'un package, toute modification doit entrainer la génération
* d'un nouveau package pour être pris en compte.
* voir l'objet ObjFichierPackage pour connaitre la marche à suivre pour regénérer un package
* @since 20/05/2009 Olivier REYT <reyt@benchmark.fr>
*/

/**
 * @package bibliotheque
 * @subpackage benchmark
 * @filesource
 */

/**
 * Objet Js gérant les fonctions de chaines sur le modèle de l'ObjChaine php
 *
 * Pour les equivalences Js des fonctions PHP, voir le site suivant et ajouter dans l'objet
 * les fonctions utiles
 * http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_addslashes/
 *
 * @author Olivier REYT <reyt@benchmark.fr>
 * @author Damien BENOIT <benoit@benchmark.fr>
 * @package bibliotheque
 * @subpackage html_include
 * @see ObjChaine
 */

if(typeof benchmark == "undefined"){var benchmark = new Object();}
if (typeof benchmark.framework == 'undefined') { benchmark.framework = new Object();}
if (typeof benchmark.framework.chaine == 'undefined') { benchmark.framework.chaine = new Object();}
if (typeof benchmark.framework.chaine.ObjChaine == 'undefined') { benchmark.framework.chaine.ObjChaine = new Object();}

/**#@+ définition des constantes de la classe ObjChaine : */

benchmark.framework.chaine.ObjChaine.TYPE_NOM_COMMUN 	= false;
benchmark.framework.chaine.ObjChaine.TYPE_NOM_PROPRE 	= true;

benchmark.framework.chaine.ObjChaine.CONTEXTE_PHRASE 		= false;
benchmark.framework.chaine.ObjChaine.CONTEXTE_MOT_ISOLE 	= true;

/**#@-*/

if (typeof benchmark.framework.chaine.ObjChaine.formateNom == 'undefined') {

	/**
	 * formate une chaine nom correctement (en majuscule)
	 *
	 * @param string nom à traiter (obligatoire sinon return false;)
	 * @param boolean type benchmark.framework.chaine.ObjChaine.TYPE_NOM_COMMUN ou benchmark.framework.chaine.ObjChaine.TYPE_NOM_PROPRE
	 * @param boolean type benchmark.framework.chaine.ObjChaine.CONTEXTE_MOT_ISOLE ou benchmark.framework.chaine.ObjChaine.CONTEXTE_PHRASE
	 * @author Damien BENOIT <benoit@benchmark.fr>
	 * @since 24/09/2008 Damien BENOIT <benoit@benchmark.fr>
	 * @see ObjChaine::formateNom()
	 * @return string formatée
	 */
	benchmark.framework.chaine.ObjChaine.formateNom = function ( nom, type, contexte) {
		if (typeof(nom) == 'undefined') {return false;}
		if (typeof(type) == 'undefined') {type = benchmark.framework.chaine.ObjChaine.TYPE_NOM_COMMUN;}
		if (typeof(contexte) == 'undefined') {contexte = benchmark.framework.chaine.ObjChaine.CONTEXTE_PHRASE;}

		switch (type)
		{
			case benchmark.framework.chaine.ObjChaine.TYPE_NOM_COMMUN :
			// met une majuscule à chaque mot :
				return nom.replace(/([^ ]{1})([^ ]+)/g,
					function ( tout,premiere,reste )
					{
						return benchmark.framework.chaine.ObjChaine.supprimeAccent(premiere.toUpperCase()+reste.toLowerCase());
					}
					);
			break;

			case benchmark.framework.chaine.ObjChaine.TYPE_NOM_PROPRE :

				switch (contexte)
				{
					case benchmark.framework.chaine.ObjChaine.CONTEXTE_PHRASE :
						// on met en maj chaque mot SAUF les déterminants :
						return nom.replace(/([^ ]+)/g,
							function ( mot )
							{
								mot = benchmark.framework.chaine.ObjChaine.supprimeAccent(mot);
								if(!mot.match(/D|De|Des|Du|Au|Aux|Sous|Sur|Et|Von/gi))
								{
									return mot.toUpperCase();
								}
								else
								{
									return mot.toLowerCase();
								}
							}
							);

					break;

					case benchmark.framework.chaine.ObjChaine.CONTEXTE_MOT_ISOLE :
						return benchmark.framework.chaine.ObjChaine.supprimeAccent(nom.substr(0,1).toUpperCase() + nom.substr(1).toLowerCase() ) ;
					break;

					default:
						return false;
					break;
				}

			break;

			default:
				return false;
			break;
		}
	};
}

if (typeof benchmark.framework.chaine.ObjChaine.supprimeAccent == 'undefined') {

	/**
	 * supprime les accents (indésirables) dans une chaine
	 *
	 * @param string chaine
	 * @author Damien BENOIT <benoit@benchmark.fr>
	 * @since 24/09/2008 Damien BENOIT <benoit@benchmark.fr>
	 * @return string
	 */
	benchmark.framework.chaine.ObjChaine.supprimeAccent = function ( chaine ) {
	//return strtr($chaine, "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüŸÿÑñ", "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuYyNn");
		return chaine
				.replace(/[ÀÁÂÃÄÅ]/g	,'A')
				.replace(/[àáâãäå]/g	,'a')
				.replace(/[ÒÓÔÕÖØ]/g	,'O')
				.replace(/[òóôõöø]/g	,'o')
				.replace(/[ÈÉÊË]/g	,'E')
				.replace(/[èéêë]/g	,'e')
				.replace(/[Ç]/g		,'C')
				.replace(/[ç]/g		,'c')
				.replace(/[ÌÍÎÏ]/g	,'I')
				.replace(/[ìíîï]/g	,'i')
				.replace(/[ÙÚÛÜ]/g	,'U')
				.replace(/[ùúûü]/g	,'u')
				.replace(/[Ÿ]/g		,'Y')
				.replace(/[ÿ]/g		,'y')
				.replace(/[Ñ]/g		,'N')
				.replace(/[ñ]/g		,'n');
	};


}

if (typeof (benchmark.framework.chaine.ObjChaine.supprimeHtml == 'undefined') )
{
	/**
	* supprime les balises html dans une chaine
	*
	* @param string chaine
	* @author Damien BENOIT <benoit@benchmark.fr>
	* @since 24/10/2008 Damien BENOIT <benoit@benchmark.fr>
	* @return string
	*/
	benchmark.framework.chaine.ObjChaine.supprimeHtml = function (chaine)
	{
		return chaine.replace(/<\/?[^>]+(>|$)/g, '');
	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.remplaceSmiley == 'undefined') )
{
	/**
	* convertit les smileys en images
	*
	* @param string chaine
	* @param string host, host à rajouter devant l'url des icones
	* @author Damien BENOIT <benoit@benchmark.fr>
	* @since 24/10/2008 Damien BENOIT <benoit@benchmark.fr>
	* @return string
	* @todo ne pas utiliser ces icones tango
	*/
	benchmark.framework.chaine.ObjChaine.remplaceSmiley = function (chaine,host)
	{
		if (typeof(chaine) == 'undefined') {return false;}
		if (typeof(host) == 'undefined') { host= '';}

		// fonction en scope local :
		insereImage = function(url,code)
		{
			return '<img src="'+host+url+'" alt="'+code+'" title="'+code+'" />';
		};
		chaine = chaine.replace(/:o/gi,		insereImage('face-surprise.png',':o') );
		chaine = chaine.replace(/:-o/gi,		insereImage('face-surprise.png',':-o') );
		chaine = chaine.replace(/:\(/g,		insereImage('face-sad.png',':(') );
		chaine = chaine.replace(/:-\(/g,		insereImage('face-sad.png',':-(') );
		chaine = chaine.replace(/:\)/g,		insereImage('face-smile.png',':)') );
		chaine = chaine.replace(/:-\)/g,		insereImage('face-smile.png',':-)') );
		chaine = chaine.replace(/:D/g,		insereImage('face-grin.png',':D') );
		chaine = chaine.replace(/:-D/g,		insereImage('face-grin.png',':-D') );
		chaine = chaine.replace(/:\|/g,		insereImage('face-plain.png',':|') );
		chaine = chaine.replace(/:-\|/g,		insereImage('face-plain.png',':-|') );
		chaine = chaine.replace(/;\)/g,		insereImage('face-wink.png',';)') );
		chaine = chaine.replace(/;-\)/g,		insereImage('face-wink.png',';-)') );
		chaine = chaine.replace(/:singe:/gi,	insereImage('face-monkey.png',':singe:') );
		chaine = chaine.replace(/\^\^/g,		insereImage('face-angel.png','^^') );
		chaine = chaine.replace(/:devil:/gi,	insereImage('face-devilish.png',':devil:') );
		chaine = chaine.replace(/:diable:/gi,	insereImage('face-devilish.png',':diable:') );
		chaine = chaine.replace(/8\)/g,		insereImage('face-glasses.png','8)') );
		chaine = chaine.replace(/8-\)/g,		insereImage('face-glasses.png','8-)') );
		chaine = chaine.replace(/;\(/g,		insereImage('face-crying.png',';(') );
		chaine = chaine.replace(/;\-\(/g,		insereImage('face-crying.png',';-(') );
		chaine = chaine.replace(/:benchadmin:/gi,	insereImage('system-users.png','Administrateur') );
		chaine = chaine.replace(/:coeur:/gi,	insereImage('emblem-favorite.png',':coeur:') );
		chaine = chaine.replace(/:interdit:/gi,	insereImage('dialog-error.png',':interdit:') );
		chaine = chaine.replace(/:jeux:/gi,		insereImage('applications-games.png',':jeux:') );
		chaine = chaine.replace(/:photo:/gi,	insereImage('image-x-generic.png',':photo:') );

		return chaine;
	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.substr == 'undefined') ){
	/**
	* Version Js d'une fonction PHP
	* substr — Retourne un segment de chaîne
	*
	* Retourne le segment de f_string défini par f_start et f_length .
	*
	* @param string f_string Texte à segmenter
	* @param integer f_start Début de la segmentation
	* @param integer f_length Taille de texte
	* @return string
	* @author Olivier REYT <reyt@benchmark.fr>
	* @since 06/01/2009 Olivier REYT <reyt@benchmark.fr>
	*
	* *****************************************************************
	*  @Deprecated Merci d'utiliser plutot les fonction native substr et substring,
	*  dans l'objet String js, existent les deux méthodes substring ET substr
	*  la premiere prenant comme argument une position départ et une longueur, la seconde deux positions
	*  ex :
	*	 'blabla'.substr(0,4);
	*      'blabla'.substring(1,3);
	*  27/05/09 Damien BENOIT <benoit@benchmark.fr>
	* *****************************************************************
	*/
	benchmark.framework.chaine.ObjChaine.substr = function (f_string, f_start, f_length){
		f_string += '';

		if(f_start < 0) {
			f_start += f_string.length;
		}

		if(f_length == undefined) {
			f_length = f_string.length;
		} else if(f_length < 0){
  			f_length += f_string.length;
		} else {
  			f_length += f_start;
		}

		if(f_length < f_start) {
  			f_length = f_start;
		}

		return f_string.substring(f_start, f_length);
	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.strlen == 'undefined') ){
	/**
	* Version Js d'une fonction PHP
	* strlen — Calcule la taille d'une chaîne
	*
	* Retourne la taille de la chaîne f_string .
	*
	* @param string f_string Texte à calculer
	* @return integer
	* @author Olivier REYT <reyt@benchmark.fr>
	* @since 06/01/2009 Olivier REYT <reyt@benchmark.fr>
	*/
	benchmark.framework.chaine.ObjChaine.strlen = function (f_string){
		return (f_string+'').length;
	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.ucfirst == 'undefined') ){
	/**
	* Version Js d'une fonction PHP
	* ucfirst — Met le premier caractère en majuscule
	*
	* Retourne la chaîne f_str après avoir remplacé le premier caractère par sa majuscule,
	*  si le premier caractère est alphabétique.
	*
	* @param string f_str Texte à modifier
	* @return integer
	* @author Olivier REYT <reyt@benchmark.fr>
	* @since 15/01/2009 Olivier REYT <reyt@benchmark.fr>
	*/
	benchmark.framework.chaine.ObjChaine.ucfirst = function (f_str){
		f_str += '';
		var f = f_str.charAt(0).toUpperCase();
		return f + f_str.substr(1);
	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.intval == 'undefined') ){
	/**
	* Version Js d'une fonction PHP
	* intval —  Retourne la valeur numérique entière équivalente d'une variable
	*
	* Retourne la valeur numérique entière équivalente d'une variable
	*
	* @param string f_str La valeur scalaire à être convertie en entier
	* @return integer
	* @author Olivier REYT <reyt@benchmark.fr>
	* @since 20/01/2009 Olivier REYT <reyt@benchmark.fr>
	*
	* *****************************************************************
	*  @Deprecated Merci d'utiliser plutot la fonction native parseInt,
	*  de plus celle ci, sensée coller au modèle php, semble de plus ne pas fonctionner dans certains cas
	*  ne sachant pas si elle est utilisée en gerant des exeptions sur son comportement étrange je ne la
	*  remplace pas par parseInt. 27/05/09 Damien BENOIT <benoit@benchmark.fr>
	* *****************************************************************
	*/
	benchmark.framework.chaine.ObjChaine.intval = function (f_str){
		var tmp;

		var type = typeof( f_str );

		if(type == 'boolean'){
			if (f_str == true) {
				return 1;
			} else {
		      	return 0;
		  	}
		} else if(type == 'string'){
		  tmp = parseInt(f_str * 1);
		  if(isNaN(tmp) || !isFinite(tmp)){
		      return 0;
		  } else{
		      return tmp.toString(10);
		  }
		} else if(type == 'number' && isFinite(f_str) ){
		  return Math.floor(f_str);
		} else{
		  return 0;
		}
	};
}


if (typeof (benchmark.framework.chaine.ObjChaine.trim == 'undefined') ){
	/**
	* Version Js d'une fonction PHP
	* trim —   Supprime les espaces (ou d'autres caractères) en début et fin de chaîne
	*
	*  Supprime les espaces (ou d'autres caractères) en début et fin de chaîne
	*
	* @param str f_str La chaîne de caractères qui sera coupé.
	* @param charlist Optionnellement, les caractères supprimés peuvent aussi être spécifiés en utilisant le paramètre charlist .
	* @return string
	* @author Olivier REYT <reyt@benchmark.fr>
	* @since 29/01/2009 Olivier REYT <reyt@benchmark.fr>
	*/
	benchmark.framework.chaine.ObjChaine.trim = function (str, charlist){

	    var whitespace, l = 0, i = 0;
	    str += '';

	    if (!charlist) {
	        // default list
	        whitespace = " \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";
	    } else {
	        // preg_quote custom list
	        charlist += '';
	        whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
	    }

	    l = str.length;
	    for (i = 0; i < l; i++) {
	        if (whitespace.indexOf(str.charAt(i)) === -1) {
	            str = str.substring(i);
	            break;
	        }
	    }

	    l = str.length;
	    for (i = l - 1; i >= 0; i--) {
	        if (whitespace.indexOf(str.charAt(i)) === -1) {
	            str = str.substring(0, i + 1);
	            break;
	        }
	    }

	    return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
	};
}


if (typeof (benchmark.framework.chaine.ObjChaine.emailValide == 'undefined') )
{
	/**
	* test si un email semble valide ou non
	*
	* @param string email
	* @author Damien BENOIT <benoit@benchmark.fr>
	* @since 31/03/2009 Damien BENOIT <benoit@benchmark.fr> création
	* @return boolean
	*/
	benchmark.framework.chaine.ObjChaine.emailValide = function (email)
	{
		// conversion string par sécurité :
		var emailChaine = new String(email);
		if (!emailChaine.match('^[-_\.0-9a-zA-Z]{1,}@[-_\.0-9a-zA-Z]{1,}[\.][0-9a-zA-Z]{2,}$'))
		{
			return false;
		}
		else
		{
			return true;
        	}
    	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.urlParamToJson == 'undefined') ){
	/**
	 * Convertit les paramètres d'une URL en Object json
	 *
	 * @param string s_url_param Paramètres de l'URL (avec ou sans le ? mais sans ce qui précède)
	 * @return Object
	 * @author decadoudal@benchmark.fr
	 * @since 02/04/2009 decadoudal@benchmark.fr création
	 */
	benchmark.framework.chaine.ObjChaine.urlParamToJson = function (s_url_param){
		var s_url = new String(s_url_param);
		var json_retour = {};
		// test si la chaîne commence par un ?
		if(s_url.indexOf('?') == 0){
			s_url = s_url.substr(1);
		}
		var a_url = s_url.split("&");
		var s_json = new String();
		for(var i in a_url){
			if( ! a_url.hasOwnProperty(i) ) { continue; }

			var s_cur_key = a_url[i].substr(0, a_url[i].indexOf('='));
			var s_cur_val = a_url[i].substr(a_url[i].indexOf('=')+1);
			if( s_cur_key == false){
				s_cur_key = s_cur_val;
				s_cur_val = '';
			}
			json_retour[s_cur_key] = s_cur_val;
		}
		return json_retour;
	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.getChaineUrl == 'undefined') ){
	/**
	 * Convertit la chaine pour qu'elle soit utilisable dans une url
	 *
	 * @note ceci est un encodage à perte, pas une conversion en entity, on remplace les espaces pas des _ , etc.
	 * @param string chaine à convertir
	 * @return string
	 * @author Damien BENOIT <benoit@benchmark.fr>
	 * @since 27/05/2009 Damien BENOIT <benoit@benchmark.fr> création
	 */
	benchmark.framework.chaine.ObjChaine.getChaineUrl = function (chaine,separateur)
	{
		if(typeof(separateur) == 'undefined')
		{
			separateur = '-';
		}
		// Si la chaine n'est pas vide
		if ( typeof(chaine) != 'undefined' && chaine != '' )
		{
			// Passage en minuscules et suppression des accents
			chaine = chaine.toLowerCase();
			chaine = benchmark.framework.chaine.ObjChaine.supprimeAccent(chaine);
			return chaine.replace(/[^\-_a-z0-9]+/gi,separateur );
		}
		else
		{
			return false;
		}

	};
}

if (typeof (benchmark.framework.chaine.ObjChaine.getFloat == 'undefined') ){
	/**
	 * Convertit la chaine en float
	 *
	 * @note ceci est un encodage à perte, pas une conversion en entity, on remplace les espaces pas des _ , etc.
	 * @param string chaine à convertir
	 * @param float valeur minimum retournée
	 * @param float valeur maximum retournée
	 * @return float
	 * @author Damien BENOIT <benoit@benchmark.fr>
	 * @since 02/06/2009 Damien BENOIT <benoit@benchmark.fr> création
	 */
	benchmark.framework.chaine.ObjChaine.getFloat = function (chaine,minimum,maximum)
	{
		 if(typeof(chaine) == "undefined") {return false;}
		 // d'abord on épure la chaine de tout les caractères interdits :
		 flottant = chaine.replace(/[^0-9\.]/,'');
		 flottant = chaine.replace(/,/,'\.');
		 // ensuite on s'assure qu'il n'y a qu'un niveau après la virgule et ne commence pas par 0 :
		 // pose pb pour les 0.x : flottant = flottant.match(/[1-9]+[0-9]*\.?[0-9]{0,2}/);
		 flottant = flottant.match(/[0-9]*\.?[0-9]{0,2}/);
		 //if(flottant.match(/0\./))
		 // on convertit en float : (pose pb pour la virgule)
		 //var flottant = parseFloat(chaine);
		 // si on a un prix minimum on l'applique :
		 if(typeof(minimum) == 'number' && flottant < minimum )
		 {
			 flottant = minimum;
		 }
		 if(typeof(maximum) == 'number' && flottant > maximum )
		 {
			 flottant = maximum;
		 }
		 return flottant;
	};
}
