//On loade onLoad une fois le DOM complétement chargé
if (document.addEventListener)  document.addEventListener("DOMContentLoaded", onLoad, false);
//Pour IE j'ai lancé un script en defer (après le DOM) qui charge onLoad
//Par défaut je mets quand même dans le window.onload
window.onload = onLoad;


function onLoad() {
	//On ne fait jouer cette fonction qu'une seule fois, on la marque comme "allreadyLaunched" au premier loading
	if (arguments.callee.allreadyLaunched) return;
	arguments.callee.allreadyLaunched = true;

	/******* On execute plusieurs opérations sur le DOM ****/
	//On affiche des bulles d'aide lors du survol des champs de formulaire
	initFunction("form.label_cell input,form.label_cell textarea,form.label_cell select", makeInfoAlt);
	//On affiche un calendrier à remplir sur les liens marqués comme tels
	initFunction("form.label_cell a.calendar", makeShowCalendar);
	//On supprime les fichiers en cliquant sur le lien
	initFunction("form.label_cell a.deleteFile", makeDeleteFile);
	//On ajoute des champs de mise en forme sur les textarea marqués
	initFunction("form.label_cell textarea.bbcode", makeBbcode);
	//Pour la page d'administration des menus, on fait ouvrir/fermer les infos qui vont bien avec le choix du type (texte, file, auteur, etc)
	initFunction("form.label_cell select#item_type,form.label_cell select#question_type", makeSelectType);
	//On ajoute des réponses on the fly dans le formulaire en cliquant sur [+]
	initFunction("#addReponse", makeAddReponse);
	//Je fais supprimer les lignes en cliquant sur (Supprimer)
	initFunction("#div_question_type_qcm .reponse a", makeDeleteReponse);
	
	//On demande confirmation sur les certains liens
	initFunction("a.confirm", makeConfirmLink);
	//Focus sur les premiers champs des formulaires
	initFunction("form *", makeFirstFocus);
	//On affiche un tooltip sur certains éléments
	initFunction(".show_tooltip", makeShowTooltip);
	//On vide certains champs au focus
	initFunction("form input.autoempty", makeAutoEmpty);
	//On affiche des zooms sur certaines images
	initFunction("img.zoom", makeZoom);
	
	//On fait défiler les actualités
	initFunction("#texte .actualites .fenetre .pellicule", makeDefileActu);
	
	
	//Pour les menus interactifs, on fait ouvrir les sous-rubriques au clic
	initFunction("#teasings ul.menu a.showMenu", makeShowMenu);
	//Menu interactifs : Pour les rubriques, on remplace le texte principal par le texte de la rubrique
	initFunction("#teasings ul.menu li a.showItem", makeShowItem);
	//On ouvre les textes des sommaires au clic ainsi que les listes d'items des chapitres
	initFunction("ul.sommaire a.sommaireTexte,ul.sommaire a.sommaireLink", makeShowSommaireItem);
	//On ajoute une fonction pour montrer les bonnes réponses dans les QCM
	initFunction(".qcm .qcmQuestion input.voir_reponses", makeTestQuestion);
	//On ajoute une fonction pour montrer les bonnes réponses dans les Vrai/Faux
	initFunction(".qcm .qcmQuestion input.voir_reponses_vf", makeTestQuestionVf);
	//On ajoute une fonction pour montrer les bonnes réponses dans les QROC
	initFunction(".qcm .qcmQuestion input.voir_reponses_qroc", makeTestQuestionQroc);
	
	//j'ouvre par défaut les #itemDefault dans les pages
	var itemDefault = document.getElementById("itemDefault");
	if (itemDefault) itemDefault.style.display = "block";
	//Si j'ai passé un #itemTruc dans l'url, j'ouvre celui là et ferme le défault
		var item = document.getElementById(window.location.hash.substring(1));
		if (item) {
			//Je masque le defaut, j'ouvre celui là
			if (itemDefault) itemDefault.style.display = "none";
			item.style.display = "block";
		}
		
	
	
}

/*
	On doit lancer les fonctions une fois la page chargée (les include de .js ne sont pas toujours considérés dans le flux de la page)
	On va tester toutes les 50ms si la page est chargée (avec document.readyState). Si ca passe à complete, alors on lance la fonction.
	Mozzila ne connait pas document.readyState, et il est possible que certains autres navigateurs ne connaissent ni l'un ni l'autre. 

function pageOnLoad(f) {
	//On teste donc le chargement de la page toutes les XXms
	//Si jamais document.readyState est undefined après nbrMaxTry essais, on considere qu'il ne connait pas cette propriété, on passe à la suivante
	var nbrMs = 50;
	var nbrMaxTry = 5;
	var nbrTry = 0;
	var timerOnLoad = setInterval(
	function() {
		//document.getElementById("bottom").innerHTML+=nbrTry+" : "+document.readyState+"=>"+ onLoad+"<br>";
		//Si j'ai testé suffisement de fois

		if (nbrTry>=nbrMaxTry) {
			//Je ne connais pas document.readyState, pas la peine de chercher plus loin donc je l'applique
			if (document.readyState==undefined) {
				onLoad();
				//Et de toutes facons j'arrete ce timer
				clearInterval(timerOnLoad);
			}
		}
		else nbrTry++;

		

		//Par contre si je connais document.readyState et qu'il est complete, je charge les fonctions
		if (document.readyState=="complete" || document.readyState==4) {
			onLoad();
			clearInterval(timerOnLoad);
		}
	},
	nbrMs);		
}
pageOnLoad(onLoad);
*/




