﻿/*
    File    : main.js
    Role    : Ce fichier contient le code javascript permettant la navigation en mode Ajax.
    Licence : CeCILL v2
    Author  : Andre Rodier <andrerodier@free.fr>
    ---------
    History
    author <email> : Date : modification
*/


var CurrentAlbum ;
var CurrentPage ;
var RefreshTimer ;
var DiapoTimer ;
var SlideTimer ;
var ResizeSlide ;
var SlidePauseTime ;

var ThumbnailsPauseTime ;
var CurrentNbThumbnails ;
var CurrentNbThumbnailsVert ;
var CurrentNbThumbnailsHorz ;
var CurrentPhotoNumber = 0 ;
var CurrentPhotoUID ;
var CurrentPhotoWidth ;
var CurrentPhotoHeight ;
var WindowResizedFlag = false ;
var MaxPhotos ;
var MaxPage ;

var PhotoNavRequest = false ;
var UpdateAlbumRequest = false ;
var PreloadRequest = false ;
var UpdatePhotoInfosRequest = false ;
var UpdThumbInfosRequest = false ;
var UpdateAlbumInfosRequest = false ;
var LoginRequest = false ;
var LogoutRequest = false ;
var FullSizeRequest = false ;
var UpdateAlbumInit = false ;


// Slide Relative variables
var PreloadSlideImage = 0 ;

// Informations about all the photos and albums
// is also stored in javascript
var PhotoInfos = new Array() ;
var AlbumInfos = new Array() ;


var CurrentImageScale = 1 ;

var CurrentSlideWidth ;
var CurrentSlideHeight ;

// vignettes ou diapositives
var CurrentMode ;
// liste de vignettes ou grille de vignettes GRID / LIST
var CurrentThumbnailsMode = BILDO_THUMBNAILS_DEFAULT_DISPLAY_TYPE ;

var ThumbnailsModeChanged = false ;

// margins
var GridLeftMargin = 0 ;
var GridTopMargin = 0 ;

/* Messages */
var StatusMessages = new Array() ;
var StatusLine = new Array() ;
var StatusTimers = new Array() ;

/*
 * Fonction d'initialisation de la navigation.
 * Charge l'album par défaut.
 */
function BildoInit(firstAlbum)
{
    if ( typeof theme_init == 'function' )
        theme_init() ;

    StatusLine['Slide'] = document.getElementById('SlideStatus') ;
    StatusLine['Thumbnails'] = document.getElementById('ThumbnailsStatus') ;

    StatusTimers['Slide'] = new Array() ;
    StatusTimers['Thumbnails'] = new Array() ;
    StatusMessages['Slide'] = new Array() ;
    StatusMessages['Thumbnails'] = new Array() ;

    if ( firstAlbum )
        ShowAlbum(firstAlbum,1, true) ;
    else
        ShowAlbum(BILDO_FIRST_SHOW_ALBUM,1, true) ;

    // Rechargement régulier du menu
    if ( BILDO_CLIENT_REFRESH_MENU_INTERVAL )
        window.setInterval('RefreshMenu(0);', 1000 * BILDO_CLIENT_REFRESH_MENU_INTERVAL) ;

    ClearSlide() ;
}

/*
 * Cette fonction est appelée lorsque la fenêtre du navigateur est redimensionnée.
 * Elle sert à calculer le nombre de diapositives pouvant rentrer dans la fenêtre
 * 
 */
function WindowResized() 
{
    if ( CurrentMode == 'Thumbnails' )
    {
        if ( CurrentThumbnailsMode == 'GRID' )
        {
            WindowResizedFlag = true ;

            if ( RefreshTimer )
                window.clearTimeout(RefreshTimer) ;

            // arrêter le diaporama, au cas où...
            if ( DiapoTimer )
                StopThumbnailsDiaporama() ;

            RefreshTimer = window.setTimeout("refreshAlbum(CurrentAlbum);", BILDO_WINDOW_RESIZE_TIMER) ;
        }
    }
    else
    {
        WindowResizedFlag = true ;

        if ( RefreshTimer )
            window.clearTimeout(RefreshTimer) ;

        // arrêter le diaporama, au cas où...
        if ( DiapoTimer )
            StopThumbnailsDiaporama() ;

        var timerFunc = 'ShowSlide(CurrentPhotoUID, CurrentPhotoNumber);'
        RefreshTimer = window.setTimeout(timerFunc, BILDO_WINDOW_RESIZE_TIMER) ;
    }
}

function refreshAlbum()
{
    // Release Timer if current refreshing ;
    if ( RefreshTimer )
        window.clearTimeout(RefreshTimer) ;

    ShowAlbum(CurrentAlbum, CurrentPage, true) ;
}

