
// Gallery definitions

var gNumslides = 0;
var gSlides = new Array();

var gMaker = " ";          // full name of owner (or just subhead)
var gUser = "";            // album owner (internal name)
var gTitle = " ";          // album title
var gPath = "";            // full path to album
var gGpath = "";           // album path rel to gallery
var gName = "";            // album name
var gGallcomment = "";     // comment for thumbnail page

var gTSprompt = "Click on any thumbnail for a larger view";

var gDebug = "";

//  Display Modes

var gCurrmode   = 0;    // Mode being displayed
var modeTN      = 1;    // Thumbnails
var modeTS      = 2;    // Thumbstrip
var modeSS      = 3;    // Slideshow

//  Image sizes

var sizeName     = new Array();
var sizeMh       = new Array();
var sizeMw       = new Array();
var sizeS;
// for eZalbums
    sizeMh[1] = 120;
    sizeMw[1] = 120;
	sizeName[1] = "_0.jpg";
    sizeMh[2] = 270;
    sizeMw[2] = 360;
	sizeName[2] = "_1.jpg";
    sizeMh[3] = 360;
    sizeMw[3] = 480;
	sizeName[3] = "_2.jpg";
    sizeMh[4] = 480;
    sizeMw[4] = 640;
	sizeName[4] = "_3.jpg";
    sizeMh[5] = 600;
    sizeMw[5] = 800;
	sizeName[5] = "_4.jpg";
    sizeS       = 5;

var gLtop = 0;             // top and
var gLleft = 0;            // left of loading icon
var gLwidth = 135;         // width of ditto
var gLheight = 23;         // and height

var gCurrslide = 0;        // Slide currently being shown
var gLoadingslide = -1;    // Slide currently being loaded

var gRunning = false;      // running in auto mode
var gClock = 0;            // Timer object for slide changes
var gTicksize = 1000;      // milliseconds per tick
var gTickcount = 0;        // Ticks since slidechange
var gTickmax = 4;          // Ticks per slidechange

var gAniminterval = null;  // Clock to shrink ctlbar
var gIhow = "N";           // Which mode to start up in
var gIwhere = "";          // starting slide fn.
var gDebuggin = false;      // debug mode for test


//                        Find our base URL

var gLoc = window.location;
var gL = new String(gLoc.protocol + "//" + gLoc.host + gLoc.pathname);
    gL = gL.substr(0,gL.lastIndexOf("/")+1);                // base loc of album (inc /)
var gLocation = gL.substr(0,gL.lastIndexOf("/",gL.length-2)+1);       // base loc of gallery (inc /)

var gLsrc = new Image();
    gLsrc.src = gLocation + "Loading.jpg";             // pre-load loading image
var gb1 = new Image();
    gb1.src = "But1.jpg";            // and buttons
var gb2 = new Image();
    gb2.src = "But1o.jpg";            // and buttons
var gb3 = new Image();
    gb3.src = "But1d.jpg";            // and buttons
var gb4 = new Image();
    gb4.src = "But2.jpg";            // and buttons
var gb5 = new Image();
    gb5.src = "But2o.jpg";            // and buttons
var gb6 = new Image();
    gb6.src = "But2d.jpg";            // and buttons
var gb7 = new Image();
    gb7.src = "But3.jpg";            // and buttons
var gb8 = new Image();
    gb8.src = "But3o.jpg";            // and buttons
var gb9 = new Image();
    gb9.src = "But3d.jpg";            // and buttons

var gEmpty = "This album contains no photos.  The owner can add photos by going to the " +
                "<a href=\"" + gLocation + "\">eZalbum Homepage</a> and entering " +
                "their password.";

//  Functions called to initialize gallery definition

function gallmaker(mname) {
    gMaker = unescape(mname);
}

function galltitle(gall) {
    gTitle = unescape(gall);
}

