/*
    File    : Bildo.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 CurrentAlbumUID ;
var CurrentPage ;
var RefreshTimer ;
var DiapoTimer ;
var SlideTimer ;
var SlidePauseTime ;

var ThumbnailsPauseTime ;
var CurrentNbDiapos ;
var CurrentPhotoNumber ;
var CurrentPhotoUID ;
var CurrentPhotoWidth ;
var CurrentPhotoHeight ;
var WindowResizedFlag = false ;
var MaxPhotos ;
var MaxPage ;

var XmlRequest = false ;
var UpdateRequest = false ;
var PreloadRequest = false ;

// 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() ;

    ShowAlbum(firstAlbum,1) ;
}

/*
 * 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();", BILDO_WINDOW_RESIZE_TIMER) ;
        }
    }
    else
    {
        ShowSlide(CurrentPhotoUID, CurrentPhotoNumber, CurrentPhotoWidth, CurrentPhotoHeight) ;
    }
}

function refreshAlbum()
{
    // Release Timer if current refreshing ;
    if ( RefreshTimer )
        window.clearTimeout(RefreshTimer) ;

    ShowAlbum(CurrentAlbum,CurrentPage) ;
}

function ShowAlbum(name,page)
{
    var justRefresh = false ;

    if ( name == CurrentAlbum && page == CurrentPage && !WindowResizedFlag && !ThumbnailsModeChanged )
        justRefresh = true ;

    if ( name == '' && page == 0 && !WindowResizedFlag && !ThumbnailsModeChanged )
        justRefresh = true ;

    // just in the case where the user has selected an album in diaporama
    if ( ( name != CurrentAlbum ) && DiapoTimer )
        StopThumbnailsDiaporama() ;

    if ( name == '' )
        name = CurrentAlbum ;
    else
        CurrentAlbum = name ;

    if ( page == 0 )
        page = CurrentPage ;
    else
        CurrentPage = page ;

    // 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 nbDiaposHoriz = BILDO_THUMBNAILS_NB_COLUMNS ;
    var nbDiaposVert = BILDO_THUMBNAILS_NB_ROWS ;
    var nbDiapos = nbDiaposHoriz * nbDiaposVert ;

    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 nbDiaposHoriz = Math.max(Math.floor( availWidth / diaposWidth), 1) ;
        var nbDiaposVert = Math.max(Math.floor( availHeight / diaposHeight), 1) ;

        nbDiapos = nbDiaposHoriz * nbDiaposVert ;

        GridLeftMargin = Math.floor( ( availWidth - nbDiaposHoriz * diaposWidth ) / 2 ) ;
        GridTopMargin = Math.floor( ( availHeight - nbDiaposVert * diaposHeight ) / 2 ) ;
    }

    if ( CurrentThumbnailsMode == 'LIST' )
        nbDiapos = BILDO_THUMBNAILS_NB_BY_PAGE ;
    
    if ( nbDiapos <= 0 || isNaN(nbDiapos) )
        nbDiapos = 1 ;
        
    CurrentNbDiapos = nbDiapos ;

    if ( !justRefresh && thumbnailsBox )
    {
        if ( CurrentThumbnailsMode == 'GRID' )
        {
            var thumbnailsBox = document.getElementById('ThumbnailsBox') ;
            if ( thumbnailsBox ) thumbnailsBox.style.visibility = 'hidden' ;
        }

        WindowResizedFlag = false ;
        InformBeginAction('Thumbnails', BILDO_MSG_LOAD_BEGIN, BILDO_MSG_LOAD_END) ;

        var availWidth = thumbnailsBox.clientWidth ;
        var availHeight = thumbnailsBox.clientHeight ;

        UpdateRequest = GetXMLHttpRequest() ;
       
        var url = 'bildo-ajax.php' ;
        var params = 'action=ShowAlbum' ;
        params += '&album='+name+'&page='+page+'&nbDiapos='+nbDiapos ;
        params += "&availWidth="+ String(availWidth) ;
        params += "&availHeight="+ String(availHeight) ;
        params += '&photoNumber=' + CurrentPhotoNumber ;

        if ( CurrentThumbnailsMode == 'GRID' )
            params += '&dispo=' + nbDiaposHoriz + ',' + nbDiaposVert ;

        UpdateRequest.onreadystatechange = AlbumUpdate ;
        UpdateRequest.open("POST", url, true);
        UpdateRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

        UpdateRequest.send(params) ;

        WriteElem('ThumbnailsCurrentPage', CurrentPage) ;
    }

    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 ( UpdateRequest.readyState < 4 )
    {
        // 1:Loading...
    }
    else
    {
        if ( UpdateRequest.status == 200 )
        {
            var thumbnailsBox = document.getElementById('ThumbnailsBox') ;
            if ( thumbnailsBox && UpdateRequest.responseText.length )
            {
                var response = CleanResponse(UpdateRequest.responseText).replace("\n"," ") ;
                thumbnailsBox.innerHTML = response ;
            }

            InformEndAction('Thumbnails') ;

            if ( DiapoTimer )
            {
                if ( CurrentPage == MaxPage )
                {
                    DiapoTimer = 0 ;
                    // fixme : Why must be present twice to clear status ?
                    InformEndAction('Thumbnails') ;
                    InformEndAction('Thumbnails') ;
                }
                else
                {
                    DiapoTimer = window.setTimeout(NextPage, ThumbnailsPauseTime) ;
                }
            }

            if ( CurrentThumbnailsMode == 'GRID' )
            {
                var thumbnailsGrid = document.getElementById('ThumbnailsGrid') ;

                if ( thumbnailsGrid )
                {
                    thumbnailsGrid.style.marginLeft = String(GridLeftMargin) + 'px' ; 
                    thumbnailsGrid.style.marginTop = String(GridTopMargin) + 'px' ; 
                }
                thumbnailsBox.style.visibility = 'visible' ;
            }
            UpdateAlbumInfos() ;
        }
    }
}

/*
 * 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) ;
}

/* 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) ;
}

/* afficher la derniÃ¨re page, dans la vue des vignettes
 * 
 * show last page, in the thumbnails view
 * 
 ************************************************************************************************************/