function ShowAlbum(name, page, reInit)
{
    var justRefresh = false ;
    var previousAlbum = CurrentAlbum ;

    if ( UpdateAlbumRequest )
    {
        UpdateAlbumRequest.abort() ;
        UpdateAlbumRequest = false ;

        CleanInformAction('Thumbnails') ;
    }

    if ( reInit ) CurrentPhotoNumber = 0 ;

    if ( !PhotoInfos[name] )
    {
        PhotoInfos[name] = new Array() ;
        PhotoInfos[name][0] = "" ;
    }

    if ( name == '' ) name = CurrentAlbum ;
    if ( page == 0 ) page = CurrentPage ;

    if ( name == CurrentAlbum && page == CurrentPage && !ThumbnailsModeChanged && !WindowResizedFlag )
        justRefresh = true ;

    // just in the case where the user has selected an album in diaporama
    if ( ( name != CurrentAlbum ) && DiapoTimer )
        StopThumbnailsDiaporama() ;

    // stop slide diaporama
    if ( SlideTimer )
        StopSlideDiaporama() ;
        
    // mandatory: show thumbnails box to calculate available size for thumbnails
    // obligatoire: afficher la thumbnailbox pour calculer le nombre de vignettes qui rentrent
    if ( typeof theme_initThumbnails == 'function' )
        theme_initThumbnails() ;

    CurrentMode = 'Thumbnails' ;

    var thumbnailsBox = document.getElementById('ThumbnailsBox') ;

    var nbThumbnailsHoriz = BILDO_THUMBNAILS_NB_COLUMNS ;
    var nbThumbnailsVert = BILDO_THUMBNAILS_NB_ROWS ;
    var nbThumbnails = nbThumbnailsHoriz * nbThumbnailsVert ;

    if ( reInit )
    {    
        if ( previousAlbum )
        {    
            var albumLink = document.getElementById('AlbumLink'+previousAlbum) ;

            if ( albumLink )
            {
                var albumDiv = albumLink.parentNode ;
                albumDiv.className = albumDiv.className.replace(/Selected/,'') ;
            }
        }

        if ( typeof theme_selectAlbum == 'function' )
            theme_selectAlbum(name) ;

        var albumLink = document.getElementById('AlbumLink'+name) ;

        if ( albumLink )
        {
            var albumDiv = albumLink.parentNode ;
            albumDiv.className += 'Selected' ;
        }
    }

    if ( CurrentThumbnailsMode == 'GRID' && BILDO_THUMBNAILS_AUTOMATIC_DISPO && thumbnailsBox )
    {
        var diaposWidth = BILDO_THUMBNAIL_FRAME_WIDTH ;
        var diaposHeight = BILDO_THUMBNAIL_FRAME_HEIGHT ;

        var availWidth = thumbnailsBox.clientWidth ;
        var availHeight = thumbnailsBox.clientHeight ;

        var nbThumbnailsHoriz = Math.max(Math.floor( availWidth / diaposWidth), 1) ;
        var nbThumbnailsVert = Math.max(Math.floor( availHeight / diaposHeight), 1) ;

        nbThumbnails = nbThumbnailsHoriz * nbThumbnailsVert ;

        GridLeftMargin = Math.floor( ( availWidth - nbThumbnailsHoriz * diaposWidth ) / 2 ) ;
        GridTopMargin = Math.floor( ( availHeight - nbThumbnailsVert * diaposHeight ) / 2 ) ;

        if ( name == CurrentAlbum &&
            page == CurrentPage &&
            !ThumbnailsModeChanged &&
            nbThumbnailsVert == CurrentNbThumbnailsVert &&
            nbThumbnailsHoriz == CurrentNbThumbnailsHorz )
            justRefresh = true ;

        CurrentNbThumbnailsVert = nbThumbnailsVert ;
        CurrentNbThumbnailsHorz = nbThumbnailsHoriz ;
    }

    CurrentAlbum = name ;
    CurrentPage = page ;

    if ( CurrentThumbnailsMode == 'LIST' )
        nbThumbnails = BILDO_THUMBNAILS_NB_BY_PAGE ;
    
    if ( nbThumbnails <= 0 || isNaN(nbThumbnails) )
        nbThumbnails = 1 ;
        
    CurrentNbThumbnails = nbThumbnails ;

    if ( justRefresh )
    {
        // mettre en évidence la photo courante
        var tdCurPhoto = document.getElementById('td_'+CurrentPhotoNumber) ;

        if ( tdCurPhoto )
            tdCurPhoto.className = 'currentPhoto' ;
    }

    if ( !justRefresh && thumbnailsBox )
    {
        WindowResizedFlag = false ;
        var loadBegin = BILDO_MSG_LOAD_PAGE_BEGIN.replace("%s", page) ;
        InformBeginAction('Thumbnails', loadBegin, BILDO_MSG_LOAD_END) ;

        var availWidth = thumbnailsBox.clientWidth ;
        var availHeight = thumbnailsBox.clientHeight ;

        UpdateAlbumRequest = GetXMLHttpRequest() ;
       
        var url = 'bildo-ajax.php' ;
        var params = 'action=ShowAlbum' ;
        params += '&albumID='+name+'&page='+page+'&nbThumbnails='+nbThumbnails ;
        params += "&availWidth="+ String(availWidth) ;
        params += "&availHeight="+ String(availHeight) ;
        params += '&photoNumber=' + CurrentPhotoNumber ;
        params += '&lang='+BILDO_LANG ;

        if ( CurrentThumbnailsMode == 'GRID' )
            params += '&dispo=' + nbThumbnailsHoriz + ',' + nbThumbnailsVert ;
        else
            params += '&dispo=' ;

        UpdateAlbumRequest.onreadystatechange = AlbumUpdate ;
        UpdateAlbumInit = reInit ;
        UpdateAlbumRequest.open("POST", url, true);
        UpdateAlbumRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

        UpdateAlbumRequest.send(params) ;

        UpdateAlbumInfos() ;
    }

    if ( BILDO_THUMBNAILS_AUTOMATIC_DISPO && ( CurrentThumbnailsMode == 'GRID' ) )
        window.onresize = WindowResized ;
}



/*
 * Fonction mettant à jour le bloc vue, qui contient les vignettes, les contrôles, les informations, etc...
 ***********************************************************************************************************/
function AlbumUpdate()
{
    if ( UpdateAlbumRequest.readyState < 4 )
    {
        // 1:Loading...
    }
    else
    {
        try
        {
            if ( typeof(AlbumInfos[name]) == 'undefined' )
                AlbumInfos[name] = new Array() ;
        
            if ( UpdateAlbumRequest.status == 200 )
            {
                var response = CleanResponse(UpdateAlbumRequest.responseText) ;

                if ( response == 'ServerModification' )
                {
                    if ( typeof(AlbumInfos[name]['exist']) == 'undefined' )
                    {
                        AlbumInfos[name]['exist'] = false ;
                        RefreshMenu(true) ;
                    }
                    else if ( AlbumInfos[name]['exist'] == false )
                    {
                        AlbumInfos[name]['exist'] = false ;
                        RefreshMenu(true) ;
                        ShowAlbum(BILDO_FIRST_SHOW_ALBUM,1, true) ;
                    }

                    // mar this album not exist, dont try to display it again
                    AlbumInfos[name]['exist'] = false ;
                }
                else
                {
                    AlbumInfos[name]['exist'] = true ;

                    var thumbnailsBox = document.getElementById('ThumbnailsBox') ;
                    if ( thumbnailsBox && UpdateAlbumRequest.responseText.length )
                    {
                        response = CleanResponse(UpdateAlbumRequest.responseText) ;
                        thumbnailsBox.innerHTML = response ;

                        if ( UpdateAlbumInit )
                            thumbnailsBox.scrollTop = 0 ;
                    }


                    if ( CurrentPage > MaxPage )
                        CurrentPage = MaxPage ;

                    if ( DiapoTimer )
                    {
                        if ( CurrentPage == MaxPage )
                            StopThumbnailsDiaporama() ;
                        else
                            DiapoTimer = window.setTimeout(NextPage, ThumbnailsPauseTime) ;
                    }
                }

                // in any way, finish
                InformEndAction('Thumbnails') ;
            }
        }
        catch(e)
        {
            // may be the user click to fast to search a page :-)
            // clean exit here...
        }

        UpdateAlbumRequest = false ;
    }
}

/*
 * Rafraichit la liste des albums, ceci peut être utile si les albums on été modifiés sur le serveur
 *
 * Refresh albums list. This is useful if albums as been modified on the server
 * 
 ************************************************************************************************************/
function RefreshMenu(informUser)
{
    if ( informUser ) alert(BILDO_MSG_SERVER_MODIFIED) ; 

    var RefreshMenuRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=GetMenu&theme='+BILDO_DEFAULT_THEME+'&album='+CurrentAlbum ;
    params += '&lang='+BILDO_LANG ;

    var menuDiv = document.getElementById('BildoToc') ;
    var menuPos = menuDiv ? menuDiv.scrollTop : -1 ;

    RefreshMenuRequest.onreadystatechange = function()
    {
        if ( RefreshMenuRequest.readyState == 4 && RefreshMenuRequest.status == 200 )
        {
            try
            {
                var response = CleanResponse(RefreshMenuRequest.responseText) ;
            }
            catch(e)
            {
                var response = RefreshMenuRequest.responseText ;
                alert("Error : "+e) ;
            }

            if ( response )
            {
                WriteElem('BildoMenu', response) ;

                // appeller la fonction par defaut du theme
                if ( typeof theme_initMenu == 'function' )
                    theme_initMenu() ;

                if ( menuPos > 0 )
                    document.getElementById("BildoToc").scrollTop = menuPos ;

                // remettre les options du menu dans un état OK
                var gridLink = document.getElementById('gridMode') ;
                var listLink = document.getElementById('listMode') ;

                gridLink.className = ( CurrentThumbnailsMode == 'GRID' ) ? 'activeOption' : 'inactiveOption' ;
                listLink.className = ( CurrentThumbnailsMode == 'LIST' ) ? 'activeOption' : 'inactiveOption' ;
            }
        }
    } ;

    RefreshMenuRequest.open("POST", url, true);
    RefreshMenuRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

    RefreshMenuRequest.send(params) ;
}