function gallpath(path) {
    gPath = path;
    gGpath = path;                // save for downloader
    var SSS = new String(path);
    if (SSS.indexOf("flowspace") != -1) { // if a flowspace gallery
//                         set flowspace image sizes and names
        sizeMh[1] = 120;
        sizeMw[1] = 120;
	    sizeName[1] = "_thumb.jpg";
        sizeMh[2] = 480;
        sizeMw[2] = 480;
	    sizeName[2] = "_little.jpg";
        sizeMh[3] = 640;
        sizeMw[3] = 640;
	    sizeName[3] = "_small.jpg";
        sizeMh[4] = 800;
        sizeMw[4] = 800;
	    sizeName[4] = "_medium.jpg";
        sizeS       = 4;
    } else {
        gPath = gL;                    // path to images is home
    }
}

function gallname(string) {
    gName = string;
}

function gallcomment(string) {
    gGallcomment = unescape(string);
}

function gallowner(string) {
    gUser = string;
}

function gallinit(string) {
    var S = new String(string);
    if (S.length >= 1) gIhow = S.substr(0,1);
    if (S.length >= 7) gIwhere = S.substr(1,99);
}

function galloptions(string) {
     var S = new String(string);
     var opt;
     while (S.length > 0) {
         opt = S.substr(0,1);
         S = S.substr(1,99);
         switch(opt) {
             case "N":
             case "S":
             case "T":
                 gIhow = opt;        // set option
                 break;
             case "Y":
                 document.getElementById("Loadbut").style.display="inline";    // set option
                 break;
         }
     }
}

function gallplate(plate) {
  	document.getElementById("Gallplate").src = '../' + plate;    // set option
}	

function slide(fn, high, wide, caption){
    this.filename = fn;
    this.height = high;
    this.width = wide;
    this.caption = unescape(caption);
    this.aspect = parseInt(high*1000/wide);
    this.imagelist = 0;
    this.sizeindex = 0;
    this.loaded = false;
}

function image(ifile, iheight, iwidth, icaption) {
    gSlides[gNumslides] = new slide(ifile, iheight, iwidth, icaption);
    gNumslides += 1;
}

//   Start the gallery

function Startup() {
    gallery();            // load definitions

    document.getElementById('Galltitle').innerHTML = gTitle;
//    document.getElementById('Gallmaker').innerHTML = gMaker;
    document.getElementById('C2S').title = "Run slower.  Now " + (gTickmax + 1) + " secs";
    document.getElementById('C2F').title = "Run faster.  Now " + (gTickmax + 1) + " secs";

    gCurrslide = 0;                           // default start at beginning
    var i = 0;
    if (gIwhere.length >= 6) {                // if we have a start parm for a specific slide
       var W = gIwhere.substr(0,6);
       for (i=0; i<gNumslides; i++) {
           if (W == gSlides[i].filename) {
               gCurrslide = i;                // go find it
               break;
           }
       }
    }

    switch(gIhow) {            // mode to start in
    case "S":                  // single-slide
        clickSS();
        break;
    case "T":                  // thumbstrip
        clickTS();
        break;
    default:                   // otherwise, thumbnails
        clickTN();
    }
}

//     Build thumbnail view for Thumbnails or Thumbstrip views

