if(!window.JSFX)
  JSFX=new Object();

JSFX.FadeImageRunning    = false;
JSFX.FadeImageMinOpacity = 30;
JSFX.FadeImageAutoUp   = 10;
JSFX.FadeImageAutoDown   = 10;
JSFX.FadeImageSavedOver  = null;
JSFX.FadeImageSavedOut   = null;
document.write('<STYLE TYPE="text/css">.imageFader{ position:relative; filter:alpha(opacity='+JSFX.FadeImageMinOpacity+'); -moz-opacity:'+JSFX.FadeImageMinOpacity/101+'}</STYLE>');
/*******************************************************************
*
* Function    : actionOnMouseOver
*
* Description : Called automatically whenever an element in the
*     document is "mousedOver". It checks to see if the
*     element has the className == "imageFader" and if so
*     starts fading up the element.
*
*****************************************************************/
JSFX.fadeImage_actionOnMouseOver = function(e)
{
  srcElement=e ? e.target : event.srcElement;
  
  if(srcElement.className && srcElement.className=="imageFader")
    JSFX.fadeUp(srcElement);

  /*** If the document already had an onMouseOver handler, call it ***/
  if(JSFX.FadeImageSavedOver != null)
    JSFX.FadeImageSavedOver(e);
}

/*******************************************************************
*
* Function    : actionOnMouseOut
*
* Description : Called automatically whenever an element in the
*     document is "mousedOut". It checks to see if the
*     element has the className == "imageFader" and if so
*     starts fading down the element.
*
*****************************************************************/
JSFX.fadeImage_actionOnMouseOut = function(e)
{
  srcElement=e ? e.target : event.srcElement;

  if(srcElement.className && srcElement.className=="imageFader")
    JSFX.fadeDown(srcElement);
  
  /*** If the document already had an onMouseOut handler, call it ***/
  if(JSFX.FadeImageSavedOut != null)
    JSFX.FadeImageSavedOut(e);
}
/*******************************************************************
*
* Function    : fadeImageAuto
*
* Parameters  : minOpacity  - Minimum opacity to fade down to.
*     stepUp  - fade up speed   - larger = faster.
*     stepDown  - fade down speed - larger = faster.
*
* Description : Saves the documents original mousOver/Out handlers
*     and installs the actionMouseOver/Out handlers
*     of JSFX.fadeImage
*
*****************************************************************/
JSFX.fadeImageAuto = function(minOpacity, stepUp, stepDown)
{
  if(minOpacity)
    JSFX.FadeImageMinOpacity = minOpacity;
  if(stepUp)
    JSFX.FadeImageAutoUp  = stepUp;
  if(stepDown)
    JSFX.FadeImageAutoDown  = stepDown;

  /*** Save the original document mouseOver/Out events ***/
  JSFX.FadeImageSavedOver = document.onmouseover;
  JSFX.FadeImageSavedOut  = document.onmouseout;

  document.onmouseover  = JSFX.fadeImage_actionOnMouseOver ;
  document.onmouseout = JSFX.fadeImage_actionOnMouseOut ;
  JSFX.setMinOpacity(JSFX.FadeImageMinOpacity);
}
/*******************************************************************
*
* Function    : setMinOpacity
*
* Description : sets the minimum opacity for all fading images from
*     the default of 40 to the passed value.
*
*****************************************************************/
JSFX.setMinOpacity = function(minOpacity)
{
  if(document.layers) return;

  for(i=0 ; i<document.images.length ; i++)
  {
    var img = document.images[i];
    if(img.className=="imageFader")
    {
      if(img.filters)
        img.filters.alpha.opacity = JSFX.FadeImageMinOpacity;
      else
        img.style.MozOpacity = JSFX.FadeImageMinOpacity/101;
    }
  }
}
/*******************************************************************
*
* Function    : fadeUpImg
*
* Description : Finds the image in the document and calls JSFX.fadeUp
*
*****************************************************************/
JSFX.fadeUpImg = function(imgName, step)
{
  if(document.layers || window.opera)
    return;

  img = document.images[imgName];
  if(img)
    JSFX.fadeUp(img, step);
}
/*******************************************************************
*
* Function    : fadeUp
*
* Description : This function is based on the turn_on() function
*         of animate2.js (animated rollovers from www.roy.whittle.com).
*         Each fading image object is given a state. 
*     OnMouseOver the state is switched depending on the current state.
*     Current state -> Switch to
*     ===========================
*     null    ->  OFF.
*     OFF   ->  FADE_UP
*     FADE_DOWN ->  FADE_UP
*     FADE_UP_DOWN->  FADE_UP
*****************************************************************/
JSFX.fadeUp = function(img, step)
{

  if(img)
  {
    if(!step) step=JSFX.FadeImageAutoUp;

    if(img.fade == null)
    {
      img.fade = new Object();
      img.fade.state   = "OFF";
      img.fade.upStep  = step;
      img.fade.downStep  = step;
      img.fade.minOpacity  = JSFX.FadeImageMinOpacity;
      img.fade.index = img.fade.minOpacity;
      
    }
    if(img.fade.state == "OFF")
    {
      img.fade.upStep  = step;
      img.fade.state = "FADE_UP";
      JSFX.startImageFading();
    }
    else if( img.fade.state == "FADE_UP_DOWN"
      || img.fade.state == "FADE_DOWN")
    {
      img.fade.upStep  = step;
      img.fade.state = "FADE_UP";
    }
  }
}
/*******************************************************************
*
* Function    : fadeDownImg
*
* Description : Finds the image in the document and calls JSFX.fadeDown
*
*****************************************************************/
JSFX.fadeDownImg = function(imgName, step)
{
  if(document.layers || window.opera)
    return;

  img = document.images[imgName];
  if(img)
    JSFX.fadeDown(img, step);
}
/*******************************************************************
*
* Function    : fadeDown
*
* 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    ->  FADE_DOWN.
*     FADE_UP ->  FADE_UP_DOWN.
*****************************************************************/
JSFX.fadeDown = function(img, step)
{
  if(img)
  {
    if(!step) step=JSFX.FadeImageAutoDown;

    if(img.fade.state=="ON")
    {
      img.fade.downStep  = step;
      img.fade.state="FADE_DOWN";
      JSFX.startImageFading();
    }
    else if(img.fade.state == "FADE_UP")
    {
      img.fade.downStep  = step;
      img.fade.state="FADE_UP_DOWN";
    }
  }
}
/*******************************************************************
*
* Function    : startImageFading
*
* 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
*****************************************************************/
JSFX.startImageFading = function()
{
  if(!JSFX.FadeImageRunning)
    JSFX.FadeImageAnimation();
}

