/* $Id: module-eadeac.js 15480 2009-06-30 13:50:23Z cbougouin $ */
/**
Copyright (C) 2003-2008 AJLSM
Voir le fichier LICENCE
**/

// Appel d'une méthode générale au chargement de la page
Event.observe(window, 'load', plInit);

/* 	On se définit une petite classe qui permet d'étendre la classe widget.Node de
	YUI et ainsi avoir des propriétés supplémentaires.
*/
YUINodeExtender = function() {
};
YUINodeExtender.prototype = {
	// Si true, on doit ouvrir automatiquement le noeud
	autoExpand: false,
	/* Pleade Plus : Marqueur pour l'identifiant Pleade du noeud */
	pleadeId: null
	/* /Pleade Plus */
};


/** Initalisations au chargement de la page. */
function plInit() {
	if ( YAHOO.widget.Node ) YAHOO.lang.augment(YAHOO.widget.Node, YUINodeExtender);
	// Ajuste les hauteurs
	//plInitHeight();
	//initialisation des boutons d'aide, home et gotoopener (s'is existent !)
	if( $("btn-help") ) {
		var btnHelp = $("btn-help");
		btnHelp.observe("click", showHelp);
	}
	if( $('btn-home') && $("btn-goto-opener") ) {
		if ( window.opener ) {
			$('btn-home').hide();
		} else {
			$('btn-goto-opener').hide();
		}
	}
}

/* Initialisation de la hauteur des div de la partie main */
function plInitHeight() {
	// Les trois div qui nous intéressent
	var dLcol = $("pl-pg-body-main-lcol");
	var dHdl = $("pl-pg-body-main-hdl-bg");
	var dMcol = $("pl-pg-body-main-mcol");
	// On prend la hauteur maximale entre la colonne de gauche et la colonne de droite,
	// mais jamais moins que la hauteur de la poignée de redimensionnement
	var hHandle = 190;
	var h = Math.max(getHeight(dLcol), getHeight(dMcol), hHandle);
	// On fixe la hauteur de ces trois éléments
	setTotalHeight(dLcol, h);
	setTotalHeight(dHdl, h);
	setTotalHeight(dMcol, h);
}

/**
* Récupère les identifiants cachés du cadre de clasement
* en cas de modification de la recherche
*/
function getCdcIdsToLoad(first) {
	// On enlève le ?
	url_params = window.location.search.slice(1,window.location.search.length);
	// On sépare le paramètres....
	params = url_params.split("&");

	var _ids = new Array();
	for(i=0 ; i < params.length ; i++) {
		param = params[i].split('=');
		if(param[0] == '_cdcid') {
			_ids[_ids.length] = param[1];
		}
	}

	var result = '';
	if( _ids.length > 0) {
			result = (first)? "?":"&";
			result += "_cdcids=" + _ids.join(';');
	}
	return result;
}

/**
*	Initialise et affiche le cadre de classement pour exploration, donc
*	sans résultats de recherche.
*/
function initCdcPlain() {
	// Le cdcPartId est facultatif; s'il est fourni, et si sa valeur
	// est non null et non vide, alors on débute l'affichage sur l'entrée du
	// cadre de classement qui correspond à cet id. Il est normalement en
	// variable globale de la page HTML.
	var query = "";
	if ( cdcPartId && cdcPartId != "" ) query = "?id=" + cdcPartId;
	// On appelle simplement la méthode générique avec les bons paramètres
	initCdc("plain", "functions/ead/cdc.json" + query);
}

/**
*	Initialise et affiche le cadre de classement pour exploration et pour
*	filtrer les recherches.
*/
function initCdcSearchForm() {
	// On appelle simplement la méthode générique avec les bons paramètres
	var _url = "functions/ead/cdc-searchform.json" + getCdcIdsToLoad(true);
	initCdc("plain", _url, "cdc");
}

/**
*	Initialise et affiche le cadre de classement avec résultats de recherche.
*/
function initCdcResults() {
	// On appelle simplement la méthode générique avec les bons paramètres
	// qid et oid sont définis comme variables globales dans le HTML
	var url = "functions/ead/cdc-results.json?qcdcall=" + qidcdcall + "&qcdc=" + qidcdc + "&qrootid=" + qidrootid + "&oid=" + oid + "&_ae=" + ae;
	initCdc("results", url);
}

