/*
 * Ajout de la méthode inArray à l'objet Array
 */
Array.prototype.inArray = function(sValue) {
   for(var i = 0; i < this.length; i++) {
      if(this[i] == sValue) return true;
   }
   return false;
}




/*
 * Permettre new XMLHttpRequest() dans IE sous Windows
 */
if (!window.XMLHttpRequest && window.ActiveXObject) {
  try {
    // Tester si les ActiveX sont autorises
    new ActiveXObject("Microsoft.XMLHTTP");
    // Definir le constructeur
    window.XMLHttpRequest = function() {
      var request;
      try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(exc) {
        request = new ActiveXObject('Msxml2.XMLHTTP');
      }
      return request;
    }
  }
  catch (exc) {}
} /* --------------------------------- */




//Fonction renvoyant le code de la touche appuyée lors d'un événement clavier
function getKeyCode(evenement)
{
    for (prop in evenement)
    {
        if(prop == 'which')
        {
            return evenement.which;
        }
    }

    return event.keyCode;
}


//Suppression des espaces/sauts de ligne inutiles (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C0C0062AC78)
function trim(value) {
   var temp = value;
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
   var obj = /  /g;
   while (temp.match(obj)) { temp = temp.replace(obj, " "); }
   return temp;
}

//Fonction donnant la largeur en pixels du texte donné (merci SpaceFrog !)
function getTextWidth(texte)
{
	//Valeur par défaut : 150 pixels
	var largeur = 150;

	if(trim(texte) == "")
	{
		return largeur;
	}

	//Création d'un span caché que l'on "mesurera"
	var span = document.createElement("span");
	span.style.visibility = "hidden";
	span.style.position = "absolute";

	//Ajout du texte dans le span puis du span dans le corps de la page
	span.appendChild(document.createTextNode(texte));
	document.getElementsByTagName("body")[0].appendChild(span);

	//Largeur du texte
	largeur = span.offsetWidth;

	//Suppression du span
	document.getElementsByTagName("body")[0].removeChild(span);
	span = null;

	return largeur;
}


//Fonction renvoyant une valeur "aléatoire" pour forcer le navigateur (ie...)
//à envoyer la requête de mise à jour
function ieTrick(sep)
{
	d = new Date();
	trick = d.getYear() + "ie" + d.getMonth() + "t" + d.getDate() + "r" + d.getHours() + "i" + d.getMinutes() + "c" + d.getSeconds() + "k" + d.getMilliseconds();

	if (sep != "?")
	{
		sep = "&";
	}

	return sep + "ietrick=" + trick;
}

function heriter(classeEnfant, classeParent)
{
	function heritage() {}
	heritage.prototype = classeParent.prototype;
	
	classeEnfant.prototype 				= new heritage();
	classeEnfant.prototype.constructor 	= classeEnfant;
	classeEnfant.constructeurParent 		= classeParent;
	classeEnfant.classeParent			= classeParent.prototype;
}


///////////////////////////////////////////////////////////////////////////////
// Create a cross browsers getObjectById()
////////////////////////////////////////////////////////////////////////////////
function checkBrowser()
{	
	this.ver=navigator.appVersion;
	this.dom=document.getElementById?1:0;
	this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom)?1:0;
	this.ie55=((this.ver.indexOf("MSIE 5.5")>-1 || this.ie6) && this.dom)?1:0;
	this.ie5=((this.ver.indexOf("MSIE 5")>-1 || this.ie5 || this.ie6) && this.dom)?1:0;
	this.ie4=(document.all && !this.dom)?1:0;
	this.ns5=(this.dom && parseInt(this.ver) >= 5) ?1:0;
	this.ns4=(document.layers && !this.dom)?1:0;
	this.ie4plus=(this.ie6 || this.ie5 || this.ie4);
	this.ie5plus=(this.ie6 || this.ie5)
	this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns5);
	return this;
}
			
var bw = new checkBrowser();
			
if (!document.getElementById) 
{
document.getElementById = getObjectById;
}
function getObjectById(ID) 
{
	var obj;
	if (bw.dom)
		return document.getElementById(ID);
	else if (bw.ie4)
		return document.all(ID);
	else if (bw.ns4)
		return eval('document.' + ID);
}




/*/////////////////////////////////////////////////////////////////////////////
 * EVENT
 * Code crossbrowser pour récupérer et manipuler les évenements 
 */////////////////////////////////////////////////////////////////////////////
if(!window.Event) Event = new Object();
Event.event = function(event){
	return (event || window.event); // W3C Vs IE
}
Event.target = function(event){
	return (event) ? event.target : window.event.srcElement;
}
Event.preventDefault = function(event){
	var event = event || window.event;
	if(event.preventDefault){ //W3C
		event.preventDefault();
	}
	else{ // IE
		event.returnValue = false;
	}
}
Event.stopPropagation = function(event){
	var event = event || window.event;
	if(event.stopPropagation){
		event.stopPropagation();
	}
	else{
		event.cancelBubble = true;
	}
}

