
/**
 * Desactication des erreurs pour IE (a cause du hack de lecture des videos...)
 */
if( Browser.Engine.trident )
{
    window.onerror = handleError;
}

/**
 * Liste d'elements et de methods d'intialisation
 * Les elements portant la class 'custom-events' 
 * ont une clef correspondant à leur id dans ce Hash
 * Cette fonction est executé sur l'evenement 'domready'
 * la fonction recoit l'element en parametre
 */
var eventAttachment = new Hash({
    'search-article':'init_combo_filters',
    'search-by-department-type':'init_radio_filters',
    'search-by-filiere':'init_combo_filters',
    'search-by-axe':'init_combo_filters',
    'vignettes':'init_vignettes',
    'marquee':'init_marquee',
    'select-axe':'init_combo_nav',
    'type':'init_combo_nav',
    'category':'init_combo_nav',
    'themes':'init_combo_nav',
    'filieres':'init_combo_nav',
    'axes':'init_combo_nav',
    'print-button':'init_print_button',
    'text-lower':'init_text_lower',
    'text-upper':'init_text_upper',
    'select-dossier':'init_combo_nav',
    'search-ressource-type':'init_combo_filters',
    'search-ressource-themes':'init_combo_filters',
    'search-ressource-filieres':'init_combo_filters',
    'implantations':'init_carte',
    'organigramme_map':'init_organigramme',
    'map-dispositif-france':'init_dispositif_france',
    'map-dispositif-hf':'init_dispositif_hf',
    'SearchText':'init_searchtext'
});



/*
 * Liste des tailles de police sur lesquelles boucle l'outil de changement de taille 
 */
var fontSize = new Array(
    '80%',
    '90%',
    '100%',
    '110%',
    '120%'
);


/**
 * Taille par défault.
 */
var defaultFontSize = '100%';

/**
 * Cibles de la modification de taille de police
 */
var changeFontSelector = new Array(
    '#cirad'
);



/**
 * Selection par selecteur CSS des elements auxquel appliquer le tool tip
 */
var ToolTipSelector = new Array(
//    '#page a img[alt]',
//    '#page div[id!="onglets"] a[title]',
//    '#medias a[rel!=milkbox_page][title]',
//    '#medias a img[alt]',
//    '#page acronym'
//    'area'
);


/**
 * Detection du domaine en cours d'utilisation
 */
var currentDomain = getDomain();




function handleError( err, url, line )
{
    return true;
}



/**
 * Intialisation globale de la page
 */
function init()
{
    window.addEvent('domready', function(){
        // Menu deroulant horizontal
        init_mainMenu();
        // Tooltip au survol des liens
        init_ToolTip();
        // Autres evenements
        addCustomEvents();
        
        init_fake_combo();

        init_font_size();
    });
}


/**
 * Detection des elements porteur de la classe custom-events
 * Et declenchement de la fonction associée
 */
function addCustomEvents()
{
    var items = $$('.custom-events');
    items.each(function(item){
        if(eventAttachment.has(item.id))
        {
            eval(eventAttachment[item.id]+'($("'+ item.id +'"));');
        }
    });
}

/**
 * !!! EXPERIMENTAL & NON UTILISE !!!
 *
 * Transforme un element et ses enfant en liste déroulante DHTML
 */
function init_fake_combo()
{
    var combos = $$('.combo');
    if( combos.length )
    {
        combos.each(function( combo ){

        if( !combo.getElement('.selected') )
        {
            combo.getFirst().addClass('selected');
        }

        combo.getElement('.selected').setStyle('display', 'block');


        combo.addEvent('click', function(){
                var children = combo.getChildren();
                children.each(function(child){
                    child.setStyle('display', 'block');
                    child.setStyle('z-index', '3000');
                });
            });
        });

        $(document.body).addEvent('click', function(e){
            if(!new Event(e).target.getParent().hasClass('combo')) {
               var combos = $$('.combo');
                combos.each(function(combo){
                   var children = combo.getChildren();
                    children.each(function(child){
                        if( ! child.hasClass('selected') )
                        {
                            child.setStyle('display', 'none');
                        }

                        child.setStyle('z-index', '1');
                    });
                });
            }
        });
    }
}

/**
 * Prepare les boutons radio de filtrage pour utilisation en tant que filtre de fetch
 */
function init_radio_filters(oForm)
{
    oForm.addEvent('submit', function(e){

        new Event(e).stop();

        // Mootools 1.2 n'a pas l'air de gérer la propriété "checked", il faut donc boucler sur chaque bouton radio
        var radios = this.getElements('input[type=radio]');

        radios.each(function(radio){
            if(radio.checked)
            {
                oForm.action += '/('+ radio.name +')/'+ radio.value;
                radio.disabled = true;
            }
        });
       oForm.submit();
    });
}