/*
	Name : initFunction
	Param : list, fun
	On applique al fonction fun() a tout les éléments qui matchent selector
*/
function initFunction(selector, fun) {
	var list = getElementsBySelector(selector);
	for (var i=0;i!=list.length;i++) {
		fun(list[i]);
	}	
}
/*
	Name : insertJsFile
	Param : filename
	Ajoute une autre feuille de code javascript dans le document. Il n'y a pas d'include possible dans Javascript, on passe donc par le DOM de la page parente
*/
function insertJsFile(filename) {
	//On crée une insertion du fichier javascript
	var jsFile = document.createElement("script");
	jsFile.setAttribute("src", filename);
	jsFile.setAttribute("language", "javascript");
	jsFile.setAttribute("type", "text/javascript");
	//On l'ajoute dans le head
	document.getElementsByTagName("head")[0].appendChild(jsFile);
}

/*
	Name : insertCSSFile
	Param : filename
	Ajoute une feuille de style CSS au document
*/
function insertCSSFile(filename){
	var cssFile = document.createElement("link");
	cssFile.setAttribute("type","text/css");
	cssFile.setAttribute("rel","stylesheet");
	cssFile.setAttribute("href",filename);
	cssFile.setAttribute("media","screen");
	document.getElementsByTagName("head")[0].appendChild(cssFile);
}

document.onmousemove = myMouseMove
if (document.captureEvents) document.captureEvents(Event.MOUSEMOVE);
//Dès que je bouge la souris, je choppe ses coords
function myMouseMove(e) {
	globalMouseX = 0;	globalMouseY = 0;
	if (!e) var e = window.event;
	//On choppe les positions de la souris à partir de différentes informations selon les navigateurs
	if (e.pageX || e.pageY)
	{
		globalMouseX = e.pageX;
		globalMouseY = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		if (document.body) {
			globalMouseX = e.clientX + document.body.scrollLeft;
			globalMouseY = e.clientY + document.body.scrollTop;
		}
		if (document.documentElement) {
			globalMouseX = e.clientX + document.documentElement.scrollLeft;
			globalMouseY = e.clientY + document.documentElement.scrollTop;
		}
	}
}



/********************** NOUVELLES FONCTIONS ET METHODES *********************************

/* On ajoute une fonction aux tableaux pour enlever le premier élément de la liste et le retourner */
Array.prototype.unpop = function () {
	this.reverse();
	var first_el = this.pop();
	this.reverse();
	return first_el;
}

/******* trouve un élément dans un tableau ******/
Array.prototype.find = function(search) {
	for (var i in this) if (this[i]==search) return true;
	return false;
}

/* On ajoute une fonction de recherche aux strings */
String.prototype.find = function (search) {
	return (this.indexOf(search)>=0) ? true : false;
}

/* Enleve les indication px d'une chaine */
String.prototype.removePx = function () {
	//*1 => transforme en int
	return 1 * (this.replace(/px/g, "")); 
}

/* Selon le navigateur les sauts de ligne sont soit \n, soit \r, soit \r\n. On va donc tout mettre en \n */
String.prototype.normalizeLineBreak = function() {
	return this.replace(/(\r\n|\r|\n)/g, '\n');	
}


/* On trouve l'année de facon correcte sur 4 chiffres (bug de l'an 2000 haha) */
Date.prototype.getRealYear = function () {
	//NS compte 106 pour 2006
	var y = this.getYear() % 100;
	y += (y < 38) ? 2000 : 1900;
	return y;
}

/* On trouve le nombre de jours dans un mois */
Date.prototype.getNbrDaysInMonth = function() {
	/* 
	Les années divisibles par 4 sont bissextiles...
	Sauf si elles sont aussi divisibles par 100...
	Mais sont quand même bissextiles si divisible par 400
	*/
	//Années bissextiles
	var bissextile = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	//Non bissextiles
	var nonBissextile = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var year = this.getRealYear();
	var month = this.getMonth();
		
	if ((year % 4) == 0) {
		//Divisible par 4, par 100, pas par 400 => non
		if ((year % 100) == 0 && (year % 400) != 0)	return nonBissextile[month];
		//Divisible par 4
		return bissextile[month];
	} 
	//Pas divisible par 4
	else return nonBissextile[month];
}























