var nsteps = 100;
var delay = 100;
var photoPath;
var timer;
var photos = [];


Array.prototype.grep = function (f)	// How do other languages cope without?
{
    if(!f.apply)
    {
        var propname = f;
        f = function(_)
        {
            return _[propname]
        }
    }
    var out = [];
    for(var i = 0; i < this.length; i++)
    {
        if( f( this[i], this, i)) out.push(this[i]);
    }
    return out;  
}

function setPhotoPath(path)
{
    photoPath = path;
}

// Restart expand onmouseover zoom

function magnifyPhoto(name)
{
    var zoom  = document.getElementById('ZOOM' + name);
    var photo = document.getElementById(name);

    var top = 0;
    var left = 0;
    var obj = photo;
    while (obj.offsetParent)
    {
        top += obj.offsetTop;
        left += obj.offsetLeft;
        obj = obj.offsetParent;
    }

    zoom.style.left   = left + 'px';
    zoom.style.top    = top  + 'px';
    zoom.style.width  = photo.offsetWidth  + 'px';
    zoom.style.height = photo.offsetHeight + 'px';
    zoom.src    = photoPath + name + '.jpg';
    zoom.style.opacity = 1;
    zoom.style.zIndex = 1;
    zoom.style.display = 'block';

    // Set up final sizes
    var screenWidth = self.innerWidth;
    var screenHeight = self.innerHeight;
    var scale = screenWidth / photo.offsetWidth;

    var fullHeight = photo.offsetHeight * scale;
    var fullWidth;

    if (fullHeight > screenHeight)
    {
        fullHeight = Math.ceil(screenHeight);
        fullWidth  = Math.ceil((screenHeight / photo.offsetHeight) * photo.offsetWidth);
    }
    else
    {
        fullHeight = Math.ceil(fullHeight);
        fullWidth  = Math.ceil (photo.offsetWidth * scale);
    }

    var start = new Array (left, top, photo.offsetWidth, photo.offsetHeight);
    var end   = new Array (self.pageXOffset + (screenWidth  - fullWidth)  / 2,
	                   self.pageYOffset + (screenHeight - fullHeight) / 2,
	                   fullWidth, fullHeight);

    zoom._step = 1;
    zoom._name = name;
    zoom._start = start;
    zoom._end = end;

    for (var i=photos.length; i--;)
    {
        if ((photos[i]._step) > 0)
        {
            photos[i]._step = 0-nsteps;
        }
    }
    photos.push(zoom);

    if (!timer)
    {
        timer = setInterval(animate, delay);
    }
}

function animate()
{
    var string = '';

    for (var i=photos.length; i--;)
    {
        string += photos[i]._name + ' (' + i + '): ' + photos[i]._step + ', ';

        if (photos[i]._step > nsteps)
        {
            photos.splice (i, 1);
        }
        else if (photos[i]._step > 0 && photos[i]._step <= nsteps)
        {
            expandPhoto (photos[i]);
        }
        else if (photos[i]._step < 0)
        {
            fadePhoto (photos[i]);
        }
        else // 0
        {
            endMagnify (photos[i]._name);
        }
    }

//     var debug = document.getElementById('debug');
//     debug.innerHTML = photos.length + ' - ' + string;
}

function expandPhoto(photo)
{
    var thisSize = new Array;
    for (var i = 0; i < 4;i++)
    {
        thisSize[i] = Math.ceil(photo._start[i] +
                                (photo._end[i] - photo._start[i]) *
                                photo._step / nsteps); 
    }

//     alert (thisSize.join(', '));

    photo.style.left   = thisSize[0] + 'px';
    photo.style.top    = thisSize[1] + 'px';
    photo.style.width  = thisSize[2] + 'px';
    photo.style.height = thisSize[3] + 'px';

    photo._step++;
}

function fadePhoto(zoom)
{
    var opacity = (0 - zoom._step) / nsteps;
    zoom.style.zIndex = 'auto';

    zoom.style.opacity = opacity;

    var step = 5;
    if (zoom._step % step)
    {
        alert (zoom._step % step + ' ' + zoom._step);
        zoom._step += zoom._step % step;
    }
    else
    {
        zoom._step +=step;
    }
}

function cancelMagnifyPhoto(name)
{
    var zoom  = document.getElementById('ZOOM' + name);

    photos.push(zoom);

    if ((zoom._step) > 0)
    {
        zoom._step = 0-nsteps;
    }
}

function endMagnify(name)
{
    var zoom  = document.getElementById('ZOOM' + name);

    zoom.style.display = 'none';
    zoom.style.src    = photoPath + 'tn_' + name + '.jpg';

    for (var i=photos.length; i--;)
    {
        if (photos[i]._name == name)
        {
            photos.splice (i, 1);
            break;
        }
    }

//     if (! photos.length)
//     {
//         clearInterval(timer);
//     }
}
