/*
	add_bookmark()
*/
function add_bookmark() {
	if (document.all) window.external.AddFavorite(self.location,document.title);
	return false;
}
/* 
	Name : openNextSibling()
	param : obj
	passe le prochain element node en display none/block selon son display actuel. utilisé pour "ouvrir" une liste lors d'un clic
*/
function openNextSibling(obj) {
	removeEmptyTextNodesChild(obj.parentNode);
	//J'ouvre ou ferme selon la position où il est
	if (obj.nextSibling.style.display=="none" || obj.nextSibling.style.display=="") obj.nextSibling.style.display = "block";
	else obj.nextSibling.style.display = "none";
}


/******** openClose() ***********/
//Ferme/ouvre un block
function openClose(obj) {
	var display = getStyleInfo(obj,"display");
	if (display=="none") {
		obj.style.display = "block";
		return true;
	}
	else {
		obj.style.display = "none";
		return false;
	}
}

/********* popUp() ***************/
//Affiche/masque une pop-up
function popUp(obj) {
	//Si je l'ouvre, je masque les selects, sinon je les affiche
	if (openClose(obj)) hideSelectElements();
	else showSelectElements();	
}

/********* hideSelectElements() et showSelectElements()  ***************/
//IE (toujours lui) place les elements <select par dessus tout le reste, ils ne sont pas soumis au zIndex. 
//Je dois donc les masque pour ne pas gener l'affichage des fausses pop-up
function hideSelectElements() {
	initFunction("select", function(obj) { obj.style.visibility = "hidden" });
}
function showSelectElements() {
	initFunction("select", function(obj) { obj.style.visibility = "inherit" });
}

/****** setClass() ********/
//Attribue une classe à un objet
function setClass(obj, classe) {
	obj.setAttribute("class", classe); //Normal
	obj.setAttribute("className", classe); //Ie
}


/********* makeInfoAlt() ***********/
//Appliqué sur les élements des formulaires pour afficher leur texte alternatif dans un div sur le coté au survol, pour les formulaires
function makeInfoAlt(obj) {
	obj.onmouseover = showAlt;
	obj.onmouseout = removeAlt;
}

/************** showAlt ****************/
//On affiche le texte du alt d'un élément dans le div info_id 
function showAlt() {
	//On trouve déjà l'alt, si vide on arrete
	var alt = this.getAttribute("alt");
	if (alt=="" || alt==undefined) return;	
	
	//ensuite on doit trouver le div où afficher les infos. Il porte l'id info_user_name, info_user_pass, etc
	var divInfo = document.getElementById("info_"+this.id);
	if (divInfo) {
		divInfo.style.display = "block";
		divInfo.innerHTML = alt;	
	}
}

/************* removeAlt *****************/
//On masque l'information quand on arrete de survoler
function removeAlt() {
	var divInfo = document.getElementById("info_"+this.id);
	if (divInfo) divInfo.style.display = "none";
}

/******** makeDeleteFile **********/
//Sous les liens (ou miniatures) des fichiers on a un lien [X] Cliquez ici pour supprimer le fichier. En cliquant dessus ca masque l'affichage du fichier et
//passe le champ hidden en vide
function makeDeleteFile(obj) {
	//On demande confirmation au clic
	obj.onclick = function() {
		if (confirm("Etes vous sur de vouloir supprimer ce fichier ?")) {
			//On trouve l'id du fichier (après deleteFile_)
			var id = this.id.substring(11);
			//On masque ce lien là
			this.style.display = "none";
			//On masque le lien/miniature
			document.getElementById("file_"+id).style.display = "none";
			//On passe le champ hidden à vide
			document.getElementById(id+"_hidden").value = "";
			alert("La suppression du fichier ne sera effective qu'une fois que vous aurez validé le formulaire.");
		}
		return false;
	}
}


/********* makeConfirmLink() ********/
//Appliqué sur les liens de suppression par exemple, demande confirmation (texte title) avant de suivre le lien
function makeConfirmLink(obj) {
	//Si pas de question, on zappe
	if (obj.title=="" || obj.title==undefined) return;
	obj.onclick = function() {
		return confirm(this.title);
	}
}


/******** makeFirstFocus() *********/
//Mets le focus sur l'élément de formulaire possedant un tabindex=1
function makeFirstFocus(obj) {
	if (obj.getAttribute("tabindex")==1) obj.focus();
}