var Keys = {
	TAB: 9,
	ENTER: 13,
	ESCAPE: 27,
	PAGE_UP: 33,
	PAGE_DOWN: 34,
	END: 35,
	HOME: 36,
	LEFT: 37,
	UP: 38,
	RIGHT: 39, 
	DOWN: 40
}

/*/////////////////////////////////////////////////////////////////////////////
 * ELEMENT
 */////////////////////////////////////////////////////////////////////////////
if(!window.Element) Element = new Object();

Element.getLeft = function(element){
	var offsetLeft = 0;
	while(element != null){
		offsetLeft += element.offsetLeft;
		element = element.offsetParent;
	}
	return offsetLeft;	
}

Element.getTop = function(element){
	var offsetTop = 0;
	while(element != null){
		offsetTop += element.offsetTop;
		element = element.offsetParent;
	}
	return offsetTop;	
}

Element.getWidth = function(element, bPx){
	iBorder = element.style.borderRightWidth ? parseInt(element.style.borderRightWidth):0;
	iBorder+= element.style.borderLeftWidth ?  parseInt(element.style.borderLeftWidth):0;
	iPadding = element.style.paddingRight ? parseInt(element.style.paddingRight):0;
	iPadding+=  element.style.paddingLeft ? parseInt(element.style.paddingLeft):0;	
	offsetWidth = iBorder + iPadding + element.offsetWidth;

	if(bPx){
		return offsetWidth +"px";
	}
	else{
		return offsetWidth;
	}
}


Element.getHeight = function(element, bPx){
	iBorder = element.style.borderToptWidth ? parseInt(element.style.borderTopWidth):0;
	iBorder+= element.style.borderBottomWidth ?  parseInt(element.style.borderBottomWidth):0;
	iPadding = element.style.paddingTop ? parseInt(element.style.paddingTop):0;
	iPadding+=  element.style.paddingBottom ? parseInt(element.style.paddingBottom):0;	
	offsetHeight = iBorder + iPadding + element.offsetHeight;

	if(bPx){
		return offsetHeight +"px";
	}
	else{
		return offsetHeight;
	}
}




/** Enleve les noeuds texte vides enfants de l'element */
Element.cleanWhiteSpace = function(element) {
  for (var i = 0; i < element.childNodes.length; i++) {
    var node = element.childNodes[i];
    if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
      element.removeChild(node);
    }
  }
}


/** Renvoie le tableau des elements de type tagName enfants de element
 * Si tagName vaut *, renvoie tous les elements enfants 
 * Ne prend pas en compte les enfants vides dûs à l'indentation
 */
Element.getChildElements = function(element, tagName) {
  var result = new Array();
  var name = tagName.toLowerCase();
  for (var i=0 ; i<element.childNodes.length ; i++) {
    var child = element.childNodes[i];
    if (child.nodeType == 1) { // C'est un element
      if (name == "*" || child.nodeName.toLowerCase() == name) {
        result.push(child);
      }
    }
  }
  return result;
} /* getChildElements() */




/*
 * Fonction qui retrouve le parent de element ayant pour tag sTagName
 */
Element.getParent = function(element, sTagName) {
	if ( ! element )
		return null;
	else if ( element.nodeType == 1 && element.tagName.toLowerCase() == sTagName.toLowerCase() )
		return element;
	else
		return Element.getParent(element.parentNode, sTagName);
} /* getParent() */


/*-------------------------------------------------------*/
// DOM XML
// Contenu textuel d'un element : W3, IE ou autres
Element.textContent = function(node, text) {
	var result = "";
	if (text) {
		// virer les enfants
		while (node.hasChildNodes()) {
			node.removeChild(node.fisrtChild);
		}
		node.appendChild(document.createTextNode(text));
		result = text;
	} else {
		if (node != null) {
			if (node.textContent) { // W3
				result = node.textContent;
			}
			else if (node.text) { // IE
				result = node.text;
			}
			else { // Safari et autres
				for (var i = 0; i < node.childNodes.length; i++) {
					switch (node.childNodes[i].nodeType) {
						case 1: // ELEMENT_NODE
						case 5: // ENTITY_REFERENCE_NODE
							result += DOM.textContent(node.childNodes[i]);
							break;
						case 3: // TEXT_NODE
						case 2: // ATTRIBUTE_NODE
						case 4: // CDATA_SECTION_NODE
							result += node.childNodes[i].nodeValue;
							break;
						default:
							break;
					}
				}
			}
		}
	}
	return result;
}


Log = {
  error: function(msg) {
    alert("Error : \n" + msg);
  },
  
  debug: function(msg) {
    //document.getElementById("message").innerHTML += msg + "<br/>";
    throw msg;
  },
  
  msg: function(msg) {
    document.getElementById("msg").innerHTML += msg + "<br/>";
  }  
}	
