function CustomNode() {}
CustomNode.posRelative = function(node) {
  var left = parseInt(node.style.left.substr(0, node.style.left.length-2), 10);
  var top  = parseInt(node.style.top.substr(0, node.style.top.length-2), 10);
  return new Point(left, top);
}

CustomNode.nodeName = function(node) {
  return node.nodeName.toLowerCase();
}

CustomNode.posAbsolute = function(node) {
    var curleft = curtop = 0;

    if (node.offsetParent) {
	curleft = node.offsetLeft;
	curtop = node.offsetTop;
	var elt = node.offsetParent;
	while (elt) {
	    curleft += elt.offsetLeft;
	    curtop += elt.offsetTop;
	    elt = elt.offsetParent;
	}
    }
    //alert(curleft+" "+curtop);

    //Debug.warning(document.getElementById('test').scrollLeft);
    var elt = node;
    while (elt && elt!=document.body) {
	curleft -= elt.scrollLeft;
	curtop -= elt.scrollTop;
	elt = elt.parentNode;
    }

    return new Point(curleft, curtop);
}

CustomNode.posAbsoluteRightBottom = function(node) {
    var pos = CustomNode.posAbsolute(node);
    var right = pos.x() + node.offsetWidth;
    var bottom = pos.y() + node.offsetHeight;
    
    return new Point(right, bottom);
}

CustomNode.width = function(node) { return node.offsetWidth; }
CustomNode.height = function(node) { return node.offsetHeight; }

CustomNode.contains = function(node, pos) {
    var posElt = CustomNode.posAbsolute(node);
    if (pos.x()<posElt.x()) return false;
    if (pos.x()>posElt.x()+node.offsetWidth) return false;
    if (pos.y()<posElt.y()) return false;
    if (pos.y()>posElt.y()+node.offsetHeight) return false;
    return true;
}

CustomNode.enterTop = function(node, pos) {
    var posElt = CustomNode.posAbsolute(node);
    if (pos.y()-posElt.y()<posElt.y()+node.offsetHeight-pos.y()) return true;
    return false;
}
CustomNode.enterBottom = function(node, pos) {
    return !CustomNode.enterTop(node, pos);
}

CustomNode.swapChilds = function(child1, child2) {
    var parent = child1.parentNode;
    if (parent!=child2.parentNode) {
	Debug.error("Node.swapChilds sur deux nodes qui n'ont pas le même parent");
	return;
    }

    if (!child1.nextSibling) {
	//Debug.infos("child1.nextSibling==null");
	parent.replaceChild(child1, child2);
	parent.appendChild(child2);

    } else if (!child2.nextSibling) {
	//Debug.infos("child2.nextSibling==null");
	parent.replaceChild(child2, child1);
	parent.appendChild(child1);

    } else {
	var insertBefore = child1.nextSibling;
	if (insertBefore==child2) {
	    insertBefore = child2.nextSibling;
	    parent.replaceChild(child2, child1);
	    parent.insertBefore(child1, insertBefore);

	} else {
	    parent.replaceChild(child1, child2);
	    parent.insertBefore(child2, insertBefore);
	}
    }
}
CustomNode.removeChilds = function(node) {
    while (node.firstChild) node.removeChild(node.firstChild);
}
function Mouse() { }

Mouse.pos = function(evt) {
    var evt = evt?evt:window.event?window.event:null; if(!evt) { return null;}

    var x, y;
    if (evt.pageX) {
	x = evt.pageX;
	y = evt.pageY;
    } else {
	x = evt.clientX + document.documentElement.scrollLeft;
	y = evt.clientY + document.documentElement.scrollTop;
    }
    //Debug.warning(x+" "+y);    
    return new Point(x, y);
}

Mouse.rightClick = function(evt) {
    if ((!document.all && evt.which==3) || 
	(document.all && window.event.button==2)) return true;
    return false;
}

function Point(x, y) {
  this._x = x;
  this._y = y;

  this.x = function() { return this._x; }
  this.y = function() { return this._y; }
}