function LastPage()
{
    ShowAlbum(CurrentAlbum,MaxPage) ;
}

/* afficher la premiÃ¨re page, dans la vue des vignettes
 * 
 * show first page, in the thumbnails view
 * 
 ************************************************************************************************************/
function FirstPage()
{
    ShowAlbum(CurrentAlbum,1) ;
}

/* 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 )
    {
        ThumbnailsPauseTime = BILDO_DIAPORAMA_TIMER ? 1000 * BILDO_DIAPORAMA_TIMER : 500 * CurrentNbDiapos ;
            
        DiapoTimer = window.setTimeout(NextPage, ThumbnailsPauseTime) ;
        InformBeginAction('Thumbnails', BILDO_MSG_THUMB_DIAPO_PROGRESS, BILDO_MSG_THUMB_DIAPO_FINISHED ) ;
    }
    else
        StopThumbnailsDiaporama() ;
}

/* 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()
{
    // Stop Diaporama
    window.clearTimeout(DiapoTimer) ;
    DiapoTimer = null ;
    InformEndAction('Thumbnails') ;
}

/* Affiche la diapositive d'une photo spÃ©cifiÃ©e 'name'
 * 
 * Show the slide named 'name'
 ************************************************************************************************************/
function ShowSlide(uid, number, width, height)
{
    // arrÃªter le diaporama, au cas oÃ¹...
    if ( DiapoTimer )
        StopThumbnailsDiaporama() ;

    CurrentMode = 'Slide' ;

    InformBeginAction('Slide', BILDO_MSG_LOAD_BEGIN, BILDO_MSG_LOAD_END) ;

    CurrentPhotoNumber = parseInt(number) ;
    CurrentPhotoUID = uid ;

    // Mettre a jour le numero de la photo
    WriteElem('SlideCurrentPhoto', CurrentPhotoNumber) ;

    var slideImage = document.getElementById('SlideImage') ;

    // appeller la fonction par defaut du theme
    if ( typeof theme_initSlide == 'function' )
        theme_initSlide() ;

    var slideSrc = BILDO_SERVER_IMGROOT+'.cache/'+uid+"-slide.jpg" ;

    //slideImage.style.visibility = 'hidden' ;
    slideImage.src = slideSrc ;
    slideImage.alt = slideSrc ;

    // apply ratio to reduce slide if needed.
    var margin = 10 ;
    var slideBox = document.getElementById('SlideBox') ;
    var xRatio = ( slideBox.clientWidth - 2 * margin ) / width ;
    var yRatio = ( slideBox.clientHeight - 2 * margin ) / height ;
    var ratio = Math.min(xRatio,yRatio) ;
    //slideSrc += "&availWidth="+slideBox.clientWidth ;
    //slideSrc += "&availHeight="+slideBox.clientHeight ;

    slideImage.style.marginTop = '10px' ;
    /*

    if ( ratio < 1 && navigator.userAgent.indexOf("MSIE") == -1  )
    {
        slideImage.width = Math.floor(ratio * width) ;
        slideImage.height = Math.floor(ratio * height) ;
        slideImage.style.marginTop = String(margin)+'px' ;
    }

    if ( ratio >= 1 )
    {
        slideImage.width = width ;
        slideImage.height = height ;
        var marginTop = String( Math.floor( ( slideBox.clientHeight - height ) / 2 ) ) + 'px' ;
        slideImage.style.marginTop = marginTop ;
    }
    */
    //slideImage.style.visibility = 'visible' ;

    WriteElem("SlideInfosText", "...") ;

    // update photo informations
    UpdatePhotoInfos() ;

    InformEndAction('Slide') ;

    // Restart Diaporama if needed
    if ( SlideTimer )
    {
        if ( CurrentPhotoNumber < MaxPhotos )
            SlideTimer = window.setTimeout("PhotoNav(1)", SlidePauseTime) ;
        else
            InformEndAction('Slide') ;
    }

    // preload next photo
    if ( CurrentPhotoNumber != MaxPhotos )
        PreloadSlide(CurrentPhotoNumber+1) ;

    UpdateSlideControls() ;
}

