// JS fonctions classiques ...
var xhr_object = null;
if(window.XMLHttpRequest) // Ff
  xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
  xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else {
  alert("Votre navigateur est incompatible avec ce site");
}

var xhr_fifo = null;

function xhr_call(filename,func,data,retfunc) // ne pas appeler directement
{
  this.filename = filename;
  this.func = func;
  this.data = data;
  this.retfunc = retfunc;
  this.next = null;
  this.last = null;
  this.exec = function() { execCall(this.filename,this.func,this.data,this.retfunc); }
}
 
function doCall(filename,func,data,retfunc)
{
  var xc = new xhr_call(filename,func,data,retfunc);
  if (xhr_fifo==null)
  {
     xhr_fifo = xc;
     xhr_fifo.last = xhr_fifo;
     xhr_fifo.exec();
  }
  else
  {
     xc.last = xc;
     xhr_fifo.last.next = xc;
     xhr_fifo.last = xc;
  }
}

function execCall(filename,func,data,retfunc) // ne pas appeler directement
{
	data = "func="+func+"&"+data
  	if (xhr_object==null) return;
  
	var method   = "POST";
	xhr_object.open(method, filename, true);
	  
	xhr_object.onreadystatechange = function() {
	  if(xhr_object.readyState == 4) {
//	    alert(xhr_object.responseText);
	    if (xhr_object.responseText!="")
	    {
	      var ret;
	      try{
	      eval("ret="+xhr_object.responseText);
	      }
	      catch(e)
	      {
	    alert(xhr_object.responseText);
	    	  ret = {ret:"Erreur du serveur"};
	      }
	      if (ret.ret=="OK")
	      {
	        retfunc(ret);
	      }
	      else affmsg("Erreur: "+ret.ret,"err",2000);
	      xhr_fifo = xhr_fifo.next;
	      if (xhr_fifo!=null) { setTimeout("xhr_fifo.exec()",300); }
	    }
	    else affmsg("Pas de réponse du serveur","err",2000);
	  }
	}

	xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xhr_object.send(data);
}

// handles

var keymanagefunc = null
function keymanage(e) {
	if (keymanagefunc==null) return;
	var code;
	if (!e) var e = window.event;
	if (e.keyCode) code = e.keyCode;
	else if (e.which) code = e.which;
	keymanagefunc(code);
}

window.onkeydown = keymanage;

//-- div

function showDiv(divid)
{
  var di = document.getElementById(divid);
  if (di==null) return;
  di.style.height="";
  di.style.visibility="visible";
}
function hideDiv(divid)
{
  var di = document.getElementById(divid);
  if (di==null) return;
  di.style.height="1px";
  di.style.visibility="hidden";
}
function mkhtml(e)
{
  return(document.createElement(e));
}
function mkaddhtml(e,o)
{
  var elt = document.createElement(e);
  o.appendChild(elt);
  return(elt);
}
function mkaddspan(h,o)
{
  var elt = mkaddhtml("span",o);
  elt.innerHTML=h;
  return(elt);
}
function getelt(i)
{
  return(document.getElementById(i));
}

function windowWidth()
{
  var d = document.body.parentNode.clientWidth;
  if (d==0) d = window.innerWidth;
  return(d);
}
function windowHeight()
{
  var d = document.body.parentNode.clientHeight;
  if (d==0) d = window.innerHeight;
  return(d);
}

function getTop (e) {
	var o=e.offsetTop;
	while ((e=e.offsetParent) != null) { o += e.offsetTop; }
	return o;
}

function getLeft (e) {
	var o=e.offsetLeft;
	while ((e=e.offsetParent) != null) { o += e.offsetLeft; }
	return o;
}
function getScrollTop()
{
 var da=document.documentElement.scrollTop;
 if (document.body.scrollTop>da) da = document.body.scrollTop;
 return(da);
}
function getScrollLeft()
{
 var db=document.documentElement.scrollLeft;
 if (document.body.scrollLeft>db) db = document.body.scrollLeft;
 return(db);
}