/*
 * Avance à la page suivant, dans la vue par vignettes. Cette fonction est appellée automatiquement
 * lors du diaporama
 *
 * Advance to next page in the thumbnails view. This function is automatically called when diaporama
 * is in progress.
 ************************************************************************************************************/
function NextPage()
{
    if ( CurrentPage < MaxPage )
        ShowAlbum(CurrentAlbum,CurrentPage+1, true) ;
}

/* afficher la page précédente, dans la vue des vignettes
 * 
 * show previous page, in the thumbnails view
 * 
 ************************************************************************************************************/
function PreviousPage()
{
    if ( CurrentPage > 1 )
        ShowAlbum(CurrentAlbum,CurrentPage-1, true) ;
}

/* afficher la dernière page, dans la vue des vignettes
 * 
 * show last page, in the thumbnails view
 * 
 ************************************************************************************************************/
function LastPage()
{
    ShowAlbum(CurrentAlbum,MaxPage, true) ;
}

/* afficher la première page, dans la vue des vignettes
 * 
 * show first page, in the thumbnails view
 * 
 ************************************************************************************************************/
function FirstPage()
{
    ShowAlbum(CurrentAlbum,1, true) ;
}

/* Démarrage du diaporama, dans la vue par vignettes. Cette fonction est appelée lorsque l'on clique
 * Sur le bouton diaporama
 *
 * Start the thumbnails diaporama, in the thumbnails view. This function is called when you click on the
 * diaporama button
 ***********************************************************************************************************/
function StartThumbnailsDiaporama()
{
    if ( !DiapoTimer )
    {
        SetElemDisplay('nav_stopdiapo', 'inline') ;
        SetElementsDisplay('nav_startdiapo,nav_previouspage,nav_nextpage', 'none') ;

        ThumbnailsPauseTime = BILDO_DIAPORAMA_TIMER ? 1000 * BILDO_DIAPORAMA_TIMER : 500 * CurrentNbThumbnails ;
            
        DiapoTimer = window.setTimeout(NextPage, ThumbnailsPauseTime) ;
        InformBeginAction('Thumbnails', BILDO_MSG_THUMB_DIAPO_PROGRESS, BILDO_MSG_THUMB_DIAPO_FINISHED ) ;
    }
}

/* Arrêt du diaporama, dans la vue par vignettes. Cette fonction est appelée lorsqu'il est nécessaire
 * d'arrêter le diaporama, pour répondre à une action du navigateur client : 
 * Slide sur une photo, changer l'album courant, retaillage de la fenêtre du navigateur.
 *
 * Stop the diaporama, in the thumbnails view. This function is called when you click on the
 * diaporama button, but too when is necessary, to answer to a client navigator action :
 * slide on a photo, change the current album, and resize the navigator window.
 ***********************************************************************************************************/
function StopThumbnailsDiaporama()
{
    if ( DiapoTimer )
    {
        SetElemDisplay('nav_stopdiapo', 'none') ;
        SetElementsDisplay('nav_startdiapo,nav_previouspage,nav_nextpage', 'inline') ;
        StatusLine['Thumbnails'].innerHTML = BILDO_MSG_THUMB_DIAPO_FINISHED ;

        window.clearTimeout(DiapoTimer) ;
        DiapoTimer = null ;
        InformEndAction('Thumbnails') ;
    }
}

/* Affiche la diapositive d'une photo spécifiée 'uid'
 * 
 * Show the slide named 'uid'
 ************************************************************************************************************/
function ShowSlide(uid, number, width, height, clear)
{
    // arrêter le diaporama, au cas où...
    if ( DiapoTimer )
        StopThumbnailsDiaporama() ;

    if ( !width ) width = CurrentSlideWidth ;
    if ( !height ) height = CurrentSlideHeight ;

    if ( clear )
    {
        ClearSlide() ;

        var slideImage = document.getElementById('SlideImage') ;
        slideImage.src = 'illus/clear.gif', false ;
        CurrentSlideWidth = slideImage.width = width ;
        CurrentSlideHeight = slideImage.height = height ;
    }
    else
    {
        CurrentSlideWidth = width ;
        CurrentSlideHeight = height ;
        ResizeSlide = true ;
    }

    PreviewSlide(document.getElementById('PreviousSlideImage'), 'illus/clear.gif', false) ;
    PreviewSlide(document.getElementById('NextSlideImage'), 'illus/clear.gif', false) ;

    CurrentMode = 'Slide' ;

    //InformBeginAction('Slide', BILDO_MSG_LOAD_BEGIN, BILDO_MSG_LOAD_END) ;

    if ( CurrentPhotoNumber > -1 )
    {
        // mettre en évidence la photo courante
        var tdCurPhoto = document.getElementById('td_'+CurrentPhotoNumber) ;

        if ( tdCurPhoto )
        {
            if ( CurrentThumbnailsMode == 'GRID' )
                tdCurPhoto.className = '' ;
            else
                tdCurPhoto.className = 'ThumbnailImage' ;
        }
    }

    CurrentPhotoNumber = parseInt(number) ;
    CurrentPhotoUID = uid ;

    // Mettre a jour le numero de la photo
    WriteElem('SlideCurrentPhoto', CurrentPhotoNumber+1) ;

    // mark loading slide informations
    WriteElem("SlideInfosText", "...") ;
    WriteElem("imageDesc", "...") ;
    WriteElem("imageTitle", "") ;

    PreloadSlideImage = new Image(width,height) ;

    // appeller la fonction par defaut du theme
    if ( typeof theme_initSlide == 'function' )
        theme_initSlide() ;

    var slideSrc = '' ;

    if ( BILDO_FULL_SIZE_IMG_HIDE_PATH )
        slideSrc = 'search.php?cat=slide&uid='+uid ;
    else
        slideSrc = BildoImagesCacheURL+uid+"-slide.jpg" ;

    PreloadSlideImage.onload = SlideLoadComplete ;

    PreloadSlideImage.src = slideSrc ;

    // update photo informations
    UpdatePhotoInfos() ;
}

/*
 * Cette fonction est appellée lorsque le chargement d'une diapositive est appellée
 *
 * This function is called when slide loading is complete
 ***********************************************************************************************************/
