/*
menuDA : un menu comme sur le site de deviantart.com

***************************
Script remplaçant le menu de base
par un menu dynamique en AJAX...
***************************

Version 1.0;
Auteur:Samuel DUFAY;
Date : 22/11/08;

*/

function menuDA (idConteneur, id_rubrique, debugMode) {
	this.idConteneur = idConteneur;
	this.inDom = null;
	this.idRubriqueCourante = id_rubrique;	//l'id de la rubrique principale du menu, change en navigant
	this.isWaiting = false;
	this.indent = 1;
	this.idCourante = id_rubrique;	//l'id de la rubrique courante, ne change pas en navigant
	
	if (debugMode) {
		this.debugMode = true;
	} else {
		this.debugMode = false;	//dans ce cas, n'affiche pas les erreurs = n'affecte pas le menu classique
	}
	
	objMenuDA = this; //transmettre this pour ne pas perdre le "binding"
	
	//attendre le chargement du DOM avant de continuer
	document.observe('dom:loaded', function() {
		objMenuDA.init();
	});
}

menuDA.prototype.init = function()
{
	try {
		//vérfier l'existance du conteneur dans le DOM
		elt = document.getElementById(this.idConteneur);
		
		if (elt) {	//si l'élement existe dans le DOM
			
			this.inDom = $(this.idConteneur);
			
			//créer la zone de status = là ou le curseur AJAX tourne...
			this.inDom.insert({before:'<div id="menu-wait"></div>'});
			
			this.reload();
			
		} else {
			throw new Error('Impossible de créer un menu sur un identifiant inexistant : idConteneur='+this.idConteneur, 'menuDA::BAD_ELT_IDENTIFIER');
		}
	} catch(e) {
		throw e;	//faire suivre l'exeption...
	}
}

menuDA.prototype.swapStatus = function()
{
	if (this.isWaiting) {
		$('menu-wait').removeClassName('wait');
		this.isWaiting = false;
	} else {
		$('menu-wait').addClassName('wait');
		this.isWaiting = true;
	}
}

menuDA.prototype.reload = function()
{
	this.indent = 1;
	_menuDA_ajaxLoad(this);
}

menuDA.prototype.clear = function()
{
	this.inDom.innerHTML = '';
}

function _menuDA_ajaxLoad(objMenuDA)
{

	//afficher le sablier
	objMenuDA.swapStatus();

	var req = new Ajax.Request('index.php',
	{
		method:'get',
		encoding:'ISO-8859-1',
		parameters: 'page=menuda&id_rub=' + objMenuDA.idRubriqueCourante,
		onComplete: function(response) {
			
			if (!(req.success && response.status == 200)) {
				
				//Signaler l'erreur...
				objMenuDA.showError("Impossible de contacter le serveur...");
				
				//masquer le sablier
				objMenuDA.swapStatus();
			} else {
				//Vérifier le status de la réponse
				if (/ERROR/.test(response.responseText)) {
					objMenuDA.showError(response.responseText);
					
					//masquer le sablier
					objMenuDA.swapStatus();
				} else {
					
					try{
						tab = eval(response.responseText);
					} finally {
						objMenuDA.inDom.style.display = 'block';
					}
					//masquer le sablier
					objMenuDA.swapStatus();
					
					//effacer l'actuel contenu du menu :
					objMenuDA.clear();
					
					for(var i=0;i<tab.length-1;i++) {
						objMenuDA.afficherRubrique(tab[i]);
					}
					
					//afficher le menu
					descendreMenu();
					
				}
			}
		},
		onLoading: function() {
			
		}
	});
}

function descendreMenu() {
	if ($('menuDA').style.display != 'none') {
		setTimeout("descendreMenu()", 500);
	} else {
		Effect.BlindDown(objMenuDA.idConteneur);
	}
}

menuDA.prototype.afficherRubrique = function(objRubrique) {
	//{'id':'$id', 'titre':'$titre', 'type':'$type'}    type = 'parent' | 'child' | 'me'
	

	if (objRubrique.haveChilds == 'true') {
		var classe = 'have-childs';
	} else {
		var classe = objRubrique.type;
	}

	var indent = this.indent * 5;

	this.inDom.insert('<div id="rubrique_menu_' + objRubrique.id + '" style="padding-left: ' + indent + 'px" class="' + classe + '">' + objRubrique.titre.replace('\\', '') + '</div>');
	
	if (objRubrique.type != 'child')	this.indent++;


	//si l'élément doit pouvoir être cliquable, ajouter un gestionnaire d'événement....	
	if (objRubrique.type != 'me') {
		if (objRubrique.haveChilds == 'true' || objRubrique.type == 'parent') {
			//gestionnaire pour mettre le menu à jour
			addGestionnaireReloadMenu(this, objRubrique.id);
		} else {
			//gestionnaire pour changer de page
			addGestionnaireGoTo(objRubrique.id);
		}
	}
}

//gestionnaire d'évènement pour les rubriques parentes : elles doivent actualiser le menu...
function addGestionnaireReloadMenu(objMenuDA, idRubrique)
{
	Event.observe($('rubrique_menu_' + idRubrique), 'click', function(event)
		{
			//pour l'accueil = exeption : il faut recharger la page si on est plus sur l'accueil...
			if (idRubrique == 1 && objMenuDA.idCourante != 1) {
				document.location.href = './';
			} else {
				//masquer le menu pendant le chargement...
				Effect.BlindUp(objMenuDA.idConteneur, { duration: 0.7 });
				
				//simplement actualiser le menu...
				objMenuDA.idRubriqueCourante = idRubrique;
				objMenuDA.reload();
			}
		}
	);
}

//gestionnaire d'évènement pour les rubriques filles : aller à la rubrique
function addGestionnaireGoTo(idRubrique)
{
	Event.observe($('rubrique_menu_' + idRubrique), 'click', function(event)
		{
			
			document.location.href = '?id_rubrique=' + idRubrique;
			
		}
	);
}
menuDA.prototype.showError = function(message)
{
	if (this.debugMode)	//sinon, n'affiche pas les erreurs = n'affecte pas le menu classique
		this.inDom.innerHTML = '<div class="error"><strong>Erreur :</strong> ' + message + '</div>';
}