function setThumbs() {
    var TNsize = sizeMh[1];        // standard thumbnail size
    var TNspace = TNsize + 10;
    var s0 = "";
    var s1 = "<IMG src=\"";
    var s2 = "\" width=";
    var s3 = " height=";
    var s4 = " hspace=";
    var s5 = " vspace=";
    var s6 = " title=\"";
    var s61 ="\" onclick=\"TNclick(";
    var s7 = ");\">";
    var s8 = "<br>";
    var S = "";

//   gDebug = "";

    if (gCurrmode==modeTN) {       // if just-thumbs
        s8 = "";
        S = "&nbsp;" + gGallcomment + "<br><br>";
    } else {
        TNsize = 100;
        TNspace = 110;   // leave room for scrollbar
    }
    if(gNumslides == 0) S = gEmpty;

    var TN = document.getElementById("TNframe");
    TN.innerHTML = s0;
    for (var i=0; i<gNumslides; i++) {
        var Sh = sizeMh[1];
        var Sw = parseInt(( 1000 * Sh ) / gSlides[i].aspect);
        if (Sw > sizeMw[1]) {
           Sw = sizeMw[1];
           Sh = parseInt((( gSlides[i].aspect * Sw ) / 1000));
        }
        var iW = parseInt((TNspace - Sw)/2);
        var iH = parseInt((TNspace - Sh)/2);
        if (gCurrmode==modeTN) {        // All thumbs
            iW = 5;                     // pack horizontally
        } else {                        // Thumbstrip
            iH = 5;                     // pack vertically
        }
        var ts = "#" + (i+1) + ": " + gSlides[i].caption;
        S= S + s1 + gPath + gSlides[i].filename + sizeName[1] +
           s2 + Sw + s3 + Sh + s4 + iW + s5 + iH + s6 + ts + s61 + i + s7;
    }
    TN.innerHTML = S;
//    gDebug = S;
}

//  Find and set largest images which will fit in SSframe

function setSizes() {
    var mW, mH, Sw, Sh;

    mW = parseInt(document.getElementById('SSframe').style.width);
    mH = parseInt(document.getElementById('SSframe').style.height) - 40;  // room for caption

	for ( var i = 0; i < gNumslides; i++ ) {
	    for ( var j = sizeS; j > 0; j-- ) {

            Sh = sizeMh[j];                    // calc height and width of slide at this size
            Sw = parseInt((1000 * Sh ) / gSlides[i].aspect);
            if (Sw > sizeMw[j] ) {
                Sw = sizeMw[j];
                Sh = parseInt(((gSlides[i].aspect * Sw ) / 1000));
            }
            if ( mW >= Sw && mH >= Sh ) {  // if will fit in this window
	            gSlides[i].height = Sh;
                gSlides[i].width = Sw;
                if ( gSlides[i].sizeindex != j ) {   // if has changed from current size
                    gSlides[i].sizeindex = j;
                    gSlides[i].imagelist = 0;
                    gSlides[i].loaded = false;
                }
                j = 0;
                break;
            }
        }
    }
            // center the loading icon
    gLtop = ((mH - gLheight) / 3) - 10;
    gLleft = ((mW - gLwidth) / 2) - 10;
}

//  Show a big slide in SSframe


function loadSlide(n) {                  // Load a slide
DT("L" + n);
    if (gSlides[n].loaded) return;       // already in
    gSlides[n].imagelist = new Image();
    gSlides[n].imagelist.onload = loadcomp;
    gSlides[n].imagelist.onerror = loaderror;
    gLoadingslide = n;                // remember who we're loading
    gSlides[n].imagelist.src = gPath + gSlides[n].filename + sizeName[gSlides[n].sizeindex];
}

function loaderror() {
DT("E" + gLoadingslide);
    gLoadingslide = -1;            // we're not loading anything
}

function loadcomp() {             // completion of loading a slide
DT("C" + gLoadingslide);
    if (gLoadingslide == -1) return;        // don't know what it was...
    var n = gLoadingslide;
    gLoadingslide = -1;            // no longer loading
    gSlides[n].loaded = true;
    if (n == gCurrslide) showSlide(n);
}

function showSlide(n) {            // show a slide in SSframe
    var capSpace = 30;             // space for the caption

DT("S" + n);
    gCurrslide = n;                // remember who's supposed to be showing
    if (!gSlides[n].loaded) loadSlide(n);    // if not loaded yet, load it
    var P = document.getElementById("slidePhoto");
    var C = document.getElementById("slideCaption");
    if (gSlides[n].loaded) {       // if load has completed
        var i = n+1;
        if (i > gNumslides - 1) i = 0;
        if (!gSlides[i].loaded) loadSlide(i);        // load-ahead next slide

        var Fs = document.getElementById("SSframe").style;
        P.width  = gSlides[n].width;
        P.height = gSlides[n].height;
        P.src    = gSlides[n].imagelist.src;
        P.vspace = (parseInt((parseInt(Fs.height) - gSlides[n].height - capSpace) / 3));
        P.hspace = (parseInt((parseInt(Fs.width) - gSlides[n].width) / 2));
        C.innerHTML = gSlides[n].caption;
        var s = "#" + (gCurrslide+1) + " of " + gNumslides + "&nbsp;";
        document.getElementById("Slidenum").innerHTML = s;
    } else {                        // still waiting for load
DT("W");
        P.width = gLwidth;          // drop in Loading... image
        P.height = gLheight;
        P.vspace = gLtop;
        P.hspace = gLleft;
        P.src = gLsrc.src;
        C.innerHTML = "";
    }
}