function SlideLoadComplete()
{
    PreloadSlideImage.onload = null ;

    //InformEndAction('Slide') ;

    UpdateSlideControls() ;

    var width = CurrentSlideWidth ;
    var height = CurrentSlideHeight ;

    /*
    if ( ResizeSlide )
    {
        // apply ratio to reduce slide if needed. todo : theme configurable margins ?
        var margin = 8 ;
        var slideBox = document.getElementById('SlideBox') ;
        var xRatio = ( slideBox.clientWidth - 2 * margin ) / width ;
        var yRatio = ( slideBox.clientHeight - 2 * margin ) / height ;
        var ratio = Math.min(1, Math.min(xRatio,yRatio)) ;

        CurrentImageScale = ratio ;

        // fixme: slide resizing is dynamic with IE when raising windows
        if ( ratio < 1 )
        {
            width = Math.floor(ratio * width) ;
            height = Math.floor(ratio * height) ;
        }
    }
    */

    var slideImage = document.getElementById('SlideImage') ;

    slideImage.width = width ;
    slideImage.height = height ;
    slideImage.src = PreloadSlideImage.src ;

    slideImage.parentNode.replaceChild(PreloadSlideImage,slideImage) ;
    PreloadSlideImage.id = 'SlideImage' ;

    WindowResizedFlag = false ;
    RefreshTimer = false ;
}

/*
 * Met à jour l'état des contrôles des diapositives
 *
 * Update thumbnails controls state
 ***********************************************************************************************************/
function UpdateThumbnailsControls()
{
    var previousPage = document.getElementById('nav_previouspage') ;

    // update controls states
    if ( CurrentPage == 1 )
    {
        previousPage.href = "#" ;
        previousPage.className = "disabled";
    }
    else
    {
        previousPage.href = "javascript:PreviousPage();" ;
        previousPage.className = "";
    }

    if ( CurrentPage == MaxPage )
    {
        document.getElementById('nav_nextpage').href = "#" ;
        document.getElementById('nav_nextpage').className = "disabled";
    }
    else
    {
        document.getElementById('nav_nextpage').href = "javascript:NextPage();" ;
        document.getElementById('nav_nextpage').className = "";
    }

    if ( CurrentPage == MaxPage || DiapoTimer )
    {
        document.getElementById('nav_startdiapo').href = "#" ;
        document.getElementById('nav_startdiapo').className = "disabled";
    }
    else
    {
        document.getElementById('nav_startdiapo').href = "javascript:StartThumbnailsDiaporama();" ;
        document.getElementById('nav_startdiapo').className = "";
    }

    if ( DiapoTimer && document.getElementById('nav_stopdiapo') )
    {
        document.getElementById('nav_stopdiapo').href = "javascript:StopThumbnailsDiaporama();" ;
        document.getElementById('nav_stopdiapo').className = "";
    }
    else if ( document.getElementById('nav_stopdiapo') )
    {
        document.getElementById('nav_stopdiapo').href = "#" ;
        document.getElementById('nav_stopdiapo').className = "disabled";
    }
}

function UpdateSlideControls()
{
    var origPage = Math.ceil((1+CurrentPhotoNumber)/CurrentNbThumbnails) ;
    document.getElementById('nav_backthumb').href = "javascript:ShowAlbum('',"+origPage+", false);" ;
    document.getElementById('slideLink').href = "javascript:ShowAlbum('',"+origPage+", false);" ;

    // update controls states
    if ( CurrentPhotoNumber == 0 )
    {
        document.getElementById('nav_previousphoto').href = "javascript:InformUser('Inactive');" ;
        document.getElementById('nav_previousphoto').className = "disabled" ;
    }
    else
    {
        document.getElementById('nav_previousphoto').href = "javascript:PhotoNav(-1);" ;
        document.getElementById('nav_previousphoto').className = "" ;
    }

    if ( CurrentPhotoNumber == MaxPhotos-1 )
    {
        document.getElementById('nav_nextphoto').href = "javascript:InformUser('Inactive');" ;
        document.getElementById('nav_nextphoto').className = "disabled" ;
    }
    else
    {
        document.getElementById('nav_nextphoto').href = "javascript:PhotoNav(1);" ;
        document.getElementById('nav_nextphoto').className = "" ;
    }

    if ( CurrentPhotoNumber == MaxPhotos-1 )
    {
        document.getElementById('nav_startdiaporama').href = "javascript:InformUser('Inactive');" ;
        document.getElementById('nav_startdiaporama').className = "disabled" ;
    }
    else
    {
        document.getElementById('nav_startdiaporama').href = "javascript:StartSlideDiaporama();" ;
        document.getElementById('nav_startdiaporama').className = "" ;
    }

    if ( MaxPhotos > 1 && SlideTimer )
    {
        document.getElementById('nav_stopdiaporama').href = "javascript:StopSlideDiaporama();" ;
        document.getElementById('nav_stopdiaporama').className = "" ;
    }
    else
    {
        document.getElementById('nav_stopdiaporama').href = "javascript:InformUser('Inactive');" ;
        document.getElementById('nav_stopdiaporama').className = "disabled" ;
    }
}

/*
 * Charge dans le cache les vignettes suivantes
 *
 * Preload next thumbnails in browser cache
 ***********************************************************************************************************/
function PreloadNextThumbnails()
{
    PreloadRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=GetImagesIds' ;
    params += '&albumID='+CurrentAlbum ;
    params += '&page='+(1+parseInt(CurrentPage)) ;
    params += '&nbThumbnails=' + CurrentNbThumbnails ;
    params += '&lang='+BILDO_LANG ;

    PreloadRequest.onreadystatechange = function()
    {
        if ( PreloadRequest.readyState == 4 && PreloadRequest.status == 200 )
        {
            var response = CleanResponse(PreloadRequest.responseText) ;
            // Return => "uid\n uid\n uid\n ..."
            var uids = response.split("\n") ;
            var uid = '' ;

            for ( uid in uids )
            {
                var imageID = uids[uid] ;

                if ( imageID )
                {
                    var image = new Image() ;
                    var source = '' ;

                    if ( BILDO_FULL_SIZE_IMG_HIDE_PATH )
                        source = 'search.php?cat=slide&uid='+uid ;
                    else
                        source = BildoImagesCacheURL+uid+"-slide.jpg" ;
                    image.src = source ;

                    var img = document.createElement('img') ;
                    var src = document.createAttribute("src") ;
                    src.nodeValue = source ;
                    img.setAttributeNode(src) ;
                }
            }
        }
    } ;
    PreloadRequest.open("POST", url, true);
    PreloadRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

    PreloadRequest.send(params) ;
}

/*
 * Vérifie que les diapositives sont à jour en tâche de fond ( lorsque l'on affiche les vignettes )
 * 
 * Check Slide up to date in the background ( when dsiaplaying thumbnails )
 ***********************************************************************************************************/
function CheckSlides()
{
    var preloadRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=CheckSlides' ;
    params += '&albumID='+CurrentAlbum ;
    params += '&page='+(parseInt(CurrentPage)) ;
    params += '&nbThumbnails=' + CurrentNbThumbnails ;
    params += '&lang='+BILDO_LANG ;

    preloadRequest.onreadystatechange = function()
    {
        if ( preloadRequest.readyState == 4 )
        {
            if ( preloadRequest.status == 200 )
            {
                var response = CleanResponse(preloadRequest.responseText) ;
                delete(preloadRequest) ;
            }
        }
    } ;
    preloadRequest.open("POST", url, true);
    preloadRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

    preloadRequest.send(params) ;
}
/*
 * Charge en mémoire la diapo donnée
 *
 * Preload a slide in memory
 ***********************************************************************************************************/
