/**
 * 
 * @param {Object} element Id de l'input
 * @param {Object} update Id du conteneur des résultats
 * @param {Object} instanceName Nom de l'instance xAjax.Autocompleter
 * @param {Object} options Options optionnels supplémentaires
 * 
 * @see http://github.com/madrobby/scriptaculous/wikis/ajax-autocompleter
 */
var xAjax = {};
xAjax.Autocompleter = Class.create(Autocompleter.Base, {
  initialize: function(element, update, instanceName, options) {
    this.baseInitialize(element, update, options);
    this.options.defaultParams = this.options.parameters || null;
	this.options.instanceName = instanceName;
  },

  getUpdatedChoices: function() {
    this.startIndicator();
	
	xajax_getVilles( this.element.id, this.element.value, this.options.instanceName );
  },

  onComplete: function(reponse) {
	this.updateChoices(reponse);
  }
  
});


function selectItem( inputTextElement, liElement )
{
	inputTextElement.value = liElement.title;
	$( inputTextElement.id + '_id_villes' ).value = liElement.id;
}



/**********************************************************************************************/
function initializSearchBox() {
	//$('box_id_regions').style.display = 'none';
	$('box_id_departements').style.display = 'none';
	$('box_villes').style.display = 'none';
}

/**
 * 
 */
function updateSearchBox()
{
	var box_pays					= $( 'box_id_pays' );
	var box_regions					= $( 'box_id_regions' );
	var box_departements			= $( 'box_id_departements' );
	var box_villes					= $( 'box_villes' );
	
	var input_etablissementsTypes	= $( 'id_etablissementsTypes' );
	var input_disciplines			= $( 'id_disciplines' );
	var input_pays					= $( 'id_pays' );
	var input_regions				= $( 'id_regions' );
	var input_departements			= $( 'id_departements' );
	var input_villes				= $( 'villes' );
	var input_id_villes				= $( 'villes_id_villes' );
	
/*****************/	
	var value_etablissementsTypes	= input_etablissementsTypes.options[input_etablissementsTypes.selectedIndex].value;
	var value_disciplines			= input_disciplines.options[input_disciplines.selectedIndex].value;
	var value_pays					= input_pays.options[input_pays.selectedIndex].value;


	if( value_pays == '0' || value_pays === '' )
	{
		if( input_regions.options.length > 0 )
		{
			input_regions.options[0].selected = true;
		}
		box_regions.style.display = 'none';
	}
	else
	{
		box_regions.style.display = 'block';
	}
	
/*****************/		
	//var value_regions				= input_regions.options[input_regions.selectedIndex].value;
	var value_regions				= ( input_regions.options.length > 0 ) ? input_regions.options[input_regions.selectedIndex].value : '';
	
	if( value_regions == '0' || value_regions === '' )
	{
		if (input_departements.options.length > 0)
		{
			input_departements.options[0].selected = true;
		}
		box_departements.style.display = 'none';
	}
	else
	{
		box_departements.style.display = 'block';
	}
	
/*****************/
	var value_departements			= ( input_departements.options.length > 0 ) ? input_departements.options[input_departements.selectedIndex].value : '';
	
	var value_villes				= input_villes.value;
	var value_id_villes				= input_id_villes.value;
	
	if( value_departements == '0' || value_departements === '' )
	{
		input_villes.value = '';
		input_id_villes.value = '';
		box_villes.style.display = 'none';
	}
	else
	{
		box_villes.style.display = 'block';
	}
/*****************/
	value_villes				= input_villes.value;
	value_id_villes				= input_id_villes.value;
	
/*****************/
	xajax_updateSearchBox( value_etablissementsTypes, value_disciplines, value_pays, value_regions, value_departements, value_villes, value_id_villes );
}


/**********************************************************************************************/