function initCdcResultsId(id){
	var url = "functions/ead/cdc-results.json?qcdcall=" + qidcdcall + "&qcdc=" + qidcdc + "&qrootid=" + qidrootid + "&oid=" + oid + "&_ae=" + ae;
	initCdc("results", url, id);
}

// Initialisation du cadre de classement
function initCdc(type, url, id) {
	startFragmentLoading();

	// L'identifiant du div
	var divid = "cdc";
	if (id) divid = id;

	// L'arbre YUI
	var tvRoot = (new YAHOO.widget.TreeView(divid)).getRoot();

	// On appelle la fonction qui demande des noeuds
	jsonTreeViewHandler(tvRoot, null, url, true);
}

/**
*	Fonction qui permet de charger des noeuds de l'arbre depuis des fichiers JSON.
*	Elle est appelée comme un callback par YUI mais aussi pour initialiser l'arbre
*	au départ.
*	@param node {Node} Le noeud du Treeview concerné
*	@param fnLoadComplete {function} La fonction à appeler une fois terminé de charger
*	@param url {String) L'URL à appeler en Ajax
*	@param draw (boolean) Si vrai, on appelle l'affichage de l'arbre
*/
function jsonTreeViewHandler(parent, fnLoadComplete, url, draw) {
	var realUrl = url;
	if ( !realUrl ) realUrl = parent.href;
	var req = new Ajax.Request(realUrl, {
			method: "get",
			onSuccess: function(r) { // mettre dans une variable type function à part ?
				// On reçoit un objet ou un ensemble d'objets
				var obj = r.responseText.evalJSON();
				var entries = $A(obj);
				// On boucle sur les objets obtenus et on construit pour chacun un noeud dans l'arbre
				entries.each(function(n) {

				 // if ( n.hidden && n.hidden!='' ) {console.log(n.id + ' : on ne passe pas !');}
				 // else {

						// On formate le contenu, différent selon le type de noeud
						var content = formatCDCEntryContent(n);

						// On construit le noeud
						var newNode = new YAHOO.widget.HTMLNode(content, parent, false, true);
						if ( n.autoExpand ) newNode.autoExpand = true;
						else newNode.autoExpand = false;

						// Le lien et son handler
						if (n.href) { // Il pourrait ne pas y avoir de lien
							newNode.href = n.href + getCdcIdsToLoad();
						}

						// La fonction qui permet de charger le contenu
						if (n.hasChildren) newNode.setDynamicLoad(jsonTreeViewHandler);

						// On appelle la méthode de fin de chargement
						if (fnLoadComplete) fnLoadComplete();

				 // }

				});
				// Utilisé pour le premier appel
				if (draw) parent.tree.draw();
				// On boucle sur les enfants et on les ouvre si nécessaire
				if (parent) {
					parent.children.each(function(nn) {
						if (nn.autoExpand) nn.expand();
					});
				}
			},
			onComplete: stopFragmentLoading
		}
	);
}