function uec(s)
{
	return(encodeURIComponent(s));
}
var preg=new RegExp("(['])", "g");
var preg2=new RegExp("([\n])", "g");

function jsenc(o)
{
  if (typeof(o)!="object") return(""+o);
  var r = "{";
  var c = 0;
  var x;
  for(x in o)
  {
    if (c>0) r=r+",";
    c++;
    var oc = eval("o."+x);
    r=r+x+":";
    if (typeof(oc)=="object")
     r=r+jsenc(oc);
    else
     r=r+"'"+oc.replace(preg,"\\'").replace(preg2,"\\n")+"'";
  }
  r=r+"}";
  return(r);
}

// -- ZEO --

var zrnk=0;
var zposx=0;
var zposy=0;
var zposz=0;
var zposzone=0;


// -- tools

var mmgr = null;
function bodymousemove(evenement)
{
	if (mmgr==null) return;
	if ((typeof(event) == "undefined")||(event.clientX==null))
	{
	mmgr.mx = evenement.pageX;
	mmgr.my = evenement.pageY;
	}else{
	mmgr.mx = event.clientX;
	mmgr.my = event.clientY;
	}
	if (mmgr.act!=null)
	{
		var d = new Date();
		var ms = d.getMilliseconds();
		if (ms<mmgr.lms) mmgr.lms=mmgr.lms-1000;
		if (ms-mmgr.lms>20)
		{
			mmgr.lms=ms;
			if ((mmgr.frst==0)&&((Math.abs(mmgr.stx-mmgr.mx)>10)||(Math.abs(mmgr.sty-mmgr.my)>10)))
			{
				mmgr.frst=1;
				if (mmgr.act.einit!=null) mmgr.act.einit();
			}
			if ((mmgr.frst==1)&&(mmgr.act.emove!=null)) mmgr.act.emove(mmgr.mx,mmgr.my); 
		}
	}
 }
function bodymouseup()
{
	if ((mmgr.act!=null)&&(mmgr.frst==1))
	{
		if (mmgr.act.edrop!=null) mmgr.act.edrop();
		mmgr.frst==0;
		mmgr.act=null;
	}
}
function movemgr()
{
	this.mx=0;
	this.my=0;
	this.dx=0;
	this.dy=0;
	this.stx=0;
	this.sty=0;
	this.act=null;
	this.lms=0;
	this.frst=0;

	this.setact = function(a) {
	  this.act=a; this.stx=this.mx; this.sty=this.my;
	  this.dx  = this.stx-getLeft(a);
	  this.dy  = this.sty-getTop(a);
	}

	document.onmousemove = bodymousemove;
	document.onselectstart = function() {return false;}
	document.onmouseup = bodymouseup;
}
mmgr = new movemgr();

function toolTitleClick(ti)
{
 var dv = ti.dv;
 if (dv.affmod==1)
 {
   dv.affmod=2;
   dv.di.style.visibility="hidden";
   dv.di.style.height="1px";
   dv.di.style.width="1px";
 } else
 if (dv.affmod==2)
 {
   dv.affmod=1;
   dv.di.style.visibility="visible";
   dv.di.style.height="";
   dv.di.style.width="";
 }
}

