/*******************************************************************
 * File    : JSFX_ImageZoom.js  © JavaScript-FX.com
 * Created : 2001/08/31
 * Author  : Roy Whittle  (Roy@Whittle.com) www.Roy.Whittle.com
 * Purpose : To create a zooming effect for images
 * History
 * Date         Version        Description
 * 2001-08-09    1.0        First version
 * 2001-08-31    1.1        Code split - others became JSFX_FadingRollovers,
 *                             JSFX_ImageFader and JSFX_ImageZoom.
 * 2002-01-27    1.2        Completed development by converting to JSFX namespace
 * 2002-04-25    1.3        Added the functions stretchIn & expandIn
 * 2004-01-06    1.4        Allowed for the image (tag) being forcibly sized
 ***********************************************************************/
/*** Create some global variables ***/
if (!window.JSFX)
    JSFX = new Object();
JSFX.ImageZoomRunning = false;
/*******************************************************************
 *
 * Function    : zoomIn
 *
 * Description : This function is based on the turn_on() function
 *              of animate2.js (animated rollovers from www.roy.whittle.com).
 *              Each zoom object is given a state.
 *            OnMouseOver the state is switched depending on the current state.
 *            Current state -> Switch to
 *            ===========================
 *            null        ->    OFF.
 *            OFF        ->    ZOOM_IN + start timer
 *            ZOOM_OUT    ->    ZOOM_IN
 *            ZOOM_IN_OUT    ->    ZOOM_IN
 *****************************************************************/
JSFX.zoomOn = function(img, zoomStep, maxZoom)
{
    if (img)
    {
        if (!zoomStep)
        {
            if (img.mode == "EXPAND")
                zoomStep = img.height / 10;
            else
                zoomStep = img.width / 10;
        }

        if (!maxZoom)
        {
            if (img.mode == "EXPAND")
                maxZoom = img.height / 3;
            else
                maxZoom = img.width / 3;
        }


        if (img.state == null)
        {
            img.state = "OFF";
            img.index = 0;
            img.orgWidth = img.width;
            img.orgHeight = img.height;
            img.zoomStep = zoomStep;
            img.maxZoom = maxZoom;
        }

        if (img.state == "OFF")
        {
            img.state = "ZOOM_IN";
            start_zooming();
        }
        else if (img.state == "ZOOM_IN_OUT"
                || img.state == "ZOOM_OUT")
        {
            img.state = "ZOOM_IN";
        }
    }
}
JSFX.zoomIn = function(img, zoomStep, maxZoom)
{
    img.mode = "ZOOM";
    JSFX.zoomOn(img, zoomStep, maxZoom);
}
JSFX.stretchIn = function(img, zoomStep, maxZoom)
{
    img.mode = "STRETCH";
    JSFX.zoomOn(img, zoomStep, maxZoom);
}
JSFX.expandIn = function(img, zoomStep, maxZoom)
{
    img.mode = "EXPAND";
    JSFX.zoomOn(img, zoomStep, maxZoom);
}
/*******************************************************************
 *
 * Function    : zoomOut
 *
 * Description : This function is based on the turn_off function
 *              of animate2.js (animated rollovers from www.roy.whittle.com).
 *              Each zoom object is given a state.
 *            OnMouseOut the state is switched depending on the current state.
 *            Current state -> Switch to
 *            ===========================
 *            ON        ->    ZOOM_OUT + start timer
 *            ZOOM_IN    ->    ZOOM_IN_OUT.
 *****************************************************************/
JSFX.zoomOut = function(img)
{
    if (img)
    {
        if (img.state == "ON")
        {
            img.state = "ZOOM_OUT";
            start_zooming();
        }
        else if (img.state == "ZOOM_IN")
        {
            img.state = "ZOOM_IN_OUT";
        }
    }
}
/*******************************************************************
 *
 * Function    : start_zooming
 *
 * Description : This function is based on the start_animating() function
 *                of animate2.js (animated rollovers from www.roy.whittle.com).
 *            If the timer is not currently running, it is started.
 *            Only 1 timer is used for all objects
 *****************************************************************/
function start_zooming()
{
    if (!JSFX.ImageZoomRunning)
        ImageZoomAnimation();
}

JSFX.setZoom = function(img)
{
    if (img.mode == "STRETCH")
    {
        img.width = img.orgWidth + img.index;
        img.height = img.orgHeight;
    }
    else if (img.mode == "EXPAND")
    {
        img.width = img.orgWidth;
        img.height = img.orgHeight + img.index;
    }
    else
    {
        img.width = img.orgWidth + img.index;
        img.height = img.orgHeight + (img.index * (img.orgHeight / img.orgWidth));
    }
}
/*******************************************************************
 *
 * Function    : ImageZoomAnimation
 *
 * Description : This function is based on the Animate function
 *            of animate2.js (animated rollovers from www.roy.whittle.com).
 *            Each zoom object has a state. This function
 *            modifies each object and (possibly) changes its state.
 *****************************************************************/
function ImageZoomAnimation()
{
    JSFX.ImageZoomRunning = false;
    for (i = 0; i < document.images.length; i++)
    {
        var img = document.images[i];
        if (img.state)
        {
            if (img.state == "ZOOM_IN")
            {
                img.index += img.zoomStep;
                if (img.index > img.maxZoom)
                    img.index = img.maxZoom;

                JSFX.setZoom(img);

                if (img.index == img.maxZoom)
                    img.state = "ON";
                else
                    JSFX.ImageZoomRunning = true;
            }
            else if (img.state == "ZOOM_IN_OUT")
            {
                img.index += img.zoomStep;
                if (img.index > img.maxZoom)
                    img.index = img.maxZoom;

                JSFX.setZoom(img);

                if (img.index == img.maxZoom)
                    img.state = "ZOOM_OUT";
                JSFX.ImageZoomRunning = true;
            }
            else if (img.state == "ZOOM_OUT")
                {
                    img.index -= img.zoomStep;
                    if (img.index < 0)
                        img.index = 0;

                    JSFX.setZoom(img);

                    if (img.index == 0)
                        img.state = "OFF";
                    else
                        JSFX.ImageZoomRunning = true;
                }
        }
    }
    /*** Check to see if we need to animate any more frames. ***/
    if (JSFX.ImageZoomRunning)
        setTimeout("ImageZoomAnimation()", 60);
}