/**
	Retourne le contenu formaté d'un noeud dans le cadre de classement, qu'il s'agisse
	d'une entrée normale ou d'un document.

	@param node	L'entrée, obtenue en JSON. Ses différentes propriétés permettent
				de générer des contenus légèrement différents selon le contexte.
*/
function formatCDCEntryContent(node) {

	// Un raccourci pour les tests sur le type de noeud
	var isDoc = (node.type == "document");

	// La classe du tableau est donnée par le type
	var classname = "cdc-" + node.type;
	if ( node.styles ) classname += " "+node.styles;

	// L'identifiant du tableau pour cette entrée
	var tableId = "cdc-tbl-" + node.id;

	// L'identifiant du td pour le contenu principal de cette entrée
	var tdId = "cdc-td-" + node.id;

	// On commence à construire le HTML
	var r = "<table class='" + classname + "' id='" + tableId + "'><tbody><tr>";

	// Une cellule pour le titre
	r += "<td class='cdc-title' id='" + tdId + "'>";

	/* Pleade Plus : affichage des IR illustrés */
	if(node.illustratedChild == true) {
		r += " <span class=\"anc_illustrated\" title=\"" + _usersMessages.cdc_illustrated_ancestor + "\">&nbsp;</span>";
	}
	/* /Pleade Plus */

	// Pour les documents, on crée un lien en mode navigation
	// pour faire varier l'URL de la page d'affichage d'un document en fonction de la base de documents
	// if ( isDoc && node.context == "cdc" ) r += "<span class='cdc-unittitle'><a title='" + _usersMessages.cdc_document_title + "' href='ead.html?id=" + node.id + "' onclick='return winFocus(this.href, \"docead\")'>";
	if ( isDoc && node.context == "cdc" ) {
		r += "<span class='cdc-unittitle'><a title='" + _usersMessages.cdc_document_title + "' href='";
		if ( node.type == "document" && node.base != '' ) r += node.base
		else r += 'ead'
		r += ".html?id=" + node.id;
		if ( node.type != "document" ) r+= '&ti18n'
	  r += "' onclick='return winFocus(this.href, \"docead\");'>";
	}
	// En mode formulaire, on crée une case à cocher
	if ( node.context == "searchform" ) {
		var strInput = "<input type=\"checkbox\" name=\"_cdcid\" value=\"" + node.id + "\"";
		if(cdc_2check_ids != '' && cdc_2check_ids.include(node.id)){
			strInput += " checked=\"checked\"";
		}
		strInput += "/>";
		/*r += "<input type=\"checkbox\" name=\"_cdcid\" value=\"" + node.id + "\"/>"*/
		r += strInput;
	};
	r += node.unittitle; // TODO (MP) : Tronquer si trop long
	if ( isDoc && node.context == "cdc" ) r += "</a></span>";
	if ( node.unitdate ) r += " \u2022 <span class='cdc-unitdate'>" + node.unitdate + "</span>"; // TODO (MP) : Tronquer si trop long
	if ( node.unitid ) r += " \u2022 <span class='cdc-unitid'>" + node.unitid + "</span>"; // TODO (MP) : Tronquer si trop long
	// Pour les résultats, on affiche le nombre
	if ( node.context == "results" ) {
		if ( isDoc ) {
			// Pour les documents, on affiche un bouton pour consulter les résultats
			r += " <span class='show-results'><a title=\"";
			if ( node.nbResults == 1 ) r += _usersMessages.cdc_showresults_title_one;
			else r += _usersMessages.cdc_showresults_title_many;
			r += "\" href='" + node.href + "'" + node.id + "' onclick='return displayDocumentResults(\"" + node.id + "\", \"" + tdId + "\", \"" + node.href + "\");'>";
			if ( node.nbResults == 1 ) r += _usersMessages.cdc_showresults_text_one;
			else r += _usersMessages.cdc_showresults_text_begin_many + " " + node.nbResults + " " + _usersMessages.cdc_showresults_text_end_many;
			r += "</a></span>";
		}
		else {
			r += "<span class='cdc-nbresults'>(" + node.nbResults + " ";
			if ( node.nbResults == 1 ) r += _usersMessages.cdc_nbresults_text_one;
			else r += _usersMessages.cdc_nbresults_text_many;
			r += ")</span>";
		}
	}

	if(node.isnew == 1) {
		r += " <span class=\"cdc-news\">" + _usersMessages.cdc_isnew + "</span>";
	}

	r += "</td>";

	// Un lien pour afficher les informations complémentaires
	if ( node.context == 'cdc' && node.moreInfo ) r += "<td class='cdc-moreinfo-td'><span class='moreinfo' id='" + tableId + "-moreinfo-span" + "'><a title=\"" + _usersMessages.cdc_moreinfo_title + "\" href='cdc-moreinfo?id=" + node.id + "' onclick='return displayMoreinfo(\"" + tableId + "\", \"" + node.id + "\");'>" + _usersMessages.cdc_moreinfo_text + "</a></span></td>";

	// Fin du HTML
	r += "</tr></tbody></table>";

	// On le retourne
	return r;

}

/**
	Affiche les résultats pour un document.

	@param tdId		L'identifiant du td où insérer le div
	@param nodeid	L'identifiant du noeau, pour avoir un id unique
	@param url		L'URL pour appeler les résultats en AJAX
*/
function displayDocumentResults(nodeid, tdId, url) {
	// L'identifiant du div où l'on a les résultats
	var divid = "results-container-" + nodeid;
	// Il est possible que l'on ait déjà affiché les résultats
	var div = $(divid);
	if ( div ) {
		// On a les résultats, alors on l'affiche ou le ferme
		div.toggle();
	}
	else {
		// On n'a pas les résultats, on doit construire le div et le remplir
		var d = document.createElement("div");
		d.setAttribute("id", divid);
		var td = $(tdId);
		td.appendChild(d);
		// On va chercher les informations et on met à jour le conteneur
		//new Ajax.Updater(d, url, {evalScripts: true});
		updateDocumentResults(d, url);
	}
	return false;
}
function updateDocumentResults(div, url) {
	startFragmentLoading();
	new Ajax.Updater(div, url, {
		evalScripts: true,
		onComplete: stopFragmentLoading
	});
}


