// JScript File
// Effectue les requêtes asynchrones sur le serveur
//
// Stéphane Graziano Nov.2005
// Ne volez pas les scripts ! demandez les par email !
// Don't steal scripts ! ask for them by mail !
// slappyto.net

var AJAX_ACTIVE = true;
var DEBUG_ACTIVE = false;
var INTERVAL_EXECUTION = 3500; //en ms, Timer principal

var gCurrentChatWindow = null; //fenêtre de discussion
var last_id_message = 0; //dernier id de message chat recu
var gChatMessages; //contient le tableau d'objet AJAX_CHAT de conversations 
var gChatFriends; //liste d'amis 

var gBufferDiscussion = new Array(); 
var gIsAjaxEnCours = false; //permet de ne pas relancer de requête AJAX si une est en cours

var gCurrentDEBUGWindow = null;


function DEBUG(text)
{
    if(DEBUG_ACTIVE)
    {
        gCurrentDEBUGWindow.document.write(text + "<br/>");
        gCurrentDEBUGWindow.scrollTo(0,2047483640);
    }
}


//Retour d'AJAX
function AJAX_callback(response)
{     
 DEBUG("AJAX_callback START");
   
    if (response != null && response.value != null)
    {
        
        var ajaxCliObj = response.value;
        
        if (typeof(ajaxCliObj) == "object")
            DoAJAXJob(ajaxCliObj);                    
                    
    }      
        
    gIsAjaxEnCours = false;  
    
 DEBUG("AJAX_callback END"); //here
}


/*******************************************

    Partie dynamique/ traitement de l'objet recu
    ici on fait joujou avec les elements

********************************************/         
function DoAJAXJob(ajaxCliObj)
{
    DEBUG("DoAJAXJob");
    //0: affiche le contenu de l'objet
    debug = false;
    if(debug==true)
    {
        ctlPanelDiscussion = document.getElementById("panelDiscussion");
        var textobj = "AJAX";
        textobj += "<br/>----------------------------------";
        textobj += "<br/>NbConnectes :"+ajaxCliObj.NbConnectes;
        textobj += "<br/>NbInscris :"+ajaxCliObj.NbInscris;
        textobj += "<br/>GotMail :"+ajaxCliObj.GotMail;
        textobj += "<br/>GotMailText :"+ajaxCliObj.GotMailText;
        textobj += "<br/>Friends :"+ajaxCliObj.Friends;
        textobj += "<br/>Conversation :"+ajaxCliObj.Conversation;
        textobj += "<br/>CustomMessage :"+ajaxCliObj.CustomMessage;
        textobj += "<br/>ChatMessages :"+ajaxCliObj.ChatMessages;
        textobj += "<br/>ExceptionMessage :"+ajaxCliObj.ExceptionMessage;
        
        ctlPanelDiscussion.innerHTML = textobj;
    }


    //1.NbInscris
    CtlCounterInscris = myGetElementById("ctl00_Header1_ctlNbInscris");
    if(CtlCounterInscris!=null)
        myInnerText(CtlCounterInscris,ajaxCliObj.NbInscris);
    
    //2.NbConnectes    
    CtlCounterConnectes = myGetElementById("ctl00_Header1_ctlNbConnectes");
    if(CtlCounterConnectes!=null)
        myInnerText(CtlCounterConnectes,ajaxCliObj.NbConnectes);
    
    //control slappy
    CtlSlappyTalk = myGetElementById("ctl00_SlappyTallk1_ctlSlappyTalks");
    
    //control text slappy
    CtlSlappyTalkText = myGetElementById("ctl00_SlappyTallk1_ctlText");
    CtlSlappyTalkText.innerHTML = ""; //vide le controle
        
    //custom message ?
     if(ajaxCliObj.CustomMessage && ajaxCliObj.CustomMessage.length>0)
        CtlSlappyTalkText.innerHTML = ajaxCliObj.CustomMessage;
    
    //Percent POST send file    
    if(ajaxCliObj.PercentPost && ajaxCliObj.PercentPost.length>0)
        window.status = ajaxCliObj.PercentPost;
        
    //3.GotMail ?
    if(ajaxCliObj.GotMail==true)
    {        
        if(CtlSlappyTalkText!=null)
            CtlSlappyTalkText.innerHTML += ajaxCliObj.GotMailText;            
    }    
    
    //4.Got Message et Messenger non ouvert ?
    if(ajaxCliObj.ChatMessages!=null )//&& ajaxCliObj.ChatMessages.length>0)
    {
        gChatMessages = ajaxCliObj.ChatMessages;

        //si messenger fermé, on info bulle..
        if(gCurrentChatWindow==null || gCurrentChatWindow.closed)
        {
            CtlSlappyTalkText.innerHTML += ajaxCliObj.ChatMessagesText;
            //on bufferise les conversations
            //afin qu'elles s'affichent directement si on ouvre la fenêtre de discussion
            
        }        
        else
        {            
            //on ajoute les onglets + messages dans la fenêtre de discussion           
            
            CALLBACKChatProc(ajaxCliObj.ChatMessages,"","");
            
            DEBUG("#1");

        }        
    }
    
    
    
    //5 affiche slappy talk si il y a de la data dans la bulle    
    if(CtlSlappyTalk!=null)
    {
        if(CtlSlappyTalkText.innerHTML.length>0)
            CtlSlappyTalk.style.display = isIE ? "block" : ""; 
        else
            CtlSlappyTalk.style.display = "none"; 
    }
    
    
    
    //forme de Friends[i] = 19:poppyto ou !19:poppyto pour un bani
    if(ajaxCliObj.Friends != null)
    { 
        gChatFriends = ajaxCliObj.Friends;
        gHttpHost = ajaxCliObj.HttpHost;
        
        if(gChatFriends && gChatFriends.length>0 &&
           gHttpHost && gHttpHost.length>0 )
        {    
            fluxHTMLFriends = BuildFriendList(gChatFriends,gHttpHost);    
            CtlFriendsList = myGetElementById("ctlMessengerListFriends");
           
            myInnerHTML(CtlFriendsList,fluxHTMLFriends);
        }
        else
            myInnerHTML(CtlFriendsList,"");
    }    
    
    DEBUG("DoAJAXJob End");
}

