// JavaScript Document

var Tchat={
	Etat: 'REPOS' ,
	EET : { 
		'L_START':   {'REPOS': 'START', 'ACTIF':'nop'   , 'APPEL':'nop'   ,'CLAVD':'nop'  } ,
		'L_TIC'  :   {'REPOS': 'nop'  , 'ACTIF':'A_TIC' , 'APPEL':'A_TIC' ,'CLAVD':'A_TIC'} ,
		'L_CLIGN':   {'REPOS': 'nop'  , 'ACTIF':'A_CAL' , 'APPEL':'A_CLI' ,'CLAVD':'A_CAL'} ,
		'L_WCX'  :   {'REPOS': 'nop'  , 'ACTIF':'A_WCX' , 'APPEL':'nop'   ,'CLAVD':'A_WCX'} ,
		'R_CNX'  :   {'REPOS': 'nop'  , 'ACTIF':'A_MCX' , 'APPEL':'A_MCX' ,'CLAVD':'A_MCX'} ,
		'R_CVD'  :   {'REPOS': 'nop'  , 'ACTIF':'A_MCV' , 'APPEL':'A_MCV' ,'CLAVD':'A_MCV'} ,
		'R_CCNX' :   {'REPOS': 'nop'  , 'ACTIF':'nop'   , 'APPEL':'nop'   ,'CLAVD':'A_CCNX'},
		'R_CCVD' :   {'REPOS': 'nop'  , 'ACTIF':'nop'   , 'APPEL':'nop'   ,'CLAVD':'A_CCVD'},
		'R_ZCMD' :   {'REPOS': 'nop'  , 'ACTIF':'nop'   , 'APPEL':'nop'   ,'CLAVD':'A_ZCMD'},
		'R_APPEL':   {'REPOS': 'nop'  , 'ACTIF':'A_APP' , 'APPEL':'A_APP' ,'CLAVD':'nop'  } ,
		'R_MSG'  :   {'REPOS': 'nop'  , 'ACTIF':'A_MSG' , 'APPEL':'A_MSG' ,'CLAVD':'A_MSG'} ,
		'R_CUR'  :   {'REPOS': 'nop'  , 'ACTIF':'nop'   , 'APPEL':'nop'   ,'CLAVD':'A_CUR'} ,
		'M_OVER' :   {'REPOS': 'nop'  , 'ACTIF':'A_QUI' , 'APPEL':'nop'   ,'CLAVD':'nop'  } ,
		'M_OUT'  :   {'REPOS': 'nop'  , 'ACTIF':'A_CAL' , 'APPEL':'A_CAL' ,'CLAVD':'A_CAL'} ,
		'M_CLICK':   {'REPOS': 'nop'  , 'ACTIF':'A_CVD' , 'APPEL':'A_CVD' ,'CLAVD':'A_PAG'} ,
		'M_ENVOI':   {'REPOS': 'nop'  , 'ACTIF':'nop'   , 'APPEL':'nop'   ,'CLAVD':'A_ENV'} ,
		'M_APPEL':   {'REPOS': 'nop'  , 'ACTIF':'nop'   , 'APPEL':'nop'   ,'CLAVD':'A_EAP'} ,
//		'_'    :   {'REPOS': '', 'ACTIF':'' , 'APPEL':'' ,'CLAVD':''} ,
		'Dummy': ""
	} , 
	Event : function (evt,parm) {	
//alert('ETAT:'+this.Etat+' EVT:'+evt+' FCT:'+this.EET[evt][this.Etat]+'<br>') ;
//document.getElementById('LogoTrace').innerHTML = 'ETAT:'+this.Etat+' EVT:'+evt+' FCT:'+this.EET[evt][this.Etat]+'<br>' ;
    this[this.EET[evt][this.Etat]](parm) ; 
  } ,
//
	Div: document.getElementById('ClavarDiv') ,
	CDing: document.getElementById('ClavDing') ,
	Content: "" ,
	MemPage: "" ,
	nop : function () 
  { 
  } , 
  Surnom : "" ,
  Color : "" ,
	GetParm : function (S_Surnom,S_Color) 
  { 
    this.Color=S_Color ;
    this.Surnom=S_Surnom ;
  } , 
	A_CAL : function () { 
    Calend.content.style.display ='block' ;
    this.Div.style.display ='none' ; 
  } ,
	A_QUI : function() { 
    Calend.content.style.display ='none' ;
    this.Div.style.display ='block' ;
//    this.Div.innerHTML = '<p>Le clavardage<br>(néologisme proposé pour traduire le mot anglais tchat) sera bientot disponible pour votre plus grand plaisir, et ne sera pas réprimé par les yeux des chefs excédés...</p>' ;
  } ,
	A_PAG : function () { 
    if (!this.Content) { this.Content=document.getElementById('content') ; }
    this.Content.style.display = 'block' ;
    this.Content.innerHTML = this.MemPage ;
    this.A_QUI() ; 
    this.Etat='ACTIF' ;
    this.A_TIC('DCX') ; 
  } ,
	TicTimer: "" ,
	TicCount: 0 ,
	TicValue: 5000 ,
	START : function() { 
    if (!this.Content) { this.Content=document.getElementById('content') ; }
    this.Etat='ACTIF' ; 
    this.A_TIC('INIT') ;
  } ,
	A_CVD : function() { 
    if (!this.Content) { this.Content=document.getElementById('content') ; }
    this.Content.style.display ='none' ;
//Sauvegarde de la page en cours
    this.MemPage = this.Content.innerHTML ;
    this.Content.innerHTML = ''
+'<FORM NAME=MSGZON onsubmit="return false;">'
+'<TABLE WIDTH=99% BORDER=1 ID="CLAZON">'
+'<TR><TD ROWSPAN=2><div id="DIAZON" >Zone de conversation.<br></div></TD>'
+'<TD valign="top">Connect&eacute;s sur le site:<br>(un clic sur un surnom lui demande de venir Clavarder)<hr><div id="CNXSIT">CNXSIT</div></TD></TR>'
+'<TR><TD valign="top">En Clavardage:<BR><span style="background-color:'+this.Color+';color:white;">'+this.Surnom+'</span> , c\'est toi.<hr><div id="CNXCLA">CNXCLA</div></TD></TR>'
+'<TR><TD>Tapez votre message ici.<br>'
+'<INPUT CLASS=INPUT TYPE=TEXT VALUE="yoyo" SIZE="100" NAME="FTEXTE" onKeyup="return Tchat.key(event);">'
+'</TD><TD><div id="CMDZON">CMDZON</div></TD></TR>'
+'</TABLE>'
+'</FORM>'
 ;
 //
    this.Content.style.display ='block' ;
    this.Etat='CLAVD' ; 
    this.A_TIC('CNX') ; 
    document.forms.MSGZON.FTEXTE.value="";
    document.forms.MSGZON.FTEXTE.select() ;
    document.forms.MSGZON.FTEXTE.focus();
  } ,
  MsgNum : 0 ,
  Cursor : 0 ,
  A_CUR : function(Mode) {
    switch (Mode) {
    case 'SET' :
      Cursor_SetPos(document.forms.MSGZON.FTEXTE,this.Cursor) ;
      break ;
    case 'GET' :
      this.Cursor=Cursor_GetPos(document.forms.MSGZON.FTEXTE);
      break ;
    }
  } ,
  key : function (e) {
//  var code ;
  if (!e) var e = window.event;
  if (e.keyCode) { code = e.keyCode;}
  else if (e.which) code = e.which ;
  if ( code == 13 ) {Tchat.Envoie(); return false;}
  return true ;
  } ,
  Envoie : function (titi) {
    var txt=document.forms.MSGZON.FTEXTE.value ;
    if (!txt) {return ;} 
    document.forms.MSGZON.FTEXTE.value = "" ;
    if (txt == 'Clear') return(document.getElementById('DIAZON').innerHTML = "Clear" );
    this.A_TIC('MSG',escape(((titi)?"[Pour "+titi+"] :" : "")+txt)) ; 
  } ,
  TicCount : 0 ,
	A_TIC : function(Parm,Val) { 
  	clearTimeout(this.TicTimer) ;
	  //NomClavardage est dans header, c'est pour voir avancer les TICs.
    x=document.getElementById('NomClavardage').innerHTML ;
  	this.TicCount %= x.length ;
    document.getElementById('NomClavardage').innerHTML = x.substr(0,this.TicCount).toLowerCase() + x.substr(this.TicCount,1).toUpperCase() + x.substr(++this.TicCount).toLowerCase() ; 
    AJ_Tchat(Parm,Val) ; 
    this.TicTimer=setTimeout("Tchat.Event('L_TIC','QUI')", this.TicValue) ; 
  } ,
  CurrentConnected : "" ,
  CurrentClavard : "" ,
  Caller : "" ,
	A_MCX : function(txt) { 
    var Connected=txt ;
//    if (Connected+"X" != this.CurrentConnected+"X") { Ding(this.CDing,'PLAY'); }
    this.CurrentConnected=Connected ;
  } ,
	A_MCV : function(txt) { 
    var Clavard=txt ;
//    if (Clavard+"X" != this.CurrentClavard+"X") { Ding(this.CDing,'PLAY'); }
    this.CurrentClavard=Clavard ;
//    this.Event('L_WCX') ;
  } ,
	A_WCX : function() { 
    this.Div.innerHTML = "<div style=\"text-align:left;\">Connectés:<br>"+this.CurrentConnected+"<hr>" ;  
    this.Div.innerHTML += (this.CurrentClavard) ? "En Clavardage:<br>"+this.CurrentClavard : "Personne ne Clavarde." ;
    this.Div.innerHTML += "<hr></div>" ;  
  } ,
	A_CCNX : function(txt) { 
    if (document.getElementById('CNXSIT')) { document.getElementById('CNXSIT').innerHTML = txt ; }
  } ,
	A_CCVD : function(txt) { 
    if (document.getElementById('CNXCLA')) { document.getElementById('CNXCLA').innerHTML = txt ; }
  } ,
	A_ZCMD : function(txt) { 
    if (document.getElementById('CMDZON')) { document.getElementById('CMDZON').innerHTML = txt ; }
  } ,
  A_APP : function(txt) {
    if (this.Caller==txt) return ;
    this.Caller=txt ;
    if (this.Caller) {
      this.Div.innerHTML = "<A HREF='#' onClick=\"javascript:Tchat.Event(\'M_CLICK\');return false;\"><div style=\"text-align:center;background:red;\"><u>APPEL</u><br><b>"+this.Caller+"</b><br>vous demande<br>de le rejoindre<br>au salon<br>pour Clavarder.<hr></div></a>" ;
      this.Alarm=false ;
      this.AlarmCount=0 ;
      this.Etat='APPEL' ;
      this.A_CLI() ;
    }
    else {
      this.Etat='ACTIF' ;
    }
  } ,
  Alarm : false ,
  AlarmCount : 0 ,
  A_CLI : function() {
    this.Alarm= !this.Alarm ;
    if (this.AlarmCount++ < 3) Ding(this.CDing,'APPEL');
    if (this.Alarm) {
      Calend.content.style.display ='none' ;
      this.Div.style.display ='block' ;
    } else {
      Calend.content.style.display ='block' ;
      this.Div.style.display ='none' ; 
    }
    window.setTimeout("Tchat.Event('L_CLIGN')",2500);
  } ,
/*  TRC : function(txt) {  
    if (document.getElementById('DIAZON')) { document.getElementById('DIAZON').innerHTML += txt.htmlEntities()+'<br>' ; }
  } ,*/
  retrive : function (Source,Token) {
    var st=Source.indexOf('<'+Token+'>') ;
    if (st==-1) return "" ;
    var start = st+Token.length+2 ;
    var stop=Source.indexOf('</'+Token+'>',start) ;
    return Source.slice(start,stop) ;
  } ,
	Dummy : "" 
}
String.prototype.htmlEntities = function () {   return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');};
//
////////////////////////////
function Get_NbrCR(txt_){
  var NbrCR = 0;
  var Pos = txt_.indexOf("\r\n");
  while( Pos > -1){
    Pos = txt_.indexOf("\r\n", Pos+2);
    NbrCR ++;
  }
  return( NbrCR);
}
//----------------------------------
function Cursor_SetPos( Obj, pos_){
//    Obj.focus();
    if( typeof Obj.selectionStart != "undefined"){
      Obj.setSelectionRange( pos_, pos_);
    }
    else{ // IE and consort
      var Chaine = Obj.createTextRange();
      Chaine.moveStart('character', pos_);
      //-- Deplace le curseur
      Chaine.collapse();
      Chaine.select();
    }
}
var range;
function curseuralafin(elem) {
    range = elem.createTextRange();
    var m = range.moveStart("textedit");
    range.select(); 
} 

//----------------------------------
function Cursor_GetPos( Obj ){
    //-- Focus sur Objet
//    Obj.focus();
    if(typeof Obj.selectionStart != "undefined")
      return Obj.selectionStart;
    else{ // IE and consort
      var szMark = "~~";
      var Chaine = Obj.value;
//-- Cree un double et insert la Mark ou est le curseur
      var szTmp = document.selection.createRange();
      szTmp.text = szMark;
      //-- Recup. la position du curseur
      var PosDeb = Obj.value.search(szMark);
      //-(*)- Supprime les retours Chariot
      var szAvant  = Chaine.substring( 0 , PosDeb);
      PosDeb -= Get_NbrCR( szAvant);
      //-- Restaure valeur initiale
      Obj.value = Chaine;
      Chaine = Obj.createTextRange();
      //-- Deplace le Debut de la chaine
      Chaine.moveStart('character', PosDeb);
      //-- Deplace le curseur
      Chaine.collapse();
      Chaine.select();
      return( PosDeb);
    }
}

//////////////////////////////
function AJ_Tchat(Param,Value)
{
  var xhr=null;
  var V ;
  var P=/\+/g ;
  if (Value==undefined) { V=""; } 
  else { Value=Value.replace( P ,"%252B"); V="&VALUE="+Value ;  }
	if(window.XMLHttpRequest) // Firefox et autres
	   xhr = new XMLHttpRequest(); 
	else if(window.ActiveXObject){ // Internet Explorer 
	   try {
                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
	}
    xhr.onreadystatechange = function() { REP_Tchat(xhr,Param) ; };
    xhr.open("GET", "Aj_Tchat.php?PARAM="+Param+V+"&LAST="+LastRecevedMessage, true);
    xhr.send(null);
} ;
//
var LastRecevedMessage=0 ;
//
function REP_Tchat(xhr,Param)
{
  var i ;
  if (xhr.readyState == 4) {
    if (xhr.status == 200) {
//      if (document.getElementById('DIAZON')) { document.getElementById('DIAZON').innerHTML += xhr.responseText+'<br>' ; }
      switch (Param) {
      case 'CNX' :
        var clv=Tchat.CurrentClavard ;
        if (clv) document.getElementById('DIAZON').innerHTML += "<span style=\"background-color:green;color:white;\">Actuellement pr&eacute;sent(s) pour clavarder : "+clv+".</span><br>" ;
        else document.getElementById('DIAZON').innerHTML += "<span style=\"background-color:red;color:white;\">Personne n'est actuellement pr&eacute;sent pour clavarder.</span><br>" ;
      case 'INIT' : 
      case 'CALL' :
      case 'DCX' :
      case 'QUI' : 
      case 'MSG' : 
        Tchat.Event('R_CUR','GET') ;
        Tchat.Event('R_APPEL',Tchat.retrive(xhr.responseText,'CALLER')) ;
        if (Tchat.retrive(xhr.responseText,'CLEAR')) {
          if (document.getElementById('DIAZON')) {
            document.getElementById('DIAZON').innerHTML = "Cleared<BR>" ;
          }
        }

        var Cnx=[] ; var Cvd=[] ;
        var LCx="" ;
        var LCv="" ;
        var LCr="" ;
        var Cl=Tchat.retrive(xhr.responseText,'CLISTE') ;
        if (Cl) {
          var Cs=Cl.split(',') ;
          for (i=0 ; i<Cs.length ; i++) {
            var Msg=Tchat.retrive(xhr.responseText,'CNX_'+Cs[i]) ;
            var Ps=Tchat.retrive(Msg,'PSEUDO') ;
            var Colr=Tchat.retrive(Msg,'COLOR') ;
            if (Tchat.retrive(Msg,'CLAV')=='NON') 
            {
              Cnx.push(Tchat.retrive(Msg,'PSEUDO')) ;
              if (Tchat.retrive(Msg,'CALLED')=='OUI') LCx+='<li><span style="background-color:'+Colr+';color:white;">'+Ps+'</span><span style="background-color:white;color:'+Colr+';"> En Appel.</span></li>' ; 
              else LCx+='<a href="#" onclick="javascript:Tchat.A_TIC(\'CALL\',\''+Ps+'\');return false;"><li>'+Ps+'</li></A>' ; 
            }
            else  
            {
              Cvd.push(Tchat.retrive(Msg,'PSEUDO')) ;
              Colr=Tchat.retrive(Msg,'COLOR') ;
              LCv+='<li><span style="background-color:'+Colr+';color:white;">'+Ps+'</span></li>' ; 
              LCr+='<span style="background-color:'+Colr+';color:white;cursor: pointer;" onclick="javascript:Tchat.Envoie(\''+Ps+'\');return false;">'+Ps+'</span>&nbsp;' ; 
            }
          }
        }
        Tchat.Event('R_CNX',Cnx.join(', ')) ; 
        Tchat.Event('R_CVD',Cvd.join(', ')) ;
        Tchat.Event('L_WCX') ;
        Tchat.Event('R_CCNX',LCx) ;
        Tchat.Event('R_CCVD',LCv) ;
        Tchat.Event('R_ZCMD',LCr) ;
        if (Tchat.retrive(xhr.responseText,'BLIP')=="Blip") Ding(Tchat.CDing,'PLAY'); ;

        var Idl=Tchat.retrive(xhr.responseText,'IDLIST') ;
        if (Idl) {
          var Ids=Idl.split(',') ;
          for (i=0 ; i<Ids.length ; i++) {
            if (document.getElementById('DIAZON')) 
            { 
              var Msg=Tchat.retrive(xhr.responseText,'MSG_'+Ids[i]) ;
              var Time=Tchat.retrive(Msg,'TIME') ;
              var From=Tchat.retrive(Msg,'FROM') ;
              var Text=Tchat.retrive(Msg,'TEXTE').htmlEntities().bold() ;
              var Colr=Tchat.retrive(Msg,'COLOR') ;
              From=From ? From.bold().fontcolor(Colr)+' dit :<br>' : "" ;
              Text=From ? Text.fontcolor(Colr) : '<span style="background-color:'+Colr+';color:white;">'+Text+'</span>' ;
              document.getElementById('DIAZON').innerHTML += '<A NAME='+Ids[i]+'><DIV>'+Time.italics()+' - '+From+Text+'</DIV></A>' ;
            }          
            LastRecevedMessage=Ids[i] ;
          }
          window.location.hash='#'+LastRecevedMessage ;
        }
        Tchat.Event('R_CUR','SET') ;
        break ;
      }
//  } else {
//      alert('Un problème est survenu avec la requête.');
    }
  }
} ;
//
/*
function retriveCNX(Txt) {
  var Cnx=[] ; var Cvd=[] ;
  var Cl=Tchat.retrive(Txt,'CLISTE') ;
  if (Cl) {
    var Cs=Cl.split(',') ;
    for (i=0 ; i<Cs.length ; i++) {
      var Msg=Tchat.retrive(Txt,'CNX_'+Cs[i]) ;
      var Ps=Tchat.retrive(Msg,'PSEUDO') ;
      if (Tchat.retrive(Msg,'CLAV')=='NON') 
      {
        Cnx.push(Ps) ;
      }
      else  
      {
        Cvd.push(Ps) ;
      }
    }
  }
  return Cnx.join(', ')) ; 
}
//
function retriveCVD(Txt) {
  var Cnx=[] ; var Cvd=[] ;
  var Cl=Tchat.retrive(Txt,'CLISTE') ;
  if (Cl) {
    var Cs=Cl.split(',') ;
    for (i=0 ; i<Cs.length ; i++) {
      var Msg=Tchat.retrive(Txt,'CNX_'+Cs[i]) ;
      var Ps=Tchat.retrive(Msg,'PSEUDO') ;
      if (Tchat.retrive(Msg,'CLAV')=='NON') 
      {
        Cnx.push(Ps) ;
      }
      else  
      {
        Cvd.push(Ps) ;
      }
    }
  }
  return Cvd.join(', ')) ; 
}
*/
//
function Ding(Div,Mode)
{
  var son="MP3/start.mp3" ;
  switch (Mode) {
    case 'APPEL' : 
        Div.style.display ='block' ;
        Div.innerHTML='<object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=snd/APPEL.mp3&amp;autostart=1" width="200" height="20"><param name="wmode" value="transparent" /><param name="movie" value="dewplayer.swf?mp3=snd/APPEL.mp3&amp;autostart=1" /></object>' ;
        Div.style.display ='none' ;
        break ;
    case 'PLAY' : 
        Div.style.display ='block' ;
        Div.innerHTML='<object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=snd/blip.mp3&amp;autostart=1" width="200" height="20"><param name="wmode" value="transparent" /><param name="movie" value="dewplayer.swf?mp3=snd/blip.mp3&amp;autostart=1" /></object>' ;
        Div.style.display ='none' ;
        break ;
    case 'STOP' : Div.innerHTML='' ;
        break ;
  }
}
///////////////////////////////////////////////