/**
 * 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 conteneur 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] );
		
		var parent = elementsToForm[0].parentNode;
		newEl = 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;
		var nbrElement;
		
		if( elementsToCount[i].hasChildNodes() ) {
			var elementsInContainer = elementsToCount[i].childNodes;
			nbrElement = elementsInContainer.length;
			
			nbrTotal+= nbrElement;
			
		} else {
			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;
}


function dragOnStart( oDrag, evMouse )
{
	var el = oDrag.element;
	//alert( 'début du drag sur ' + el );
	//$(el).setStyle({'z-index':100});
	$(el).addClassName( 'dragIsOn' );
}

function dragOnEnd( oDrag, evMouse )
{
	var el = oDrag.element;
	//alert( 'fin du drag sur ' + el );
	//$(el).setStyle({'z-index':10});
	$(el).removeClassName( 'dragIsOn' );
	$(el).removeClassName( 'forbiddenDrop' );
}

function dropOnHover( oDrag, container, overloap )
{
	
}

/**
 * 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 )
{
	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;
}


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);
	var aSource;
	
	if (aMatches) {
		for (m = 0; m < aMatches.length; m++) {
			aSource = aMatches[m].split('_');
			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")
	searchPattern = /(uniqueDrop_[\w]+)/gi;
	aMatches = containerClass.match(searchPattern);	
	
	if (aMatches) {
		for (m = 0; m < aMatches.length; m++) {
			aSource = aMatches[m].split('_');
			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,scroll: window});
	var x = new Draggable($(idNewElement), {
			revert: true,
			scroll: window,
			onStart: dragOnStart,
			onEnd: dragOnEnd
		});
	
	// Ajoute le hover sur le li || IE6
	Event.observe( newLi, "mouseover", function( e ){
		el = Event.element( e );
		$(el).addClassName( 'draggableHover' );
	});
	Event.observe( newLi, "mouseout", function( e ){
		el = Event.element( e );
		$(el).removeClassName( 'draggableHover' );
	});
	
	// On supprime l'élement si on effectué un moving
	if( isMoving ) {
		elementParent.removeChild( element );
	}
}


function canDropped( element, container )
{
	$(container).setStyle({
		position: 'relative',
		'z-index': 0
	});
	
	//return;
	
	$( element ).removeClassName( 'forbiddenDrop' );
		
	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;
	var elementParent = $(aContainerId[0]);
	
	if( $(elementParent) == $(container) || $(container) == $('selectable') ) {
		return;
	}	
	
	var lastElement = element;
	
	var containerClass = container.className;
	// Vérifie si c'est un move (class="moveFrom_element")
	var isMoving = false;
	searchPattern = /(moveFrom_[\w]+)/gi;
	aMatches = containerClass.match(searchPattern);
	
	if (aMatches) {
		for (m = 0; m < aMatches.length; m++) {
			aSource = aMatches[m].split('_');
			sSource = aSource[1];
			
			try {
				if (elementParent.id == sSource) {
					isMoving = true;
					//Effect.Fade( element.id );
					//alert( 'moving!!');
					break;
				}
			}catch(e){}
		}
	}
	
	// Vérifie la duplication
	if (hasTheElement(idNewElement, container) && !isMoving) {
		$( element ).addClassName( 'forbiddenDrop' );
		return;
	} else if( hasTheElement(idNewElement, container) && isMoving ) {
		elementParent.removeChild( element );
		$( element ).addClassName( 'forbiddenDrop' );
		return;
	}
	
	// Vérifie le duplicate entre différentes listes (class="uniqueDrop_element")
	searchPattern = /(uniqueDrop_[\w]+)/gi;
	aMatches = containerClass.match(searchPattern);	
	
	if (aMatches) {
		for (m = 0; m < aMatches.length; m++) {
			aSource = aMatches[m].split('_');
			sSource = aSource[1];
			
			//alert( m + ' : |' + aMatches[m] + '| => |' + sSource + "| => " + $(sSource) );
			if (hasTheElement(idNewElement, $(sSource), true) && !isMoving) {
				$( element ).addClassName( 'forbiddenDrop' );
		return;
			}
		}
	}
}

/**
 * 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
 * 
 * @return {Object} Retourne le nouvel élément ajouté
 */