function BuildFriendList(friendList,httpHost)
{    
    if(friendList && friendList.length>0)
    {
        var fluxHTML = "";
        
       arrayFriends = friendList.split('\n'); //on éclate la liste d'amis en tableau
        
        var fluxHTML_Admis = "<div class=\"Entete\">Amis :</div>";
        var fluxHTML_Banis  = "<div class=\"Entete\">Bloqu&eacute;s :</div>";
        
            

        for(i=0;i<arrayFriends.length;i++)
        {
                var strFriend = arrayFriends[i];            
                   
                var IsAdmis = (strFriend.charAt(0) == "1")?true:false;
                var IsConnecte = (strFriend.charAt(1) == "2")?true:false;
                            
                var currentUID = strFriend.substring(2,strFriend.indexOf("#"));            
                var currentPseudo = strFriend.substr(strFriend.indexOf("#")+1);
                
            if(currentUID && currentUID.length>0 && currentPseudo && currentPseudo.length>0)
            {                
                var className = IsConnecte?"enligne":"absent";
                var href = IsConnecte?"javascript:startConversation('"+httpHost+"Messenger/Chat.aspx','"+escape(currentPseudo)+"','"+currentUID+"');":"javascript:;";
                
                var classBloqueOrReadm= IsAdmis?"cmdBloque":"cmdDebloque";
                var actionBloqueOrReadm = IsAdmis?"BloqueFriend":"AddFriend";
                var UID_Or_Pseudo = IsAdmis?currentUID:"'" + currentPseudo.replace("'","\\'") + "'";
                
                var FluxHtmlCurrentPseudo = "<div><a class=\""+className+"\" href=\""+ href +"\">"+ currentPseudo +"</a><a class=\""+classBloqueOrReadm+"\" href=\"javascript:"+actionBloqueOrReadm+"("+UID_Or_Pseudo+");\">Bloc</a><a class=\"cmdSupprime\" href=\"javascript:RemoveFriend("+currentUID+");\">Rem</a></div>";
                
                if(IsAdmis)
                {
                    fluxHTML_Admis += FluxHtmlCurrentPseudo;
                }
                else
                {
                    fluxHTML_Banis += FluxHtmlCurrentPseudo;
                }      
            }      
        }
        

                
        return "<div id=\"ctlListeAmisDIV\">"+fluxHTML_Admis+"</div>" + "<div id=\"ctlListeBanisDIV\">" + fluxHTML_Banis + "</div>";
    
    }
    else
        return null;
}