Point.prototype.debug = function() { 
    return "x="+this._x+" y="+this._y; 
}

Point.prototype.inside = function(elt) {
    var pos = CustomNode.posAbsolute(elt);
    
    var ml = 0;
    var mr = 0;
    var mt = 0;
    var mb = 0;
    if (elt.style.marginLeft) ml = parseInt(elt.style.marginLeft.substr(0, elt.style.marginLeft.length-2), 10);
    if (elt.style.marginRight) mr = parseInt(elt.style.marginRight.substr(0, elt.style.marginRight.length-2), 10);
    if (elt.style.marginTop) mt = parseInt(elt.style.marginTop.substr(0, elt.style.marginTop.length-2), 10);
    if (elt.style.marginBottom) mb = parseInt(elt.style.marginBottom.substr(0, elt.style.marginBottom.length-2), 10);

    debug2(elt.nodeName+" "+elt.style.marginTop);

    if (this._x<pos.x()-ml) return false;
    if (this._x>pos.x()+elt.offsetWidth+mr) return false;
    if (this._y<pos.y()-mt) return false;
    if (this._y>pos.y()+elt.offsetHeight+mb) return false;

    debug("mouse inside : " + elt.id +" :"+this.debug()+" "+pos.debug()+" w="+elt.offsetWidth+" h="+elt.offsetHeight);
    return true;
}

function Tools() { }

Tools.getTargetEvent = function(evt) {
    var target;
    var event = evt || window.event;
    if (event.target) target = event.target;
    else target = event.srcElement;
    
    return target;
}
Tools.toggleDisplayElement = function(eltName) {
    var elt = document.getElementById(eltName);
    if (elt==null) {
	alert("L'element "+eltName+" n'existe pas");
	return false;
    }

    if (elt.style.display=="none") elt.style.display = "block";
    else elt.style.display = "none";
    
    return false;
}

Tools.sizeOctets = function(numOctets) {
    var size, unit;
    if (numOctets>1048576) {
	size = Tools.arrondi(numOctets/1048576., 2);
	unit = 'Mo';
    } else if (numOctets>1024) {
	size = Tools.arrondi(numOctets/1024., 2);
	unit = 'Ko';
    } else {
	size = numOctets;
	unit = 'O';
    }
    
    return size + " " + unit;
}
Tools.arrondi = function(nombre, precision) {
    var coef = Math.pow(10, precision);
    nombre = Math.round(nombre*coef) / coef;
    return nombre;
}
Tools.urlParameters = function(url) {
    var pos = url.indexOf('?');
    if (pos==-1 || pos==url.length) return new Array();
    var paramsStr = url.substring(pos+1, url.length);

    var args  = paramsStr.split('&');

    var params = new Array();
    for (var i=0;i<args.length;i++) {
	pos = args[i].indexOf('=');
	if (pos<1) continue;

	var name = args[i].substring(0, pos);
	var value = "";
	if (pos+1<args[i].length) value = args[i].substring(pos+1, args[i].length);

	params[name] = value;
    }

    return params;
}
Tools.forceReloadAntiHackImage = function(idImg) {
    var img = document.getElementById(idImg);
    if (img==null) return;

    var pos = img.src.indexOf('?');
    if (pos==-1) {
	img.src += '?new='+Math.random();
	return;
    }

    var array = Tools.urlParameters(img.src);
    array['new'] = Math.random();

    img.src = img.src.substring(0, pos+1);
    var first = true;
    for (key in array) {
	if (first) first = false;
	else img.src += '&';
	img.src += key+'='+array[key];
    }
}

Tools.isInteger = function(str) {
    var i = parseInt(str, 10);
    if (i!=str) return false;
    return true;
}

Tools.secsToHuman = function(secs) {
    var h = Math.floor(secs/3600);
    var m = Math.floor((secs-h*3600)/60);
    var s = secs - h*3600 - m*60;
    if (s>30) m++;

    if (h>0) return h+"h " + m+"mn";
    else if (m>0) return m+"mn";
    else return "< 1mn";
}