/********* makeShowTooltip() **********/
//Emulation du tooltip. Si possede la classe "show_tooltip" on créé un élément html avec le title (ou le texte alternatif) au survol
function makeShowTooltip(obj) {
	//je prends le texte dans le title, si vide dans le alt, si rien on s'arrete
	var txt =obj.getAttribute("title");
	if (!txt) txt = obj.getAttribute("alt");
	if (!txt) return;
	//On vire le alt qui va avec maintenant qu'on a amélioré le tooltip
	obj.title = "";
	
	//On affiche le tootlip au survol
	obj.onmouseover = function() {
		showTooltip(txt, this);		
	}
	//On le masque en partant
	obj.onmouseout = removeTooltip;
}


/************ showTooltip() ************	
	Name : showTooltip
	Params : 
		le texte à afficher
		l'objet auquel lier le tooltip
		les positions si besoin
		
*/
function showTooltip(txt,obj,  x, y, width, height) {
	//Si le tooltip existe, on le fait disparaitre
	if (document.getElementById("tooltip")) removeTooltip();
	
	//On créé un tooltip avec le texte dedans et l'id/classe pour le masquer
	var tooltip = document.createElement("div");
	tooltip.setAttribute("id", "tooltip");
	tooltip.innerHTML = txt;
	//On l'ajoute après l'élément, sauf si des coordonnées sont indiquées
	if (x || y) {
		//Coords données, on le mets aux coords
		document.getElementsByTagName("body")[0].appendChild(tooltip);
		tooltip.style.top = y+"px";
		tooltip.style.left = x+"px";
	}
	else {
		//Pas de dimension, on le place juste avant l'élément (c'est à dire juste avant l'élément dans son parent)
		obj.parentNode.insertBefore(tooltip, obj);		
		tooltip.style.marginTop = "25px"
		tooltip.style.marginLeft = "5px"
	}
	//On l'affiche
	tooltip.style.display = "block";
	//Si j'ai précisé des dimensions, je redimensionne
	if (width) tooltip.style.width = width+"px";
	if (height) tooltip.style.height = height+"px";
		
}

/******* removeTooltip() ***********/
//On supprime le tooltip
function removeTooltip() {
	var tooltip = document.getElementById("tooltip");
	if (!tooltip) return;
	//On le supprime
	tooltip.parentNode.removeChild(tooltip);
}


/********* makeShowCalendar() *********/
//On affiche un calendrier lors du clic sur les liens "Calendrier" d'un formulaire
function makeShowCalendar(obj) {
	obj.onclick = calendarShow;
}

/********* makeAutoEmpty() ***********/
//On vide les champs de texte lors du focus
function makeAutoEmpty(obj) {
	obj.onfocus = function() {
		obj.value = "";
	}
}

/********** makeZoom() **********/
function makeZoom(obj) {
	obj.onclick = zoomShow
}
/**********  zoomShow() *******/
//On affiche une image en grand format au milieu de l'écran
function zoomShow() {
	//On créé un div pour le zoom
	var div = document.getElementById("zoom");
	//S'il existe déjà, on le cache
	if (div) return openClose(div);
	//Sinon on le crée
	div = document.createElement("div");
	div.setAttribute("id", "zoom");
		
	//On crée un lien "fermer"
	var fermer = document.createElement("a");
	setClass(fermer, "fermer");
	fermer.innerHTML = "Fermer";
	fermer.href = "#";
	fermer.onclick = function() { openClose(div); return false; };
	div.appendChild(fermer);
	
	//On mets l'image dedans
	var img = document.createElement("img");
	img.alt = this.alt;
	//Le grand format est de la forme XXXX_full.ext, on doit donc retrouver XXX.jpg
	var dotPosition = this.src.lastIndexOf(".");
		
	//On centre le div une fois l'image chargée (sinon il trouve pas le width correct)
	img.onload = function() {
		//On le mets un peu à partir du haut
		div.style.top = "120px";
		//On le mets au milieu (on prends la largeur de la page divisée par deux moins la moitié de sa largeur )
		var pageWidth = getPageWidth(); //Largeur de la page
		//On peut pas trouver la largeur du div avec IE (il mets "auto") on prends donc juste la largeur de l'image
		var divWidth = getStyleInfo(div, "width");
		if (divWidth=="auto") {
			this.style.pixelWidth; //Bizarrement... Rien que de faire appel à cette ligne me permet d'avoir le résultat de getStyleInfo(img, "width"). 
			//Sans cette ligne je n'ai rien du tout (IE), il doit donner un layout... je sais pas...
			divWidth = getStyleInfo(img, "width").removePx();
		}
		else divWidth = divWidth.removePx();
		//On le place donc au centre !	
		div.style.left = ((pageWidth/2) - (divWidth/2)) + "px"
	}
		
	//On dit où chercher (Ie le charge à ce moment là, même s'il n'est pas mis dans le DOM)
	img.src = this.src.substring(0, dotPosition) + "_full" + this.src.substring(dotPosition);

	//On ferme le fenetre en cliquant sur l'image
	img.onclick = function() { openClose(div) }
	
	//On ajoute l'image au div
	div.appendChild(img);
	//On ajoute le div à la page
	document.getElementsByTagName("body")[0].appendChild(div);	
}



