/**
 * Couleur de bordure des champs de formulaire 
 * - specifique au site
 */
var couleur_de_bordure="#888";

/**
 * @return {Void} Fonctions a effectuer après le chargement de la page
 */
window.onload=function()
{
	// vidage des champs autocomplete du navigateur
	window.setTimeout("clearPwBox()", 100);
}

/**
 * 
 * @param {Object} strId
 * @return {Void} pour l'autocompletion (TODO :: a mettre en place
 */
var OnKeyRequestBuffer = 
{
    bufferText: false,
    bufferTime: 1000,
    
    modified : function( strId , strValue , strIdLieu )
    {
            setTimeout('OnKeyRequestBuffer.compareBuffer("'+strId+'","'+xajax.$(strId).value+'","'+strValue+'","'+strIdLieu+'");', this.bufferTime);
    },
    
    compareBuffer : function(strId, strText , strValue , strIdLieu)
    {
        if (strText == xajax.$(strId).value && strText != this.bufferText)
        {
            this.bufferText = strText;
            OnKeyRequestBuffer.makeRequest( strId , strValue , strIdLieu );
        }
    },
    
    makeRequest : function( strId , strValue , strIdLieu )
    {
        xajax_getVilles( strId , strValue , strIdLieu );
    }
}


function validNombreMembre(){
	
	var ElementNbrNecessary = document.getElementsByClassName( 'necassaryNbr' );
	var nbrTotalNecessary = 0;
	
	for(i=0; i<ElementNbrNecessary.length; i++) {
		nbrTotalNecessary+=  ( ElementNbrNecessary[i].innerHTML * 1);
	}
	
	var nbrTotalCourant = countElement();
	
	/*if( nbrTotalCourant < nbrTotalNecessary ) {*/
	if( nbrTotalCourant <= 0 ) {
		alert( 'Erreur : Veuillez vérifier le nombre de membres sélectionnés pour chacun des postes' );
		return false;
	} else if( nbrTotalCourant < nbrTotalNecessary ) {
		var mess = 'Attention ! Le nombre de membres que vous avez sélectionné ne correspond pas avec celui spécifié dans l\'évènement.\nVoulez-vous continuer ?';
		return confirm( mess );
	}
	
	return true;
}


/**
 * Génère un formulaire caché en fonction des listes ul-li possèdant la class="toForm"
 * 
 * Le formulaire caché sera inclu juste avant le 1er conteur trouvé. Les champs crées seront de type "hidden", leur nom sera l'id du
 * conteneur et sont prévu pour être des tableaux (name="idConteneur[]"). La valeur sera la valeur réelle extraite de l'id de l'élement
 * courant (idElement='liste_1' => value="1")
 */
function makeForm()
{
	var elementsToForm = document.getElementsByClassName( 'toForm' );
	var inputs = '';
	
	for(i=0; i<elementsToForm.length; i++) {
		if( elementsToForm[i].hasChildNodes() ) {
			var inputName = elementsToForm[i].id;
			var elementsInContainer = elementsToForm[i].childNodes;
			
			for(c=0; c<elementsInContainer.length; c++) {
				var aElementId = elementsInContainer[c].id.split( '_' );
				inputs+= '<input type="hidden" name="' + inputName + '[]" value="' + aElementId[1] + '" />\n';
			}
		}
	}
	// création des élements du formulaire
	if( !$('updateForm' ) )	{
		cont = document.createElement( 'p' );
		cont.setAttribute( 'id', 'updateForm' );

		elRef = $( elementsToForm[0] );
		parent = elRef.parentNode;
		
		parent.insertBefore( cont, elRef );
	}
	// Récup du conteneur
	cont = $( 'updateForm' );
	cont.style.display = 'none';
	
	cont.innerHTML = inputs;
}

/**
 * Compte le nombre d'élement l'affiche si c'est possible, et le retourne
 */
function countElement()
{
	var elementsToCount = document.getElementsByClassName( 'toCount' );
	var nbrTotal = 0;
	
	for(i=0; i<elementsToCount.length; i++) {
		var elementsToCountId = elementsToCount[i].id;
		
		if( elementsToCount[i].hasChildNodes() ) {
			var elementsInContainer = elementsToCount[i].childNodes;
			var nbrElement = elementsInContainer.length;
			
			nbrTotal+= nbrElement;
			
		} else {
			var nbrElement = 0;
		}
		
		// Si conteneur id="nbr_{elementsToCountId}_courant", on met à jour l'affichage
		var labelNbrId = 'nbr_' + elementsToCountId + '_courant';
		if ($(labelNbrId)) {
			$(labelNbrId).innerHTML = nbrElement;
		}
	}
	return nbrTotal;
}


