// dhtml fx library - copyright 2005 Webprofusion Ltd, portions copyright original authors.

//constants
var FX_FADEIN       = 1;
var FX_FADEOUT      = 2;
var FX_FADEOUTIN    = 3;
var FX_BOUNCEIN     = 4;
var FX_SLIDEIN      = 8;

// FXCore_BeginFX('objectid',durationsecs,fxtype,onCompleteHandler);
// Begin transition effect on selected element id

function FXCore_BeginFX(elementID, durationsecs, fxtype, onCompleteHandler)
{
    FXCore_ResetFX(elementID,fxtype);

    var targetObj = document.getElementById(elementID);

    if (targetObj.dhtmlfx_status!=null)
    {
        //ignore running or complete effects
        if (targetObj.dhtmlfx_status!=0) return;

    } else
        targetObj.dhtmlfx_status=0;

    targetObj.onCompleteHandler = onCompleteHandler;
	targetObj.dhtmlfx_type = fxtype

    targetObj.dhtmlfx_count=0;
    targetObj.dhtmlfx_status=1;
    targetObj.dhtmlfx_duration=durationsecs*1000;
    targetObj.dhtmlfx_step=75;

    if (targetObj.dhtmlfx_type==FX_FADEIN)
    {
        //fade in effect - reset opacity
        FXCore_SetOpacityPercentage(elementID,0);
    }

    if (targetObj.dhtmlfx_type==FX_FADEOUT || targetObj.dhtmlfx_type==FX_FADEOUTIN)
    {
        //fade out effect - reset opacity
        //FXCore_SetOpacityPercentage(elementID,100);
    }

    if (targetObj.dhtmlfx_type==FX_BOUNCEIN)
    {
        //right to left slide in
        targetObj.style.position="relative";

    }
     if (targetObj.dhtmlfx_type==FX_BOUNCEIN || targetObj.dhtmlfx_type==FX_SLIDEIN )
    {
        //fade in effect - reset opacity
       FXCore_SetOpacityPercentage(elementID,100);
    }

    setTimeout("FXCore_TransitionStep('"+elementID+"')",10);
}

function FXCore_SetOpacityPercentage(elementID, percentage, obj)
{
    var targetObj =null;

    if (obj!=null) targetObj=obj;
    else targetObj = document.getElementById(elementID);

    if (targetObj.style.filter!=null) {
			targetObj.style.filter="alpha(opacity="+percentage+")";
	} else {
			if (targetObj.style.opacity!=null) {
				targetObj.style.opacity=percentage;
			}
	}
}

function FXCore_InitPositioning(elementID,startpos,endpos,direction)
{
    var targetObj = document.getElementById(elementID);
    targetObj.dhtmlfx_startpos=startpos;
    targetObj.dhtmlfx_endpos=endpos;
    targetObj.dhtmlfx_changeval=endpos-startpos;
    targetObj.dhtmlfx_direction=direction;  //horizontal/vertical
}

// reset FX status of object ready for next effect playback
function FXCore_ResetFX(elementID,fxtype)
{
    var targetObj = document.getElementById(elementID);
    targetObj.dhtmlfx_status=0;
    targetObj.dhtmlfx_count=0;
    targetObj.dhtmlfx_type = fxtype;
}

function FXCore_TransitionStep(elementID)
{

    var targetObj = document.getElementById(elementID);

    targetObj.dhtmlfx_count+=targetObj.dhtmlfx_step;
    var percentage = (targetObj.dhtmlfx_count/targetObj.dhtmlfx_duration);

    if (targetObj.dhtmlfx_type == FX_FADEIN || targetObj.dhtmlfx_type == FX_FADEOUT ) //|| targetObj.dhtmlfx_type==FX_BOUNCEIN)
    {
        var opacityShift= targetObj.dhtmlfx_count;

        if (targetObj.dhtmlfx_type == FX_FADEOUT || targetObj.dhtmlfx_type== FX_FADEOUTIN) opacityShift = targetObj.dhtmlfx_duration - opacityShift;

        //opacity anim

        if (targetObj.style.filter!=null) {
			targetObj.style.filter="alpha(opacity="+(100*percentage)+");";
		} else {
			if (targetObj.style.MozOpacity!=null) targetObj.style.MozOpacity=(((100/targetObj.dhtmlfx_duration)*opacityShift)/100);
			else if (targetObj.style.opacity!=null) {
					targetObj.style.opacity=percentage;
			}
	    }
   }


   //slide in, with bounce
   if (targetObj.dhtmlfx_type == FX_BOUNCEIN)
   {
        if (targetObj.dhtmlfx_direction=="vertical")
            targetObj.style.top=Math.easeOut(targetObj.dhtmlfx_count, targetObj.dhtmlfx_startpos, targetObj.dhtmlfx_changeval, targetObj.dhtmlfx_duration)+"px";
        else
            targetObj.style.left=Math.easeOut(targetObj.dhtmlfx_count, targetObj.dhtmlfx_startpos, targetObj.dhtmlfx_changeval, targetObj.dhtmlfx_duration)+"px";
   }

   // linear slide in
    if (targetObj.dhtmlfx_type == FX_SLIDEIN)
   {
        if (targetObj.dhtmlfx_direction=="vertical")
            targetObj.style.top=targetObj.dhtmlfx_startpos+(targetObj.dhtmlfx_changeval*percentage)+"px";
        else
            targetObj.style.left=targetObj.dhtmlfx_startpos+(targetObj.dhtmlfx_changeval*percentage)+"px";
   }

    if (targetObj.dhtmlfx_count<targetObj.dhtmlfx_duration)
        setTimeout("FXCore_TransitionStep('"+elementID+"')",targetObj.dhtmlfx_step);
    else
    {
        targetObj.dhtmlfx_status=2;

        if (targetObj.dhtmlfx_fxtype == FX_FADEOUTIN)
        {    
            FXCore_BeginFX(elementID,targetObj.dhtmlfx_duration,FADEIN,null);
        }
        if (targetObj.onCompleteHandler!=null) targetObj.onCompleteHandler();
    }
}

/*helper methods */
Math.easeOut =function (t,b,c,d,a,p) {
	/*
		Easing Equations (c) 2003 Robert Penner - Use freely, giving credit where you can.
		http://www.robertpenner.com
	*/
	if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
	if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
	else var s = p/(2*Math.PI) * Math.asin (c/a);
	return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b);
}


function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

