/**
* Ce fichier fait parti du package Kernel, toute modification doit entrainer la génération
* d'un nouveau package pour être pris en compte.
* voir l'objet ObjDependancePackage pour connaitre la marche à suivre pour regénérer un package
* @since 20/05/2009 Olivier REYT <reyt@benchmark.fr>
* @since 24/11/2009 Damien BENOIT <benoit@benchmark.fr> conversion framework lib_js
*/

/**
 * @package bibliotheque
 * @subpackage benchmark
 * @filesource
 */

/**
 * objet (virtuel) collection de fonctions agissant sur les objets
 *
 * @author Damien BENOIT <benoit@benchmark.fr>
 * @package bibliotheque
 * @subpackage html_include
 * @version 1.00
 * @since 26/09/08 création du fichier
 */

if (typeof benchmark == 'undefined') 			{ var benchmark = new Object();}

/**
* @since 08/01/10 Damien BENOIT <benoit@benchmark.Fr>
* @author Damien BENOIT <benoit@benchmark.Fr>
* @author Yannick ROHOU <rohou@benchmark.Fr>
* extension de l'objet js primaire Object afin d'y adjoindre divers fonctionalités :
*/
/**
* extension de l'objet primaire objet pour déclaration et gestion de l'arbre :
* 
* @param {string} arbre exemple : 'f.validation.test' 
* @param {function} [option] déclaration directe d'une fonction, dans ce cas le dernier niveau de l'arbre n'est pas un objet mais la fonction en question
*/
benchmark.etend = function (arbre,fonction) 
{
	if (typeof(arbre) == 'string') 
	{
		arbre = arbre.split('.');
		var racine = this;
		var taille = 1;
		for (var objet in arbre) 
		{
			if( typeof(arbre[objet]) == 'string' )
			{
			if(taille == arbre.length && typeof(fonction) == 'function' )
			{
				racine[arbre[objet]] = fonction;
			}
			else
			{
				if (typeof(racine[arbre[objet]]) == 'undefined') 
				{
					racine[arbre[objet]] = {};
				}
				racine = racine[arbre[objet]];
			}
			taille ++;
			}
		}
	}
    return this;
};

benchmark.etend('f.lang.objet');

if (typeof benchmark.f.lang.objet.fusion == 'undefined') {
	/**
	* fusionne deux objets js en un (pour configuration, parametrage template données+param objet, etc)
	* @author Damien BENOIT <benoit@benchmark.fr>
	* @param objet1 (privilegié en cas de duplicat)
	* @param objet2
	* @return objet
	* @note préférer quand possible jQuery.extends();
	* @todo mettre en deprecated et convertir ici avec jQuery.extends();
	*/

	benchmark.f.lang.objet.fusion = function (objet1,objet2)
	{
		objetRetour = new Object();
		for ( var valueName in objet2 )
		{
			objetRetour[valueName] = objet2[valueName];
		}

		for ( var valueName in objet1 )
		{
			objetRetour[valueName] = objet1[valueName];
		}
		delete(valueName);
		return objetRetour;
	};
}


/**
* retourne la taille d'un objet ou d'un tableau associatif ( .length retourne undefined si associatif)
* @author Damien BENOIT <benoit@benchmark.fr>
* @param objet
* @return int taille
*/
benchmark.etend(
	'f.lang.objet.taille',
	function (objet)
	{
		var j = 0;
		for ( var i in objet)
		{
			if (objet.hasOwnProperty(i)) {
				j++;
			}
		}
		return j;
	}
);

if (typeof benchmark.f.lang.objet.delegate == 'undefined') {

	/**
	 * Cette fonction importé de la librairy mx de Flash 8
	 * permet de garder le contexte d'une fonction a son execution
	 * @author adobe/macromedia
	 * @todo trouver une syntaxe de call ou apply pour se passer de ces appels malgré l'usage qu'on en fait dans le controleur ajax par exemple
	 * @since ??/??/0? Pierre CHABILLAND <chabilland@benchmark.fr> rapatriment depuis libs adobe.
	 * @since 25/11/09 Damien BENOIT <benoit@benchmark.fr> rapatriment dans objet, deprecated de l'alias global
	 */
	benchmark.f.lang.objet.delegate = function(pTarget, pFunction){
		var f = function(){
			return arguments.callee.func.apply(arguments.callee.target, arguments);
		};
		f.target = pTarget;
		f.func = pFunction;
		return f;
	};

	/**
	* @deprecated Ne plus se servir de cet alias qui devra être supprimé dès que possible :
	* @todo supprimer quand possible.
	*/
	// raccourci du package
	var delegate = benchmark.f.lang.objet.delegate;
}

/**
* le temps de la migration du framework on donne un alias pour que les deux arbres soient valides :
*
* @since 24/11/2009 Damien BENOIT <benoit@benchmark.fr> intégration framework lib_js
*/

if (typeof benchmark.framework == "undefined") 			{ benchmark.framework = new Object();}
if (typeof benchmark.framework.util == 'undefined') 		{ benchmark.framework.util = new Object();}
if (typeof benchmark.framework.util.objet == 'undefined') 	{ benchmark.framework.util.objet = new Object();}
benchmark.framework.util.objet = benchmark.f.lang.objet;
// et ici aussi un alias pour délégate qui a été rapatrié ici :
benchmark.framework.util.delegate = benchmark.f.lang.objet.delegate;