/********* makeShowMenu **********/
//On fait ouvrir/fermer les sous-menu
function makeShowMenu(obj) {
	//On commence par trouver le menu auquel s'applique le lien
	var ul = document.getElementById(obj.href.substr(obj.href.indexOf("#")+1));
	if (ul) {
		//On le masque
		ul.style.display = "none";
		//On l'affiche/masque au clic
		obj.onclick = function() { openClose(ul); return false; };
	}
}

/********* makeShowItem() *********/
function makeShowItem(obj) {
	//On commence par trouver le div qui contient les informations à afficher
	var div = document.getElementById(obj.href.substr(obj.href.indexOf("#")+1));
	//On le masque
	div.style.display = "none";
	//Quand on clic sur le lien, on masque le default et on affiche celui donné
	obj.onclick = showItem;
}
/******** showItem() ***************/
function showItem() {
	//On masque tout les items
	initFunction(".item", function(obj) { obj.style.display = "none" });
	//On affiche celui cliqué
	document.getElementById(this.href.substr(this.href.indexOf("#")+1)).style.display = "block";
	//On enleve toutes les classes focus
	initFunction("#teasings a.showItem", function(obj) { setClass(obj, "showItem"); });
	//On lui laisse la classe focus
	setClass(this, "showItem focus");
	return false;
}

/********* makeShowSommaireItem() *********/
//On affiche/masque les textes en cliquant sur le lien qui s'y rapporte
function makeShowSommaireItem(obj) {
	//On commence par trouver le div qui contient les informations à afficher
	var div = document.getElementById(obj.href.substr(obj.href.indexOf("#")+1));
	if (div) {
		//Quand on clic sur le lien, on masque le default et on affiche celui donné
		obj.onclick = function() { openClose(div); return false }
		//J'applique une classe spéciale aux liens qui sont en tete de chapitre, pour les faire passer pour de vrais liens
		if (isOfClass(obj, "sommaireLink")) obj.className+=" hover";
	}
}


/*********** makeSelectType() **************/
//Selon que je choisisse texte, fichier, site, auteur, ouvrage ou rubrique, j'affiche un deuxieme champ différent
function makeSelectType(obj) {
	//Le select possede une liste d'options (texte, fichier, site, auteur, ouvrage, parent par exemple
	//Son nom est item_type
	//Il est suivi d'une liste de div intitulés id="div_item_type_texte", id="div_item_type_fichier"
	//On va donc rendre ca automatique quelque soit le select et les div, du moment qu'ils suivent la mm logique
	
	//On commence par enlever les noeuds vides
	removeEmptyTextNodesChild(obj);
	
	//Puis on affiche que celui qui est selectionné
	selectTypeShowSelected.call(obj);
}
/******** selectTypeShowSelected() ***********/
function selectTypeShowSelected() {
	//je cache tout
	selectTypeHideDiv(this);
	//J'affiche celui qui est selectionné
	var div = document.getElementById("div_"+this.name+"_"+this.value);
	if (div) div.style.display = "block";
	//Et je fais la même chose quand je change
	this.onchange =selectTypeShowSelected;
}

/********* selectTypeHideDiv ***********/
function selectTypeHideDiv(obj) {
	//On va masquer tout les divs qui correspondent à chaque valeur du select
	//(Exemple div_item_type_texte si le select s'appelle item_type et sa valeur est texte)
	var div;
	for (i = 0; i!=obj.childNodes.length;i++) {
		//Si le div existe, on le masque
		div = document.getElementById("div_"+obj.name+"_"+obj.childNodes[i].value);
		if (div) div.style.display = "none";
	}
}