/**
 * Rend droppable tous les éléments possédant la class <b>className</b>.
 * Pour les options, voir la documentation scriptaculous de l'objet Droppable ()
 * 
 * @param {String} className
 * @param {Object} options
 */
function makeDroppable( className, options )
{
	var elements = document.getElementsByClassName( className );
	
	if ( elements ) {
		for( e=0; e < elements.length; e++ )
		{
			Droppables.add( elements[e], options );
		}
	}
}

function dropElement( element, container, event )
{
	addElement(element, container, event);
	
	
	// On génère le formulaire pour l'envoie
	makeForm();
	countElement();
}

function addElement(element, container, event)
{
	var elementId = element.id;
	// Extrait le véritable id = "elementName_id" => récup juste id
	var aContainerId = elementId.split('_');
	var realElementId = aContainerId[1];
	var idNewElement = container.id + '_' + realElementId;

	var elementParent = element.parentNode;
	if( elementParent == container ) {
		return;
	}
	
	var lastElement = element;
	
	var containerClass = container.className;
	// Vérifie si c'est un move (class="moveFrom_element")
	var isMoving = false;
	var searchPattern = /(moveFrom_[\w]+)/gi;
	var aMatches = containerClass.match(searchPattern);
	
	if (aMatches) {
		for (m = 0; m < aMatches.length; m++) {
			var aSource = aMatches[m].split('_');
			var sSource = aSource[1];
			
			if( elementParent.id == sSource ) {
				isMoving = true;
				//Effect.Fade( element.id );
				//alert( 'moving!!');
				break;
			}
		}
	}
	
	// Vérifie la duplication
	if (hasTheElement(idNewElement, container) && !isMoving) {
		return;
	} else if( hasTheElement(idNewElement, container) && isMoving ) {
		elementParent.removeChild( element );
		return;
	}
	
	// Vérifie le duplicate entre différentes listes (class="uniqueDrop_element")
	var searchPattern = /(uniqueDrop_[\w]+)/gi;
	var aMatches = containerClass.match(searchPattern);	
	
	if (aMatches) {
		for (m = 0; m < aMatches.length; m++) {
			var aSource = aMatches[m].split('_');
			var sSource = aSource[1];
			
			//alert( m + ' : |' + aMatches[m] + '| => |' + sSource + "| => " + $(sSource) );
			if (hasTheElement(idNewElement, $(sSource), true) && !isMoving) {
				return;
			}
		}
	}
	
	// Construit le nouvel élement
	var newLi = Builder.node( 'li', {id: idNewElement, className: lastElement.className, style: "display:none"});
	newLi.innerHTML = lastElement.innerHTML;
	container.appendChild( newLi );
	Effect.Appear( newLi.id );
	
	// Rend le nouvel élément draggable
	new Draggable( idNewElement, {revert:true});
	
	// On supprime l'élement si on effectué un moving
	if( isMoving ) {
		elementParent.removeChild( element );
	}
}

/**
 * Vérifie si l'élement <b>elementId</b> est déjà présent dans le container <b>container</b>
 * Si <b>strict</b> vaut true, le test se fera sur la chaine id entière. S'il vaut false, on extraiera les id réels (elementName_idReel)
 * pour effectuer le test entre eux
 * 
 * @param {String} elementId
 * @param {Object} container
 * @param {Bool} strict | default = false
 * 
 * @return {Bool} Retourne TRUE si l'élement est déjà présent, sinon, retourne false
 */
function hasTheElement( elementId, container, strict )
{
	var strict = strict || false;
	
	var aElementId = elementId.split( '_' );
	var strictElementId = aElementId[1];
	
	if (container.hasChildNodes()) {
		var elementsOfContainer = container.childNodes;
		
		// Vérifie si l'élément n'existe pas déjà
		for (i = 0; i < elementsOfContainer.length; i++) {
			var element = elementsOfContainer[i].id;
			
			var aElement = element.split( '_' );
			var strictElement = aElement[1];
			
			if (strict) {
				elementId = strictElementId;
				element = strictElement;
			}			
			
			if (elementId == element) {
				return true;
			}
		}
	}
	return false;
}

/**
 * Ajoute un élément automatiquement draggable ayant l'id <b>id</b> et la class <b>class</b> au container <b>containerId</b>
 * 
 * 
 * @param {Object} containerID
 * @param {Object} id
 * @param {Object} class
 */
function addToListe( containerID, id, className, value, draggable )
{
	var draggable = draggable || true;
		
	var newLi = Builder.node( 'li', {id: id, className: className, style: "display:none"});
	var container = $(containerID);
	
	newLi.innerHTML = value;
	container.appendChild( newLi );
	Effect.Appear( newLi.id );
	
	// Rend le nouvel élément draggable
	if (draggable) {
		new Draggable(id, {
			revert: true
		});
	}
}


/**
 * Supprimer tous les enfants du conteneur <b>container</b>
 * @param {Object} container
 */
