/**
 * @package parcours
 * @subpackage benchmark
 * @filesource
 */

/**
 * Objet de gestion des actions dans la liste de relations
 *
 * @author Olivier REYT <reyt@benchmark.fr>
 * @package parcours
 * @subpackage html_include
 * @since 05/05/2009 Olivier REYT <reyt@benchmark.fr> Création du fichier
 */

if(typeof(benchmark) == "undefined") {                                    var benchmark = new Object(); }
if(typeof(benchmark.application) == "undefined") {                        benchmark.application = new Object(); }
if(typeof(benchmark.application.copaindavant) == "undefined") {           benchmark.application.copaindavant = new Object(); }
if(typeof(benchmark.application.copaindavant.relation) == "undefined") {  benchmark.application.copaindavant.relation = new Object(); }

/**
 * constructeur :
 * @return void
 */
benchmark.application.copaindavant.relation.ObjGestionRelation = function(){

	/**
	* url de base du controleur :
	*/
	this.urlBase = '/framework/lib/objcontroleurajax3/cgi/controleur_ajax.norevue.php?f_action=';

	/**
	* tableau devant contenir les urls du controleur ajax, finallement stockées en dur
	*/
	this.tableauUrlAjax = {
		acceptationInvitation       : this.urlBase+'c8392a282c352a3c3c2e703c03faf903ea182b330a2c3d3238372a332a411b2e352a3d323837ea047070392a28362e3d31382d2e703c03f90103ea2a2c2c2e393d2e3b32373f323d2a3d323837ea047070392a28392a3b2a362e3d3b2e702a03f803444670703b2a2c32372e28382b33703c030103ea392a3b2c383e3b3cea047070392a282e372c382d2a302e703c03fc03ea333c3837ea047070333c38372c2a35352b2a2c34701704',
            refusInvitation             : this.urlBase+'e65748464a53485a5a4c8e5a2119182109364951284a5b5056554851485f394c53485b50565509228e8e574846544c5b4f564b4c8e5a21181e2109594c4d5c5a4c5950555d505b485b50565509228e8e57484657485948544c5b594c8e4821172162648e8e59484a50554c465649518e5a211f21095748594a565c595a09228e8e5748464c554a564b484e4c8e5a211b2109515a565509228e8e515a56554a48535349484a528e3522',
            suppressionInvitation       : this.urlBase+'087869676b74697b7b6daf7b423a39422a576a72496b7c717776697269805a6d74697c7177762a43afaf786967756d7c70776c6daf7b423a39422a7b7d78787a6d7b7b71777671767e717c697c7177762a43afaf78696778697a69756d7c7a6daf694238428385afaf7a696b71766d67776a72af7b4240422a78697a6b777d7a7b2a43afaf7869676d766b776c696f6daf7b423c422a727b77762a43afaf727b77766b6974746a696b73af5643',
            refusCommentaire            : this.urlBase+'61d1c2c0c4cdc2d4d4c609d49b93929b83b0c3cba2c4d5cad0cfc2cbc2d9b3c6cdc2d5cad0cf839c0909d1c2c0cec6d5c9d0c5c609d49b92999b83d3c6c7d6d4c6d3c4d0cecec6cfd5c2cad3c6839c0909d1c2c0d1c2d3c2cec6d5d3c609c29b919bdcde0909d3c2c4cacfc6c0d0c3cb09d49b999b83d1c2d3c4d0d6d3d4839c0909d1c2c0c6cfc4d0c5c2c8c609d49b959b83cbd4d0cf839c0909cbd4d0cfc4c2cdcdc3c2c4cc09af9c',
            refusSuppressionCommentaire : this.urlBase+'79e9dad8dce5daececde21ecb3abaab39bc8dbe3badcede2e8e7dae3daf1cbdee5daede2e8e79bb42121e9dad8e6deede1e8ddde21ecb3abaeb39bdae7e7eee5deebebdedfeeecdeebdce8e6e6dee7eddae2ebde9bb42121e9dad8e9daebdae6deedebde21dab3a9b3f4f62121ebdadce2e7ded8e8dbe321ecb3b1b39be9daebdce8eeebec9bb42121e9dad8dee7dce8dddae0de21ecb3adb39be3ece8e79bb42121e3ece8e7dcdae5e5dbdadce421c7b4'
	};

	/**
	* tableau devant contenir les textes en cas de réussite et d'échec de l'action
	*/	
	this.tableauTexteAction = {
		acceptationInvitation : { 
		      reussite : 'Vous avez bien accepté l\'invitation.',  
		      echec : 'La validation de votre invitation a échoué. Veuillez renouveler votre demande ultérieurement'
		},
            refusInvitation : { 
                  reussite : 'Vous avez bien refusé l\'invitation.',
                  echec : 'Le refus de votre invitation a échoué. Veuillez renouveler votre demande ultérieurement'
            },
            suppressionInvitation :{
                  reussite : 'Vous avez bien supprimé l\'invitation.',
                  echec : 'La suppression de votre invitation a échoué. Veuillez renouveler votre demande ultérieurement'
            },
            accepteCommentaire : { 
                  reussite : '(anecdote validée)',
                   echec : 'La validation de votre anecdote a échoué. Veuillez renouveler votre demande ultérieurement'
            },
            refusCommentaire : { 
                  reussite : '(anecdote refusée, <a class="annuler_refus_commentaire">annuler</a>)', 
                  echec : 'Le refus de votre anecdote a échoué. Veuillez renouveler votre demande ultérieurement'
            },
            refusSuppressionCommentaire : { 
                  reussite : '(<a title="Refuser l\'anecdote" class="refuser_commentaire">Refuser</a>)',
                  echec : 'L\'annulation a échouée. Veuillez renouveler votre demande ultérieurement'
            }
	};

      /**
      * Initialisation des binds
      */

      /**
	* bindActionsLienInvitation : applique le bind sur les liens d'invitation
	* 
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param string nom_div   Nom de la classe de la div du lien cliqué (accepter_invitation, refuser_invitation etc...)
	* @param string nom_type  Nom du type d'action (acceptationInvitation, refusInvitation etc...)
	* @return void
	* @since 05/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.bindActionsLienInvitation = function(nom_div, nom_type){
		$("table.liste_invitation_recu ."+nom_div+"").bind('click',
			{self:this},function(e){

                        // On lance l'ensemble des actions lors du clic
                        e.data.self.actionApresClicInvitation($(this));

                        // On ajoute à l'élément this le nom du type d'action
                        this.type_action = nom_type;

				// appel au controleur ajax
				benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
					this,
					e.data.self.tableauUrlAjax[nom_type],{
						// méthodes retour de l'objet avec un delegate appliqué pour conserver le contexte objet :
						SUCCES: benchmark.framework.util.delegate(e.data.self,e.data.self.actionApresClicInvitationReussi), 
						ERREUR: benchmark.framework.util.delegate(e.data.self,e.data.self.actionApresClicInvitationRate)
					},
					// On renvoie l'id de la personne dont on accepte l'invitation
					{
					      f_id_personne   : $(this).attr('idpersonne'),
					      f_type_relation : $(this).attr('typeinvitation'),
					      f_id_ligne      : $(this).attr('idLigne')
					}
				)
				return false;
			}
		);
	};

      /**
	* bindActionsLienCommentaire : applique le bind sur le lien "Valider"
	* 
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param string nom_div   Nom de la classe de la div du lien cliqué (valider_commentaire, refuser_commentaire etc...)
	* @param string nom_type  Nom du type d'action (accepteCommentaire, refusCommentaire etc...)
	* @return void
	* @since 05/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.bindActionsLienCommentaire = function(nom_div, nom_type){
		$("table.liste_invitation_recu ."+nom_div+"").bind('click',
			{self:this},function(e){

                        // On lance l'ensemble des actions lors du clic
                        e.data.self.actionApresClicCommentaire($(this));

                        // On ajoute à l'élément this le nom du type d'action
                        this.type_action = nom_type;

				// appel au controleur ajax
				benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
					this,
					e.data.self.tableauUrlAjax[nom_type],{
						// méthodes retour de l'objet avec un delegate appliqué pour conserver le contexte objet :
						SUCCES: benchmark.framework.util.delegate(e.data.self,e.data.self.actionApresClicCommentaireReussi), 
						ERREUR: benchmark.framework.util.delegate(e.data.self,e.data.self.actionApresClicCommentaireRate)
					},
					// On renvoie l'id de la personne dont on accepte l'invitation
					{
					      f_id_personne   : $(this).attr('idpersonne'),
					      f_type_relation : $(this).attr('typeinvitation'),
					      f_id_ligne      : $(this).attr('idLigne')
					}
				)
				return false;
			}
		);
	};

      /**
      * Actions lors du lancement d'un bind
      */

  	/**
	* actionApresClicInvitation : ensemble des actions lorsque l'on clique sur un des liens d'invitation 
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param DOM element L'élément Jquery du lien
	* @return void
	* @since 06/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.actionApresClicInvitation = function(element){

            // On récupére les informations de personne et de type d'invitation
            var f_id_personne   = element.attr('idpersonne');
            var f_id_ligne      = element.attr('idLigne');
            var f_type_relation = element.attr('typeinvitation');

            // On fait apparaitre l'image de chargement
            $("#ajax_icone_chargement_"+f_type_relation+"_"+f_id_personne).css('display', 'inline');

            // On récupére l'élément DOM de la div action_invitation
            var dom_div_action = element.parent();

            // On modifie le style en ajoutant la classe "texte_en_attente"
            // et ainsi on passer tous le texte en gris
            dom_div_action.addClass("texte_en_attente");
            dom_div_action.find("a").addClass("texte_en_attente");
            
            // On récupére la ligne du tableau correspondant
            var dom_ligne_action = dom_div_action.parent().parent();

            // On passe la case à cocher à disabled et check = false
            // dom_ligne_action.find(":input").checked = false;
            dom_ligne_action.find(":input").removeAttr('checked');
            dom_ligne_action.find(":input").attr({'disabled':'disabled'});

	}

  	/**
	* actionApresClicCommentaire : ensemble des actions lorsque l'on clique sur un des liens de commentaire 
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param DOM element L'élément Jquery du lien
	* @return void
	* @since 06/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.actionApresClicCommentaire = function(element){

            // On récupére les informations de personne et de type d'invitation
            var f_id_personne   = element.attr('idpersonne');
            var f_id_ligne      = element.attr('idLigne');
            var f_type_relation = element.attr('typeinvitation');

            // On fait apparaitre l'image de chargement
            $("#ajax_icone_chargement_commentaire_"+f_type_relation+"_"+f_id_personne).css('display', 'inline');

            // On récupére l'élément DOM de la div action_invitation
            var dom_div_action = element.parent();

            // On modifie le style en ajoutant la classe "texte_en_attente"
            // et ainsi on passer tous le texte en gris
            dom_div_action.addClass("texte_en_attente");
            dom_div_action.find("a").addClass("texte_en_attente");
	}

      /**
      * Actions lors de la réussite d'une action
      */
	
  	/**
	* actionApresClicInvitationReussi : ensemble des actions lorsque l'on clique sur un des liens 
	* d'invitation et que cela a réussi 
	*  
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param DOM element L'élément Jquery du lien
	* @return void
	* @since 06/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.actionApresClicInvitationReussi = function(element){

            // On teste le code retour
            var retour_ajax = element.json.code_retour;
            
            // Si le retour est 0, on renvoie vers la méthode this.actionApresClicInvitationRate
            if (retour_ajax == 0){
                 return this.actionApresClicInvitationRate(element);
            }

            // On récupére les informations de personne et de type d'invitation
            var f_id_personne   = $(element.currentTarget).attr('idpersonne');
            var f_type_relation = $(element.currentTarget).attr('typeinvitation');
            var f_id_ligne      = $(element.currentTarget).attr('idLigne');

            // On fait disparaitre l'image de chargement
            $("#ajax_icone_chargement_"+f_type_relation+"_"+f_id_personne).css('display', 'none');

            // On récupére l'élément DOM de la div action_invitation
            var dom_div_action = $(element.currentTarget).parent();

            // Dans le cas où le niveau du dessus n'est pas une div utilisant la classe action_invitation,
            // on charge le parent de cet élément
            if (!dom_div_action.is("div.action_invitation")){
                  dom_div_action = dom_div_action.parent(); 
            }

            // On change le texte de la div action_invitation avec celui contenu dans le DOM
            var texte_reussite = this.tableauTexteAction[element.currentTarget.type_action].reussite;
            dom_div_action.html(texte_reussite);

            // On supprime une partie du DOM pour ne plus avoir le fond bouton, existant pour
            // le bouton "Accepter l'invitation" par exemple

            // On modifie le style en ajoutant la classe "texte_reussi"
            dom_div_action.addClass("texte_reussi");
            dom_div_action.find("a").addClass("texte_reussi");

            // On supprime la ligne au bout de 5 secondes
            setTimeout( 
                  function(){
                        $("#liste_invitation_recu_"+f_type_relation+" tr#ligne_"+f_type_relation+"_"+f_id_personne+"").remove();
                        $("#liste_invitation_recu_"+f_type_relation+" tr#ligne_"+f_type_relation+"_"+f_id_personne+"_2").remove();
                        
                        // On regarde s'il existe encore des lignes.
                        // Dans le cas contraire, on supprime le tableau
                        var compteur = 0;
                        $("#liste_invitation_recu_"+f_type_relation).find("tr[id^='ligne_']").each(
                              function(){
                                    compteur++;
                              }
                        );
                        
                        if (compteur == 0){
                              $("#cadre_liste_relation_"+f_type_relation).remove();
                              $("#titre_relation_"+f_type_relation).remove();

                              // On regarde si on est dans la page qui liste toutes les relations
                              // en cherchant une div utilisant l'id "liste_invitation_vide"
                              if ($("#liste_invitation_vide").attr('id') == 'liste_invitation_vide'){
                                    
                                    // On regarde s'il existe encore des listes d'invitation
                                    if ($("div.cadre_liste_relation").attr('class') != 'cadre_liste_relation'){
                                         
                                         // Dans le cas contraire, on passe le diplay du texte contenu
                                         // dans la div d'id "liste_invitation_vide" à "block"
                                         $("#liste_invitation_vide").css('display','block');
                                    }                          
                              }
                        }
                  }
                  , 3000
            );

            // On décrémente le nombre d'invitation
            this.modifieCompteur();
	}

  	/**
	* actionApresClicCommentaireReussi : ensemble des actions lorsque l'on clique sur un des liens 
	* de commentaire et que cela a réussi 
	*  
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param DOM element L'élément Jquery du lien
	* @return void
	* @since 06/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.actionApresClicCommentaireReussi = function(element){

            // On teste le code retour
            var retour_ajax = element.json.code_retour;
            
            // Si le retour est 0, on renvoie vers la méthode this.actionApresClicInvitationRate
            if (retour_ajax == 0){
                 return this.actionApresClicCommentaireRate(element);
            }

            // On récupére les informations de personne et de type d'invitation
            var f_id_personne   = $(element.currentTarget).attr('idpersonne');
            var f_type_relation = $(element.currentTarget).attr('typeinvitation');
            var f_id_ligne      = $(element.currentTarget).attr('idLigne');

            // On fait disparaitre l'image de chargement
            $("#ajax_icone_chargement_commentaire_"+f_type_relation+"_"+f_id_personne).remove();

            // On récupére l'élément DOM de la div liste_commentaire
            var dom_div_action = $(element.currentTarget).parent();

            // On change le texte de la div action_invitation en ajoutant celui contenu dans le DOM
            var texte_reussite = this.tableauTexteAction[element.currentTarget.type_action].reussite;
            dom_div_action.html(texte_reussite);
            
            // Cas particuliers : Dans le cas d'un refus de commentaire, on doit créer un nouveau 
            // bind sur le texte affiché
            if (element.currentTarget.type_action == 'refusCommentaire'){

                  // On passe l'id personne et le type de relation au lien
                  dom_div_action.find("a.annuler_refus_commentaire").attr({'idPersonne':f_id_personne, 'typeinvitation':f_type_relation, 'idLigne':f_id_ligne});
                  
                  // On créé le bind
                  this.bindActionsLienCommentaire('annuler_refus_commentaire', 'refusSuppressionCommentaire');
            }
            else {
 
                  // On passe l'id personne et le type de relation au lien
                  dom_div_action.find("a.refuser_commentaire").attr({'idPersonne':f_id_personne, 'typeinvitation':f_type_relation, 'idLigne':f_id_ligne});

                  // On créé le bind
                  this.bindActionsLienCommentaire('refuser_commentaire', 'refusCommentaire');

            }

            // On modifie le style en ajoutant la classe "texte_reussi", sauf dans le cas
            // d'une annulation de suppression
            dom_div_action.removeClass("texte_en_attente");
            dom_div_action.find("a").removeClass("texte_en_attente");
            
            if (element.currentTarget.type_action == 'refusSuppressionCommentaire'){
                  dom_div_action.removeClass("texte_reussi");
                  dom_div_action.find("a").removeClass("texte_reussi");          
            }
            else {
                  dom_div_action.addClass("texte_reussi");
                  dom_div_action.find("a").addClass("texte_reussi");
            }
	}

      /**
      * Actions lors de l'échec d'une action
      */

  	/**
	* actionApresClicInvitationRate : ensemble des actions lorsque l'on clique sur un des liens 
	* d'invitation et que cela a raté 
	*  
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param DOM element L'élément Jquery du lien
	* @return void
	* @since 06/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.actionApresClicInvitationRate = function(element){

            // On récupére les informations de personne et de type d'invitation
            var f_id_personne   = $(element.currentTarget).attr('idpersonne');
            var f_type_relation = $(element.currentTarget).attr('typeinvitation');
            var f_id_ligne      = $(element.currentTarget).attr('idLigne');

            // On fait disparaitre l'image de chargement
            $("#ajax_icone_chargement_"+f_type_relation+"_"+f_id_personne).parent().remove();
 
            // On récupére l'élément DOM de la div action_invitation
            var dom_div_action = $(element.currentTarget).parent();

            // Dans le cas où le niveau du dessus n'est pas une div utilisant la classe action_invitation,
            // on charge le parent de cet élément
            if (!dom_div_action.is("div.action_invitation")){
                  dom_div_action = dom_div_action.parent(); 
            }

            // On change le texte de la div action_invitation avec celui contenu dans le DOM
            var texte_echec = this.tableauTexteAction[element.currentTarget.type_action].echec;
            dom_div_action.html(texte_echec);
            
            // On modifie le style en ajoutant la classe "texte_rate"
            dom_div_action.addClass("texte_rate");
            dom_div_action.find("a").addClass("texte_rate");	      
	}

  	/**
	* actionApresClicCommentaireRate : ensemble des actions lorsque l'on clique sur un des liens 
	* de commentaire et que cela a raté 
	*  
	* @author Olivier REYT <reyt@benchmark.fr>
	* @param DOM element L'élément Jquery du lien
	* @return void
	* @since 06/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.actionApresClicCommentaireRate = function(element){

            // On récupére les informations de personne et de type d'invitation
            var f_id_personne   = $(element.currentTarget).attr('idpersonne');
            var f_type_relation = $(element.currentTarget).attr('typeinvitation');
            var f_id_ligne      = $(element.currentTarget).attr('idLigne');

            // On fait disparaitre l'image de chargement
            $("#ajax_icone_chargement_commentaire_"+f_type_relation+"_"+f_id_personne).css('display', 'none');
 
            // On récupére l'élément DOM de la div liste_commentaire
            var dom_div_action = $(element.currentTarget).parent();

            // On change le texte de la div action_invitation avec celui contenu dans le DOM
            var texte_echec = this.tableauTexteAction[element.currentTarget.type_action].echec;
            dom_div_action.html(texte_echec);
            
            // On modifie le styleen ajoutant la classe "texte_rate"
            dom_div_action.removeClass("texte_en_attente");
            dom_div_action.addClass("texte_rate");
            dom_div_action.find("a").removeClass("texte_en_attente");
            dom_div_action.find("a").addClass("texte_rate");	      
	}

  	/**
	* modifieCompteur : modification du nombre d'invitation dans les onglets
	* @author Olivier REYT <reyt@benchmark.fr>
	* @return void
	* @since 13/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.modifieCompteur = function(){

            // On récupére l'élément DOM du compteur
            var dom_onglet_compteur = $("label#nombre_invitation");
            
            // On récupére la valeur du compteur
            var compteur_val = dom_onglet_compteur.attr('nombreInvitation');
            
            // On décrémente le compteur
            compteur_val = compteur_val - 1;
           
            // Si le compteur est égale à 0, on supprime le nombre dans l'onglet
            if (compteur_val <= 0){
                  dom_onglet_compteur.html('');
            }
            // Sinon on affiche la nouvelle valeur et on modifie la valeur de l'attribut
            else {
                  dom_onglet_compteur.html('('+compteur_val+')');
                  dom_onglet_compteur.attr('nombreInvitation', compteur_val);
            }
	}

  	/**
	* initialise : initialisation de l'ensemble des actions Js
	* @author Olivier REYT <reyt@benchmark.fr>
	* @return void
	* @since 05/05/2009 Olivier REYT <reyt@benchmark.fr> 
	*/
	this.initialise = function(){
		this.bindActionsLienInvitation('accepter_invitation',  'acceptationInvitation');
		this.bindActionsLienInvitation('refuser_invitation',   'refusInvitation');
		this.bindActionsLienInvitation('supprimer_invitation', 'suppressionInvitation');
		this.bindActionsLienCommentaire('valider_commentaire', 'accepteCommentaire');
		this.bindActionsLienCommentaire('refuser_commentaire', 'refusCommentaire');
	};
}

$(document).ready(
	function(){
		if(typeof(benchmark.execution) == "undefined") {            benchmark.execution = new Object(); }
		if(typeof(benchmark.execution.relation) == "undefined") {   benchmark.execution.relation = new Object(); }
		benchmark.execution.relation.ObjGestionRelation = new benchmark.application.copaindavant.relation.ObjGestionRelation();
            benchmark.execution.relation.ObjGestionRelation.initialise();
	}
);
;