function toolDiv()
{
	var dv = mkaddhtml("div",document.body);
	dv.className="tooldiv";
	dv.s = dv.style;
	dv.s.zIndex=100;
	dv.affmod = 1;

	dv.ha = mkaddhtml("span",dv);
	dv.ha.innerHTML="#";
	dv.ha.className="hadiv";
	dv.ha.title="";
	dv.ha.dv = dv;
	dv.ha.emove = function(x,y)
	{
	  x = x-mmgr.dx; y = y-mmgr.dy;
	  if (x<0) x=0;
	  if (y<0) y=0;
	  this.dv.s.left = x+"px";this.dv.s.top = y+"px";
	  if (typeof(this.dv.onmove)=="function") this.dv.onmove(x,y);
	}
	dv.ha.onmousedown = function() { mmgr.setact(this); }
	dv.ha.onmouseup = bodymouseup;

	dv.ti = mkaddhtml("a",dv);
	dv.ti.className="tooltitle";
	dv.ti.innerHTML="Tool";
	dv.ti.dv = dv;
	dv.ti.onclick = function() { toolTitleClick(this); };

	dv.close = mkaddhtml("a",dv);
	dv.close.innerHTML="X";
	dv.close.className="toolx";
	dv.close.title="Fermer"
	dv.close.dv = dv;
	dv.close.onclick=function() {
	if (typeof(dv.onclose)=="function") dv.onclose();
	this.dv.di.innerHTML=""; document.body.removeChild(this.dv); }

	dv.di = mkaddhtml("div",dv);
	dv.di.s = dv.di.style;
	dv.di.s.overflow = "hidden";

	return(dv);
}

// -- msg

var msgdv = null;
function rlyhidemsg()
{
 if (msgdv==null) return;
 msgdv.s.left="0px";
 msgdv.s.top="0px";
 msgdv.s.width="1px";
 msgdv.s.height="1px";
 msgdv.s.visibility = "hidden";
}
function affmsg(txt,mid,tim)
{
//setTimeout("xhr_fifo.exec()",300);
//var d = new Date();
 if (msgdv==null)
 {
	var dv = mkaddhtml("div",document.body);
	dv.className="tooldiv";
	dv.s = dv.style;
	dv.s.zIndex=100;
	msgdv=dv;

	dv.txt = mkaddhtml("span",dv);
	mkaddhtml("br",dv);
	
	dv.close = mkaddhtml("a",dv);
	dv.close.innerHTML="Fermer";
	dv.close.dv = dv;
	dv.close.onclick=rlyhidemsg;
 }
 if (tim!=null)
 {
 	var d = (new Date()).valueOf();
	msgdv.afftime = d;
	setTimeout("msgtimeout("+d+")",tim);
 } else {
	msgdv.afftime = 0;
 }
 msgdv.mid = mid;
 msgdv.txt.innerHTML=txt;
 msgdv.s.width="";
 msgdv.s.height="";
 msgdv.s.visibility = "visible";
 msgdv.s.left = (2+getScrollLeft())+"px";
 msgdv.s.top = (2+getScrollTop())+"px";
 msgdv.s.zIndex = 500;
 
}
function msgtimeout(t)
{
 if (t==msgdv.afftime) rlyhidemsg();
}
function hidemsg(mid)
{
 if ((msgdv==null)||(msgdv.mid!=mid)) return;
 rlyhidemsg();
}

// -- objs
function frmfalse()
{
  return(false);
}

function mdl_depl(dv)
{
  dv.affmod=1;
  if (dv.spx) dv.spx.innerHTML="X";
}

function zeo_html(dv)
{
  mdl_depl(dv);
  dv.di.innerHTML=dv.obj.data;
}
function zeo_tool(dv)
{
  var x = getLeft(dv);
  var y = getTop(dv)+25;
  var acc_aff = dv.obj.acc_aff;
  dv = toolDiv();
  dv.acc_aff = acc_aff;
  dv.s.left=x+"px";
  dv.s.top=y+"px";
  return(dv); 
}
function zeo_txt(dv)
{
  mdl_depl(dv);
    dv.di.innerHTML="";
    var frm = mkaddhtml("form",dv.di);
    
    frm.tx = mkaddhtml("textarea",frm);
    frm.tx.cols=80;
    frm.tx.rows=30;
    frm.tx.value=dv.obj.data;
    if (zrnk>=dv.obj.acc_up)
    {
      frm.onsubmit=function(){ 
        dv.obj.data = this.tx.value;
	var data = "id="+dv.obj.id+"&data="+uec(this.tx.value);
        doCall(rmtpage,"dataupdate",data,retStd);
        affmsg("Transmission..","std");
	return(false);
      }
      mkaddhtml("br",frm);
      snd = mkaddhtml("span",frm);
      snd.innerHTML = "<input type='submit' value=' OK '/>";
    } else {
      frm.tx.readOnly=true;
      frm.onsubmit=frmfalse;
    }
}