/*******************************************************************
*
* Function    : FadeImageAnimation
*
* Description : This function is based on the Animate function
*       of animate2.js (animated rollovers from www.roy.whittle.com).
*       Each object has a state. This function
*       modifies each object and (possibly) changes its state.
*****************************************************************/
JSFX.FadeImageAnimation = function()
{
  JSFX.FadeImageRunning = false;
  for(i=0 ; i<document.images.length ; i++)
  {
    var img = document.images[i];
    if(img.fade)
    {
      if(img.fade.state == "FADE_UP")
      {
        img.fade.index+=img.fade.upStep;
        if(img.fade.index > 100)
          img.fade.index = 100;

        if(img.filters)
          img.filters.alpha.opacity = img.fade.index;
        else
          img.style.MozOpacity = img.fade.index/101;

        if(img.fade.index == 100)
          img.fade.state="ON";
        else
          JSFX.FadeImageRunning = true;
      }
      else if(img.fade.state == "FADE_UP_DOWN")
      {
        img.fade.index+=img.fade.upStep;
        if(img.fade.index > 100)
          img.fade.index = 100;

        if(img.filters)
          img.filters.alpha.opacity = img.fade.index;
        else
          img.style.MozOpacity = img.fade.index/101;
  
        if(img.fade.index == 100)
          img.fade.state="FADE_DOWN";
        JSFX.FadeImageRunning = true;
      }
      else if(img.fade.state == "FADE_DOWN")
      {
        img.fade.index-=img.fade.downStep;
        if(img.fade.index < img.fade.minOpacity)
          img.fade.index = img.fade.minOpacity;

        if(img.filters)
          img.filters.alpha.opacity = img.fade.index;
        else
          img.style.MozOpacity = img.fade.index/101;

        if(img.fade.index == img.fade.minOpacity)
          img.fade.state="OFF";
        else
          JSFX.FadeImageRunning = true;
      }
    }
  }
  /*** Check to see if we need to animate any more frames. ***/
  if(JSFX.FadeImageRunning)
    setTimeout("JSFX.FadeImageAnimation()", 40);
}