function FrameOnload() { }
FrameOnload._obj = null;

FrameOnload.createIfNotExists = function() {
    var iframe = null;
    iframe = document.getElementById('iframeForm');
    if (iframe!=null) return iframe;

    if (browser.ie()) iframe = document.createElement('<iframe name="iframeForm" id="iframeForm" src="" style="display: none; width: 0px; height: 0px; margin: 0; padding: 0; border: 0;" onload="FrameOnload.onload();"></iframe>');
    else {
	iframe = document.createElement('iframe');
	iframe.name = "iframeForm";
	iframe.id = "iframeForm";
	iframe.src = "";
	iframe.style.width = "0px";
	iframe.style.height = "0px";
	iframe.style.display = "none";
	iframe.style.margin = "0px";
	iframe.style.padding = "0px";
	iframe.style.border = "0px solid black";
	iframe.onload = FrameOnload.onload;
    }
    document.body.appendChild(iframe);

    return iframe;
}
FrameOnload.setObj = function(obj) { 
    FrameOnload.createIfNotExists();
    FrameOnload._obj = obj; 
    return true;
}
FrameOnload.obj = function() { return FrameOnload._obj; }
FrameOnload.onload = function() {
    if (FrameOnload._obj==null) return;
    var iframe = document.getElementById('iframeForm');

    /*
    var str = "";
    var iframes = document.getElementsByTagName('iframe');
    for (var i=0;i<iframes.length;i++) str += iframes[i].name+" ";
    alert(str);
    */

    var doc = iframe.contentDocument;
    if (doc==null) doc = iframe.contentWindow.document;
    if (doc!=null) {
	var textareas = doc.getElementsByTagName('textarea');
	//alert(doc.body.innerHTML);

	if (textareas.length==0) {
	    FrameOnload._obj = null;
	    iframe.src = "";
	    alert("Erreur du serveur, réponse non conforme...");
	    //alert(doc.body.innerHTML);
	    return;
	}
	rep = textareas[0].value;       
	var a = Ajax.jsonDecode(textareas[0].value);
	if (a!=null) FrameOnload._obj.onFormResponse(a);

    } else alert('ouups, doc=null');

    FrameOnload._obj = null;
    iframe.src = "";
}

String.prototype.trim = function() {
    return this.replace(/(^\s*)|(\s*$)/g,'');
} 
String.prototype.evalScripts = function() {
  resultat = this.match(/<script[^>]*>([\s\S]*?)<\/script>/g);
  if (!resultat) return;

  for (i=0;i<resultat.length;++i) {
      var res = resultat[i].replace(/<script[^>]*>([\s\S]*)<\/script>/, '$1');
      //alert(res);
      eval(res);
  }
}
    
function Rect(posLeftTop, posRightBottom) {
    this._leftTop = posLeftTop;
    this._rightBottom = posRightBottom;
}

Rect.prototype.contains = function(pos) {
    if (pos.x()<this._leftTop.x()) return false;
    if (pos.x()>this._rightBottom.x()) return false;
    if (pos.y()<this._leftTop.y()) return false;
    if (pos.y()>this._rightBottom.y()) return false;
    return true;
}

var browser = new Browser();
function Browser() {
    this._browser = navigator.appName;
    this._version = parseFloat(navigator.appVersion);
	
    this._name = "inconnu";
    if (this._browser=='Microsoft Internet Explorer') this._name = 'ie';
    else if (navigator.userAgent.toLowerCase().indexOf('opera')!=-1) this._name = 'opera';
    else this._name = 'mozilla';
    
    this.name = function() { return this._name; }
    this.ie = function() { if (this._name=="ie") return true; return false; }

    this.bodyOfIframe = function(iframe) {
	if (iframe==null) return null;

	var doc;
	if (iframe.contentDocument) doc = iframe.contentDocument; // For NS6
	else if (iframe.contentWindow) doc = iframe.contentWindow.document; // For IE5.5 and IE6
	else if (iframe.document) doc = iframe.document; // For IE5
	else return null;
	    
	return doc.body;
    }
}