function PreloadSlide(number, offset)
{
    number += offset ;

    if ( number < MaxPhotos && number >= 0 && !PhotoInfos[CurrentAlbum][number] )
    {
        var preloadSlideRequest = GetXMLHttpRequest() ;

        var url = 'bildo-ajax.php' ;
        var params = 'action=GetPhotoInfos' ;
        params += '&albumID='+CurrentAlbum ;
        params += '&photoNumber='+number ;
        params += '&lang='+BILDO_LANG ;

        preloadSlideRequest.onreadystatechange = function()
        {
            if ( preloadSlideRequest.readyState == 4 )
            {
                if ( preloadSlideRequest.status == 200 )
                {
                    // Return => "uid|photoInfos|width|height|photoNumber"
                    var response = CleanResponse(preloadSlideRequest.responseText) ;
                    PhotoInfos[CurrentAlbum][number] = response ;

                    var image = null ;

                    if ( offset == 1 ) image = document.getElementById('NextSlideImage') ;
                    else if ( offset == -1 ) image = document.getElementById('PreviousSlideImage') ;
                    else image = new Image() ;

                    PreviewSlideWithText(image, response, offset) ;
                }
                preloadSlideRequest = false ;
            }
        } ;

        //preloadSlideRequest.photoNumber = number ;
        preloadSlideRequest.open("POST", url, true);
        preloadSlideRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

        preloadSlideRequest.send(params) ;
    }
    else if ( number < MaxPhotos && number >= 0 && PhotoInfos[CurrentAlbum][number] )
    {
        var image = null ;

        if ( offset == 1 ) image = document.getElementById('NextSlideImage') ;
        else if ( offset == -1 ) image = document.getElementById('PreviousSlideImage') ;
        else image = new Image() ;

        PreviewSlideWithText(image, PhotoInfos[CurrentAlbum][number], offset) ;
    }
    else if ( number < MaxPhotos || number >= 0 )
    {
        var image = null ;

        if ( offset == 1 ) image = document.getElementById('NextSlideImage') ;
        else if ( offset == -1 ) image = document.getElementById('PreviousSlideImage') ;
        else image = new Image() ;

        PreviewSlide(image, 'illus/clear.gif', false) ;
    }
}

function PreviewSlideWithText(image, text, isMiniature)
{
    var infos = text.split('|') ;
    var uid = infos[0] ;
    var photoNumber = infos[4] ;
    var category = 'slide' ;
    var source = '' ;
    var width = infos[2] ;
    var height = infos[3] ;

    if ( BILDO_FULL_SIZE_IMG_HIDE_PATH )
        source = 'search.php?cat=slide&uid='+uid ;
    else
        source = BildoImagesCacheURL+uid+"-slide.jpg" ;

    if ( isMiniature )
    {
        width /= BILDO_THEME_PREVIEW_SLIDE_RATIO ;
        height /= BILDO_THEME_PREVIEW_SLIDE_RATIO ;
    }

    PreviewSlide(image, source, width, height) ;
}

function PreviewSlide(image, source, width, height)
{
    // load the image
    image.width = width ;
    image.height = height ;
    image.src = source ;

    // second method to force the browser to create the image in his cache
    var img = document.createElement('img') ;
    var src = document.createAttribute("src") ;
    src.nodeValue = source ;
    img.setAttributeNode(src) ;
}

/*
 * Navigue entre les photos, en mode slide. sens est +1 ou -1
 *
 * Navguation in slide mode. sens is an offset: +1 or -1
 ************************************************************************************************************/
function PhotoNav(sens)
{
    if ( PhotoNavRequest ) PhotoNavRequest.abort() ;

    if ( CurrentPhotoNumber+sens >= 0 && CurrentPhotoNumber+sens <= MaxPhotos )
    {
        CurrentPhotoNumber += sens ;

        // Mettre a jour le numero de la photo
        WriteElem('SlideCurrentPhoto', CurrentPhotoNumber) ;

        if ( PhotoInfos[CurrentAlbum][CurrentPhotoNumber] )
        {
            ClearSlide() ;
            var infos = PhotoInfos[CurrentAlbum][CurrentPhotoNumber].split('|') ;
            var uid = infos[0] ;
            var legend = infos[1] ;
            var width = parseInt(infos[2]) ;
            var height = parseInt(infos[3]) ;
            var number = infos[4] ;
            ShowSlide(uid, CurrentPhotoNumber, width, height) ;

            // Restart Diaporama if needed
            if ( SlideTimer )
            {
                SlidePauseTime = BILDO_SLIDE_TIMER ? BILDO_SLIDE_TIMER * 1000 : 5000 ;

                if ( CurrentPhotoNumber < MaxPhotos-1 )
                    SlideTimer = window.setTimeout("PhotoNav(1)", SlidePauseTime) ;
                else
                    StopSlideDiaporama() ;
            }
        }
        else
        {
            ClearSlide() ;

            PhotoNavRequest = GetXMLHttpRequest() ;

            var url = 'bildo-ajax.php' ;
            var params = 'action=GetPhotoInfos' ;
            params += '&albumID='+CurrentAlbum ;
            params += '&photoNumber=' +(CurrentPhotoNumber) ;
            params += '&lang='+BILDO_LANG ;

            PhotoNavRequest.onreadystatechange = function()
            {
                if ( PhotoNavRequest.readyState == 4 )
                {
                    try
                    {
                        if ( PhotoNavRequest.status == 200 )
                        {
                            var response = CleanResponse(PhotoNavRequest.responseText) ;
                            // Return => "uid|photoInfos|width|height|photoNumber"
                            var infos = response.split('|') ;
                            var uid = infos[0] ;
                            var legend = infos[1] ;
                            var width = parseInt(infos[2]) ;
                            var height = parseInt(infos[3]) ;
                            var number = infos[4] ;
                            ShowSlide(uid, CurrentPhotoNumber, width, height) ;
                            
                            if ( ! PhotoInfos[CurrentAlbum] )
                                PhotoInfos[CurrentAlbum] = new Array() ;

                            PhotoInfos[CurrentAlbum][CurrentPhotoNumber] = response ;


                            // Restart Diaporama if needed
                            if ( SlideTimer )
                            {
                                SlidePauseTime = BILDO_SLIDE_TIMER ? BILDO_SLIDE_TIMER * 1000 : 5000 ;

                                if ( CurrentPhotoNumber < MaxPhotos-1 )
                                    SlideTimer = window.setTimeout("PhotoNav(1)", SlidePauseTime) ;
                                else
                                {
                                    InformEndAction('Slide') ;
                                    StopSlideDiaporama() ;
                                }
                            }
                        }
                    }
                    catch(e)
                    {
                        // the user click to fast for searching a photo :-)
                    }
                    PhotoNavRequest = false ;
                }
            } ;
            PhotoNavRequest.open("POST", url, true);
            PhotoNavRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

            PhotoNavRequest.send(params) ;
        }
    }
}