//     Window layout stuff

window.onresize = resizeWin;      // window resize by user

var grscounting = false;          // true during pause to let window stop moving
var grscount = 3;
var grscounter = 0;

function resizeWin() {            // window resized
    grscount = 3;                 // so start pause all over
    if (grscounting) return;      // if already counting, we're done
    popresizeWin();               // otherwise start the pause counter
}

function popresizeWin() {            // fired when we're counting down to do a screen resize
    if (grscounting && (grscount <= 0)) {     // if countdown is complete
        grscounting = false;                  // shut it all off
        sizeWin();                            // rebuild the window
        if (gCurrmode != modeTN) { showSlide(gCurrslide); }     // reshow current slide
        return;                        // and don't take another tick
    }
    grscounter = window.setTimeout("popresizeWin()", 150 );     // come back in a bit
    grscounting = true;
    grscount -= 1;                     // down a tick
}

function sizeWin() {                // layout the entire screen and make the right bits visible

    var winHeight = maxHeight();
    var winWidth = maxWidth();

//  Constants defining page layout

    var Lmargin = 20;    // Left Margin
    var Rmargin = 20;    // Right Margin
    var Cmargin = 10;    // Center gutter in Thumbstrip
    var Swidth = 150;    // Width of Thumbstrip
    var Hheight = 50;    // Height of headings area
    var Theight = 28;    // Height of buttonstrip
    var vSlop = 10;      // nudge
    var hSlop = 0;       // do.

    var uWidth = winWidth - Lmargin - hSlop;   // usable width

    var Cmarg = winWidth - Swidth - Lmargin;

    var GTs = document.getElementById('Galltitle').style;
    var GMs = document.getElementById('Gallmaker').style;
    var TNs = document.getElementById('TNframe').style;
    var SSs = document.getElementById('SSframe').style;
    var CTs = document.getElementById('Ctlbar').style;
    var C2s = document.getElementById('Ctlbar2').style;
    var C1s = document.getElementById('Ctlbar1').style;
    var NVs = document.getElementById('Navbar').style;
    var SNs = document.getElementById('Slidenum').style;
    //  Most common
        document.getElementById('oheader').innerHTML = "";
//        document.getElementById('strip').style.width = (uWidth - Rmargin) + "px";
        document.getElementById('strip').style.top = Hheight + "px";
        document.getElementById('headline').style.width = (uWidth - Rmargin) + "px";
        document.getElementById('headline').style.left = Lmargin + "px";
        document.getElementById('Slidebut').innerHTML = "Slides";
        document.getElementById('Slidebut').title = "Show slideshow";
//        document.getElementById('Slidebut').style.visibility = "hidden";
        SNs.display = "none";
//        GTs.left = Lmargin + "px";
//        GTs.top = vSlop + "px";
//        GTs.display = "inline";
//        GMs.left = (uWidth-600) + "px";
//        GMs.top = vSlop + "px";
//        GMs.display = "inline";
        TNs.height = (winHeight - Hheight - Theight - vSlop) + "px";
        TNs.left = Lmargin + "px";
        TNs.top = (Hheight + Theight) + "px";
        TNs.width = (uWidth - Rmargin) + "px";
        TNs.display = "inline";
        SSs.left = Lmargin + "px";
        SSs.height = (winHeight - Hheight - Theight - vSlop) + "px";
        SSs.top = (Hheight + Theight) + "px";
        SSs.width = (uWidth - Rmargin) + "px";
        SSs.display = "inline";
        C1s.display = "none";
        C2s.display = "none";
        NVs.left = (uWidth - Rmargin - 276) + "px";   // for now - need to get cleverer
        NVs.display = "inline";
        SNs.left = parseInt(((uWidth - Rmargin - 296) + 175)/2) + "px";
        CTs.height = "70px";
        CTs.display = "inline";
    //  Differences
        switch (gCurrmode) {
        case modeTS:
            C2s.display = "inline";
            TNs.left = Cmarg + "px";
            TNs.width = Swidth + "px";
            SSs.width = (Cmarg - Lmargin - Cmargin) + "px";
            document.getElementById('C2R').style.visibility = "hidden";
            SNs.display = "inline";
            break;
        case modeTN:
            SSs.display = "none";
            document.getElementById('oheader').innerHTML = gTSprompt;
//            document.getElementById('TSlab').innerHTML = "Thumbstrip";
//            document.getElementById('TSlab').title = "Show thumbstrip";
            document.getElementById('Slidebut').style.visibility = "visible";
            break;
        case modeSS:
            if (!gRunning) {            // unless we're resizing an already running slideshow
                C2s.display = "inline";
                document.getElementById('C2R').style.visibility = "visible";
            } else {                    // we are...
                C1s.display = "inline";
            }
	        document.getElementById('Slidebut').innerHTML = "Thumbnails";
	        document.getElementById('Slidebut').title = "Show thumbnails";
            TNs.display = "none";
            SNs.display = "inline";
            break;
        }
        setSizes();        // set image sizes
}

