/* ------------------------------- */
/* Transition layers v2.1          */
/* (c) 2006/2007 by Artifex-Media  */
/* ------------------------------- */

var _transition = Array();
var _transition_settings = { unique:true };
var _transition_callback_el = null;

function getLeft(l)
{
  if (l.offsetParent) return (l.offsetLeft + getLeft(l.offsetParent));
  else return (l.offsetLeft);
}
function getTop(l)
{
  if (l.offsetParent) return (l.offsetTop + getTop(l.offsetParent));
  else return (l.offsetTop);
}

function addTransition(src, dest, ttype, duration)
{
	var srcDiv = document.getElementById(src);
    var destDiv = document.getElementById(dest);

    if (!srcDiv)
    {
    	document.write("Error: Transition source element missing.");
        return false;
    }
    if (!destDiv)
    {
    	document.write("Error: Transition destination element missing.");
        return false;
    }

    destDiv.style.visibility = "hidden";

    _transition[_transition.length] = { elSrc:srcDiv, elDest:destDiv, type:ttype, dur:duration};


}

function checkTransitionStartedByElement(el)
{
	var trs = findTransitionByElement(el);
    if (!_transition[trs].started)
    	return false;

	return true;


}

function startTransitionByElement(el, reverse)
{
	startTransition(findTransitionByElement(el), reverse);
}

function _transition_reset(num)
{
	switch(_transition[num].type)
    {
    	case "expand":
        	_transition_reset_expand(num);
    }
    _transition[num].finished = false;
    _transition[num].started = false;
}

function startTransition(num, reverse)
{
	if (!_transition[num])
    	return false;

    if (_transition_settings.unique)
    {
		var rt = getRunningTransitions();
    	if (rt.length > 0)
    	{
    		if (!(rt.length == 1 && rt[0] == _transition[num]))
    			return false;
    	}
    }

    _transition[num].step = (reverse?_transition[num].dur:0);
    _transition[num].reverse = reverse;
    _transition[num].elSrc.style.visibility = "hidden";
    _transition[num].elDest.style.visibility = "visible";

    switch(_transition[num].type)
    {
        case "expand":
            _transition_init_expand(num);
    }

    _transition[num].started=true;
    _transition[num].finished = false;

    if (_transition_callback_el == null)
    	_transition_callback_el = window.setInterval("_transition_callback()", 10);
}

function findTransitionByElement(el)
{
	var div = document.getElementById(el);
    if (!div)
    	return -1;

	for (var i = 0; i < _transition.length; i++)
    {
    	if (_transition[i].elSrc == div || _transition[i].elDest == div)
        	return i;
    }
    return -1;
}

function _transition_reset_expand(num)
{
    _transition[num].elDest.style.width = _transition[num].width;
    _transition[num].elDest.style.height = _transition[num].height;
    _transition[num].elDest.style.marginLeft = _transition[num].marginLeft;
    _transition[num].elDest.style.marginTop = _transition[num].marginTop;
    _transition[num].elDest.style.visibility = "hidden";
    _transition[num].elSrc.style.visibility = "visible";

}

function _transition_init_expand(num)
{
   if (!_transition[num].elDest.style.marginLeft)
   	_transition[num].elDest.style.marginLeft = "0px";

   if (!_transition[num].elDest.style.marginTop)
    _transition[num].elDest.style.marginTop = "0px";

   _transition[num].step = (_transition[num].reverse?_transition[num].dur:0);

   _transition[num].xDist = getLeft(_transition[num].elDest) - getLeft(_transition[num].elSrc);
   _transition[num].yDist = getTop( _transition[num].elDest) - getTop(_transition[num].elSrc);

   _transition[num].xAdv = _transition[num].xDist / _transition[num].dur;
   _transition[num].yAdv = _transition[num].yDist / _transition[num].dur;

   _transition[num].marginLeft = parseInt(_transition[num].elDest.style.marginLeft);
   _transition[num].marginTop  = parseInt(_transition[num].elDest.style.marginTop);

   if (!_transition[num].is_set)
   {
   	_transition[num].width = parseInt(_transition[num].elDest.style.width);
   	_transition[num].height= parseInt(_transition[num].elDest.style.height);

   }

   if (!_transition[num].width || !_transition[num].height || !_transition[num].elSrc.style.width || !_transition[num].elSrc.style.height)
   		_transition[num].ignoreSize = true;

   else
   {
    		if (!_transition[num].is_set)
         {
   			_transition[num].wDist = parseInt(_transition[num].elSrc.style.width) - parseInt(_transition[num].elDest.style.width);
   			_transition[num].hDist = parseInt(_transition[num].elSrc.style.height) - parseInt(_transition[num].elDest.style.height);
         }

        _transition[num].wAdv = _transition[num].wDist / _transition[num].dur;
        _transition[num].hAdv = _transition[num].hDist / _transition[num].dur;

   		_transition[num].elDest.style.width = _transition[num].elSrc.style.width;
        _transition[num].elDest.style.height= _transition[num].elSrc.style.height;


   }

   _transition[num].elDest.style.marginLeft = (_transition[num].marginLeft - _transition[num].xDist)+"px";
   _transition[num].elDest.style.marginTop = (_transition[num].marginTop - _transition[num].yDist)+"px";

   _transition[num].elDest.style.visibility = "visible";

   _transition_advance_expand(num);
   _transition[num].is_set=true;

}

function _transition_advance_expand(num)
{
	_transition[num].elDest.style.marginLeft = -_transition[num].xDist +Math.ceil( _transition[num].xAdv * _transition[num].step ) + "px";
    _transition[num].elDest.style.marginTop  = -_transition[num].yDist +Math.ceil( _transition[num].yAdv * _transition[num].step ) + "px";

    if (!_transition[num].ignoreSize)
    {
    	_transition[num].elDest.style.width = _transition[num].width + _transition[num].wDist - Math.ceil(_transition[num].wAdv * _transition[num].step ) + "px";
        _transition[num].elDest.style.height = _transition[num].height+_transition[num].hDist - Math.ceil(_transition[num].hAdv * _transition[num].step ) + "px";
    }
}

function _transition_callback()
{
	for (var i = 0; i < _transition.length; i++)
    {
    	if(_transition[i].started)
        {
        	_transition_advance(i, _transition[i].reverse);
            if (_transition_settings.unique == true)
            	return;
        }
    }

}

function _transition_advance(num, reverse)
{

	switch(_transition[num].type)
    {
    	case "expand":
        	_transition_advance_expand(num);
    }

    if (!reverse)
    {
    	if (_transition[num].step >= _transition[num].dur)
    	{
    		_transition[num].started = false;
            _transition_stop(num);
        	return;
    	}
        _transition[num].step++;
    }

    else
    {
    	if (_transition[num].step <= 0)
        {
        	_transition[num].started = false;
            _transition_stop(num);
            return;
        }
    	_transition[num].step--;
    }
}

function _transition_stop(num)
{
    _transition[num].started = false;
    _transition[num].finished = true;
    if (_transition[num].reverse)
    {
    	_transition[num].elDest.style.visibility = "hidden";
        _transition[num].elSrc.style.visibility = "visible";
        _transition_reset(num);
    }

}

function getRunningTransitions()
{
	var result = Array();
	for (var i = 0; i < _transition.length; i++)
    {
    	if (_transition[i].started || _transition[i].finished)
        	result[result.length] = _transition[i];
    }

    return result;
}
