/**************************************************************/
/*    photos.js                                               */
/**************************************************************/

function isInternetExplorer() {
    if (document.all)
        return true;
    else
        return false;
}

function getElementsByTagNameNS_portable( element, strPrefix, strTag ) {

    // Without namespace
    if (strPrefix == "") {
        return element.getElementsByTagName( strTag );
    }

    // With namespace
    if ( isInternetExplorer() ) {
        return element.getElementsByTagName( strPrefix + ":" + strTag );
    }
    else {
        var strNamespaceURI;
        switch (strPrefix) {
        case "media":   strNamespaceURI = 'http://search.yahoo.com/mrss/';         break;
        case "gphoto":  strNamespaceURI = 'http://schemas.google.com/photos/2007'; break;
        default:
            alert("Unhandled namespace in getElementsByTagNameNS_portable");
            break;
        }
        return element.getElementsByTagNameNS( strNamespaceURI, strTag );
    }
}

function setElementStyle( element, strStyle ) {
    if ( isInternetExplorer() ) {
        element.style.setAttribute("cssText", strStyle);
    }
    else {
        element.setAttribute("style", strStyle )
    }
}

function getURLParam(strParamName){
    var strReturn = "";
    var strHref = window.location.href;
    if ( strHref.indexOf("?") > -1 ){
        var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
        var aQueryString = strQueryString.split("&");
        for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
            if ( aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 ) {
                var aParam = aQueryString[iParam].split("=");
                strReturn = aParam[1];
                break;
            }
        }
    }
    return unescape(strReturn);
}

function convertDate (strDate) {
    var items = strDate.split(' ');
    
    var strDay;
    var strTemp = items[0].replace(/,/, ''); // Remove comma
    switch ( strTemp ) {
    case "Mon": strDay = "Lundi";   break;
    case "Tue": strDay = "Mardi";   break;
    case "Wed": strDay = "Mercredi";   break;
    case "Thu": strDay = "Jeudi";   break;
    case "Fri": strDay = "Vendredi";   break;
    case "Sat": strDay = "Samedi";   break;
    case "Sun": strDay = "Dimanche";   break;
    }
    
    var strMonth;
    switch ( items[2] ) {
    case "Jan": strMonth = "Janvier";   break;
    case "Feb": strMonth = "Février";   break;
    case "Mar": strMonth = "Mars";   break;
    case "Apr": strMonth = "Avril";   break;
    case "May": strMonth = "Mai";   break;
    case "Jun": strMonth = "Juin";   break;
    case "Jul": strMonth = "Juillet";   break;
    case "Aug": strMonth = "Août";   break;
    case "Sep": strMonth = "Septembre";   break;
    case "Oct": strMonth = "Octobre";   break;
    case "Nov": strMonth = "Novembre";   break;
    case "Dec": strMonth = "Décembre";   break;
    }
    
    return strDay + " " + items[1] + " " + strMonth + " " + items[3];
}

function processAlbumsList( xmlPicasaAPI ) {

    var item = getElementsByTagNameNS_portable( xmlPicasaAPI, "", "item");
    var tbody = document.createElement("tbody");

    for ( i=0; i<item.length; i++ ) {
        
        var title       = getElementsByTagNameNS_portable( item[i], "", "title")[0].childNodes[0].nodeValue;
        var date        = getElementsByTagNameNS_portable( item[i], "", "pubDate")[0].childNodes[0].nodeValue;
        var link        = getElementsByTagNameNS_portable( item[i], "", "link")[0].childNodes[0].nodeValue;
        var thumb       = getElementsByTagNameNS_portable( item[i], "media", "thumbnail")[0].getAttribute("url");
        var numphotos   = getElementsByTagNameNS_portable( item[i], "gphoto", "numphotos")[0].childNodes[0].nodeValue;
        var albumid     = getElementsByTagNameNS_portable( item[i], "gphoto", "id")[0].childNodes[0].nodeValue;
        
        var img = document.createElement("img");
        img.setAttribute("src", thumb );
        img.setAttribute("alt", "X" );
        
        var aImage = document.createElement("a");
        aImage.appendChild( img );
        aImage.setAttribute("href", window.location.href + "&album=" + albumid );
        
        var td1 = document.createElement("td");
        td1.appendChild( aImage );

        var aTitre = document.createElement("a");
        aTitre.appendChild(document.createTextNode( title  ) );
        aTitre.setAttribute("href", window.location.href + "&album=" + albumid );
        
        var td2 = document.createElement("td");
        td2.appendChild( aTitre );
        td2.appendChild(document.createElement("br") );
        td2.appendChild(document.createTextNode(
            convertDate( date ) + " - " + numphotos + " photos" ) );

        var tr = document.createElement("tr");
        tr.appendChild( td1 );
        tr.appendChild( td2 );
        
        tbody.appendChild( tr );
    }
    
    var table = document.createElement("table");
    table.appendChild( tbody );

    var h2 = document.createElement("h2");
    h2.appendChild(document.createTextNode( "Liste des albums" ) );
    
    var container = document.getElementById("albums");
    container.appendChild(h2);
    container.appendChild(table);

}

function createAlbumElement( xmlPicasaAPI ) {
    
    var div = document.createElement("div");
    setElementStyle( div, "text-align:center;" );
    
    var entry   = xmlPicasaAPI.getElementsByTagName("entry");
    if (entry.length == 0) alert("Pas de photos dans cet album");
    for ( i=0; i<entry.length; i++ ) {
        
        var thumb = getElementsByTagNameNS_portable( entry[i], "media", "thumbnail")[0].getAttribute("url");
        
        var img = document.createElement("img");
        img.setAttribute("src", thumb );
        img.setAttribute("alt", "X" );
        
        var aTitre = document.createElement("a");
        aTitre.setAttribute("href", "#" );
        aTitre.photo = i;
        aTitre.onclick = function () { processImage( xmlPicasaAPI, this.photo ); return false; };
        aTitre.appendChild( img );
        
        div.appendChild(aTitre);
    }
    return div;
}

