DY.registerModule('doubleyou.transformations.frenado');
DY.requires('doubleyou.dom.core');

DY.Dom.wipeFrenadoTo = function(el,t,r,b,l,inc,interv){
	var el = this.getElement(el);

	var t = (t!=null) ? t : this.getClip(el)[0];
	var r = (r!=null) ? r : this.getClip(el)[1];
	var b = (b!=null) ? b : this.getClip(el)[2];
	var l = (l!=null) ? l : this.getClip(el)[3];

	var wipeFrenado;
	if (wipeFrenado = getWipeFrenadoByElement(el))
	{
		wipeFrenado.t = t;
		wipeFrenado.r = r;
		wipeFrenado.b = b;
		wipeFrenado.l = l;
		clearTimeout(wipeFrenado.timer);
		wipeFrenado.loop();
	}
	else wipeFrenado = new DOMwipeFrenado(el,t,r,b,l,inc,interv);

	return wipeFrenado;

}

var wipeFrenadoCounter = 0;
var DOMwipeFrenadoArray = [];

getWipeFrenadoByElement  = function(el)
{
	var rt = null;
	for (var i in DOMwipeFrenadoArray)
	{
		if (DOMwipeFrenadoArray[i].el == el)
		{
			rt = DOMwipeFrenadoArray[i];
			break;
		}
	}

	return rt;
}

function DOMwipeFrenado(el,t,r,b,l,inc,interv){
	this.el = el;
	this.t = t;
	this.r = r;
	this.b = b;
	this.l = l;
	this.inc = inc;
	this.interv = interv;

	if (this.timer) clearTimeout(this.timer)
	this.timer = null

	this.obj = 'wipeFrenado'+wipeFrenadoCounter++;
	eval(this.obj+'=this');

	this.arrayPosition = DOMwipeFrenadoArray.length;
	DOMwipeFrenadoArray[this.arrayPosition] = this;

	this.loop();
}

DOMwipeFrenado.prototype.loop = function(){

	var clip = DY.Dom.getClip(this.el);

	var clipt = Math.round( (this.t+this.inc*clip[0])/(this.inc+1) );
	var clipr = Math.round( (this.r+this.inc*clip[1])/(this.inc+1) );
	var clipb = Math.round( (this.b+this.inc*clip[2])/(this.inc+1) );
	var clipl = Math.round( (this.l+this.inc*clip[3])/(this.inc+1) );

	DY.Dom.setClip(this.el,clipt,clipr,clipb,clipl);

	if (this.onWipeFrenado) this.onWipeFrenado();

	var limit = this.inc
	if ( (Math.abs(this.t-clipt)<=limit) && (Math.abs(this.r-clipr)<=limit) && (Math.abs(this.b-clipb)<=limit) && (Math.abs(this.l-clipl)<=limit) ) {
		DY.Dom.setClip(this.el,this.t,this.r,this.b,this.l);
		//Como se vuelve a actualizar el valor de clip, volvemos a invocar el evento "onWipeFrenado"
		if (this.onWipeFrenado) this.onWipeFrenado();
		if (this.onWipeFrenadoEnd) this.onWipeFrenadoEnd();
	}
	else setTimeout(this.obj+".loop()",this.interv);
}