//"namespace" visionneuse
window.visio =
{
    //constantes
    nb_miniatures_maxi: 8,
    largeur_sky: 300,
    //variables
    taille_reelle: false,
    affpub: true,

    onclicks: //fonctions pour la gestion des onclick. Le nom de la fct est l'id de l'objet
    {
        lent: function ()
        {
            visio.onclicks.arret();
            visio.diapo.allumerBtn( "lent" );
            visio.diapo.intervalle = visio.diapo.intervalle_lent;
            visio.diapo.precharger();
            return false;
        },

        rapide: function ()
        {
            visio.onclicks.arret();
            visio.diapo.allumerBtn( "rapide" );
            visio.diapo.intervalle = visio.diapo.intervalle_rapide;
            visio.diapo.precharger();
            return false;
        },

        arret: function ()
        {
            visio.diapo.allumerBtn( "arret" );
            clearTimeout( visio.diapo.timeout );
            visio.diapo.img_pre = null;
            return false;
        },

        precedente: function ()
        {
            visio.onclicks.arret();
            visio.choisirImage( ( visio.index_act-1+visio.nbi ) %visio.nbi );
            return false;
        },

        suivante: function ()
        {
            visio.onclicks.arret();
            visio.allerSuivante();
            return false;
        },

        mini: function ( e )
        {
            visio.onclicks.arret();
            e = xbevent( e );
            var cible = e.cible;
            //cible.blur();
            while( cible.nodeName.toLowerCase()!="li"
                && cible.nodeName.toLowerCase()!="ul" )
            {
                cible = cible.parentNode;
            }
            if( cible.nodeName.toLowerCase()=="li" )
            {
                visio.choisirImage( cible.index_image );
            }
            return false;
        },

        lien_full: function ()
        {
            //afficher l'image taille réelle
            visio.onclicks.arret();
            visio.taille_reelle = true;
            visio.img_aff.style.width = '';
            addClass( doc.byId( "img" ), 'full' );
            doc.byId( 'pub' ).style.display = 'none';
            return false;
        }
    },

    diapo:  //ce qui concerne le diaporama
    {
        timeout: null,
        intervalle_lent: 2.5*1000,
        intervalle_rapide: 1000,

        //  allume le bouton avec l'id spécifié, et éteint les autres
        allumerBtn: function ( id_btn )
        {
            var tmp = doc.byId( 'diapo' ).getElementsByTagName( "a" );
            for( var i=0; i!=tmp.length; i++ )
            {
                delClass( tmp[ i ], "on" );
            }
            addClass( doc.byId( id_btn ), "on" );
        },

        //  précharge la diapo suivante
        precharger: function ()
        {
            var img_pre = visio.diapo.img_pre = new Image();
            img_pre.onload = visio.diapo.onload;
            visio.diapo.timeout = setTimeout( visio.diapo.ontimeout, visio.diapo.intervalle );
            img_pre.src = visio.getInfosImage( ( visio.index_act+1 ) %visio.nbi ).url_full;
        },

        ontimeout: function ()
        {
            visio.diapo.timeout = null;
            if( visio.diapo.img_pre.complete )
            {
                visio.diapo.suivante();
            }
        },

        onload: function ()
        {
            if( visio.diapo.timeout==null )
            {
                visio.diapo.suivante();
            }
        },

        //  appelé quand l'image suivante est préchargée ET que le timer diapos est passé
        suivante: function ()
        {
            visio.allerSuivante();
            visio.diapo.precharger();
        }
    },

    //  va à l'image suivante. utilisé par onclicks.suivante et les diapos
    allerSuivante: function ()
    {
        visio.choisirImage( ( visio.index_act+1 ) %visio.nbi );
    },

    //choisit dans la liste d'images celle dont l'index est fourni en paramètre et l'affiche
    choisirImage: function ( index )
    {
        var num_prec, num_suiv, start, stop;
        var i_reel, infos, li, infos, descr;
        var com, descr_img, h1;
        var nb_miniatures_maxi = visio.nb_miniatures_maxi;
        var ul = doc.byId( 'mini' );
        var descr_img = doc.byId( 'descr_img' );

        visio.affRedimAuto();

        //  nombre d'images
        var nbi = visio.nbi;
        num_prec = ( index+nbi-1 ) % nbi;
        num_suiv = ( index+1 ) %nbi;

        if( nbi<=nb_miniatures_maxi )
        {
            start = 0;
            stop = nbi;
        }
        else
        {
            start = num_prec;   //  afficher une image avant l'image actuelle
            stop = start + nb_miniatures_maxi;
        }

        //ul.innerHTML = '';
        while( ul.firstChild )
        {
            ul.removeChild( ul.firstChild );
        }
        for( var i_img=start; i_img!=stop; i_img++ )
        {
            i_reel = i_img%nbi;
            infos = visio.getInfosImage( i_reel );
            li = doc.createEl( 'li', null,
                [ doc.createEl( 'a', { href: infos.url_htm },
                    [ doc.createEl( 'img', { src: infos.url_mini, alt: "" } ) ]
                ) ] );
            li.index_image = i_reel;
            switch( i_reel )
            {
                case index:
                    visio.img_aff.src = infos.url_full;

                    addClass( li, 'on' );

                    //  description de l'image
                    descr = visio.getDescrImage ? visio.getDescrImage( i_reel ) : {};
                    com = descr.commentaire;
                    if( visio.titre_base )
                    {
                        doc.title = visio.titre_base + ( index+1 ) + ( com ? ' - '+com : '' );
                    }

                    visio.img_aff.title = descr.title || '';
                    visio.img_aff.alt = descr.alt || '';

                    if( descr_img )
                    {
                        while( descr_img.firstChild )
                        {
                            descr_img.removeChild( descr_img.firstChild );
                        }
                        
                        descr.descr_img = descr.descr_img || [];
                        for( var i=0; i!=descr.descr_img.length; i++ )
                        {
                            descr_img.appendChild( descr.descr_img[ i ] );
                        }
                    }

                    if( visio.img_stats )
                    {
                        var dte = new Date();
                        visio.img_stats.src = visio.img_stats.src.replace( /&D=.+$/,
                            '&D=' + dte.getHours()+dte.getMinutes()+dte.getSeconds()+
                            '&R=' + escape( infos.url_htm ) );
                    }

/*                    // Reload google analytics
                    try {
                        var pageTracker = _gat._getTracker("UA-8385559-2");
                        pageTracker._trackPageview();
                    } catch(err) {

                    }*/

                    break;
                case num_prec:
                    doc.byId( 'precedente' ).href = infos.url_htm;
                    break;
                case num_suiv:
                    doc.byId( 'suivante' ).href = infos.url_htm;
                    visio.img_aff.parentNode.href = infos.url_htm;
                    break;
                default:
                    break;
            }

            ul.appendChild( li );
        }
        
        visio.txt_img_sur.nodeValue = " Image "+(index+1)+' sur '+nbi;
        visio.index_act = index;

        visio.onresize();

        //on cache l'iframe pour éviter le flash blanc
        doc.byId( 'pub' ).style.visibility = 'hidden';
        //éviter de recharger si le sky n'est pas déjà en place (bug IE)
        if( frames[ 'sky' ].location.href.indexOf( visio.url_sky )!=-1 )
        {
            frames[ 'sky' ].location.reload();
        }
    },

    onloadimgdims: function ()
    {
        this.chargee = true;
        visio.onresize();
    },

    onresize: function ()
    {
        if( !visio.img_cachee || visio.img_aff.src != visio.img_cachee.src )
        {
            visio.img_cachee = new Image();
            visio.img_cachee.onload = visio.onloadimgdims;
            visio.img_cachee.src = visio.img_aff.src;
        }
        else if( visio.img_cachee.chargee && !visio.taille_reelle )
        {
            var posdiv = findPos( doc.byId( "img" ) );
            var dim = findClientDimensions();
            posdiv[ 1 ] = findPos( visio.img_aff )[ 1 ];

            doc.byId( 'img' ).style.paddingRight = ( ( visio.affpub ? visio.largeur_sky : 0 ) + 5 ) + 'px';
            dim[ 0 ] -= ( visio.affpub ? visio.largeur_sky : 0 ) + 10;   //sky (éventuellement) + marge à droite de l'image

            var descr_img = doc.byId( 'descr_img' );
            if( descr_img )
            {
                dim[ 1 ] -= descr_img.offsetHeight;
            }
            for( var i=0; i!=2; i++ )
            {
                dim[ i ] -= posdiv[ i ] + 20;   //20: marge pour les éventuelles scrollbars
            }
            var x = dim[ 0 ];   //place disponible en largeur
            var y = dim[ 1 ];   //et en hauteur
            var l = visio.img_cachee.width;     //largeur de l'image
            var h = visio.img_cachee.height;    //hauteur
            var w = Math.round( Math.max( 0, Math.min( l, x, y*l/h ) ) );
            visio.img_aff.style.width = w + 'px'
            doc.byId( "lien_full" ).style.visibility = (w==l)?'hidden':'';
        }
    },

    affRedimAuto: function ()
    {
        //  annule le "taille_réelle" de l'image
        visio.taille_reelle = false;
        delClass( doc.byId( 'img' ), 'full' );
        doc.byId( 'pub' ).style.display = '';
        visio.onresize();
    },

    onclick_image: function ( e )
    {
        e = xbevent( e );
        if( visio.taille_reelle )
        {
            visio.onclicks.arret();
            visio.affRedimAuto();
        }
        else
        {
            switch( e.type )
            {
                case 'click':
                    visio.onclicks.suivante();
                    break;
                case 'contextmenu':
                    visio.onclicks.precedente();
                    break;
            }
        }

        return false;
    },

    //appelé par la page html dans l'iframe lors du chargement, pour ré-afficher l'iframe
    onload_iframe: function()
    {
        var imgs = frames[ 'sky' ].document.getElementsByTagName( 'img' );
        visio.affpub = true;
        for( var i=0; i!=imgs.length; i++ )
        {
            if( imgs[ i ].src.indexOf( "pixel1x1.gif" ) >= 0 || imgs[ i ].src.indexOf( "pixel.gif" ) >= 0 )
            {
                visio.affpub = false;
                break;
            }
        }
        visio.onresize();
        if( visio.affpub )
        {
            doc.byId( 'pub' ).style.visibility = '';
        }
    },

    /*
    initialise la visionneuse
    les éléments HTML doivent déjà exister, ils seront pris par id:
    "mini" -> ul qui contient les images dans des liens
    */
    preparerVisionneuse: function ()
    {
        cleanNode( doc.byId( "mini" ) );
        visio.txt_img_sur = doc.byId( "header" ).getElementsByTagName( 'h1' )[ 0 ].lastChild;
        visio.index_act = parseInt( visio.txt_img_sur.nodeValue.match( /Image (\d+) sur \d+/ )[ 1 ] )- 1;
        visio.nbi = visio.liste_images.length;

        for( var id in visio.onclicks )
        {
            doc.byId( id ).onclick = visio.onclicks[ id ];
        }

        //  image utilisée pour l'affichage
        visio.img_aff = doc.byId( 'img' ).getElementsByTagName( "img" )[ 0 ];
        visio.img_aff.parentNode.onclick = visio.onclick_image;
        if( visio.stop_contextmenu )
        {
            visio.img_aff.parentNode.oncontextmenu = visio.onclick_image;
        }

        window.onresize = visio.onresize;

        //afficher les contrôles qui servent que s'il y a du js (cachés par défaut)
        doc.byId( 'lien_full' ).parentNode.style.visibility = '';
        doc.byId( "diapo" ).style.display = '';
        doc.byId( 'pub' ).style.display = '';

        //initialise certaines choses (comme la propriété index_image pour chaque li) et appelle onresize
        visio.choisirImage( visio.index_act );
        //choisirImage fait un refresh sur le sky, donc on ne met la bonne url qu'après l'avoir appelé pour éviter d'afficher deux fois la pub au onload.
        frames[ 'sky' ].location.href = visio.url_sky;

        visio.img_stats = doc.byId( 'image_dstats' );
    }

    //propriétés de l'objet visio à mettre dans les includes (selon le site)
    //getUrlsImage: function( index )
    //  fonction obligatoire
    //  doit retourner un tableau associatif des urls utiles pour l'image d'index "index"
    //  Le tableau associatif contient les informations suivantes:
    //  url_mini, url_full et url_htm: tableau des url (absolues) de l'image miniature, de la grande image, et de l'url de la page qui mène à cette image
    //getDescrImage: function( index )
    //  fonction optionnelle
    //  doit retourner un tableau associatif contenant les informations suivantes sur l'image (ne sera appelée que pour l'image affichée)
    //  commentaire: commentaire éventuel de l'image, utilisé uniquement à la fin du titre de la page.
    //  descr_img: tableau de noeuds html pour peupler le <div id='descr_img'>
    //  titre et alt (optionnel): attributs title et alt de la balise img

    //stop_contextmenu (bool): si true, un clic droit sur l'image affichera l'image précédente au lieu du menu contextuel du navigateur
    //url_sky: '/screenshots/sky_visio.html',
    //titre_base: Titre qui sera utilisé immédiatement avant le numéro de l'image. exemple: "Dossier Zelda - page 4 - Screenshot "
    //liste_images: tableau des données brutes de l'image, contient obligatoiremenet une entrée par image.
};

ajoutOnLoad( visio.preparerVisionneuse );
