// $Id: util.js,v 1.10 2008-02-23 14:36:20 patrick Exp $ 

function display_toggle(id)
{
 var e=document.getElementById(id);
 if (!e) return;
 if (e.style.display != 'none')
 {
  e.style.display='none';
 }
 else
 {
  e.style.display='';
 }
}

function display_hide(id)
{
 var e=document.getElementById(id);
 if (!e) return;
 e.style.display='none';
}

function display_showblock(id)
{
 var e=document.getElementById(id);
 if (!e) return;
 e.style.display='block';
}

function form_display_errors (gid,con)
{
 if (!gid) return;
 if (!con) con='forms_itemerroron';
 
 var haserror=0;
 var pattern=new RegExp('(^| )'+con+'( |$)');

 var es=document.getElementsByTagName("*");
 for(var i=0;i<es.length;i++)
 {
  if (! pattern.test(es[i].className)) continue;
  haserror++;
 }

 if (haserror)
 {
  document.getElementById(gid).firstChild.data=haserror;
  document.getElementById(gid).parentNode.style.display='block';
 }
}

// Voir http://blog.virgule.info/2005/12/13/106-treewalker-xpath-et-getelementsbytagname-sont-dans-un-bateau
// XPath plus rapide
function getElementsByClassName(classname,tag,node)
{
    var a = [];
    if (tag == null) tag='*';
    if (node == null) node=document;
    var re = new RegExp('(^|\\s)' + classname + '(\\s|$)');
    var els = node.getElementsByTagName(tag);
    for(var i=0,j=els.length; i<j; i++)
        if (els[i].nodeType==Node.ELEMENT_NODE && els[i].hasAttribute("class") && (els[i].className == classname || re.test(els[i].className))) a.push(els[i]);
    return a;
}


var add_event;

if (document.addEventListener) 
{
  add_event = function(element, type, handler) {
    element.addEventListener(type, handler, false);
  };
} else if (document.attachEvent) {
  add_event = function(element, type, handler) {
    element.attachEvent('on' + type, handler);
  };
} else {
  add_event = new Function;
}

function deplier_setup(t)
{
 if (t == null) t='div';
 var off=(t == 'div')? 1 : 0;
 var a=getElementsByClassName('depliertitle',t);
 var re=new RegExp('(^|\\s)depliercontent(on|off)(\\s|$)');
 var fd=document.createElement('span').appendChild(document.createTextNode('\u25B6\u00A0'));
 var fb=document.createElement('span').appendChild(document.createTextNode('\u25BC\u00A0'));
 var fc=document.createElement('span').appendChild(document.createTextNode('\u25A0\u00A0'));
 var sre=new RegExp('(^|\\s)depliercontentoff(\\s|$)');
 for(var i=0;i<a.length;i++)
 {
  var c=(a[i].parentNode.getElementsByTagName('div'))[off];
  if (c.childNodes.length==0 || (c.childNodes.length==1 && c.firstChild.nodeType == Node.TEXT_NODE && c.firstChild.data.length <= 3))
  {
   a[i].insertBefore(fc.cloneNode(1),a[i].firstChild);
   a[i].className=String(a[i].className).replace(/depliertitle/,'');
  } else
  {
   var sc=new String(c.className);
   var fs=sc.match(sre)? fd : fb;
   a[i].insertBefore(fs.cloneNode(1),a[i].firstChild);
   add_event(a[i],'click',_deplier_setup_click(a[i],re,fd,fb,off));
  }
 }
}
 
function _deplier_setup_click (e,re,fd,fb,off)
{
 return function () {
 	var s=e.parentNode.getElementsByTagName('div')[off];
 	var sc=new String(s.className);
	var a=sc.match(re);
	s.className=a[1]+'depliercontent'+(a[2]=='off'? 'on' : 'off')+a[3];
	e.replaceChild(a[2]=='off'? fb.cloneNode(1) : fd.cloneNode(1),e.firstChild);
 };
}


function object_position(obj)
{
 var curleft=0;
 var curtop=0;
 if (obj.offsetParent) 
 {
  curleft=obj.offsetLeft;
  curtop=obj.offsetTop;
  obj=obj.offsetParent;
  while (obj) 
  {
   curleft += obj.offsetLeft;
   curtop += obj.offsetTop;
   obj=obj.offsetParent;
  }
 }
 return [curleft,curtop];
}

function mouse_coords(event)
{
 if (!event) event=window.event;
 if(event.pageX || event.pageY) return [event.pageX,event.pageY];
 return [event.clientX+document.body.scrollLeft-document.body.clientLeft,event.clientY+document.body.scrollTop-document.body.clientTop];
}

function event_stop(event)
{
 if (!event) event=window.event; 
 event.cancelBubble=true; 
 if (event.stopPropagation) event.stopPropagation();
}

function mouse_offset(target,ev)
{
 var dpos=object_position(target);
 var mpos=mouse_coords(ev);
 return [mpos[0]-dpos[0],mpos[1]-dpos[1]];
}

function event_target(e) { var targ; if (!e) e=window.event; if (e.target) targ=e.target; else if (e.srcElement) targ=e.srcElement; return targ; }

function debug (msg)
{
 var d=document.getElementById('debug');
 if (!d) return;
 var now=new Date();
 d.firstChild.data=msg+' '+now.toLocaleTimeString();
}