function maxWidth() {
  if (window.innerWidth)
    { return window.innerWidth; }
  else if (document.documentElement.clientWidth)
    { return document.documentElement.clientWidth; }
  else
    { return document.body.clientWidth; }
}

function maxHeight() {
  if (window.innerHeight)
    { return window.innerHeight; }
  else if (document.documentElement.clientHeight)
    { return document.documentElement.clientHeight; }
  else
    { return document.body.clientHeight; }
}

//   All of the clickables

function clickLE() {          // move left end
    showSlide(0);
}

function clickLF() {          // move left
    var n = gCurrslide - 1;
    if (n < 0) { n = gNumslides - 1; }
    showSlide(n);
}

function clickRI() {          // move right
    var n = gCurrslide + 1;
    if (n >= gNumslides) { n = 0; }
    showSlide(n);
}

function clickRE() {          // move right end
    showSlide(gNumslides - 1);
}

function clickGO() {            // Run button
    gRunning = true;
    gTickcount = 0;            // give a whole timeslice to first slide
    document.getElementById('Ctlbar1').style.display="inline";
    document.getElementById('Ctlbar2').style.display="none";
    runSS();
}

function clickST() {            // Stop button
    gRunning = false;
    document.getElementById('Ctlbar1').style.display="none";
    document.getElementById('Ctlbar2').style.display="inline";
}

function clickNZ() {            // Exit from gallery
    if (gRunning) clickST();
    window.history.back();
}

function clickTN() {            // Thumbnails
    if (gCurrmode == modeTN) {
        clickTS();
    } else {
        if (gRunning) clickST();
        gCurrmode = modeTN;
        sizeWin();
        setThumbs();
    }
}

function clickTS() {            // Thumbstrip
    if(gNumslides == 0) return;
    gCurrmode = modeTS;
    setThumbs();
    modeComm();
}

function clickSS() {            // Single Slide
	if(document.getElementById('Slidebut').innerHTML == "Thumbnails") {
		clickTN();
	} else {
	    if(gNumslides == 0) return;
	    gCurrmode = modeSS;
	    modeComm();
	}
}

function clickLD() {            // Download original slide
    document.location.href = gLocation + "Galldownload.php?file=" + gGpath +
        gSlides[gCurrslide].filename;
}

function modeComm() {
    if (gRunning) { clickST(); }  // turn off auto
    sizeWin();
    showSlide(gCurrslide);
}

