// 080911, Eric Baradat, Basic.js

var SPAF={}; // SPAF is now true because empty objects are true.
SPAF.IE= false;

SPAF.elementHasClass=function (element, className)
  {
  return $(element).hasClass(className);
  }
SPAF.elementAddClass=function (element, className)
  {
  $(element).addClass(className);
  }
SPAF.elementRemoveClass=function (element, className)
  {
  $(element).removeClass(className);
  }

SPAF.elementCoords=function (element)
  {
  var o= $(element), rx, ry, x, y, w, h;
  rx= o.position().left; ry= o.position().top;
  x= o.offset().left; y= o.offset().top;
  w= o.outerWidth(true); h= o.outerHeight(true);
  return {rx: rx, ry: ry, x: x, y: y, w: w, h: h};
  }
SPAF.elementSetCoords=function (element,c)
  {
  var o= $(element);
  if (c) {
    if (c.x!==undefined || c.y!==undefined) {
      o.offset({
        left: (c.x!==undefined ? c.x : o.offset().left),
        top:  (c.y!==undefined ? c.y : o.offset().top)});}
    if (c.w!==undefined) o.width(c.w);
    if (c.h!==undefined) o.height(c.h);}
  }

SPAF.objPos=function (o)
  // Position d'un élément de la page html.
  // 'o' may be the 'id' of an element.
  {
  var x=0, y=0;
  if (typeof(o)==='string') o=document.getElementById(o);
  while (o!=null) {x+=o.offsetLeft; y+=o.offsetTop; o=o.offsetParent;}
  return {x: x, y: y};
  }

SPAF.objMidPos=function (o)
  // Milieu d'un élément de la page html.
  // 'o' may be the 'id' of an element.
  {
  var x=0, w=0, y=0, h=0;
  if (typeof(o)==='string') o=document.getElementById(o);
  if (o) {w=(o.offsetWidth/2); h=(o.offsetHeight/2);}
  while (o!=null) {x+=o.offsetLeft; y+=o.offsetTop; o=o.offsetParent;}
  return {x: x+w, y: y+h};
  }

SPAF.objSize=function (o)
  // Taille d'un élément de la page html.
  // 'o' may be the 'id' of an element.
  {
  var w=0, h=0;
  if (typeof(o)==='string') o=document.getElementById(o);
  if (o) {w=o.offsetWidth; h=o.offsetHeight;}
  return {w: w, h: h};
  }

SPAF.objSetPos=function (o, pos, zindex)
  {
  o.style.cssText='position:absolute; top:'+(pos.y)+'px; left:'+(pos.x)+'px;'+
    (zindex?(' z-index:'+zindex+';'):'');
  }

SPAF.objSetSize=function (o, sz)
  {
  o.style.cssText='width:'+sz.w+'px; height:'+sz.h+'px;';
  }

SPAF.timeout=function (t0,dt)
  {
  var x;
  if (!t0) {x=new Date(); t0= x.getTime();}
  setTimeout("SPAF.timeoutAlert("+t0+")",dt);
  }
SPAF.timeoutAlert=function (t0)
  {
  var x,t,dt,ndt,l,m0,m,c,rgb,dt1;
  x=new Date(); t= x.getTime(); dt= t-t0;
  l=document.getElementById('message');
  if (l) {
    m= null; m0= 'Sans action de votre part, vous serez déconnecté dans ';
    if (dt>=20*60*1000) {
      m= 'Votre session a expirée. Pour vous reconnecter, '+
         'cliquez <a href="?q=logout" style="color:DarkRed">ICI</a>.';
      ndt=0;}
    else if (dt>=19*60*1000) {m= m0+'1 minute.' ;       ndt= 20*60*1000-dt;}
    else if (dt>=18*60*1000) {m= m0+'2 minutes.';       ndt= 19*60*1000-dt;}
    else if (dt>=17*60*1000) {m= m0+'3 minutes.';       ndt= 18*60*1000-dt;}
    else if (dt>=.5*60*1000) {
      // entre 30 et 60 secondes, on éclaircit le message
      dt1= 30;
      if ((c= (dt-.5*60*1000)/1000)>dt1) c= dt1; c= Math.floor(7*c);
      rgb= 'rgb('+c+','+c+','+c+')';
      $(l).css('color',rgb);
      if (c>=7*dt1) $(l).css('background','none');
                                    ndt= (c<7*dt1 ? 2*1000 : 17*60*1000-dt);}
    else                     {                          ndt= .5*60*1000-dt;}
    if (m) l.innerHTML= '<span style="color:DarkRed;">'+m+'</span>';
    if (ndt) SPAF.timeout(t0,ndt);}
  }