/*
 * Met Ã  jour l'Ã©tat des contrÃ´les des diapositives
 *
 * Update thumbnails controls state
 ***********************************************************************************************************/
function UpdateThumbnailsControls()
{
    // update controls states
    if ( CurrentPage == 1 )
    {
        document.getElementById('nav_firstpage').href = "javascript:InformUser('Inactive');" ;
        document.getElementById('nav_previouspage').href = "javascript:InformUser('Inactive');" ;
    }
    else
    {
        document.getElementById('nav_firstpage').href = "javascript:FirstPage()" ;
        document.getElementById('nav_previouspage').href = "javascript:PreviousPage();" ;
    }

    if ( CurrentPage == MaxPage )
    {
        document.getElementById('nav_nextpage').href = "javascript:InformUser('Inactive');" ;
        document.getElementById('nav_lastpage').href = "javascript:InformUser('Inactive');" ;
    }
    else
    {
        document.getElementById('nav_nextpage').href = "javascript:NextPage();" ;
        document.getElementById('nav_lastpage').href = "javascript:LastPage();" ;
    }

    if ( MaxPage <= 1 )
        document.getElementById('nav_startstopdiapo').href = "javascript:InformUser('Inactive');" ;
    else
        document.getElementById('nav_startstopdiapo').href = "javascript:StartThumbnailsDiaporama();" ;
}

function UpdateSlideControls()
{
    // update controls states
    if ( CurrentPhotoNumber == 1 )
        document.getElementById('nav_previousphoto').href = "javascript:InformUser('Inactive');" ;
    else
        document.getElementById('nav_previousphoto').href = "javascript:PhotoNav(-1);" ;

    if ( CurrentPhotoNumber == MaxPhotos )
        document.getElementById('nav_nextphoto').href = "javascript:InformUser('Inactive');" ;
    else
        document.getElementById('nav_nextphoto').href = "javascript:PhotoNav(1);" ;

    if ( MaxPhotos <= 1 )
        document.getElementById('nav_diaporama').href = "javascript:InformUser('Inactive');" ;
    else
        document.getElementById('nav_diaporama').href = "javascript:StartSlideDiaporama();" ;
}

/*
 * Charge en mÃ©moire la diapo donnÃ©e
 *
 * Preload a slide in memory
 ***********************************************************************************************************/
