/* Nécessite le framework Prototype (version 1.5.1), lib_core.js at lib_dhtml_core.js */

if(window.Prototype)
{
	/**
	* méthode statique étendant l’objet Prototype.Browser de Prototype.
	* 
	* Test la version d’Internet Explorer.
	* Arguments :
	* 1 ou 2 arguments : chaîne de texte ou chiffres si version du type 6 ou 6.1
	*
	* @param ver (obligatoire) : version minimale de ie.
	* @param arguments[1] 2ème argument (facultatif) : version maximale de ie
	* si cet argument est présent, ver peut être : null ou '0' ou 0, dans ce cas retourne true si version inférieure ou égale à max (2ème argument).
	*
	* @return boolean
	*/
	Prototype.Browser.ieVersionInRange = function(ver)
	{
		/** 
		* méthode privée retournant tableau de version à partir de chaîne ou chiffre.
		* @param String ou Number
		* @return Array
		*/
		function _getVersionNumber(v)
		{
			var tv = null;
			
			if(Object.objectOfType(v,'string'))
			{
				tv = v;
			}
			else
			{
				tv = v.toString();
			}
			
			return tv.split('.');
		}
		
		var minVer = null;
		
		if(ver != null)
		{
			minVer = _getVersionNumber(ver);
		}
		
		var currentVer = null;
		var strCV = window.navigator.userAgent.toLowerCase().match(/msie (\d\.\d)/);
		if(strCV && !window.opera)
		{
			currentVer = _getVersionNumber(strCV[1]);
		}
		
		if(currentVer == null)
		{
			return false;
		}
		else
		{
			/** 
			* méthode privée de comparaison entre deux tableaux de version
			*
			* @param minA Array, version minimale
			* @param maxA Array, version maximale
			*
			* @return boolean
			*/
			function _versionCompare(minA,maxA)
			{
				var maxLength = (minA.length >= maxA.length) ? minA.length : maxA.length;
				
				for(var i=0; i<maxLength; i++)
				{
					if(Object.objectOfType(minA[i],'undefined'))
					{
						minA[i] = 0;
					}
					
					if(Object.objectOfType(maxA[i],'undefined'))
					{
						maxA[i] = 0;
					}
					
					if((minA[i] < maxA[i]) || ((minA[i] == maxA[i]) && i == maxLength-1))
					{
						return true;
					}
					else if(minA[i] > maxA[i])
					{
						return false;
					}
				}
				
				return false;
			}
			
			var minC = true;
			if(minVer != null)
			{
				minC = _versionCompare(minVer,currentVer);
			}
			
			var maxC = true;
			if(arguments.length == 2)
			{
				maxVer = _getVersionNumber(arguments[1]);
				maxC = _versionCompare(currentVer,maxVer);
			}
			
			return minC && maxC;
		}
	}
	
	/** 
	* méthode publique étendant l’objet Element de Prototype
	*
	* Récupère la valeur d’un attribut dans un autre espace de nom (XML).
	*
	* @param element Element élément (DOM)
	* @param namespace String namespace chaîne du type 'préfixe|uri namespace'
	* @param attrName String nom de l’attribut
	*
	* @return String Valeur de l’attribut.
	* 
	*/
	
	//Element.addMethods avec getAttributeNS : stack overflow sous ie et opéra
	
	Object.extend(Element, {
	getElementAttributeNS: function(element,namespace,attrName)
	{
		var element = $(element);
		
		var sep = '|';
		
		var ns = '';
		var pref = '';
		
		if(Object.objectOfType(namespace,'string'))
		{
			if(namespace.indexOf(sep) != -1)
			{
				var res = namespace.split(sep);
				
				pref = res[0];
				ns = res[1];
			}
			else
			{
				ns = namespace;
			}
		}
		
		var attr = null;
	
		if(element.getAttributeNS && Object.objectOfType(element.getAttributeNS(ns,attrName),'string') && (element.getAttributeNS(ns,attrName).length > 0))
		{
			attr = element.getAttributeNS(ns,attrName);
		}
		else if(element.getAttribute)
		{
			if((attrName == 'class') && Prototype.Browser.IE)
			{
				attrName = 'className'; /* IE */
			}
			
			var attN = (pref == '') ? attrName : pref+':'+attrName;
			
			attr = element.getAttribute(attN);
		}
		
		return attr;
	},
	
	/** 
	* méthode publique étendant l’objet Element de Prototype
	*
	* Fixe la valeur d’un attribut dans un autre espace de nom (XML).
	*
	* @param element Element élément (DOM)
	* @param namespace String namespace chaîne du type 'préfixe|uri namespace'
	* @param attrName String nom de l’attribut
	* @param val String valeur de l’attribut
	* 
	*/
	
	setElementAttributeNS: function(element,namespace,attrName,val)
	{
		var element = $(element);
		
		var sep = '|';
		
		var ns = '';
		var pref = '';
		
		if(Object.objectOfType(namespace,'string'))
		{
			if(namespace.indexOf(sep) != -1)
			{
				var res = namespace.split(sep);
				
				pref = res[0];
				ns = res[1];
			}
			else
			{
				ns = namespace;
			}
		}
		
		var attr = null;
	
		if(element.setAttributeNS)
		{
			attr = element.setAttributeNS(ns,attrName,val);
		}
		else if(element.setAttribute)
		{
			if((attrName == 'class') && Prototype.Browser.IE)
			{
				attrName = 'className'; /* IE */
			}
			
			var attN = (pref == '') ? attrName : pref+':'+attrName;
			
			attr = element.setAttribute(attN,val);
		}
		
		return attr;
	},

	/**
	* méthode publique étendant l’objet Element de Prototype
	*
	* Permet de vider un élément de tous ses noeuds
	*
	* @param element Element(DOM)
	*/
	removeAllNodes: function(element)
	{
		element = $(element);
		
		while(element.hasChildNodes())
		{
			element.removeChild(element.firstChild);
		}
	},
	
	setCoordinate: function(element,cX,cY)
	{
		element = $(element);
		element.style.top = cY+CssConstant.PIXEL_UNIT;
		element.style.left = cX+CssConstant.PIXEL_UNIT;
	},
	
	getParentElement: function(elem)
	{
		var rtO = null;
		
		element = $(elem);

		if(element.parentNode)
		{
			rtO = element.parentNode;
		}
		else if(element.parentElement)
		{
			rtO = element.parentElement;
		}

		return $(rtO);
	},
	
	getAncestorElement: function(elem)
	{
		var retEl = null;
		var tagN = null;
		var classN = null;
		
		element = $(elem);

		if((arguments.length == 3) && Object.objectOfType(arguments[2],'string'))
		{
			classN = arguments[2];
		}

		if((arguments.length >= 2) && Object.objectOfType(arguments[1],'string'))
		{
			tagN = arguments[1];
		}

		var cP = Element.getParentElement(element);

		if(cP != null)
		{
			if(tagN == null)
			{
				if(classN == null)
				{
					retEl = cP;
				}
				else
				{
					if((cP.nodeType == 1) && Element.hasClassName(cP,classN))
					{
						retEl = cP;
					}
					else
					{
						retEl = Element.getAncestorElement(cP,tagN,classN);
					}
				}
			}
			else
			{
				if(classN == null)
				{
					if(cP.nodeName.toLowerCase() == tagN.toLowerCase())
					{
						retEl = cP;
					}
					else
					{
						retEl = Element.getAncestorElement(cP,tagN,classN);
					}
				}
				else
				{
					if((cP.nodeName.toLowerCase() == tagN.toLowerCase()) && (cP.nodeType == 1) && Element.hasClassName(cP,classN))
					{
						retEl = cP;
					}
					else
					{
						retEl = Element.getAncestorElement(cP,tagN,classN);
					}
				}
			}
		}

		return $(retEl);
	}
	
	});
	
	/**
	* L’objet Window représente l’interface Window (W3C)
	*/
	if(!window.Window)
	{
		var Window = {};
	}
	
	Window.getInnerDimensions = function()
	{
		return {width: (window.innerWidth || document.body.offsetWidth || document.documentElement.offsetWidth),
		height: (window.innerHeight || document.body.offsetHeight || document.documentElement.offsetHeight)};
	}
	
	Window.getScrollCoordinates = function()
	{
		return {scrollX: (window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft),
		scrollY: (window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop)};
	}
	
	Window.getCursorWindowCoordinates = function(ev)
	{
		var cursorCoord = null;
		
		if(Object.isInitialized(ev) && Object.objectOfType(ev.clientX,'number'))
		{
			cursorCoord = {x: ev.clientX, y: ev.clientY};
		}

		return cursorCoord;
	}
	
	Window.getCursorDocumentCoordinates = function(ev)
	{
		var cursorCoord = null;
		
		var scrollCoord = Window.getScrollCoordinates();

		if(Object.isInitialized(ev) && Object.objectOfType(ev.clientX,'number'))
		{
			cursorCoord = {x: ev.clientX + scrollCoord.scrollX, y: ev.clientY + scrollCoord.scrollY};
		}

		return cursorCoord;
	}
}