/* JS Document pour les pages du Parlement europeen */
/* Scripts permettant les actions sur les balises */

/* ======================================================================================================== */
/* ACTIVATION DES SCRIPTS ================================================================================= */
/* ======================================================================================================== */
	var htmanager_js			= true;


/* ======================================================================================================== */
/* JSmanager ============================================================================================== */
/* ======================================================================================================== */
/* Classe JS ajoutant les scripts */

	// Fonction chargeant un script JS inter domaine
	function JSmanager(){
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Principe de fonctionnement
			// 1. Attente de l'existance de la balise <body> avant de s'activer
			// 2. Recherche de la fonction "getJS" renvoyant un tableau d'objets correctement parametres :
			//		> js:		nom du fichier javascript a appeler
			//		> path:		chemin d'acces au fichier (s'il n'est pas defini, le chemin utilise sera celui de ce fichier)
			//		> fct:		nom de la classe definie dans le fichier JS
			//		> params:	parametres a envoye a la fonction callback de la classe JS
			// 3. Lancement du chargement des fichiers JS les uns apres les autres
			// 4. Lancement des fonctions "callbackjsmanager" si elles sont presentes dans les classes JS les unes apres les autres
		// Chaque classe JS appelee doit etre lancee automatiquement depuis le fichier afin d'etre disponible par la classe JSmanager
			// ex : function FCT_TEST(){ };	var FCT_TEST = new FCT_TEST();
		// Il ne peut y avoir qu'une seule classe JS par fichier
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		var This			= this;
		var Data			= new Array();
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction attendant le chargements minimum de la page
		this.wait = function(n){
			var b 					= document.getElementsByTagName("body")[0];
			if(typeof(b) == "object" && b != null && typeof(getJS) == "function") init(b);
			else if(n < 50000) 	setTimeout(function(){ This.wait(n +1); }, 10);
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction initialisant le chargement des JS
		function init(B){
			// Recherche de l'entete
			var h 					= document.getElementsByTagName("head")[0];
			// Recuperation de la liste des JavaScript
			var l					= getJS();
			// Verification des donnees recuperees
			if(typeof(l) == "object"){
				if(l.length > 0){
					// Recuperation du chemin du dossier "common"
					var p			= null;
					var r			= document.getElementsByTagName("script");
					var m			= r.length;
					for(var i = 0; i < m; i++){ 
						if(r[i].src.match("/htmanager.js")){
							p		= String(r[i].src).replace("/htmanager.js", "/");
						}
					}
					// Ajout de la classe CSS au body
					B.className		+= (String(B.className).length > 0)? " ep_jsavailable" : "ep_jsavailable";
					// Initialisation de l'objet de donnee
					Data			= new Object();
					Data.head		= h;
					Data.cb			= new Array();
					Data.current	= -1;
					Data.max		= l.length;
					Data.list		= l;
					Data.path		= (p == null)? "" : p;
					// Integration des fonctions "outil"
					insert({js:"managetag.js"});
				}
			}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction attendant le chargement minimum des balises
		this.analyze = function(d, n){
			var t					= document.getElementById(d.zone);
			if(typeof(t) == "object" && t != null) insert(d);
			else if(n < 50000) 	setTimeout(function(){ This.analyze(d, n +1); }, 10);
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction attendant le chargement minimum des balises
		function insert(d){
			if(d.js == "epbox.js"){
				// Integration du JS
				var s	= document.createElement("script");
				s.setAttribute("type", 	"text/javascript");
				s.setAttribute("async", "true");
				s.setAttribute("src", 	(typeof(d.path) == "string")? d.path + "jquery.min.js" : Data.path + "jquery.min.js");
				Data.head.appendChild(s);
			}
			// Integration du JS
			var s		= document.createElement("script");
			s.setAttribute("type", 	"text/javascript");
			s.setAttribute("async", "true");
			s.setAttribute("src", 	(typeof(d.path) == "string")? d.path + d.js : Data.path + d.js);
			Data.head.appendChild(s);
			// Lancement du suivant
			if(Data.current +1 < Data.max){	Data.current += 1;	setTimeout(function(){ This.analyze(Data.list[Data.current], 0); }, 10);
			}else{							Data.current = -1;	setTimeout(This.finish, 10)	}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction activant les evenements
		this.finish = function(){
			Data.current++;
			if(Data.current < Data.max){
				if(typeof(window[Data.list[Data.current].fct]) == "object"){
					if(typeof(window[Data.list[Data.current].fct].callbackjsmanager) == "function"){
						if(Data.list[Data.current].params != null && String(Data.list[Data.current].params) != "undefined")	window[Data.list[Data.current].fct].callbackjsmanager (This.finish, Data.list[Data.current].params);
						else 																								window[Data.list[Data.current].fct].callbackjsmanager (This.finish);
					}else 																									This.finish();
				}else 																										This.finish();
			};
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Ajout de l'evenement d'attente du chargement de la page
		this.wait(0);
	};
	// Lancement automatique de l'ajout des scripts
	//var JSmanager = new JSmanager();
	
	
/* ======================================================================================================== */
/* HTManager ============================================================================================== */
/* ======================================================================================================== */
/* Classe JS gerant les actions sur les balises */

	function HTManager(){
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction verifiant la validite d'une balise HTML
		this.check = function(o){	if(typeof(o) == "object" && o != null){	return(typeof(o.tagName) == "string"); }else{	return(false);	}	};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction construisant un noeud/balise HTML
		this.createNode = function(tag){
			var n				= document.createElement(tag);
			var c;
			for(var p = 1; p < arguments.length; p++){
				c				= arguments[p];
				if(typeof(c) == "string"){
					n.appendChild(document.createTextNode(c));
				}else if(c.nodeName){
					n.appendChild(c);
				}else{
					for(var sP in c){
						n[sP]	= c[sP];
					}
				}
			}
			return n;
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction convertissant les caractères spéciaux et supprimant les espaces vides pour la récupération de texte en JS
		this.cleanText = function(value){	return(String(value).replace(/&nbsp;/gi, ' ').replace(/^\s+/g,'').replace(/\s+$/g,'').replace(/&nbsp;/gi, " ").replace(/&lt;/gi, "<").replace(/&gt;/gi, ">").replace(/&amp;/gi, "&"));		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction envoyant la valeur numerique de la touche pressee
		this.getKey = function(eEvent){
			if(window.event)		return(event.keyCode);						// IE
			else if(eEvent)			return((eEvent.which)? eEvent.which : 0);	// Autres
			else 					return(0);
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction ajoutant un evenement JS a une balise
		this.addEvent = function(oTag, sEvent, fAction, bBlockReturn){
			function callfunction(e){
				fAction(e);
				if(!String(sEvent).match("key") && (typeof(bBlockReturn) == "boolean" && bBlockReturn)){
					if(e.preventDefault) e.preventDefault();
					else e.returnValue		= false;
				}
			}
			if((this.check(oTag) || oTag == window || oTag == document) && typeof(sEvent) == "string" && typeof(fAction) == "function"){
				// Ajout de l'evenement
				if(document.addEventListener) oTag.addEventListener(sEvent, callfunction, false);
				else if(window.attachEvent)	oTag.attachEvent("on" + sEvent, callfunction);
			}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction envoyant les dimensions du contenu de la page
		this.documentDimensions = function(){
			// Calcul des dimensions en fonction de l'interpretation des css par le navigateur
			if(document.compatMode){
				var w			= document.documentElement.scrollWidth;
				var h 			= document.documentElement.scrollHeight;
			}else{
				var w			= document.body.scrollWidth;
				var h			= document.body.scrollHeight;
			}
			// Verification de la demande de taille maximale : document/window
				b				= this.windowDimensions();
				// Comparaison
				w				= Math.max(w, b.width);
				h				= Math.max(h, b.height);
			// Verification des valeurs
			if(isNaN(w)) w		= null;
			if(isNaN(h)) h		= null;	
			// Envoi des dimensions
			return({width:w, height:h});
		};
		// Recuperation de la dimension de la fenetre
		this.windowDimensions = function(){
			// Calcul des dimensions en fonction du navigateur
			var w				= window.innerWidth;
			var h				= window.innerHeight;
			if(document.documentElement.clientWidth){
				w			= document.documentElement.clientWidth;
				h 			= document.documentElement.clientHeight;
			}else{
				w			= document.body.clientWidth;
				h			= document.body.clientHeight;
			}
			// Envoi de la hauteur
			return({width:w, height:h});
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction envoyant la position reelle d'une balise dans la page
		this.getRealOffset = function(tag, limit){
			// Verification de la valeur de la balise
			if(this.check(tag)){
				var t					= 0;
				var l					= 0;
				// Identification de la balise limite
				limit					= (this.check(limit))? limit : null;
				// Creation de la securite (eviter les boucles infinie)
				var nmax				= 1000;
				// Lancement de la recuperation des positions
				while(this.check(tag) && tag != limit && nmax > 0){
					nmax--;
					// Verification du type de balise atteinte
					if(String(tag.tagName).toLowerCase != "html" && String(tag.tagName).toLowerCase != "body"){
						// Sauvegarde de la position
						t				+= tag.offsetTop;
						l				+= tag.offsetLeft;
						// Mise a jour de la balise a traitee
						tag				= tag.offsetParent;
					}else break;
				}
				return({top:t, left:l});
			}else{
				return(null);
			}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction chargeant un fichier XML
		this.loadfile = function(File, CallBack){
			// Verification des parametres transmis
			if(typeof(CallBack) == "function" && typeof(File) == "string" && String(File).length > 4 && String(File).lastIndexOf(".xml") >= String(File).length -5){
				This = this;
				// Initialisation de l'indicateur de chargement automatique
				var request = null;
				var autoLoading = false;
				// Chargement du fichier (pour différents navigateurs)
				try{
					request = new XMLHttpRequest();
					request.open("GET", File, false);
				} catch(exception) {
					//gestion du chargement sous IE
					var isIE = (typeof window.ActiveXObject != "undefined");
					if(isIE){
						// chargement automatique
						request = new ActiveXObject("Microsoft.XMLDOM");
						request.async = false;
						// attente du chargement complet
						while(request.readyState != 4) {};
						//changement
						request.load(File);
						// appel de la fonction de convertion
						CallBack(request.documentElement);
						// Blocage de l'action de chargement différé
						autoLoading = true;
					} else {
						request = document.implementation.createDocument("", "", null);
						request.onload = function(){ 
							CallBack(request.documentElement);
						};
						request.load(File);
						autoLoading = true;
					}
				}
				// vérification de l'existence de la requete
				if(!autoLoading && request !=null){
					request.setRequestHeader('Content-Type', 'text/xml');
					request.send("");
					var result = request.responseXML;
					CallBack(result.documentElement);
					autoLoading = true;
				}
			}
		};
	};