SPAF.log=(function ()
  {
  var l=null,count=0,args=arguments; // private vars
  function parcourir(obj) // private function
    {
    var s,prop,x;
    s='(>'+typeof obj+':'+obj+'<)';
    if (typeof obj==='object') {
      s+= ' is an object';
      for (prop in obj) {
        x= false;
        if (typeof obj[prop]==='function') {}
        else if (SPAF.IE || obj.hasOwnProperty(prop)) x= '     ';
        else x= '     (inherited)';
        if (x) {s+= '\n'+x+prop+' :'+typeof obj[prop]+': '+obj[prop];}}}
    return s;
    }
//l=document.getElementById('log'); // cannot be initialized here because the document is not yet build
  return function (o)
    {
    if (!l) { // initialization (only once)
      count+=100;
      l=document.getElementById('log');
      if (l) l.innerHTML='<h1 style="text-align:center">Console:</h1>';}
    if (l) {
      for (var a=l.firstChild, z; a!==(z=l.lastChild);) {l.removeChild(z);}
      var ts=parcourir(o).split('\n'),p;
      l.appendChild(document.createTextNode(count+=1));
      for (var i=0, n=ts.length; i<n; i++) {
        p=document.createElement('p');
        p.appendChild(document.createTextNode(ts[i]));
        l.appendChild(p);}}
    };
  }) ();

///// TAXON

SPAF.newXhr=function (o)
  // XMLHttpRequest.
  {
  var xhr=null;
  if (XMLHttpRequest) {try {xhr=new XMLHttpRequest();} catch(e1) {xhr=null;}}
  else if (ActiveXObject) { // YAHOO uses this order !
    try {xhr=new ActiveXObject('Microsoft.XMLHTTP' );} catch(e2) {
      try {xhr=new ActiveXObject('MSXML2.XMLHTTP.3.0');} catch(e3) {
        try {xhr=new ActiveXObject('MSXML2.XMLHTTP'    );} catch(e4) {
          xhr=null;}}}}
  else alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
  return xhr;
  }

SPAF.selectAppend=function (select, lib, val, optSelected)
  {
  var option= new Option(lib,val);
  if (optSelected) option.selected=true;
//$(select).add(option); // pb avec MapVfMailles (dep et com)
  if (!SPAF.IE) select.add(option,null);
  else select.add(option);
  }

SPAF.doXhr=function (element,request,url,doIt)
  // element est le premier arg de la fonction doIt. Peut être null.
  // element porte la xhr pendant la transaction.
  // si element possède déjà une xhr, la fonction retourne false.
  // si element a une value, elle est envoyée comme argument de la requête.
  // request: nom de la requête.
  // url: l'url de la requête depuis SPAF.root
  // doIt(element, state, response): response est la réponse json renvoyée.
  // state est 1 si la xhr n'a pu être créée
  // state est 2 si la xhr répond en échec
  // state est 3 si la xhr répond correctement (response non null)
  {
  var xhr, state, response;
  if (element && element.xhr) return false;
  if (!(xhr= SPAF.newXhr())) doIt(element, 1, null);    
  else {
    xhr.onload= function()
      {
      if (xhr.readyState===4) {
        if (xhr.status!==200) {r= 2; response= null;}
        else {r= 3; response= eval('('+xhr.responseText+')');}
        doIt(element, response, state);
        if (element) {
          element.xhr.onload= function() {};
          //element.xhr.abort();
          element.xhr= null;}}
      };
    xhr.open('POST', SPAF.root + url, true);
    xhr.setRequestHeader('Content-type', 'text/plain; charset=utf-8');
    xhr.send('{"demande":"'+request+'","argument":"'+
      (element ? SPAF.htmlspecialchars(element.value) : '')+
      '"}');
    if (element) element.xhr=xhr;
    }
  }