function stdActivData(dv)
{
 var cd = dv.obj.code;
 if(cd!="")
 {
   eval(cd);
 } else {
  var dt = dv.obj.data;
  dv.affmod=1;
  dv.spx.innerHTML="X";
  dv.di.innerHTML=dt;
 }
}
var stdselecting = null;
function stdTitleClick(l)
{
 if (stdselecting!=null)
 {
   stdselecting.objselected(l.dv);
   stdselecting = null;
   return;
 }
 if (l.dv.affmod==0)
 {
   stdActivData(l.dv);
 } else
 if (l.dv.affmod==1)
 {
   l.dv.affmod=2;
   l.dv.di.style.visibility="hidden";
   l.dv.di.style.height="1px";
   l.dv.di.style.width="1px";
 } else
 if (l.dv.affmod==2)
 {
   l.dv.affmod=1;
   l.dv.di.style.visibility="visible";
   l.dv.di.style.height="";
   l.dv.di.style.width="";
 }
}
function stdXClick(l)
{
 l.dv.affmod=0;
 l.dv.di.innerHTML="";
 l.dv.spx.innerHTML="";
 l.dv.di.style.visibility="visible";
 l.dv.di.style.height="";
}
function stdDiv()
{
  var dv = mkaddhtml("div",document.body);
  dv.s=dv.style;
  dv.className="zbox"; 
  return(dv);
}

function model_std(obj,depl)
{
  var bdy = document.body;
  var create = true;
  var dv = getelt(obj.id);
  if (dv!=null)
  {
   var crtobj = dv.obj;
   if ((obj.desc_model==crtobj.desc_model)&&(dv.affmod>0))
   {
     if (crtobj.pos_x != obj.pos_x) dv.s.left=obj.pos_x+"px";
     if (crtobj.pos_y != obj.pos_y) dv.s.top=obj.pos_y+"px";
     if (crtobj.pos_z != obj.pos_z) dv.s.zIndex=(10+1*obj.pos_z);
     dv.spt.innerHTML = obj.desc_type;
     dv.spl.innerHTML = obj.desc_title;

     if ((crtobj.code!=obj.code)||(crtobj.data!=obj.data)) dv.spx.innerHTML="@";

     dv.obj = obj;
     create=false;
   }
   if (create) // si a recreer on efface
   {
     bdy.removeChild(dv);
   }
  }
  if (create)
  {
   var dv = stdDiv();
   dv.id = obj.id;
   dv.obj = obj;
   dv.affmod = 0;
   dv.s.left=obj.pos_x+"px";
   dv.s.top=obj.pos_y+"px";
   dv.s.zIndex=(10+1*obj.pos_z);
   var ti = mkaddhtml("p",dv);
   ti.className="ztitle";
   dv.ti=ti;
   var spt = mkaddhtml("span",ti);
   spt.innerHTML = obj.desc_type;
   dv.spt = spt;
   var spl = mkaddhtml("a",ti);
   spl.innerHTML = obj.desc_title;
   spl.dv = dv;
   spl.onclick = function() { stdTitleClick(this); };
   dv.spl=spl;
   var spx = mkaddhtml("a",ti);
   spx.dv = dv;
   spx.className="ztitlex";
   spx.title="Fermer";
   spx.onclick = function() { stdXClick(this); }
   dv.spx = spx;
   var di = mkaddhtml("div",dv);
   dv.di = di;

   if (depl) stdActivData(dv);
  }
}