function addToListe( containerID, id, className, value, draggable )
{
	draggable = (draggable === undefined) ? true : draggable;
		
	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 === true) {
		var x = new Draggable(id, {
			revert: true,
			scroll: window,
			onStart: dragOnStart,
			onEnd: dragOnEnd
		});
	}
	
	// Ajoute le hover sur le li || IE6
	Event.observe( newLi, "mouseover", function( e ){
		el = Event.element( e );
		$(el).addClassName( 'draggableHover' );
	});
	Event.observe( newLi, "mouseout", function( e ){
		el = Event.element( e );
		$(el).removeClassName( 'draggableHover' );
	});
	
	return newLi;
}





/**
 * 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 );
	}
}



/**
 * 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 )
{
	$$( '.' + className ).each( function( element ){
		Droppables.add( element, options );
	});
}

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

/*********************** PANNEAU D'AFFICHAGE *************************/
function displayLoader( )
{
	var widthScreen = document.viewport.getWidth();
	var heigthScreen = Math.max( document.viewport.getHeight(), window.innerHeight );
	
	var dOffsets = document.viewport.getScrollOffsets();
	
	// préload de l'image de loading
	var imgLoad = new Image();
	imgLoad.src = baseUrl + '/views/images/ajax-loader.gif';
	
	//alert( 'widthScreen=' + widthScreen + ' | heigthScreen=' + heigthScreen + '\ndOffsets.top='+dOffsets.top + 'dOffsets.left='+dOffsets.left)
	
	if (null === $('loaderBox')) {
		var loaderBox = Builder.node('div', {
			id: 'loaderBox',
			style: 'display:none;position:absolute;width:' + widthScreen + 'px;height:' + heigthScreen + 'px;background-color:#fff;top:0;left:0;z-index:9000;'
		});
		
		var loaderBox_content = Builder.node( 'div', {
				id:'loaderBox_content',
				style:'display:none;position:absolute;z-index:9999;'
			}, [Builder.node( 'img', {
					src: imgLoad.src,
					alt: 'Chargement en cours...'
					}
				)]
		);
				
		var loaderBox_contentText = Builder.node( 'span', 'Chargement en cours...' );
				
		loaderBox_content.appendChild( loaderBox_contentText );
		//loaderBox.appendChild( loaderBox_content );
		
		// Récup du body
		var body = $$('body');
		body.each(function(e){
			body = e;
			throw $break;
		});
		body.appendChild( loaderBox );
		body.appendChild( loaderBox_content );
	}
	
	// Recalcul la taille de l'overlay
	$('loaderBox').setStyle({
		heigth:heigthScreen + 'px',
		top:dOffsets.top + 'px'
	});
	
	// Positionne le loader
	var loaderTop = ( ( parseInt( window.innerHeight, 10 ) - parseInt( $('loaderBox_content').getHeight(), 10 ) ) / 2 ) + dOffsets.top;
	var loaderLeft = ( ( widthScreen - parseInt( $('loaderBox_content').getWidth(), 10 ) ) / 2 ) + dOffsets.left;

	//alert( 'loaderTop=' + loaderTop + ' | loaderLeft=' + loaderLeft);

	
	$('loaderBox_content').setStyle({
		position:'absolute',
		top: loaderTop + 'px',
		left: loaderLeft + 'px'
	});
	
	Effect.Appear( 'loaderBox', { duration: 0.25, to:0.6 });
	Effect.Appear( 'loaderBox_content', { duration: 0.25 });
		
}

function hiddenLoader()
{
	if( null !== $('loaderBox_content') ) {
		$('loaderBox_content').remove();
	}
	
	if (null !== $('loaderBox')) {
		Effect.Fade( 'loaderBox', { duration: 0.25 });
		$('loaderBox').remove();
	}
	
	
}

function getPageInformations( page )
{
	var container = $( 'listingInformations_box' );
	// loaderBox
	displayLoader();
	
	// Appel ajax
	xajax_getInformations( page );
}

function getPageEvenements( page )
{
	var container = $( 'listingEvenements_box' );
	// loaderBox
	displayLoader();
	
	// Appel ajax
	xajax_getConvocations( page );
}

function getPageDocumentations( page )
{
	var container = $( 'listingDocumentations_box' );
	// loaderBox
	displayLoader();
	
	// Appel ajax
	xajax_getDocumentations( page );
}