function PreloadSlide(number)
{
    PreloadRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=GetPhotoInfos' ;
    params += '&album='+encodeURI(CurrentAlbum) ;
    params += '&photoNumber=' + number ;

    PreloadRequest.onreadystatechange = function()
    {
        if ( PreloadRequest.readyState == 4 && PreloadRequest.status == 200 && PreloadRequest.responseText.length )
        {
            var response = CleanResponse(PreloadRequest.responseText) ;
            // Return => "uid|photoInfos|width|height|photoNumber"
            var infos = response.split('|') ;
            var uid = infos[0] ;
            var category = 'slide' ;
            var image = new Image() ;
            //var source = "search.php?dispo=inline&cat="+category+"&uid="+uid ;
            var source = BILDO_SERVER_IMGROOT+'.cache/'+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) ;
}

/*
 * 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 ( CurrentPhotoNumber + sens > 0 && CurrentPhotoNumber+sens <= MaxPhotos )
    {
        ClearSlide() ;

        XmlRequest = GetXMLHttpRequest() ;
        CurrentPhotoNumber += sens ;

        var url = 'bildo-ajax.php' ;
        var params = 'action=GetPhotoInfos' ;
        params += '&album='+encodeURI(CurrentAlbum) ;
        params += '&photoNumber=' + CurrentPhotoNumber ;

        XmlRequest.onreadystatechange = function()
        {
            if ( XmlRequest.readyState == 4 && XmlRequest.status == 200 && XmlRequest.responseText.length )
            {
                var response = CleanResponse(XmlRequest.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, number, width, height) ;
            }
        } ;
        XmlRequest.open("POST", url, true);
        XmlRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

        XmlRequest.send(params) ;
    }
}

function UpdateAlbumInfos()
{

    var XmlRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=GetAlbumInfos' ;
    params += '&album='+encodeURI(CurrentAlbum) ;

    XmlRequest.onreadystatechange = function()
    {
        if ( XmlRequest.readyState == 4 && XmlRequest.status == 200 && XmlRequest.responseText.length )
        {
            // Return => "nbPhotos|Description|Title"
            var albumInfos = CleanResponse(XmlRequest.responseText).split('|') ;
            MaxPhotos = albumInfos[0] ;
            MaxPage = Math.ceil(parseInt(MaxPhotos)/CurrentNbDiapos) ;

            var albumDesc ;

            if ( MaxPhotos > 1 )
                albumDesc = albumInfos[1].replace(/\(s\)/, 's') ;
            else if ( MaxPhotos == 1 )
                albumDesc = albumInfos[1].replace(/\(s\)/, '') ;
            else if ( MaxPhotos == 0 )
                albumDesc = BILDO_LABEL_EMPTY_ALBUM ;

            if ( MaxPhotos >= 1 )
            {
                WriteElem("SlideMaxPhotos", MaxPhotos) ;
                WriteElem("ThumbnailsMaxPage", MaxPage) ;
            }
            else
            {
                WriteElem("SlideMaxPhotos", ' ' ) ;
                WriteElem("ThumbnailsMaxPage", ' ' ) ;
            }

            if ( CurrentPage > MaxPage )
                ShowAlbum(CurrentAlbum, MaxPage) ;
            else
            {
                WriteElem("ThumbnailsInfosText", albumDesc) ;
                WriteElem("AlbumTitle", albumInfos[2]) ;

                UpdateThumbnailsControls() ;
                UpdateSlideControls() ;
            }
        }
    } ;
    XmlRequest.open("POST", url, true);
    XmlRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

    XmlRequest.send(params) ;
}

function UpdatePhotoInfos()
{
    var InfosRequest = GetXMLHttpRequest() ;

    var url = 'bildo-ajax.php' ;
    var params = 'action=GetPhotoInfos' ;
    params += '&album='+encodeURI(CurrentAlbum) ;
    params += '&photoNumber=' + CurrentPhotoNumber ;

    InfosRequest.onreadystatechange = function()
    {
        if ( InfosRequest.readyState == 4 && InfosRequest.status == 200 && InfosRequest.responseText.length )
        {
            var response = CleanResponse(InfosRequest.responseText) ;
            // Return => "uid|photoInfos|width|height|photoNumber|title|description"
            var infos = response.split('|') ;
            CurrentPhotoUID = infos[0] ;
            var legend = infos[1] ;

            WriteElem('SlideInfosText', legend) ;
            WriteElem('imageTitle', infos[5]) ;

            CurrentPhotoWidth = parseInt(infos[2]) ;
            CurrentPhotoHeight = parseInt(infos[3]) ;
        }
    } ;
    InfosRequest.open("POST", url, true);
    InfosRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded') ;

    InfosRequest.send(params) ;
}

/*
 * DÃ©marre ou arrÃªte le slide en mode diaporama
 *
 * Start or stop the slide diaporama function
 ************************************************************************************************************/
function StopSlideDiaporama()
{
    if ( SlideTimer )
    {
        // Stop Diaporama
        window.clearTimeout(SlideTimer) ;
        SlideTimer = null ;
        InformEndAction('Slide') ;
    }
}

function StartSlideDiaporama()
{
    if ( !SlideTimer )
    {
        SlidePauseTime = BILDO_SLIDE_TIMER ? BILDO_SLIDE_TIMER * 1000 : 5000 ;
            
        // Start Diaporama
        if ( CurrentPhotoNumber < MaxPhotos )
            SlideTimer = window.setTimeout("PhotoNav(1)", SlidePauseTime) ;

        InformBeginAction('Slide', BILDO_MSG_THUMB_DIAPO_PROGRESS, BILDO_MSG_THUMB_DIAPO_FINISHED ) ;
    }
    else
    {
        StopSlideDiaporama() ;
    }
}

/*
 * Ouvre une nouvelle fenÃªtre avec l'image en taille rÃ©elle
 *
 * open a new window with the full size image
 ************************************************************************************************************/
function FullSize(dispo)
{
    var url = "search.php?dispo="+dispo+"&cat=full&uid="+CurrentPhotoUID ;
    if ( dispo == 'inline' )
        window.open(url, '_blank') ; 
    else
        window.open(url, '_self') ; 
}

/*
 * 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) ;
        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()
{
    var slideImage = document.getElementById('SlideImage') ;

    WriteElem('imageTitle', '') ;

    slideImage.src = 'illus/clear.gif' ;
    slideImage.alt = '' ;
}

/*
 *
 */
function InformBeginAction(block, beginMessage, endMessage)
{
    if ( StatusLine[block] )
    {
        StatusMessages[block].push(endMessage) ;
        StatusMessages[block].push(beginMessage) ;
        StatusLine[block].innerHTML = beginMessage ;
    }
}

/*
 *
 */
function InformEndAction(block)
{
    window.clearTimeout(StatusTimers[block]) ; 

    if ( StatusLine[block] )
    {
        StatusLine[block].innerHTML = StatusMessages[block].pop() ;
        StatusTimers[block] = window.setTimeout("PopMessages('"+block+"',true);",1200) ;
    }
}

/*
 *
 */
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 ;
    //else alert("fonction 'WriteElem' : element introuvable ("+id+")") ;
}

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) ;
    }
    else alert("fonction 'AddEvent' : element introuvable ("+htmlElem+")") ;
}

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) ;
    }
    else alert("fonction 'RemoveEvent' : element introuvable ("+htmlElem+")") ;
}


/*
 * 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 ;
    //else ( alert("Element introuvable: '"+elemId+"' !")) ;
}

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 ;
    //else ( alert("Element introuvable: '"+elemId+"' !")) ;
}

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 ;
    //else ( alert("Element introuvable: '"+elemId+"' !")) ;
}

function SetElementsZIndex(elemIds, zindex)
{
    var elements = elemIds.split(',') ;

    for ( var e = 0 ; e < elements.length ; e++ )
        SetElemZIndex(elements[e], zindex)
}



/*
 * 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)
        {
        }
        
        if (object == null)
        {
            try
            {
                object = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
            }
        }
    }
    
    if (object == null)
    {
        // todo: passer en mode non ajax
    }
    
    return object;
}

function CleanResponse(response)
{
    var begin = response.indexOf('[[[') + 3 ;
    var end = response.indexOf(']]]') ;

    return response.substring(begin,end) ;
}