function clActivData(dv)
{
 var cd = dv.obj.code;
 if(cd!="")
 {
   eval(cd);
 } else {
  var dt = dv.obj.data;
  dv.affmod=1;
  dv.di.innerHTML=dt;
 }
}
function clTitleClick(l)
{
 if (stdselecting!=null)
 {
   stdselecting.objselected(l.dv);
   stdselecting = null;
   return;
 }
 if (l.dv.affmod==0)
 {
   clActivData(l.dv);
 } else
 if (l.dv.affmod==1)
 {
   l.dv.affmod=2;
   l.dv.di.style.visibility="hidden";
   l.dv.di.style.height="1px";
   l.dv.di.style.width="1px";
 } else
 if (l.dv.affmod==2)
 {
   l.dv.affmod=1;
   l.dv.di.style.visibility="visible";
   l.dv.di.style.height="";
   l.dv.di.style.width="";
 }
}
function clDivClick(d)
{
 if (stdselecting!=null)
 {
   stdselecting.objselected(d);
   stdselecting = null;
   return;
 }
}
function model_classic(obj,depl)
{
  var bdy = document.body;
  var create = true;
  var cobj = getelt(obj.id); // div
  if (cobj!=null)
  {
   if (create) // si a recreer on efface
   {
     bdy.removeChild(cobj);
   }
  }
  if (create)
  {
   var dv = mkhtml("div");
   var tr = null;
   var rf = false;
   var i;
   var cn = bdy.childNodes;
   for (i=cn.length-1;(i>=0)&&(!rf);i--)
   {
     var nd = cn[i];
     if (nd.nodeName=="DIV")
     {
       if ((typeof(nd.obj)!="undefined")&&(nd.className=="clbox"))
       {
         if ((1*nd.obj.pos_y)>(1*obj.pos_y))
	 {
	   tr=nd;
	 }
	 else rf=true;
       }
     }
   }
   if (tr!=null) bdy.insertBefore(dv,tr);
   else bdy.appendChild(dv);
   dv.s=dv.style;
   dv.className="clbox";
   dv.id = obj.id;
   dv.obj = obj;
   dv.affmod = 0;
   //dv.s.top=obj.pos_y+"px";
   dv.s.zIndex=(10+1*obj.pos_z);
   dv.onclick = function() { clDivClick(this); };
   if ((obj.desc_title!="")&&(obj.desc_title.charAt(0)!='#'))
   {
   var ti = mkaddhtml("p",dv);
   ti.className="cltitle";
   dv.ti=ti;
   var spl = mkaddhtml("a",ti);
   spl.innerHTML = obj.desc_title;
   spl.dv = dv;
   spl.onclick = function() { clTitleClick(this); };
   dv.spl=spl;
   }
   var di = mkaddhtml("div",dv);
   dv.di = di;

   if (depl) clActivData(dv);
  }
} // model_classic

function affObjs(objs)
{
 var i;
 for (i=0;i<objs.length;i++)
 {
  var obj = objs[i];
  if (obj.desc_model=="") model_std(obj);
  else eval(obj.desc_model);
 }
}

// -- automatismes

function purgeListobj()
{
  var i;
  var bdy = document.body;
  var cn = bdy.childNodes;
  for (i=cn.length-1;i>=0;i--)
  {
    var nd = cn[i];
    if (nd.nodeName=="DIV")
    {
      if ((typeof(nd.obj)!="undefined"))
      {
        if ((1*nd.obj.acc_aff)>zrnk) bdy.removeChild(nd);
      }
      else if ((1*nd.acc_aff)>zrnk) bdy.removeChild(nd);
    }
  }
}