Date.fromMySQL = function(str) {
    if ( (typeof str)!="string") return new Date(1970, 0, 1);

    var annee = parseInt(str.substr(0, 4), 10);
    var mois = parseInt(str.substr(5, 2), 10)-1;
    var jour = parseInt(str.substr(8, 2), 10);
    var heures = parseInt(str.substr(11, 2), 10);
    var minutes = parseInt(str.substr(14, 2), 10);
    var secondes = parseInt(str.substr(17, 2), 10);
    
    return new Date(annee,mois,jour,heures,minutes,secondes);
}
Date.prototype.dateOrDatetimeFr = function() {
    var annee = this.getYear();
    var mois = this.getMonth();
    var jour = this.getDate();
    var heures = this.getHours();
    var minutes = this.getMinutes();
    var secondes = this.getSeconds();
    
    var isToday = true;
    var date = new Date();
    if (date.getYear()!=annee || date.getMonth()!=mois || date.getDate()!=jour) isToday = false;

    annee += 1900;
    mois += 1;

    mois = (mois<10) ? '0'+mois : mois;
    jour = (jour<10) ? '0'+jour : jour;
    heures = (heures<10) ? '0'+heures : heures;
    minutes = (minutes<10) ? '0'+minutes : minutes;
    secondes = (secondes<10) ? '0'+secondes : secondes;

    var str = heures+":"+minutes;
    if (!isToday) str = jour+"/"+mois+"/"+annee+" "+str;

    return str;
}

function Debug() {}
Debug.appendLI = function(messg, color) {
    var ul = document.getElementById('debug');
    if (ul==null) {
	var ul = document.createElement('ul');
	ul.id = 'debug';
	document.body.appendChild(ul);
    }

    var li = document.createElement('li');
    li.innerHTML = messg;

    li.style.color = color;

    ul.appendChild(li);

    return li;
}

Debug.error   = function(messg) { Debug.appendLI(messg, "red"); }
Debug.warning = function(messg) { Debug.appendLI(messg, "orange"); }
Debug.infos   = function(messg) { Debug.appendLI(messg, "green"); }

function OnLoad() {}
OnLoad.funcs = new Array();
OnLoad.add = function(func) {
    if (OnLoad.funcs.length==0) window.onload = OnLoad.onload;
    OnLoad.funcs.push(func);
}
OnLoad.onload = function() {
    for (var i=0;i<OnLoad.funcs.length;i++) OnLoad.funcs[i]();
}

function OnUnload() {}
OnUnload.funcs = new Array();
OnUnload.add = function(func) {
    if (OnUnload.funcs.length==0) window.onunload = OnUnload.onunload;
    OnUnload.funcs.push(func);
}
OnUnload.onunload = function() {
    for (var i=0;i<OnUnload.funcs.length;i++) OnUnload.funcs[i]();
}
    
function Popup() {}
Popup.standard = "toolbar=0,location=0,directories=0,menuBar=0,scrollbars=1,resizable=1";
Popup.open = function(url, nom, width, height, params) {
    var p;
    if (!params) p = Popup.standard;
    else p = params;
    
    p += ",width="+width;
    p += ",height="+height;
    window.open(url, nom, p);
}

function Cookie() {}

Cookie.write = function(nom, valeur) {
    var now = new Date() ;
    var expires = new Date() ;
    expires.setTime( now.getTime() + 365*24*3600*1000 );
    
    document.cookie = nom+"="+encodeURI(valeur)+"; expires="+expires.toGMTString();
}
    
Cookie.load = function(name) {
    if (!document.cookie) return "";

    var index = document.cookie.indexOf(name);
    if (index==-1) return "";

    var nDeb = document.cookie.indexOf("=", index) + 1;
    var nFin = document.cookie.indexOf(";", index);

    if (nFin==-1) nFin = document.cookie.length;
    return decodeURI(document.cookie.substring(nDeb, nFin));
}