function removeAll( containerId )
{
	var element = document.getElementById( containerId );
	while (element.firstChild) {
		element.removeChild( element.firstChild );
	}
}

// ########################### FORMULAIRE AJOUT EVENTS

/**
 * ouverture et fermeture des onglets
 */
function afficheBlocId( id , className )
{
	// les elements a masquer récupérés par leur class
	var elements = getElementsByClass(className);
	
	// pour chaque elements de classe 'className'
	elements.each( function( element ){
		masqueBlocId( element.id );
	});
	
	// ouverture avec scriptaculus
	nematis_$(id+'Onglet').className = 'select';
	Effect.toggle(id , 'appear' , { delai : 0 } ) ;
	//Effect.Appear(id);
}
function masqueBlocId( id )
{
	nematis_$(id).style.display = 'none';
	//Effect.toggle(id , 'appear' ) ;
	
	nematis_$(id+'Onglet').className = '';
}

/**
 * soumet le "formulaire" d'ajout de lieux en ajax
 * 
 */
function submitAddVenuesXajax()
{
	// recup des valeurs
	var saisie = Array();
	saisie['nom_venues'] = nematis_$('nom_venuesAjax').value;
	saisie['id_venuesTypes'] = nematis_$('id_venuesTypesAjax').value;
	saisie['lieu_lieuxVenues'] = Array();
	saisie['lieu_lieuxVenues']['id_lieux'] 	= nematis_$('villeOuCp_lieux_lieuxVenuesAjax_id_lieux').value;
	saisie['lieu_lieuxVenues']['id_villes'] = nematis_$('villeOuCp_lieux_lieuxVenuesAjax_id_villes').value;
	
	// Verif des champs obligatoires
	if( saisie['nom_venues'] == '' || saisie['id_venuesTypes'] == '' || saisie['lieu_lieuxVenues']['id_villes'] == '' 
	|| nematis_$('villeOuCp_lieux_lieuxVenuesAjax').value == '' )
	{
		alert( 'Tous les champs doivent être remplis' );
		return false;
	}
	
	// enregistrement ajax avec rechargement dynamique
	xajax_saveVenues( saisie , 'xajax_rechargeMyVenues' );
	
	// on vide les champs de creation
	nematis_$('id_venuesAjax').value = '';
	nematis_$('nom_venuesAjax').value = '';
	nematis_$('id_venuesTypes').value = '';
	nematis_$('villeOuCp_lieux_lieuxVenuesAjax_id_villes').value = '';
	nematis_$('lieu_lieuxVenuesAjax_adresse_lieux').value = '';
	nematis_$('villeOuCp_lieux_lieuxVenuesAjax').value = '';
	
	// ouverture onglet mes lieux
	afficheBlocId( 'eventsVenuesMine' , 'eventsVenuesBloc' );
}

/******* performers *****/

/**
 * 
 * @param {Object} idPerformer
 * @param {Object} libPerformer
 * @return Void :: ajoute l'artiste dans la liste des artistes de l'evenement
 */
function addPerformerToEvent( idPerformer , libPerformer )
{
	var html = '';
	html += '<p><input type="hidden" name="agenda_eventsPerformers[id_performers][]" value="' + idPerformer + '" />';
	html += libPerformer + '&nbsp;&nbsp;<a href="#" onclick="delPerformerToEvent(this.parentNode);return false;">|x|</a></p>';
	
	// ajoute le libellé et l'id dans la liste
	nematis_$('eventsPerformersList').innerHTML += html;
	
	
	// masque la box d'ajout de performers
	Effect.toggle('eventsPerformersBox', 'blind' , { duration: 0.8} ) ;
	//masqueBlocId( 'eventsPerformersBox' ); 
}

function delPerformerToEvent( objBoxPerformer )
{
	objBoxPerformer.remove();
}

/**
 * soumet le "formulaire" d'ajout de performers en ajax
 * 
 */
function submitAddPerformersXajax()
{
	// recup des valeurs
	var saisie = Array();
	saisie['nom_performers'] = nematis_$('nom_performersAjax').value;
	saisie['id_performersTypes'] = nematis_$('id_performersTypesAjax').value;
	
	// Verif des champs obligatoires
	if( saisie['nom_performers'] == '' || saisie['id_performersTypes'] == '' )
	{
		alert( 'Tous les champs doivent être remplis' );
		return false;
	}
	
	// enregistrement ajax avec rechargement dynamique et ajout du performer dans la liste de l'event
	xajax_savePerformersFromAddEvent( saisie , 'xajax_rechargeMyPerformers' );
	
	// on vide les champs de creation
	nematis_$('id_performersAjax').value = '';
	nematis_$('nom_performersAjax').value = '';
	nematis_$('id_performersTypesAjax').value = '';
	
}