/*********** makeDefileActu ************/
//On fait monter la liste des actus petit à petit
function makeDefileActu(obj) {
	actuStop = false;
	defileActuOnlyOnceAtATime = false;
	defileActu(obj);	
	obj.onmouseover = function() { actuStop = true; }
	obj.onmouseout = function() { actuStop = false; defileActu(obj); }
}
function defileActu(obj) {
	if (actuStop || defileActuOnlyOnceAtATime) return;
	defileActuOnlyOnceAtATime = true;
	var marginTop = getStyleInfo(obj, "marginTop").removePx();
	var height = obj.offsetHeight;
	obj.style.marginTop = (marginTop-1)+"px";
	//Si je l'ai fait remonté completemtn en dehors, je le remets un peu en dessous de la fenetre
	if (marginTop+height<0) {
		obj.style.marginTop = (getStyleInfo(obj.parentNode, "height").removePx())+"px"
	}
	defileActuOnlyOnceAtATime = false;
	setTimeout(function() { defileActu(obj)}, 25);
	
		
}


/********* makeAddReponse() ***************/
function makeAddReponse(obj) {
	//On ajoute une nouvelle ligne identique à la premiere avec les noms qui changent
	obj.onclick = addReponse;
}

function addReponse() {
	//Je prends l'étalon, la réponse A
	var etalon = document.getElementById("reponse1");
	//Le div conteneur
	var div = etalon.parentNode;
	//Je prends aussi la dernière réponse
	var arrReponses = getElementsBySelector("div.reponse", div);
	var nbrReponses = arrReponses.length;
	var lastReponse = arrReponses[nbrReponses-1];
	
	//Je trouve donc la nouvelle Id (on compte le nombre de Label)
	var newId = div.getElementsByTagName("label").length+1;
	//On remets les tabindex dans l'ordre (deux par ligne)
	var tabindex = 1*etalon.getElementsByTagName("textarea")[0].getAttribute("tabindex") + (2*(newId-1));
	
	
	//Je fais une copie du dernier ajouté, et je change les noms de tout dedans
	var newReponse = lastReponse.cloneNode(true);
	//On vire la class
	//vd(getClass(newReponse));
	//if (getClass(newReponse).find(" error")) setClass(getClass(newReponse)
	newReponse.id = "reponse"+newId; //je change son id
	
	//On doit changer les noms et id des éléments dedans
	
	//Les deux tooltip
	var tooltips = getElementsBySelector("div.infos div.texte", newReponse);
	tooltips[0].id = "info_reponse_name"+newId;
	tooltips[1].id = "info_reponse_juste"+newId;
	
	//Label : On change le nom (Réponse A, B, C, etc) et le for
	var label = newReponse.getElementsByTagName("label")[0];
	label.setAttribute("for", "reponse_name"+newId);
	//Je change son nom
	var arrLettre = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
	label.innerHTML = "Réponse "+arrLettre[newId-1]+" : ";
	
	//Le champ de réponse, on change son nom et son id
	var reponse_name = newReponse.getElementsByTagName("textarea")[0];
	reponse_name.name = reponse_name.id = "reponse_name"+newId;
	reponse_name.value = "";
	reponse_name.setAttribute("tabindex", tabindex);
	//On fait afficher le tooltip
	reponse_name.onmouseover = showAlt;
	reponse_name.onmouseout = removeAlt;
	
		
	//La case à cocher pour dire si la réponse est juste ou non
	var reponse_juste = newReponse.getElementsByTagName("input")[0];
	reponse_juste.name = reponse_juste.id = "reponse_juste"+newId;
	reponse_juste.checked = "";
	reponse_juste.setAttribute("tabindex", tabindex+1);
	//On fait afficher le tooltip
	reponse_juste.onmouseover = showAlt;
	reponse_juste.onmouseout = removeAlt;
	
	//On affiche le lien de suppression et on y attribue la fonction
	var deleteLink = newReponse.getElementsByTagName("a")[0];
	deleteLink.id = "deleteLink"+newId;
	deleteLink.href = "reponse"+newId;
	deleteLink.style.display = "inline";
	deleteLink.onclick = deleteReponse;
	
	//On l'ajoute après le dernier (c'est à dire juste avant le suivant du dernier)
	div.insertBefore(newReponse, lastReponse.nextSibling);
	return false;
}


/**** deleteReponse ****/
//On supprimer une réponse en cliquant sur le lien Supprimer
function deleteReponse() {
	//Hop, on efface ca
	this.parentNode.parentNode.removeChild(this.parentNode);
	renameReponses();
	return false;
}