function clickHL() {            // Help

    if (gDebuggin) {
        alert (gDebug);
    } else {
        document.location.href = gLocation + "Gallhelp.htm";
    }
}

function Runslow() {             // Slower button
    gTickmax = parseInt(((gTickmax * 3) + 1)/ 2);
    document.getElementById('C2S').title = "Run slower.  Now " + (gTickmax + 1) + " secs";
    document.getElementById('C2F').title = "Run faster.  Now " + (gTickmax + 1) + " secs";
}

function Runfast() {             // Faster button
    if (gTickmax > 1) {
        gTickmax = parseInt(((gTickmax * 2) + 1) / 3);
    }
    document.getElementById('C2S').title = "Run slower.  Now " + (gTickmax + 1) + " secs";
    document.getElementById('C2F').title = "Run faster.  Now " + (gTickmax + 1) + " secs";
}

//  Click on a thumbnail

function TNclick(n) {
    if (gCurrmode == modeTN) {
        gCurrslide = n;
        clickSS();
    }
    if (gCurrmode == modeTS) {
        showSlide(n);
    }
}

//    Run a slideshow

function runSS() {            // called each clock cycle
    if (!gRunning) return;    // if we've been stopped
                              // first restart clock, or everything will stop if we hit an error
    gClock = window.setTimeout("runSS()", gTicksize );

    gTickcount = gTickcount + 1;
    if (gTickcount > gTickmax) {
        gTickcount = 0;
        clickRI();                      // move forward
    }
    if (gMousebar || (gMousecnt == 0)) {           // Diddle control bar
        gMousecnt = 1;
        Growbar();
    } else {
        gMousecnt += 1;
        if (gMousecnt == gMousemax) {
            Shrinkbar();
        }
    }
}

//  Mouse detection functions to hide ctlbar in slideshow

document.onmousemove = Mousemove;     // listen to mouse

var gMousebar = false;     // True when mouse on ctlbar
var gMousecnt = 0;         // Ticks since ctlbar shown
var gMousemax = 3;         // Ticks when ctlbar hidden
var gCursX = 0;            // Cursor position
var gCursY = 0;            // do.

function Mousein() {             // mouse moves into ctlbar
	gMousebar=true;
}

function Mouseout() {            // mouse moves out of ctlbar
	gMousebar=false;
}

function Mousemove(e) {            // called when mouse moves
  if (!gRunning) return false;
  if (!e) {
      if (typeof(event) == "undefined") return false;  // Moz seems to throw extra undef events
      e = event;
  }
  if ((gCursX != e.clientX)||(gCursY!= e.clientY)) {        // make sure it moved
    gMousecnt = 0;                                          // restart counter
  }
  gCursX = e.clientX;
  gCursY = e.clientY;
  return false;
}

//  Functions to shrink and grow the control bar in slideshow

function Shrinkbar() {
    if (gAniminterval != null) Clearanim();
    var intervalMethod = function() { Shrinker(); }
    gAniminterval = setInterval(intervalMethod,8);
}

function Shrinker() {
    var CTs = document.getElementById('Ctlbar').style;
    var h = parseInt(CTs.height);
    if (h <= 2) {
        Clearanim();
    } else {
        CTs.height = (h-2) + "px";
    }
}

function Growbar() {
    if (gAniminterval != null) Clearanim();
    var intervalMethod = function() { Grower(); }
    gAniminterval = setInterval(intervalMethod,10);
}

function Grower() {
    var CTs = document.getElementById('Ctlbar').style;
    var h = parseInt(CTs.height);
    if (h >= 70) {
        Clearanim();
    } else {
        CTs.height = (h+2) + "px";
    }
}

function Clearanim() {
    clearInterval(gAniminterval);
    gAniminterval = null;
}

//   Debug trace

function DT(string) {
    if (!gDebuggin) return;
    if (gDebug.length>200) gDebug = "";   // wrap
    gDebug = gDebug + string + "|";
}