function UpdateThumbnailsInfos(pos)
{
    if ( !UpdThumbInfosRequest )
    {
        UpdThumbInfosRequest = GetXMLHttpRequest() ;

        var url = 'bildo-ajax.php' ;
        var params = 'action=GetThumbnailsInfos' ;
        params += '&albumID='+CurrentAlbum ;
        params += '&page='+CurrentPage+'&nbThumbnails='+CurrentNbThumbnails ;
        params += '&lang='+BILDO_LANG ;

        UpdThumbInfosRequest.onreadystatechange = function()
        {
            if ( UpdThumbInfosRequest.readyState == 4 )
            {
                if ( UpdThumbInfosRequest.status == 200 )
                {
                    var thumbnailsInfos = CleanResponse(UpdThumbInfosRequest.responseText) ;
                    WriteElem("ThumbnailsInfos", thumbnailsInfos) ;

                    if ( typeof theme_afterUpdate == 'function' )
                        theme_afterUpdate() ;
                }
                UpdThumbInfosRequest = false ;
            }
        } ;
        UpdThumbInfosRequest.open("POST", url, true);
        UpdThumbInfosRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

        UpdThumbInfosRequest.send(params) ;
    }
}


function UpdateAlbumInfos()
{
    if ( UpdateAlbumInfosRequest )
    {
        UpdateAlbumInfosRequest.abort()
        UpdateAlbumInfosRequest = false ;
    }

    UpdateAlbumInfosRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=GetAlbumInfos' ;
    params += '&albumID='+CurrentAlbum ;
    params += '&page='+CurrentPage+'&nbThumbnails='+CurrentNbThumbnails ;
    params += '&lang='+BILDO_LANG ;

    if ( UpdatePhotoInfosRequest )
    {
        UpdatePhotoInfosRequest.abort() ;
        UpdatePhotoInfosRequest = false ;
    }

    UpdateAlbumInfosRequest.onreadystatechange = function()
    {
        if ( UpdateAlbumInfosRequest.readyState == 4 )
        {
            if ( UpdateAlbumInfosRequest.status == 200 )
            {
                var thumbInfos = document.getElementById('ThumbnailsInfos') ;
                var pos = thumbInfos.scrollLeft ;
                
                // Return => "nbPhotos|Description|Title"
                var albumInfos = CleanResponse(UpdateAlbumInfosRequest.responseText).split('|') ;
                MaxPhotos = albumInfos[0] ;
                MaxPage = Math.ceil(parseInt(MaxPhotos)/CurrentNbThumbnails) ;
                var imgCount = 'imgCount_'+CurrentAlbum ;

                UpdateAlbumInfosRequest = false ;

                if ( CurrentPage > MaxPage )
                {
                    CurrentPage = MaxPage ;
                    ThumbnailsModeChanged = true ;
                    ShowAlbum(CurrentAlbum, MaxPage, false) ;
                }
                else
                {
                    var albumDesc ;

                    if ( MaxPhotos > 1 )
                    {
                        albumDesc = albumInfos[1].replace(/\(s\)/, 's') ;
                        WriteElem(imgCount, MaxPhotos+' '+BILDO_LABEL_PHOTOS) ;
                    }
                    else if ( MaxPhotos == 1 )
                    {
                        albumDesc = albumInfos[1].replace(/\(s\)/, '') ;
                        WriteElem(imgCount, '1 '+BILDO_LABEL_PHOTO) ;
                    }
                    else if ( MaxPhotos == 0 )
                    {
                        albumDesc = BILDO_LABEL_EMPTY_ALBUM ;
                        WriteElem(imgCount, BILDO_LABEL_EMPTY_ALBUM) ;
                    }

                    if ( MaxPhotos >= 1 )
                    {
                        WriteElem("SlideMaxPhotos", MaxPhotos) ;
                    }
                    else
                    {
                        WriteElem("SlideMaxPhotos", ' ' ) ;
                    }

                    if ( CurrentPage > MaxPage )
                    {
                        if ( MaxPhotos > 0 )
                            ShowAlbum(CurrentAlbum, MaxPage, true) ;
                    }
                    else
                    {
                        UpdateThumbnailsInfos(pos) ;
                        WriteElem("AlbumTitle", albumInfos[2]) ;

                        UpdateThumbnailsControls() ;
                        UpdateSlideControls() ;

                        CheckSlides() ;
                        PreloadNextThumbnails() ;
                    }
                }
            }

            // maj position dans l'album
            var firstPhoto = CurrentNbThumbnails * ( CurrentPage - 1 ) ;
            var lastPhoto = Math.max(1, Math.min(firstPhoto + CurrentNbThumbnails, MaxPhotos)) ;
            var curPhotos = "" ;

            PreloadSlide(firstPhoto) ;

            if ( MaxPhotos == 0 )
            {
                curPhotos = BILDO_LABEL_EMPTY_ALBUM ;
            }
            else if ( firstPhoto != lastPhoto-1 )
            {
                curPhotos = BILDO_LABEL_THUMBNAILS_POSITION.replace(/%d/, firstPhoto+1) ;
                curPhotos = curPhotos.replace(/%d/, lastPhoto) ;
                curPhotos = curPhotos.replace(/%d/, MaxPhotos) ;
            }
            else if ( MaxPhotos > 0 )
            {
                curPhotos = BILDO_LABEL_THUMBNAILS_LAST_POSITION.replace(/%d/, firstPhoto+1) ;
            }
            WriteElem('ThumbnailsPageProgress', curPhotos ) ;

        }
    } ;
    UpdateAlbumInfosRequest.open("POST", url, true);
    UpdateAlbumInfosRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

    UpdateAlbumInfosRequest.send(params) ;
}

function UpdatePhotoInfos()
{
    if ( UpdatePhotoInfosRequest )
        UpdatePhotoInfosRequest.abort() ;

    if ( PhotoInfos[CurrentAlbum][CurrentPhotoNumber] )
    {
        WritePhotoInfos(PhotoInfos[CurrentAlbum][CurrentPhotoNumber]) ;

        // preload next and previous photos if need
        PreloadSlide(CurrentPhotoNumber, 1) ;
        PreloadSlide(CurrentPhotoNumber, -1) ;
    }
    else
    {
        UpdatePhotoInfosRequest = GetXMLHttpRequest() ;

        var url = 'bildo-ajax.php' ;
        var params = 'action=GetPhotoInfos' ;
        params += '&albumID='+CurrentAlbum ;
        params += '&photoNumber='+(CurrentPhotoNumber) ;
        params += '&lang='+BILDO_LANG ;

        UpdatePhotoInfosRequest.onreadystatechange = function()
        {
            try
            {
                if ( UpdatePhotoInfosRequest.readyState == 4 )
                {
                    if ( UpdatePhotoInfosRequest.status == 200  )
                    {
                        var response = CleanResponse(UpdatePhotoInfosRequest.responseText) ;
                        // Return => "uid|photoInfos|width|height|photoNumber|title|description"
                        WritePhotoInfos(response) ;
                    }
                    UpdatePhotoInfosRequest = false ;

                    // preload next and previous photos if need
                    PreloadSlide(CurrentPhotoNumber, 1) ;
                    PreloadSlide(CurrentPhotoNumber, -1) ;
                }
            }
            catch(e)
            {
                // don't worry, is just the user who click too fast...
            }
        } ;
        UpdatePhotoInfosRequest.open("POST", url, true);
        UpdatePhotoInfosRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

        UpdatePhotoInfosRequest.send(params) ;
    }
}