// retour avec chgt de rnk
function retRnk(ret)
{
  if (ret.result!="OK") { affmsg(ret.result,"rnk"); return; }
  hidemsg("std");
  zrnk = 1*ret.rnk;
  // del objs
  purgeListobj();  
  // rechargt
  callListobj();
}
function retObj(ret)
{
 affmsg("Resultat: "+ret.result,"std",2000);
 if (ret.obj!=null)
 {
   affObjs(ret.obj);
 }
}
// retour standard: affiche msg
function retStd(ret)
{
 affmsg("Resultat: "+ret.result,"std",2000);
}

function submitFormA()
{
 var data ="";
 var i;
 for (i=0;i<this.champs.length;i++)
 {
   var ch = this.champs[i];
   if (i>0) data = data + "&";
   data = data+ch.name+"="+uec(ch.inp.value);
 }
 doCall(rmtpage,this.rmtFunc,data,this.retFunc);
 affmsg("Transmission..","std");
 return(false);
}

// champs : tableau conservé et modifié -> ne pas réutiliser
function genForm(parentfrm,champs)
{
 var frm = mkaddhtml("form",parentfrm);
 frm.champs = champs;
 frm.onsubmit = frmfalse;
 var i;
 var tb = mkaddhtml("table",frm);
 var tbd = mkaddhtml("tbody",tb);
 frm.tbd=tbd;
 var tr;
 var td;
 for (i=0;i<champs.length;i++)
 {
   var ch = champs[i];
   tr = mkaddhtml("tr",tbd);
   td = mkaddhtml("td",tr);
   td.innerHTML = ch.lib;
   td = mkaddhtml("td",tr);
   if ((typeof(ch.t)=="undefined")||(ch.t=="i"))
     td.innerHTML = "<input name='"+ch.name+"'/>";
   else if (ch.t=="ro")
     td.innerHTML = "<input name='"+ch.name+"' readonly/>";
   else if (ch.t=="p")
     td.innerHTML = "<input type='password' name='"+ch.name+"'/>";
   else if (ch.t=="h")
     td.innerHTML = "<input type='hidden' name='"+ch.name+"'/>";
   else if (ch.t=="t")
     td.innerHTML = "<textarea name='"+ch.name+"' cols='"+ch.tcols+"' rows='"+ch.trows+"'></textarea>";
   champs[i].inp = td.firstChild;
 }
 return(frm);
}

function genFormOK(frm,txt)
{
 if ((txt==null)||(txt=="")) txt="OK";
 var tbd = frm.tbd;
 var tr;
 var td;
 tr = mkaddhtml("tr",tbd);
 td = mkaddhtml("td",tr);
 td.colspan=2;
 td.innerHTML = "<input type='submit' value=' "+txt+" '/>";
}

function genFormA(parentfrm,champs,rmtFunc,retFunc)
{
 var frm = genForm(parentfrm,champs);
 frm.onsubmit = submitFormA;
 frm.rmtFunc = rmtFunc;
 frm.retFunc = retFunc;
 genFormOK(frm);
 return(frm);
}

// -- appels distants
var rmtpage = "ex.php";

function callListobj()
{
 var data ="";
 doCall("ex.php","listobj",data,retListobj);
 affmsg("Chargement...","obj");
}
function retListobj(ret)
{
 affObjs(ret.result);
 hidemsg("obj");
}

function chZone(zone)
{
 var data ="pzone="+zone;
 doCall("ex.php","chzone",data,retChZone);
 affmsg("Chargement...","zone");
}
function retChZone(ret)
{
 if (ret.result.length>0)
 {
   var zn = ret.result[0];
   zposzone=zn.id;
   callListobj();
   window.scrollTo(zn.pos_x,zn.pos_y);
 }
 else
 hidemsg("zone");
}
// en travaux ..

function srvMgr()
{
  var dv = stdDiv();
  dv.s.left="10px";
  dv.s.top="10px";
  dv.stm=mkaddhtml("span",dv);
  dv.stm.innerHTML="N/A";
  mkaddhtml("br",dv);
  dv.inf=mkaddhtml("span",dv);
  dv.inf.innerHTML="N/A";
}


window.onload=function()
{
}