SPAF.runXhr=function (element,request,needsToRun,doIt,oInit,oWait,oEnd)
  // element est le html input text.
  // request: nom de la requête.
  // Toutes les fonctions suivantes prennent element en argument.
  // needsToRun est une fonction qui détermine si la requête doit avoir lieu.
  //   Elle doit vérifier notament si la ou les valeurs ont changées. Retourne
  //   0 (false) ou 1 ou -1(:abort mais on ne relance pas).
  //   Peut faire ce qu'elle veut sur element notament si -1:abort.
  // doIt(element, response): response est la réponse json renvoyée.
  // Toutes les fonctions suivantes sont optionnelles.
  // oInit est une fonction d'initialisation de element qui si elle existe doit
  //   positionner element.initOk= true.
  // oEnd(element,needsToRunResult): si quelque chose à faire lors de l'arrêt
  //   d'une requête. Si 'needsToRunResult' vaut
  //     -1:abort la requête est stoppée;
  //      1: la requête est remplacée par une nouvelle;
  //      2: la requête est finie en erreur;
  //      3: la requête est finie en status ok (200).
  {
  var r,xhr,response;
  function endXhr_(element, oEnd, state) // private
    {
    if (element.xhr) {
      element.xhr.onreadystatechange= function() {};
      //element.xhr.abort();
      element.xhr= null;
      if (oEnd) oEnd(element, state);}
    }
  if (element.initOk===undefined) {
    if (oInit) {element.initOk= false; oInit(element);}
    else element.initOk= true;}
  if (element.initOk && (r= needsToRun(element))) {
    endXhr_(element, oEnd, r);
    if (r===1 && (xhr= SPAF.newXhr())) {
      xhr.onreadystatechange= function()
        {
        if (xhr.readyState===4) {
          if (xhr.status===200) {
            response= eval('('+xhr.responseText+')');
//SPAF.log(response);
            doIt(element, response);
            r= 3;}
          else r= 2;
          endXhr_(element, oEnd, r);}
        };
      xhr.open('POST', SPAF.root+'Responders/AjaxJson.php5', true);
      xhr.setRequestHeader('Content-type', 'text/plain; charset=utf-8');
      xhr.send('{"demande":"'+request+'","argument":"'+
        SPAF.htmlspecialchars(element.value)+
        '"}');
      element.xhr=xhr;
      if (oWait) oWait(element);}
    }
  }

SPAF.setAjaxPopup=function (element)
  // element est le html input text.
  {
  var i, os, n;
  if (!element.ajaxPopup) { // initialization
    // on cherche le popup correspondant
    var sibling,ring;
    sibling=document.getElementById('sfInst_'+element.id);
    ring=document.getElementById('AjaxPopupRing');
    if (sibling) {
      element.ok=true;
      element.ajaxPopup=sibling;
      var clone=[];
      for (i=0, os=sibling.options, n=os.length; i<n; i++) {
        clone.push({lib:os[i].text, val:os[i].value});}
      element.ajaxPopup0=clone;
      element.ajaxPopupRing=ring;
      element.oldValue=element.value;}
    else {element.ok=false;}}
  if (element.ok && element.value!=element.oldValue) { // la valeur a changé
    var v=element.value;
    element.oldValue=v;
    if (v.length===0 || (v.length===1 && v[0]===' ') ||
        (v.length===2 && v[1]===' ') || (v.length===3 && v[2]===' ') ||
        v.length===4 || v.length===5) {
      // v='' ou ' ' ou 'f ' ou 'gg [r]' ou 'gg  [r]' ou 'ggee[r]'
      if (element.xhr) { // abort de la modification en cours
        element.xhr.onreadystatechange=function() {};
        //element.xhr.abort();
        element.xhr=null;
        element.ajaxPopupRing.className='nonvisible';}
      if (v.length===0) { // retour à la liste initiale
        var l=element.ajaxPopup;
        while (l.length) {l.remove(l.options[0]);}
        for (i=0, os=element.ajaxPopup0, n=os.length; i<n; i++) {
          SPAF.selectAppend(l, os[i].lib, os[i].val);}}
      else { // rechercher la liste corespondante
        var xhr=SPAF.newXhr(); var pos;
        if (xhr) {
          xhr.onreadystatechange=function()
            {
            var getValueForTagName=function (o,name)
              {
              var vs=o.getElementsByTagName(name);
              return (vs.length?vs[0].firstChild.nodeValue:null);
              };
            if (xhr.readyState===4 && xhr.status===200) {
              var tmp=xhr.responseXML;
//SPAF.log(tmp.firstChild.nextSibling);
//SPAF.log(SPAF);
              var items;
              var l=element.ajaxPopup;
              var sel=l.value;
//SPAF.log(l);
              if (tmp) tmp=tmp.documentElement;
              items=!tmp?null:tmp.getElementsByTagName('élément');
              while (l.length) {l.remove(l.options[0]);}
              if (!items || (n=items.length)===0) {
                lib='--- pas de taxons ---';
                val='0';
                SPAF.selectAppend(l, lib, val);}
              else for (var i=0; i<n; i++) {
                var ii,lib,val;
                ii=items[i];
                lib=getValueForTagName(ii,'libellé');
                val=getValueForTagName(ii,'numéro');
                SPAF.selectAppend(l, lib, val, (val===sel));}}
            if (xhr.readyState===4) {
              element.xhr=null;
              element.ajaxPopupRing.className='nonvisible';}
            };
          xhr.open('POST', SPAF.root+'Responders/AjaxPopup2.php5', true);
          //xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
          xhr.setRequestHeader('Content-type', 'text/plain; charset=utf-8');
          xhr.send('<requête><la_requête>'+
            SPAF.htmlspecialchars(element.value)+
            '</la_requête></requête>');
          //xhr.send(element.value);
          element.xhr=xhr;
          pos=SPAF.objMidPos(element.ajaxPopup); pos.x-=21; pos.y-=6;
          SPAF.objSetPos(element.ajaxPopupRing, pos);
          element.ajaxPopupRing.className='visible';}}}}
  }