function WritePhotoInfos(infos)
{
    if ( infos )
    {
        infos = infos.split('|') ;
        CurrentPhotoUID = infos[0] ;
        var legend = infos[1] ;

        WriteElem('SlideInfosText', legend) ;
        WriteElem('imageTitle', infos[5]) ;
        WriteElem('imageDesc', infos[6]) ;

        CurrentPhotoWidth = parseInt(infos[2]) ;
        CurrentPhotoHeight = parseInt(infos[3]) ;

        if ( CurrentImageScale < 1 && document.getElementById('ImageScale') )
        {
            // inform the user that photo is scalled again by javascript
            var curScale = document.getElementById('ImageScale').innerHTML ;
            curScale = parseFloat(curScale) ;
            curScale = Math.floor(curScale * CurrentImageScale) ;
            WriteElem('ImageScale', curScale) ;
        }
    }
}

/*
 * Arrête le slide en mode diaporama
 *
 * Stop the slide diaporama function
 ************************************************************************************************************/
function StopSlideDiaporama()
{
    var nav = 'nav_startdiaporama,nav_nextphoto,nav_previousphoto,nav_backthumb' ;
    SetElementsDisplay(nav,'inline') ;
    SetElemDisplay('nav_stopdiaporama','none') ;

    SetElementsDisplay('nav_viewfullsize,nav_savefullsize','inline') ;

    window.clearTimeout(SlideTimer) ;
    SlideTimer = null ;
    InformEndAction('Slide') ;
}

function StartSlideDiaporama()
{
    if ( !SlideTimer && CurrentPhotoNumber < MaxPhotos-1 )
    {
        var nav = 'nav_startdiaporama,nav_nextphoto,nav_previousphoto,nav_backthumb' ;
        SetElementsDisplay(nav,'none') ;
        SetElemDisplay('nav_stopdiaporama','inline') ;
        SetElementsDisplay('nav_viewfullsize,nav_savefullsize','none') ;

        SlidePauseTime = BILDO_SLIDE_TIMER ? BILDO_SLIDE_TIMER * 1000 : 5000 ;
            
        // Start Diaporama
        SlideTimer = window.setTimeout("PhotoNav(1)", SlidePauseTime) ;

        InformBeginAction('Slide', BILDO_MSG_THUMB_DIAPO_PROGRESS, BILDO_MSG_THUMB_DIAPO_FINISHED ) ;
    }
}

/*
 * Ouvre une nouvelle fenêtre avec l'image en taille réelle
 *
 * open a new window with the full size image
 ************************************************************************************************************/
function FullSize(dispo)
{
    if ( !FullSizeRequest )
    {
        if ( dispo == 'inline' )
        {
            FullSizeRequest = GetXMLHttpRequest() ;

            var url = 'bildo-ajax.php' ;
            var params = 'action=GetFullSizeURL' ;
            params += '&albumID='+CurrentAlbum ;
            params += '&photoNumber=' + CurrentPhotoNumber ;
            params += '&dispo=' + dispo ;
            params += '&lang='+BILDO_LANG ;

            FullSizeRequest.onreadystatechange = function()
            {
                if ( FullSizeRequest.readyState == 4 )
                {
                    if ( FullSizeRequest.status == 200 )
                    {
                        url = CleanResponse(FullSizeRequest.responseText) ;
                        window.open(url, '_blank') ; 
                    }
                    FullSizeRequest = false ;
                }
            }
            FullSizeRequest.open("POST", url, true);
            FullSizeRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;
            FullSizeRequest.send(params) ;
        }
        else
        {
            FullSizeRequest = GetXMLHttpRequest() ;

            var url = 'bildo-ajax.php' ;
            var params = 'action=GetFullSizePath' ;
            params += '&albumID='+CurrentAlbum ;
            params += '&photoNumber=' + CurrentPhotoNumber ;
            params += '&dispo=' + dispo ;
            params += '&lang='+BILDO_LANG ;

            FullSizeRequest.onreadystatechange = function()
            {
                if ( FullSizeRequest.readyState == 4 )
                {
                    if ( FullSizeRequest.status == 200 )
                    {
                        url = CleanResponse(FullSizeRequest.responseText) ;
                        window.open('download.php?imagePath='+url, '_self') ; 
                    }
                    FullSizeRequest = false ;
                }
            }
            FullSizeRequest.open("POST", url, true);
            FullSizeRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;
            FullSizeRequest.send(params) ;
        }
    }
}

/*
 * Fonction basculant entre l'affichage des vignettes par grille et l'affichage des vignettes par liste
 ***********************************************************************************************************/
function ThumbnailsDisplayMode(mode)
{
    if ( CurrentMode == 'Thumbnails' )
    {
        var gridLink = document.getElementById('gridMode') ;
        var listLink = document.getElementById('listMode') ;

        ThumbnailsModeChanged = true ;
        CurrentThumbnailsMode = mode ;

        gridLink.className = ( mode == 'GRID' ) ? 'activeOption' : 'inactiveOption' ;
        listLink.className = ( mode == 'LIST' ) ? 'activeOption' : 'inactiveOption' ;

        ShowAlbum(CurrentAlbum, CurrentPage, false) ;
        ThumbnailsModeChanged = false ;
    }
}

/*
 * Cette fonction est appelée lorsque l'utilisateur clique sur un bouton inactif
 * 
 * This function is called when user click on an inactive button
 * 
 ************************************************************************************************************/
function InformUser(context)
{
    // to be continued...
    // probably theme specific function will be called here
}

function ClearSlide()
{
    WriteElem('imageTitle', '') ;
    WriteElem('imageDesc', '') ;
}

/*
 *
 */
function CleanInformAction(block)
{
    StatusMessages[block] = new Array() ;
    StatusLine[block].innerHTML = '' ;
    document.getElementById('ThumbnailsPageProgress').className = '' ;
}

/*
 *
 */
function InformBeginAction(block, beginMessage, endMessage)
{
    if ( StatusLine[block] )
    {
        //beginMessage = img + beginMessage ;
        StatusMessages[block].push(endMessage) ;
        StatusMessages[block].push(beginMessage) ;
        StatusLine[block].innerHTML = beginMessage ;
        document.getElementById('ThumbnailsPageProgress').className = 'loading' ;
    }
}

/*
 *
 */
function InformEndAction(block)
{
    window.clearTimeout(StatusTimers[block]) ; 

    if ( StatusLine[block] )
    {
        StatusLine[block].innerHTML = StatusMessages[block].pop() ;
        StatusTimers[block] = window.setTimeout("PopMessages('"+block+"',true);",800) ;
        window.setTimeout("document.getElementById('ThumbnailsPageProgress').className='';", 600) ;
    }
}

/*
 *
 */
function PopMessages(block, remove)
{
    if ( remove )
    {
        if ( StatusMessages[block].length )
        {
            StatusLine[block].innerHTML = StatusMessages[block].pop() ;
            StatusTimers[block] = window.setTimeout("PopMessages('"+block+"', false);",1200) ;
        }
        else
            StatusLine[block].innerHTML = '' ;
    }
    else
    {
        if ( StatusMessages[block].length )
            StatusLine[block].innerHTML = StatusMessages[block][StatusMessages[block].length-1] ;
        else
            StatusLine[block].innerHTML = '' ;
    }
}

