//opsIsDebugOn = 'con';

YAHOO.namespace("OPS");

YAHOO.OPS.AnimBorderPulse = function(mgr, opts) {
    this.mgr = mgr;
    this.mgrID = this.mgr.add(this);
    this.createEvent('complete');
    if(YAHOO.util.Event.DOMReady)
	this.init('DOMReady', null, opts);
    else
	YAHOO.util.Event.onDOMReady(this.init, opts, this, true);
};

YAHOO.OPS.AnimBorderPulse.prototype = {
    init: function(ev, other, opts) {
	myopts = {
	    el: '' // Must be defined
	    // Either speed or duration must be specified
	    , speed: 0 // Number of seconds between each step
	    , duration: 0 // Total elpased time in seconds
	    , repeat: 0
	    , delay: 0
	    , nSteps: 5
	    , from: [255, 255, 255]
	    , to: [0, 0, 0]
	    , bgfrom: []
	    , bgto: []
	};

	// Merge options.
	var debugout = '';
	for(var opt in myopts) {
	    if(typeof opts[opt] != 'undefined') {
		debugout += opt+'='+opts[opt]+"\n";
		myopts[opt] = opts[opt];
	    }
	}
	this.opts = myopts;
	if(!(this.opts.el instanceof Array))
	    this.opts.el = new Array(this.opts.el);

	this.els = new Array();
	for(var i in this.opts.el) {
	    if(typeof(this.opts.el[i]) != 'object') {
		var imageEl = YAHOO.util.Dom.get(this.opts.el[i]);
		var speed = 1;
		var nSteps = this.opts.nSteps;
		var repeat = this.opts.repeat;
		var from = this.opts.from;
		var to = this.opts.to;
		var bgfrom = this.opts.bgfrom;
		var bgto = this.opts.bgto;
	    } else {
		var imageEl = YAHOO.util.Dom.get(this.opts.el[i].id);
		var speed = this.opts.el[i].speed || 1;
		var nSteps = this.opts.el[i].nSteps || this.opts.nSteps;
		var repeat = this.opts.el[i].repeat || this.opts.repeat;
		var from = this.opts.el[i].from || this.opts.from;
		var to = this.opts.el[i].to || this.opts.to;
		var bgfrom = this.opts.el[i].bgfrom || this.opts.bgfrom;
		var bgto = this.opts.el[i].bgto || this.opts.bgto;
	    }
	    if(!imageEl)
		continue;

	    var delta = new Array();
	    for(var i = 0; i < 3; i++)
		delta[i] = Math.floor((to[i] - from[i]) / (nSteps));

	    var bgdelta = new Array();
	    for(var i = 0; i < bgfrom.length; i++)
		bgdelta[i] = Math.floor((bgto[i] - bgfrom[i]) / (nSteps));

	    var totalSteps = 2*nSteps*(repeat+1);
	    this.els.push({imageEl: imageEl, speed: speed, nSteps: totalSteps, nRemaining: totalSteps, from: from, to: to, delta: delta, bgfrom: bgfrom, bgto: bgto, bgdelta: bgdelta, pulseSteps: nSteps, drctn: 1});
	}

	this.initParams();
	this.mgr.queue(this.mgrID, this, this.opts.delay);
    }

    , complete: function(anim) {
	this.fireEvent('complete');
    }

    , tick: function(data, anim) {
	if(this.curEl >= this.els.length)
	    return;

	//opsDebug('++++ BorderPulse ++++ '+data.stepNo+' : '+data.duration+' , '+anim.stepSize);
	if(!this.els[this.curEl].nRemaining) {
	    this.curEl++;
	    if(this.curEl >= this.els.length)
		return;
	}

	if(this.els[this.curEl].drctn > 0) {
	    var from = this.els[this.curEl].from;
	    var to = this.els[this.curEl].to;
	} else {
	    var from = this.els[this.curEl].to;
	    var to = this.els[this.curEl].from;
	}
	var stepNo = ((this.els[this.curEl].nSteps - this.els[this.curEl].nRemaining)) % this.els[this.curEl].pulseSteps;
	var R = Math.floor(from[0]+(stepNo+1)*this.els[this.curEl].drctn*this.els[this.curEl].delta[0]);
	var G = Math.floor(from[1]+(stepNo+1)*this.els[this.curEl].drctn*this.els[this.curEl].delta[1]);
	var B = Math.floor(from[2]+(stepNo+1)*this.els[this.curEl].drctn*this.els[this.curEl].delta[2]);
	opsDebug('el: '+this.els[this.curEl].nSteps+' / '+this.els[this.curEl].nRemaining+' / '+this.els[this.curEl].pulseSteps);
	opsDebug('border '+this.els[this.curEl].drctn+'.'+stepNo+': rgb('+R+','+G+','+B+')');
	YAHOO.util.Dom.setStyle(this.els[this.curEl].imageEl, 'border-color', 'rgb('+R+','+G+','+B+')');

	if(this.els[this.curEl].bgfrom.length) {
	    if(this.els[this.curEl].drctn > 0) {
		var from = this.els[this.curEl].bgfrom;
		var to = this.els[this.curEl].bgto;
	    } else {
		var from = this.els[this.curEl].bgto;
		var to = this.els[this.curEl].bgfrom;
	    }
	    var stepNo = ((this.els[this.curEl].nSteps - this.els[this.curEl].nRemaining)) % this.els[this.curEl].pulseSteps;
	    var R = Math.floor(from[0]+(stepNo+1)*this.els[this.curEl].drctn*this.els[this.curEl].bgdelta[0]);
	    var G = Math.floor(from[1]+(stepNo+1)*this.els[this.curEl].drctn*this.els[this.curEl].bgdelta[1]);
	    var B = Math.floor(from[2]+(stepNo+1)*this.els[this.curEl].drctn*this.els[this.curEl].bgdelta[2]);
	    YAHOO.util.Dom.setStyle(this.els[this.curEl].imageEl, 'background-color', 'rgb('+R+','+G+','+B+')');
	}

	this.els[this.curEl].nRemaining--;
	if(stepNo == this.els[this.curEl].pulseSteps-1)
	    this.els[this.curEl].drctn *= -1;
    }

};

YAHOO.lang.augmentProto(YAHOO.OPS.AnimBorderPulse, YAHOO.OPS.AnimBase);

