/******************************************************************* 
* 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/2;
      else
        maxZoom = img.width/2;
    }


    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()", 40);
}