/**
 * Initialise les liste déroulantes servant à filtrer des fetch
 */
function init_combo_filters(oForm)
{

    // Ajout d'un evenement desactivant les filtres du formulaire
    oForm.addEvent('submit', function(){
            this.getElements('select.filter').set('disabled', true);
            this.submit();
    });


    var selects = oForm.getElements('select.filter');

    selects.addEvent('change', function(e) {
        // Modification de l'action du formulaire
        // Note : On sauve l'action originale dans l'element
        
        if( this.getSelected().get('value') != '')
        {
            oForm.action = oForm.retrieve('original-action', oForm.action.toString()) + '/('+ this.name +')/'+ this.value;
        }
        // Soumission automatique du formulaire
        if( this.hasClass('auto-submit') )
        {
            oForm.fireEvent('submit');
        }
    });
}

/**
 * Initialise les listes déroulantes en vu de changer de page
 */
function init_combo_nav(oForm)
{
    // Ajout d'un evenement desactivant les filtres du formulaire
    oForm.addEvent('submit', function(){
        this.getElements('select.filter').set('disabled', true);
        this.submit();
    });
    var selects = oForm.getElements('select.filter');

    selects.addEvent('change', function(e) {

        if( this.getSelected().get('value') != '')
        {
            oForm.action = oForm.retrieve('original-action', oForm.action.toString()) +'/'+ this.value;
        }
        // Soumission automatique du formulaire
        if( this.hasClass('auto-submit') )
        {
            oForm.fireEvent('submit');
        }
    });
}

/**
 * Attache le "tip" aux éléments selctionnes par le selecteur CSS
 */
function init_ToolTip()
{
	myTips = new kTips( ToolTipSelector.join(', '), {'className':'tooltip'} );
	$$('.tooltip').setStyle('opacity', '0.8');
	$$('.tooltip').setStyle('visibility', 'hidden');
}


/**
 * Ajoute un evenement hover sur les LI du menu horizontal, (JS obligatoire pour IE6)
 */
function init_mainMenu()
{
	var lis = $$('#menu-principal > div > ul > li');

	lis.addEvent('mouseover', function(){
			if(ul = this.getElement('ul'))
			{
				ul.setStyle('display', 'block');
			}
	});
	
	lis.addEvent('mouseout', function(){
			if(ul = this.getElement('ul'))
			{
				ul.setStyle('display', 'none');
			}
	});	
}

/**
 * Texte défilant sur l'accueil
 */
function init_marquee( elem )
{
    new mooquee(elem, {
        direction: 'left',
        pauseOnOver:true,
        marHeight: elem.getStyle('height').toInt(),
        marWidth: elem.getStyle('width').toInt(),
	speed:20

    });
}

/** 
 * Gestion des vignettes aleatoires
 * Note : Le hash CR_vignettes est défini dans le head de la page d'accueil
 */
function init_vignettes()
{
    CR_vignettes.each(function(val, key){
 	    setVignette(key);	
    });
}

/**
 * Tire au sort une image et l'affiche
 */
function setVignette( imgElementID )
{
	var vigInfo = CR_vignettes[imgElementID];
	var max = vigInfo.img.length - 1;
	var index = $random(0, max);
	$(imgElementID).set( 'src', vigInfo.img[index] );
}


/**
 * Extends Moo's tips in order to handle IE beahvior with alt attribute
 */
var kTips = new Class({

    Extends: Tips,

	attach: function(elements){
        
        // Call ancestors method
        this.parent(elements);

        // Store and delete alt attribute's value
		$$(elements).each(function(element){
			element.store('tip:native:alt', element.get('alt'));
			element.erase('alt');
		}, this);

		return this;
	},
	
	detach: function(elements){

        // Call ancestors method
        this.parent(elements);

        // Retrieve and set alt attribute's value
		$$(elements).each(function(element){
            var originalAlt = element.retrieve('tip:native:alt');
            if (originalAlt) element.set('alt', originalAlt);
		});
		return this;
	}
});

/**
 * Attache l'appel à la fonction d'impression du navigateur
 */
function init_print_button( elem )
{
    elem.addEvent('click', function(){
        window.print();
    });
}


/**
 * Récupére la taille de texte sauvée dans un cookie et la repporte
 */
function init_font_size()
{
    var cookieFontSize = Cookie.read('fontSize');

    if( cookieFontSize )
    {
        setFontSize( cookieFontSize );
        
        if( $('tools') )
        {
            var key = fontSize.indexOf( cookieFontSize );

            if( key == 0 )
            {
                setStatus( $('text-lower'), 'disabled' );
            }
            else if( key == (fontSize.length-1) )
            {
                setStatus( $('text-upper'), 'disabled' );
            }
        }
    }
}

/**
 * Attache l'appel a la fontion de diminution de la taille du texte
 */