/*
 * Fonctions utiles, pouvant être appelées par le fichier de script du theme
 * 
 * Useful functions who can be called by the script theme file
 * 
 ************************************************************************************************************/
function WriteElem(id,value)
{
    var elem = document.getElementById(id) ;

    if ( elem ) elem.innerHTML = value ;
}

function AddEvent(htmlElem, eventName, eventCallback, when)
{
    if ( document.getElementById(htmlElem) )
    {
        if ( document.all && eventName == "mouseover" )
            document.getElementById(htmlElem).onmouseover = eventCallback ;
        else if ( document.all && eventName == "mouseout" )
            document.getElementById(htmlElem).onmouseout = eventCallback ;
        else if ( document.all && eventName == "mousemove" )
            document.getElementById(htmlElem).onmousemove = eventCallback ;
        else
            document.getElementById(htmlElem).addEventListener(eventName, eventCallback, when) ;
    }
}

function RemoveEvent(htmlElem, eventName, eventCallback, when)
{
    if ( document.getElementById(htmlElem) )
    {
        if ( document.all && eventName == "mouseover" )
            document.getElementById(htmlElem).onmouseover = null ;
        else if ( document.all && eventName == "mouseout" )
            document.getElementById(htmlElem).onmouseout = null ;
        else if ( document.all && eventName == "mousemove" )
            document.getElementById(htmlElem).onmousemove = null ;
        else
            document.getElementById(htmlElem).removeEventListener(eventName, eventCallback, when) ;
    }
}


/*
 * Affiche ou cache un element, en utilisant sa propriété CSS display
 * 
 * Show or hide an html element, with this "display" CSS property.
 * 
 ************************************************************************************************************/
function SetElemDisplay(elemId, display)
{
    var div = document.getElementById(elemId) ;

    //if ( div && div.style.display ) div.style.display = display ;
    if ( div ) div.style.display = display ;
}

function SetElementsDisplay(elemIds, display)
{
    var elements = elemIds.split(',') ;

    for ( var e = 0 ; e < elements.length ; e++ )
        SetElemDisplay(elements[e], display)
}


/*
 * Affiche ou cache un element, en utilisant sa propriété CSS visibility
 * 
 * Show or hide an html element, with this "visibility" CSS property.
 * 
 ************************************************************************************************************/
function SetElemVisibility(elemId, visibility)
{
    var div = document.getElementById(elemId) ;

    if ( div ) div.style.visibility = visibility ;
}

function SetElementsVisibility(elemIds, visibility)
{
    var elements = elemIds.split(',') ;

    for ( var e = 0 ; e < elements.length ; e++ )
        SetElemVisibility(elements[e], visibility)
}

/*
 * Change la couche d'un element, en utilisant sa propriété CSS z-index
 * 
 * Change the layer of an html element, with this z-index CSS property 
 *
 ************************************************************************************************************/
function SetElemZIndex(elemId, zindex)
{
    var div = document.getElementById(elemId) ;

    if ( div ) div.style.zIndex = zindex ;
}

function SetElementsZIndex(elemIds, zindex)
{
    var elements = elemIds.split(',') ;

    for ( var e = 0 ; e < elements.length ; e++ )
        SetElemZIndex(elements[e], zindex)
}



/*
 * Login en mode javascript
 * 
 * javascript login
 *
 ************************************************************************************************************/
function Login()
{
    var login = document.getElementById('login').value ;
    var password = document.getElementById('password').value ;

    if ( !login || !password )
        return null ;
    
    // TODO : use a symetric encryption with the server ?
    // var salt = '' ;
    // clear password transfer on the network
    //var pwInfos = Javacrypt.crypt(salt, password) ;
    //password = pwInfos[0]
    //salt = pwInfos[1] ;

    var userLogin = document.getElementById('userLinks') ;
    if ( userLogin.firstChild )
        userLogin.removeChild(userLogin.firstChild) ;
    userLogin.innerHTML = BILDO_MSG_LOGIN_PROGRESSING ;

    // Ajax login :-)
    LoginRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=CheckLogin' ;
    params += '&login='+login ;
    params += '&password=' + password ;
    params += '&lang='+BILDO_LANG ;

    LoginRequest.onreadystatechange = function()
    {
        if ( LoginRequest.readyState == 4 )
        {
            alert(LoginRequest.responseText) ;

            if ( LoginRequest.status == 200 )
            {
                // return login \n password \n sessionID
                var answers = CleanResponse(LoginRequest.responseText).split("\n") ;
                var sessionID = answers[2] ;
                if ( sessionID )
                {
                    //document.cookie = "PHPSESSID="+sessionID+";"
                    RefreshMenu(false) ;
                }
                else
                {
                    WriteElem('userLinks', BILDO_MSG_LOGIN_ERROR ) ;
                    window.setTimeout("RefreshMenu(false);", 3000) ;
                }
            }
            LoginRequest = false ;
        }
    }
    LoginRequest.open("POST", url, true);
    LoginRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;
    LoginRequest.send(params) ;

    // dont reload the page
    return false ;
}

function Logout()
{
    if ( !LogoutRequest )
    {
        LogoutRequest = GetXMLHttpRequest() ;

        var url = 'bildo-ajax.php' ;
        var params = 'action=Logout' ;
        params += '&lang='+BILDO_LANG ;

        WriteElem('userLinks', BILDO_MSG_LOGOUT_PROGRESSING ) ;

        LogoutRequest.onreadystatechange = function()
        {
            if ( LogoutRequest.readyState == 4 )
            {
                /*if ( LogoutRequest.responseText )
                    alert ( LogoutRequest.responseText ) ;*/

                if ( LogoutRequest.status == 200 )
                {
                    document.cookie = "Name=PHPSESSID; expires=Thu, 01-Jan-1970 00:00:01 GMT" ;
                    if ( BILDO_GALLERY_PRIVATE )
                        window.open('login.php', '_self') ;
                    else
                        RefreshMenu(false) ;
                }
                LogoutRequest  = false ;
            }
        }
        LogoutRequest.open("POST", url, true);
        LogoutRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;
        LogoutRequest.send(params) ;
    }
}

/*
 * Crée l'objet XML Request
 * 
 * Create Xml request object
 *
 ************************************************************************************************************/
function GetXMLHttpRequest() 
{
    var object = null;
    
    if (window.XMLHttpRequest) 
    {
        object = new XMLHttpRequest();
    } 
    else if (window.ActiveXObject) 
    {
        try
        {
            object = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                object = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
            }
        }
    }
    
    if (object == null)
    {
        // todo: passer en mode non ajax
    }
    
    return object;
}

function CleanResponse(response)
{
    if ( !response )
        response = "[[[]]]" ;

    var begin = response.indexOf('[[[') + 3 ;
    var end = response.indexOf(']]]') ;

    if ( begin > 3 && BILDO_DEBUG_AJAX )
    {
        var messages = response.substring(0,begin-3) ;
        alert(messages) ;
    }

    return response.substring(begin,end) ;
}