//permet de recopier un objet 
function copyObject(oldObject) 
{
    var newObject = new Object();
    for (var propName in oldObject) {
    newObject[propName] = oldObject[propName];
    }
    return newObject;
}

var gBufferDiscussion2 = new Array();
var last_id_message2;
function AJAXLauncher()
{
    DEBUG("--------------");
    DEBUG("AJAXLauncher");
    
    if(!AJAX_ACTIVE)
        return;

      if(gIsAjaxEnCours == false)
      {      
           gIsAjaxEnCours = true;
           
           //// Attention AJAXPRO ne sauvegarde les valeurs que par référence
           //// donc il faut une copie du tableau a envoyer (le code continue
           //// d'être executé car il y a une queue d'envoi dans ajaxpro )
           
           //1 on erase le tableau de cache
           for(u=0;u<gBufferDiscussion2.length;u++)
                gBufferDiscussion2.pop();
                
           //2 on rempli le tableau avec les nouvelles valeurs à envoyer
           for(u=0;u<gBufferDiscussion.length;u++)
                gBufferDiscussion2[u] = gBufferDiscussion[u];
                      
           last_id_message2 = last_id_message;
           
           if(typeof(AJAX_CLIENT) != "undefined")
                AJAX_CLIENT.GetAJAXObject(gBufferDiscussion2,last_id_message2,AJAX_callback);
           else
                gIsAjaxEnCours = false;
           
           for(i=0;i<gBufferDiscussion.length;i++)
                gBufferDiscussion.pop();

      }
                            
    setTimeout(AJAXLauncher,INTERVAL_EXECUTION);                
}


//appel de fonction dans INTERVAL_EXECUTION ms
setTimeout(AJAXLauncher,INTERVAL_EXECUTION);

/*******************************

ENLEVER / AJOUTER UN AMI
Etat : 0->bloqué,1->pote,2->enlever de la liste (et donc débannir)
		
*******************************/
function AddFriendText()
{
    textbox = myGetElementById("inputFriend");
    myGetElementById("ctlDivSearchResponse").style.display = "none";
    if(textbox.value.length>=2) //seuelement les pseudos de + de 1 car
    {        
        AddFriend(textbox.value);        
    }
}

function AddFriend(text)
{ 
    if(!AJAX_ACTIVE)
        return;

    if(typeof(AJAX_CLIENT) != "undefined")
        AJAX_CLIENT.SetFriend(text,1/*ajoute*/,AJAX_callback_AddFriend);
       
}

function RemoveFriend(id)
{ 
   if(!AJAX_ACTIVE)
        return;
        
    if(typeof(AJAX_CLIENT) != "undefined")
        AJAX_CLIENT.SetFriend(id,2/*enleve*/,AJAX_callback_AddFriend);
}

function BloqueFriend(id)
{ 
   if(!AJAX_ACTIVE)
        return;
               
    if(typeof(AJAX_CLIENT) != "undefined")
        AJAX_CLIENT.SetFriend(id,0/*bloque*/,AJAX_callback_AddFriend);
        
}        
        

       
//Retour d'AJAX
function AJAX_callback_AddFriend(response)
{      

    if (response != null && response.value != null)
    {        
          
        var ajaxCliObj = response.value;
        
        if (typeof(ajaxCliObj) == "object")
        {
            ////alert(ajaxCliObj.ModereFriendsReponse);               
        }
   }   
   
   
   gIsAjaxEnCours == false;
}


function SetUserChatState(Etat)
{
    if(typeof(AJAX_CLIENT) != "undefined")
        AJAX_CLIENT.SetChatState(Etat,AJAX_callback_SetChatState);
}       

//Retour d'AJAX
function AJAX_callback_SetChatState(response)
{      
    if (response != null && response.value != null)
    {        
        var ajaxCliObj = response.value;
        
        if (typeof(ajaxCliObj) == "object")
        {
            ctlOnline = myGetElementById("ctl00_Statut1_IamOnline");
            ctlOffline = myGetElementById("ctl00_Statut1_IamOffline");
        
            if( ctlOnline.style.display != "none" ) //online
            {
                //on devient offline
                ctlOnline.style.display = "none";
                ctlOffline.style.display = isIE ? "block" : ""; 
                
            }
            else //offline
            {
                //on devient online
                ctlOffline.style.display = "none";
                ctlOnline.style.display = isIE ? "block" : ""; 
            
            }
            
            ////alert("etat updated");
        }
   }                
}