/**
 *	Construit un noeud dans l'arbre des résultats d'un document.
 *
 *	@param parent	Le noeud parent
 *	@param result	true si c'est un résultat, false si c'est un ancêtre d'un résultat
 *	@param linkType	Le type de lien à construire (newWin, internal)
 *	@param eadid	L'identifiant du document ead
 *	@param id		L'identifiant du composant résultat
 *	@param titre	Le titre du composant résultat
 *	@param d		La date
 *	@param c		La cote
 *	@param pacomm	Première année communicable
 *  @param qid
 *  @param mBase
 *  Pleade Plus:
 *  @param illustrated
 *  @param ancillustrated
 */
function buildTVEntryResult(parent, result, linkType, eadid, id, titre, d, c, pacomm, qid, illustrated, ancillustrated, mBase) {
  if(mBase==null || mBase=='') mBase='ead';
	// Fabrication du titre à afficher
	var sep = " \u2022 "; // TODO (MP) : recuperer depuis la variable globale dans module-eadeac.xmap (list-sep)
	// Y a-t-il des termes à mettre en surbrillance ?
	if(titre.indexOf('hilite_pretag')!=-1){
		titre = titre.gsub('hilite_pretag', '<span class="pl-hilite">').gsub('hilite_posttag', '</span>');
	}
	 // TODO (MP) : Tronquer titre, d et c si trop longs
	var linktitle = titre;
	var onclick = "return winFocus(this.href, 'doc"+ mBase+"');"
	if ( linkType == "internal" ) onclick = "loadFragment('" + mBase + "-fragment.xsp?c=" + id + "&qid=" + qid + "'); return false;";
	if ( result ) linktitle = "<a href=\""+mBase+".html?id=" + eadid + "&c=" + id + "&qid=" + qid + "\" onclick=\"" + onclick + "\">" + titre + "</a>";
	var title = "<span class=\"cdc-unittitle\">" + linktitle + "</span>";
	if ( d && d != "" ) title += sep + "<span class=\"cdc-unitdate\">" + d + "</span>";
	if ( c && c != "" ) title += sep + "<span class=\"cdc-unitid\">" + c + "</span>";
	if ( pacomm && pacomm != "" ) title += sep + "<span class=\"cdc-pacomm\">Première année communicable&#xA0;: " + pacomm + "</span>"; // TODO (MP) : i18n
	// La classe du table
	var tableclass = result ? "cdc-document" : "cdc-entry";
	// Le HTML final
	var html = "<table class=\"" + tableclass + "\"><tbody><tr><td class=\"cdc-title\">"; //FIXME (MP) : inclue mBase dans la classe ?
	//TODO (MP) : Condition pour savoir si on active le bouton : le doc est-il deja dans le panier ?
	if ( activeBasket && activeBasket=="true" && result ) {
		// on a active le panier && on traite un resultat clicable : on peut ajouter le bouton d'ajout au panier
    // TODO (MP) : pour autre que EAD ?
		html += "<button class=\"pl-bskt-bttn-doc\" title=\""+_usersMessagesBasket.basket_button_add_doc_title+"\" onclick=\"addDocToBasket('id="+id+"', this);\" onkeypress=\"this.click();\"><span class=\"access\">"+_usersMessagesBasket.basket_button_add_doc_text+"</span></button>";
	}
	/* Pleade Plus : affichage des IR illustrés */
	if(ancillustrated){
		html += '<span class="anc_illustrated">&nbsp;</span>';
	}
	if(illustrated){
		$A(illustrated).each(function(ni){
			if( illustrated.length == 1 && ni == 1 ) {
				html += '<span class="old_illustrated">&nbsp;</span>';
			} else {
				html += '<span class="' + ni + '_illustrated">&nbsp;</span>';
			}
		});
	}
	/* /Pleade Plus */
	html += title;
	html += "</td></tr></tbody></table>";
	// On retourne un noeud YUI
	return new YAHOO.widget.HTMLNode(html, parent, true, true);
}