function init_text_lower( elem )
{
    elem.addEvent('click', function(){

        var key = fontSize.indexOf( $('tools').retrieve('state', defaultFontSize) );

        if( key > 0 )
        {
            setFontSize( fontSize[(key - 1)] );
            setStatus( $('text-upper'), 'enabled' );

            if( key == 1 )
            {
                setStatus( elem, 'disabled' );
            }
        }
    });
}

/**
 * Attache l'appel a la fontion d'augmentation de la taille du texte
 */
function init_text_upper( elem )
{
    elem.addEvent('click', function(){

        var key = fontSize.indexOf( $('tools').retrieve('state', defaultFontSize) );

        if( key < (fontSize.length-1) )
        {
            setFontSize( fontSize[(key + 1)]);
            setStatus( $('text-lower'), 'enabled' );

            if( key == (fontSize.length-2) )
            {
                setStatus( elem, 'disabled' );
            }
        }
    });
}

/**
 * Applique la taille sur le body
 */
function setFontSize( fontSize )
{
    $$(changeFontSelector.join(', ')).setStyle( 'font-size', fontSize );

    Cookie.write(
            'fontSize', fontSize, {
                'path':'/',
                'domain': currentDomain
            }
        );
    
    if( $('tools') )
    {
        $('tools').store( 'state', fontSize );
    }

}

/**
 * Change l'apparence des boutons de chagement de font lorsqu'ils n'ont plus d'effet
 */
function setStatus( elem, status )
{
    if( status == 'disabled' )
    {
        elem.setStyle('opacity', 0.6);
        elem.setStyle('cursor', 'not-allowed');
    }
    else
    {
        elem.setStyle('opacity', 1);
        elem.setStyle('cursor', 'pointer');
    }
}

/**
 * Motools n'as pas d'objet pour manipuler les url ??
 * Retourve le domaine courant
 */
function getDomain()
{
    var uri = self.document.location.href + '';
    
    var domain = uri.substr(7, uri.length - 7).split('/')[0];

    return domain;
}



/**
 * Initialisation des rollover de la carte
 */
function init_carte( elem )
{
    // Masque les contenus
    $("implantations").getElements('area').each(function(area){
		var elems = $("carteTextes").getElements('li.text_' + area.href.split('#')[1].replace('/', '_').replace('/', '_'));

		if( elems.length > 0)
        {
			area.set('rel', elems[$random( 0, elems.length -1 )].get('html') );
		}
        else 
        {
			area.set('rel', ' ' );
		}
		area.set('title', '');
        area.set('alt', '');
    });

    myTips = new Tips( "area", {
            'className':'tooltip maptip',
            'onShow':function(tip){
                 $$('.tooltip p').setStyle('opacity', '0.8');
                 tip.setStyle('visibility', 'visible');
            },
            'onHide':function(tip){
                $$('.tooltip p').setStyle('visibility', 'hidden');
                 tip.setStyle('visibility', 'hidden');
            }

    });
	$$('.tooltip').setStyle('visibility', 'hidden');
    
    elem.getElements('area').each(function( area ){
		area.addEvent('mouseover', function(){
			map_activate_region( this, 'implantations', '#' );
		});
		area.addEvent('mouseout', function(){
			map_desactivate_region( this, 'implantations', '#' );
		});

        area.addEvent('click', function(e){
            e = new Event(e).stop();
            var href = this.href.replace('#','').replace('_', '/').replace('_', '/').replace('_', '/');
            document.location.href = href;
        });
    });
}


function map_activate_region( area, map, sep )
{
    var href = area.href.split( sep );
    var className = href[href.length-1];

    map_set_position( className, map );
}

function map_desactivate_region( area, map )
{
    map_set_position( 'default', map );
}

/**
 * IE6 n'apprecie pas de passer par des classes CSS...
 * On change donc la propriétés CSS à la volée
 */
 /*
 var cartePositions = new Hash({

    'dispositif-france':{
        'ile-de-france': Array(-352, 0),
        'languedoc-roussillon': Array(-528, 0),
        'reunion-et-mayotte': Array(-704, 0),
        'antilles-guyane': Array(-176, 0),
        'default': Array(0, 0)
    },
    'dispositif-hf':{
        'bresil': Array(-635, -1122),
        'afrique-de-l-ouest-cotiere': Array(0, -748),
        'afrique-de-l-ouest-continentale': Array(-635, -374),
        'afrique-centrale': Array(0, -374),
        'afrique-orientale-et-australe': Array(-635, 0),
        'madagascar': Array(0, -1496),
        'asie-du-sud-est-continentale': Array(-635, -748),
        'asie-du-sud-est-insulaire': Array(0, -1122),
        'mediterranee': Array(0, -1870),
        'amerique-latine': Array(-635, -1496),
        'default': Array(0, 0)

    }
});
 */


