// JavaScript Document
/*credits: Andrés Fernández, based in http://ajaxcookbook.org/transitions-animation-effects/ */
function onMotionFinished(){}
function onMotionStart(){}
function onMotionProgress(){}
function transicion(curva,ms,callback){
    window.globalIntervaloN=1;
    this.ant=0.01;
	this.fotograma=0;
    this.done_=false;
    var _this=this;
    this.start=new Date().getTime();
    this.init=function(){
        setTimeout(function(){
				_this.fotograma++;
				if(_this.fotograma==1){
					onMotionStart();
				}
                if(!_this.next()){
                    callback(1);
					onMotionFinished();
                    _this.done_=true;
                    window.globalIntervaloN=0;
                    return;
                }
                callback(_this.next());
				onMotionProgress(_this.next())
                _this.init();
            },13);
    }
    this.next=function(){
        var now=new Date().getTime();
        if((now-this.start)>ms)
            return false;
        return this.ant=curva((now-this.start+.001)/ms,this.ant);
    }
}
function desacelerado(p){
    var maxValue=1, minValue=.001, totalP=1, k=.25;
    var delta = maxValue - minValue; 
    var stepp = minValue+(Math.pow(((1 / totalP) * p), k) * delta); 
    return stepp; 
}
function acelerado(p){
    var maxValue=1, minValue=.001, totalP=1, k=7;
    var delta = maxValue - minValue; 
    var stepp = minValue+(Math.pow(((1 / totalP) * p), k) * delta); 
    return stepp; 
}
function senoidal(p,ant){
    return (1 - Math.cos(p * Math.PI)) / 2;
}
function ejecutar(obj,efectos,ms,curva){
    var t=new transicion(
    curva,ms,function(p){
        
        for (var i=0;efectos[i];i++){
            if(efectos[i].fin<efectos[i].inicio){
                var delta=efectos[i].inicio-efectos[i].fin;
				if(efectos[i].propCSS!='scrollLeft' && efectos[i].propCSS!='scrollTop'){
                	obj.style[efectos[i].propCSS]=(efectos[i].inicio-(p*delta))+efectos[i].u;
				}
				if(efectos[i].propCSS=='scrollLeft' || efectos[i].propCSS=='scrollTop')
					 obj[efectos[i].propCSS]=(efectos[i].inicio-(p*delta));
                if(efectos[i].propCSS=='opacity'){
                    obj.style.zoom=1;
                    obj.style.MozOpacity = (efectos[i].inicio-(p*delta));
                    obj.style.KhtmlOpacity = (efectos[i].inicio-(p*delta));
                    obj.style.filter='alpha(opacity='+100*(efectos[i].inicio-(p*delta))+')';
                }
            }
            else{
                var delta=efectos[i].fin-efectos[i].inicio;
				if(efectos[i].propCSS!='scrollLeft' && efectos[i].propCSS!='scrollTop')
                   obj.style[efectos[i].propCSS]=(efectos[i].inicio+(p*delta))+efectos[i].u;
				if(efectos[i].propCSS=='scrollLeft' || efectos[i].propCSS=='scrollTop')
					 obj[efectos[i].propCSS]=(efectos[i].inicio+(p*delta));
                if(efectos[i].propCSS=='opacity'){
                    obj.style.zoom=1;
                    obj.style.MozOpacity = (efectos[i].inicio+(p*delta));
                    obj.style.KhtmlOpacity = (efectos[i].inicio+(p*delta));
                    obj.style.filter='alpha(opacity='+100*(efectos[i].inicio+(p*delta))+')';
                }
            }
        }
        
    });
    t.init();
    t=null;
}
var globalCola=[];
var globalIntervaloId=null;
function encolar(f){ globalCola.push(f);
    if(!globalIntervaloId){
        globalIntervaloId=setInterval(function(){
            if(!globalCola.length){
                clearInterval(globalIntervaloId);
                globalIntervaloId=null;
            }
            if(!window.globalIntervaloN){
                var ae=globalCola.shift();
                if(typeof ae=='function')
                    ae();
            }
        },13);
    }
}
function fx(obj,efectos,ms,cola,curva){
    if(!window.globalIntervaloN)
        ejecutar(obj,efectos,ms,curva);
    else {
        if(cola)
            return encolar(function(){ejecutar(obj,efectos,ms,curva);});
        else
            return;
    }    
   
} 