/**** renameReponse ***/
//Parfois en supprimant des éléments ils ne sont plus par ordre A B C E, etc, on les remets donc dans l'ordre et on renomme les name/id des éléments dedans
function renameReponses() {
	var reponses = getElementsBySelector("#div_question_type_qcm .reponse");
	var arrLettre = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
	var tooltips, label, textarea, checkbox, link;
	var id;
	for (var i =0;i!=reponses.length;i++) {
		id = i+1;
		//On change les id/name de tout les éléments
		reponses[i].id = "reponse"+id;
		//Les deux tooltips
		tooltips = getElementsBySelector(".infos .texte", reponses[i]);
		tooltips[0].id = "info_reponse_name"+id;
		tooltips[1].id = "info_reponse_juste"+id;
		//Le label
		label = reponses[i].getElementsByTagName("label")[0];
		label.setAttribute("for", "reponse_name"+id);
		label.innerHTML = "Réponse "+arrLettre[i]+" : ";
		//Le textarea
		textarea = reponses[i].getElementsByTagName("textarea")[0];
		textarea.name = textarea.id = "reponse_name"+id;
		//La checkbox
		checkbox = reponses[i].getElementsByTagName("input")[0];
		checkbox.name = checkbox.id = "reponse_juste"+id;
		//le lien de suppression
		link = reponses[i].getElementsByTagName("a")[0];
		link.href = "reponse"+id;
		link.id = "deleteReponse"+id;
		
		
	}
	
}

/**** On efface une réponse en cliquant dessus ****/
function makeDeleteReponse(obj) {
	obj.onclick = deleteReponse;
}


/************ makeTestQuestion ***************************/
//On affiche la question en rouge ou vert selon les cases cochées
function makeTestQuestion(obj) {
	obj.onclick = testQuestion;
}
function testQuestion() {
	//je masque le bouton
	this.style.display = "none";
	
	
	//Je prends la question
	var question = this.parentNode;
	//La liste des réponses
	var answers = this.alt.split(",");
	//Je passe en revue maintenant les cases à cocher pour voir si bien cochées
	var ul = question.getElementsByTagName("ul")[0];
	var li = ul.getElementsByTagName("li");
	var perfect = true;
	var thisPerfect;
	for (var i=0; i!=li.length;i++) {
		checkbox = li[i].getElementsByTagName("input")[0];
		thisPerfect = (
			(checkbox.checked && answers.find(checkbox.value)) 
			|| 
			(!checkbox.checked && !answers.find(checkbox.value))
		);
		perfect = (thisPerfect && perfect);
	}
	
	var strong = document.createElement("strong");
	
	//Si c'est pas perfect, je passe en rouge
	if (!perfect) {
		setClass(question, "qcmQuestion error");
		setClass(strong, "error");
		strong.innerHTML = "Réponse incorrecte";
	}
	else {
		setClass(question, "qcmQuestion perfect");
		setClass(strong, "perfect");
		strong.innerHTML = "Réponse correcte";
	}
	//On le mets juste avant la liste;
	question.insertBefore(strong, ul);
	
	return false;
}

/************ makeTestQuestionVf ***************************/
//On affiche la question en rouge ou vert selon les cases cochées
function makeTestQuestionVf(obj) {
	obj.onclick = testQuestionVf;
}
function testQuestionVf() {
	//je masque le bouton
	this.style.display = "none";
	
	
	//Je prends la question
	var question = this.parentNode;
	//La liste des réponses
	var answer = this.alt;
	
	//On regarde ce qui est coché
	var checkedVrai = question.getElementsByTagName("input")[0];
	var perfect = (checkedVrai.checked && answer==1);
	
	var strong = document.createElement("strong");
	//Si c'est pas perfect, je passe en rouge
	if (!perfect) {
		setClass(question, "qcmQuestion error");
		setClass(strong, "error");
		strong.innerHTML = "Réponse incorrecte";		
	}
	else {
		setClass(question, "qcmQuestion perfect");
		setClass(strong, "perfect");
		strong.innerHTML = "Réponse correcte";
	}
	var ul = question.getElementsByTagName("ul")[0];
	//On le mets juste avant la liste;
	question.insertBefore(strong, ul);
	
	return false;
}


/************ makeTestQuestionQroc ***************************/
//On affiche en vert 
function makeTestQuestionQroc(obj) {
	obj.onclick = testQuestionQroc;
}
function testQuestionQroc() {
	//je masque le bouton
	this.style.display = "none";	
	//Je prends la question
	var question = this.parentNode;
	setClass(question, "qcmQuestion perfect");
	return false;
}