// on va passer par un callback, car
// ça peut planter IE si il est entrain de charger les scripts
// autant passer le relais à une tâche ^^
// sans bloquer.
var g_urlMessenger = "";
function OpenMessenger(urlMessenger)
{
    g_urlMessenger = urlMessenger;
    setTimeout("OpenMessengerCALLBACK()",0);

}

//  Ouvre le messenger + Mutex de fenêtre ^^ 
function OpenMessengerCALLBACK()
{
    DEBUG("OpenMessengerCALLBACK");

        var ParamsOuverture = "width=640,height=480,toolbar=0,width=640,height=480,resizable,status=1,scrollbars=no,location=0,menubar=0";
                
         //on vérifie que le messenegr ne soit pas déjà ouvert sans tenter de l'ouvrir
         
        if(!gCurrentChatWindow || (gCurrentChatWindow && gCurrentChatWindow.closed ))
        {     
        
            DEBUG("OpenMessenger - BEFORE WINDOW.OPEN");           
            //on tente de sélectionner le messenger déjà ouvert
            gCurrentChatWindow = window.open('',"SlappytoMessenger",ParamsOuverture);
            
            //on ne recréé le messenegr que si elle la fenêtre créé/sélectionnée est vide ! 
            //(ça veut dire que c'est la première fois qu'on la créé)
            if(!gCurrentChatWindow || gCurrentChatWindow.location.href.indexOf(g_urlMessenger) == -1)
            {
                gCurrentChatWindow = window.open(g_urlMessenger,"SlappytoMessenger",ParamsOuverture);        
            
            }           
        }
}

//  Ouvre le messenger + Mutex de fenêtre ^^ 
//  et transfère les onglets + textes de la denrière requete ajax
function OpenNewMessenger(urlMessenger)
{
    DEBUG("OpenNewMessenger");

    OpenMessenger(urlMessenger);        
    if(gCurrentChatWindow && !gCurrentChatWindow.closed && gChatMessages)
    {
        CALLBACKChatProc(gChatMessages,"","");
        DEBUG("#2");

    }
    
}


//  Démarre une conversation (ouvre le messenegr si fermé) 
function startConversation(urlMessenger,pseudo,pseudoUID)
{    
    DEBUG("startConversation");
    OpenMessenger(urlMessenger);
    
    
    CALLBACKChatProc("",pseudo,pseudoUID);
    DEBUG("#3");
   
}

function CALLBACKChatProc(messages,pseudo,pseudoUID)
{
    DEBUG("CALLBACKChatProc");
    
    try
    {
          if(gCurrentChatWindow && !gCurrentChatWindow.closed && gCurrentChatWindow.ChatProc)
            {
                DEBUG("gCurrentChatWindow.ChatProc");
                
                gCurrentChatWindow.ChatProc(messages,pseudo,pseudoUID,gChatFriends,last_id_message);

                //quel est le dernier message lu ?
                if(messages.length>0)
                    last_id_message = messages[messages.length-1].id_message;
                    
                DEBUG("gCurrentChatWindow.ChatProc CALL Ok");
            }
            else
            {
                //si les fonctions n'ont pas été chargées dans
                //la fenetre de conversation, on redemande
                //cette fonction dans 200ms
                 
                setTimeout("CALLBACKChatProc('" + replaceAll(messages,"'","\\'") + "','" + replaceAll(pseudo,"'","\\'") + "','" + pseudoUID +"')",50);
                
            }       

   }
   catch(ex)
   {
   
        //alert("EXCEPTION : " +  ex);
   }
    
}


//
// Bufferise les messages avant de les envoyer toutes les x secondes
//
function AddBufferedMessage(PseudoReceiverUID,textAInserer)
{        

        DEBUG("AddBufferedMessage");
        gBufferDiscussion.push(PseudoReceiverUID + ":" + textAInserer);//empile 
        
        
}

function SetChatWindow(_window)
{       
    gCurrentChatWindow = _window; 
//    window.status = "Window exist - " + _window; 
}