function createPhotoElement( xmlPicasaAPI, strPhotoId ) {

    var entry       = getElementsByTagNameNS_portable( xmlPicasaAPI, "", "entry");
    var numphotos   = getElementsByTagNameNS_portable( xmlPicasaAPI, "gphoto", "numphotos")[0].childNodes[0].nodeValue;
    var albumid     = getElementsByTagNameNS_portable( xmlPicasaAPI, "gphoto", "id")[0].childNodes[0].nodeValue;
    var imageFull   = getElementsByTagNameNS_portable( entry[strPhotoId], "media", "content")[0].getAttribute("url");
    var imageSrc    = getElementsByTagNameNS_portable( entry[strPhotoId], "media", "thumbnail")[2].getAttribute("url");

    var intPhoto = parseInt( strPhotoId );
    var intPhotoPrecedente = parseInt( strPhotoId ) - 1;
    var intPhotoSuivante = parseInt( strPhotoId ) + 1;
    var intPhotoTotal = parseInt( numphotos );
    
    var aRetour = document.createElement("a");
    aRetour.appendChild(document.createTextNode( "« Retour à la liste des photos" ) );
    aRetour.setAttribute("href", "#" );
    aRetour.onclick = function () { processAlbumUpdate( xmlPicasaAPI ); return false; };
    
    var aPrecedent = document.createElement("a");
    aPrecedent.appendChild(document.createTextNode( "« Précédente" ) );
    if ( intPhoto > 0 ) {
        aPrecedent.setAttribute("href", "#" );
        aPrecedent.photo = intPhotoPrecedente;
        aPrecedent.onclick = function () { processImage( xmlPicasaAPI, this.photo ); return false;};
    }
    else {
        setElementStyle( aPrecedent, "visibility:hidden;");
    }

    var aSuivant = document.createElement("a");
    aSuivant.appendChild(document.createTextNode( "Suivante »" ) );
    if ( intPhoto < ( intPhotoTotal - 1 ) ) {
        aSuivant.setAttribute("href", "#" );
        aSuivant.photo = intPhotoSuivante;
        aSuivant.onclick = function () { processImage( xmlPicasaAPI, this.photo ); return false; };
    }
    else {
        setElementStyle( aSuivant, "visibility:hidden;");
    }
    
    var p = document.createElement("p");
    setElementStyle( p, "text-align:center;" );
    p.appendChild( aPrecedent );
    p.appendChild(document.createTextNode( " - Photo " + intPhotoSuivante + " sur " + numphotos + " - " ) );
    p.appendChild( aSuivant );

    var img = document.createElement("img");
    img.setAttribute("src", imageFull );
    img.setAttribute("alt", "Chargement en cours..." );
    
    var div = document.createElement("div");
    setElementStyle( div, "text-align:center;" );
    div.appendChild( aRetour );
    div.appendChild( document.createElement("br") );
    div.appendChild( p );
    div.appendChild( document.createElement("br") );
    div.appendChild( img );

    return div;
}

function processAlbum( xmlPicasaAPI ) {

    var title   = xmlPicasaAPI.getElementsByTagName("title")[0].childNodes[0].nodeValue;
    
    // Remove album parameter in order to get the album list page
    var str = window.location.href;
    str = str.substr(0, str.indexOf("&"));

    var aRetour = document.createElement("a");
    aRetour.setAttribute("href", str );
    aRetour.appendChild(document.createTextNode( "« Retour à la liste des albums" ) );
    
    var h2 = document.createElement("h2");
    h2.appendChild(document.createTextNode( title ) );
    
    var div = createAlbumElement( xmlPicasaAPI );

    var container   = document.getElementById("albums");
    container.appendChild(aRetour);
    container.appendChild(h2);
    container.appendChild(div);
}

function processAlbumUpdate( xmlPicasaAPI ) {
    var div = createAlbumElement( xmlPicasaAPI );
    var container   = document.getElementById("albums");
    container.replaceChild( div, container.lastChild );
}

function processImage( xmlPicasaAPI, strPhotoId ) {
    var div = createPhotoElement( xmlPicasaAPI, strPhotoId );
    var container   = document.getElementById("albums");
    container.replaceChild( div, container.lastChild );
}

function getXML( strURL ) {
    var request = null;
    if (window.XMLHttpRequest) {
        request =  new XMLHttpRequest();
    }
    else {
        request =  new ActiveXObject("Microsoft.XMLHTTP");
    }
    request.open("GET", strURL, false);
    request.setRequestHeader("Content-Type", "text/xml");
    request.send("");

    if ( (request.status == 200) && (request.readyState == 4 ) ) {
        if (request.responseXML == null) {
            //alert( "responseXML est nul" + request.responseText );
        }
    }
    else {
        return null;
    }
    return request.responseXML;
}

function init() {
    
    var container = document.getElementById("albums");
    if ( container == null ) {
        return;
    }
    
    /* Get album id if any */
    var album = getURLParam("album");
    if (album == "") {
        // Get a list of albums
        var url="google.php?service=picasa";
        var xmlDoc = getXML( url );
        if (xmlDoc != null) processAlbumsList( xmlDoc );
    }
    else {
        // Get list of photos for a given album
        var url="google.php?service=picasa&album=" + album;
        var xmlDoc = getXML( url );
        if (xmlDoc != null) processAlbum( xmlDoc );
    }
}
window.onload = init; 