function map_set_position( className, map )
{
    $('carte-'+ map ).setStyle(
        'background-position', 
        cartePositions[map][className][0]+ 'px '+ cartePositions[map][className][1]+'px'
        );
}


function init_dispositif_france( elem )
{
    elem.getElements('area').each(function( area ){

        area.addEvent('mouseover', function(){
            map_activate_region( this, 'dispositif-france', '/' );
        });

        area.addEvent('mouseout', function(){
            map_desactivate_region( this, 'dispositif-france', '/' );
        });
    });
}

function init_dispositif_hf( elem )
{
    elem.getElements('area').each(function( area ){

        area.addEvent('mouseover', function(){
            map_activate_region( this, 'dispositif-hf', '/' );
        });

        area.addEvent('mouseout', function(){
            map_desactivate_region( this, 'dispositif-hf', '/' );
        });
    });

}




/** Organigramme */

var current_area;

function init_organigramme()
{
    
    org_hide_items();

    
    $('personnels').setStyle('overflow', 'visible');
    $('personnels').setStyle('height', 'auto');

    $('highlight').addEvent('mouseout', function(){
            org_hide_outline();
     });

    $('img_organigramme').addEvent('mouseout', function(){
            org_hide_outline();
    });


    $('highlight').addEvent('click', function(){
            org_show_item();
     });


    $('organigramme_map').getElements('area').each(function( area ){

        area.store('anchor', area.href.split('#')[1]);
        area.href = '#';


        area.addEvent('click', function(){
            org_show_item();
        });

        area.addEvent('mouseover', function(){
            current_area = this;
            org_show_outline( this );
        });

    });

}


function org_show_outline( area )
{
    var coords, x, y, w, h, hl;

    if( area.shape.toLowerCase() == 'rect' )
    {
        coords = area.coords.split(',');
        x = parseInt(coords[0]);
        y = parseInt(coords[1]);
        w = parseInt(coords[2]) - x;
        h = parseInt(coords[3]) - y;

        hl = $('highlight');

        bWidth = parseInt(hl.getStyle('border-width'));
        
        org_image_coords = $('img_organigramme').getPosition();

        hl.setStyles({
                'width':w,
                'height':h,
                'top': (org_image_coords.y + y - bWidth ),
                'left':(org_image_coords.x + x - bWidth ),
                'display':'block'
            });
        
    }
}

function org_hide_outline()
{
    $('highlight').setStyle('display', 'none');
}


function org_hide_items()
{
    $$('#personnels>dt').setStyle('display', 'none');
    $$('#personnels>dd').setStyle('display', 'none');

}

function org_show_item(  )
{
    org_hide_items();

    $$('.'+ current_area.retrieve('anchor') ).setStyle('display', 'block');
}


function ShowHide(id,idLien)
{
	//on affiche
	if($(id).getStyle('display')== 'none')
	{
		$(id).setStyle('display','block');	
		$(id).setStyle('visibility','visible');
		$(idLien).innerHTML = 'cacher';
	}
	else //on cache
	{ 
		$(id).setStyle('display','none');
		$(id).setStyle('visibility','hidden');
		$(idLien).innerHTML = '+ d\'infos';
	}
}


/** 
 * Suppression du texte par defaut du champ de recherche
 */
function init_searchtext( elem )
{
    elem.addEvent('focus', function(){
        searchText_focus( this );
    });

    elem.addEvent('blur', function(){
        searchText_blur( this );
    });
}

function searchText_focus( elem )
{
    var defaultText = elem.retrieve( 'default-text', elem.value );

    if( defaultText == elem.value )
    {
        elem.value = '';
    }
}

function searchText_blur( elem )
{
    if( elem.value == '' )
    {
        elem.value = elem.retrieve( 'default-text' );
    }
}

/**
 * Modification du DOM et interactions pour l'annuaire des agents
 */
 
window.addEvent('domready', function(){

  // Marquer les adresses comme "cachées" pour obtenir un affichage compact
  $$('#annuaireAgents.coordonneesCachees .agent .coordonnees').each(function(el){
    el.addClass('coordonneesCachees');
  });

  // Rendre clicable le nom des agents pour afficher le bloc "adresse"
  $$('#annuaireAgents .agent .infos').each(function(el){
    el.addEvent('click', function(){
      var par = $(this).getParent();
      par.getElement('div.coordonnees').toggleClass('coordonneesCachees');
      par.getElement('div.coordonneesweb').toggleClass('coordonneesCachees');
    });
    el.setStyle('cursor','pointer');
  });

  // Ajouter un texte indiquant que le nom est clicable
  $$('#annuaireAgents h2').each(function(el){
    var txt = new Element('p', { 'class': 'aideMontrerCacherCoordonnees' } );
    txt.appendText("Cliquer sur un nom pour voir l'adresse complète");
    txt.inject(el, 'after');
  });

});