/**
	Affiche une rangée de tableau pour donner plus d'information sur
	une entrée de cadre de classement.

	@param	tableId		L'identifiant du tableau qui contient l'entrée
	@param	cdcId		L'identifiant de l'entrée du cadre de classement
*/
function displayMoreinfo(tableId, cdcId) {
	// Le tableau
	var t = $(tableId);
	// L'identifiant de la rangée pour pouvoir la fermer ensuite
	var rowId = tableId + "-" + "moreinfo";
	var newR = $(rowId);
	// Le span et son lien
	var sp = $(tableId + "-moreinfo-span");
	var a = sp.down("a");

	if (newR) {
		// On a déjà construit la rangée, on la cache ou rend visible
		newR.toggle();
		if ( newR.visible() ) {
			// Ajustement du lien
			t.addClassName("cdc-exit");
			t.removeClassName("cdc-entry");
			sp.addClassName("lessinfo");
			sp.removeClassName("moreinfo");
			a.setAttribute("title", _usersMessages.cdc_moreinfo_close_title);
			a.innerHTML = _usersMessages.cdc_moreinfo_close_text;
		}
		else {
			// Ajustement du lien
			t.addClassName("cdc-entry");
			t.removeClassName("cdc-exit");
			sp.addClassName("moreinfo");
			sp.removeClassName("lessinfo");
			a.setAttribute("title", _usersMessages.cdc_moreinfo_title);
			a.innerHTML = _usersMessages.cdc_moreinfo_text;
		}
	}
	else {
		// On n'a pas la rangée, on la construit
		var tr = $(document.createElement("tr"));
		tr.setAttribute("id", rowId);
		var td = $(document.createElement("td"));
		td.setAttribute("colspan", "10");
		tr.appendChild(td);
		t.down('tbody').appendChild(tr);
		// On va chercher le contenu
		new Ajax.Updater(td, "functions/ead/cdc-moreinfo.html?id=" + cdcId);
		// On ajuste le lien
		t.addClassName("cdc-exit");
		t.removeClassName("cdc-entry");
		sp.addClassName("lessinfo");
		sp.removeClassName("moreinfo");
		a.setAttribute("title", _usersMessages.cdc_moreinfo_close_title);
		a.innerHTML = _usersMessages.cdc_moreinfo_close_text;
	}
	return false;
}

/**
*	Fonction appelée au début du chargement d'un fragment.
*/
function startFragmentLoading( message, path ) {
	if(!message || message == ''){
		message = 'Chargement en cours...'; /* TODO: i18n */
	}
	if(!path || path == undefined) path = '';
	var ldiv = new Element('div', { 'id': 'loading' }).update("<img src=\"" + path + "theme/images/pnl-loading.gif\"/> " + message);
	ldiv.setStyle({
			width: "200px",
			left: ( (document.viewport.getWidth() - 220) / 2 ) + "px"
	});
	$("pl-pg-body-main").insert(ldiv);
	$("body").setStyle({cursor: 'wait'});
}

/**
*	Fonction appelée à la fin du chargement d'un fragment.
*/
function stopFragmentLoading() {
	if( $("loading") )
		$("loading").remove();
	$("body").setStyle({cursor: 'auto'});
	/* try{ adjustHeight(); } catch(e){} */
}

/**
 *	Valider les selections de l'utilisateur dans les criteres de type "suggest".
 *	On recoit l'INPUT et le bloc conteneur des valeurs a y inscrire.
 *	Ce dernier bloc contient des SPAN. On boucle dessus et on ne conserve que le
 *	le texte (fonction stripTags de Prototype).
 */
function suggest2work( myInput, myValues ) {
	if( myInput==null
			|| myValues==null ) return false;
	$(myValues).getElementsBySelector("a").each( function( o,i ) {
		if( !o.empty() ){
			var v = o.innerHTML.stripTags().strip();
			if ( myInput.value.indexOf( v ) != -1 ) // la valeur y est deja, on continue
					return;
			else if( i!=0 || !myInput.getValue().blank() )
					myInput.value += sep + v;
			else
					myInput.value += v;
		}
	});
}
/*
 *	Initialisation des onglets YUI
 *	On se base sur des blocs DIV ayant une classe "tab"
 */
function initTabs(){
	var mTabs = new YAHOO.widget.TabView("tabs");
}

/** Initialisation des tooltips pour les éléments html acronym */
function initAcronyms(){
	$$('acronym').each(function(item){
			var tooltip = new YAHOO.widget.Tooltip("myTooltip", { context:item, width:250} );
	});
}

function showHelp(ev){
	var _url = 'pages/help-ead.html';
	winFocus(_url, 'eadhelp','width=800,height=600', null, 'true');
	ev.stop();
}