/*******************************************************

            AJAX - SEARCH PSEUDO

*******************************************************/
//Retour d'AJAX pour la recherche 
function AJAX_TextBoxCallback(response)
{
  if (response != null && response.value != null)
    {
        
        var ajaxCliObj = response.value;
        
        if (typeof(ajaxCliObj) == "object")
            ChangeSearchResult(ajaxCliObj);                    
                    
    }      
}


function AjaxTextBox(objTextBox,idObjDivBox,action)
{
    switch(action)
    {
        case "pseudo":
        {       
            ctlAjaxSearchResponse = myGetElementById(idObjDivBox);
            
            
            //ctlAjaxSearchResponse.style.display = "block";
            ctlAjaxSearchResponse.style.width = objTextBox.clientWidth;            
            
            
            if(objTextBox.value.length>1 && typeof(AJAX_CLIENT) != "undefined")
                AJAX_CLIENT.GetAJAXSearch(objTextBox.value,objTextBox.id,idObjDivBox,action,AJAX_TextBoxCallback)
            else
                ctlAjaxSearchResponse.style.display = "none";
            
        }    
        break;
    }


}

function ChangeSearchResult(ajaxCliObj)
{
          ctlAjaxSearchResponse = myGetElementById( ajaxCliObj.GotMailText);
          if(ctlAjaxSearchResponse)
          {     
                myInnerHTML(ctlAjaxSearchResponse,ajaxCliObj.CustomMessage);           
                if(ajaxCliObj!=null && ajaxCliObj.CustomMessage!=null && ajaxCliObj.CustomMessage.length>0)
                    ctlAjaxSearchResponse.style.display = "block";
                else
                    ctlAjaxSearchResponse.style.display = "none";
          }    
}


function ajaxSelect(objDIV,idTextbox,nom)
{
    ctlAjaxSearchText = myGetElementById( idTextbox );
    ctlAjaxSearchResponse = myGetElementById( objDIV );
    
    ctlAjaxSearchText.value = unescape(nom);
    ctlAjaxSearchResponse.style.display = "none";

}


if(DEBUG_ACTIVE)
{
    gCurrentDEBUGWindow = window.open('',"SlappytoMessengerDEBUG","width=640,height=480,toolbar=0,width=640,height=480,resizable,status=1,scrollbars=no,location=0,menubar=0");
}


/*******************************************************

            AJAX - AFFICHE CARTE DE VISITE

*******************************************************/

//on va mettre en cache les FLux des cartes de visites
//pour ne pas les recharger si 2 fois le même user (econom-ajax)
var ArrayCacheCardUsers = new Array();


function ShowCarteVisite(UID,ControlID)
{
    var _obj = myGetElementById(ControlID);
             
    if(_obj!=null)
    {
        if(_obj.alreadyLoaded)
        {
            if(_obj.style.display == "block")
            {
                _obj.style.display = "none";
            }
            else //invisible
            {
                _obj.style.display = "block";                
            }
                        
            
        }
        else
        {
            if(ArrayCacheCardUsers[UID] == undefined)
            {
                
                if(typeof(Topic) != "undefined")
                {
                    Topic.GetCarteDeVisiteFluxHtml(UID,ControlID,AJAX_CardCallback);
                }
                else if(typeof(Forum_Espion) != "undefined")
                {
                    Forum_Espion.GetCarteDeVisiteFluxHtml(UID,ControlID,AJAX_CardCallback);
                }
            }
            else
            {
                _obj.style.display = "block";
                _obj.innerHTML = ArrayCacheCardUsers[UID];             
                _obj.alreadyLoaded = true;
            }
        }
    }
}

//Retour d'AJAX pour la carte de visite
function AJAX_CardCallback(response)
{
  if (response != null && response.value != null)
    {
        
        var ajaxCliObj = response.value;
        
        if (typeof(ajaxCliObj) == "object")
        {
             var FluxHtmlCard = ajaxCliObj[0];
             var UID = ajaxCliObj[1];
             var ControlID = ajaxCliObj[2];
                          
             var _obj = myGetElementById(ControlID);
             
             if(_obj!=null) 
             {
                _obj.style.display = "block";
                _obj.innerHTML = FluxHtmlCard;             
                _obj.alreadyLoaded = true;
                
                ArrayCacheCardUsers[UID] = FluxHtmlCard;
             }
             
        }              
    }      
}