SPAF.setVfQuadrat=function (element)
  // Checkbox d'un quadrat vigie-flore.
  {
  var input,td,yes,x,p,l;
  input= document.getElementById(element.id.substr(1,element.id.length-1));
  if (input) {
    yes= input.value!=='1341';
//SPAF.log(input.value);
    input.value= (yes?'1341':'0');
    element.src= SPAF.root+'img/'+(yes?'check.png':'spacer.gif');
    td= document.getElementById(element.id+'_');
    if (td) {
      x= td.style.backgroundImage; p= x.lastIndexOf('.png')-1; l= yes?'l':'b';
      td.style.backgroundImage= x.substring(0,p)+l+x.substring(p+1);}}
  }

SPAF.fct=function (o)
  // Explanation.
  {
  var ret=null;
  return ret;
  }

SPAF.navigatorOk= function (idsToEnable, jsUnactivated)
  {
  function getInternetExplorerVersion_()
    // Returns the version of Internet Explorer or a -1
    // (indicating the use of another browser).
    {
    var rv= -1; // Return value assumes failure.
    if (navigator.appName==='Microsoft Internet Explorer') {
      var ua= navigator.userAgent;
      var re= new RegExp('MSIE ([0-9]{1,}[\.0-9]{0,})');
      if (re.exec(ua)!==null) rv= parseFloat(RegExp.$1);}
    return rv;}
  var ver= getInternetExplorerVersion_();
  if (ver>=8.0) SPAF.IE= true;
  var ok= ((ver===-1)||(ver>=8.0));
  var js= jsUnactivated?document.getElementById(jsUnactivated) : null;
  if (ok) {
    var n,i,x;
    if (idsToEnable && (n= idsToEnable.length)) for (i=0; i<n; i++) {
      if ((x= document.getElementById(idsToEnable[i]))) x.disabled=false;}
    if (js) js.style.cssText= 'display:none;';}
  else if (js) js.innerHTML= 'Merci d’utiliser la dernière version d’Internet '+
    'Explorer<br>ou un autre navigateur comme Firefox.';
  return ok;
  }

SPAF.htmlspecialchars=function (ch)
  {
  ch = ch.replace(/&/g ,"&amp;" );
  ch = ch.replace(/\"/g,"&quot;");
  ch = ch.replace(/\'/g,"&#039;");
  ch = ch.replace(/</g ,"&lt;"  );
  ch = ch.replace(/>/g ,"&gt;"  );
  return ch;
  }

