// colorflow - fade the background color of a given link element
// Tim Reeves, 2006-04-17

function myrgb (R, G, B) {
	this.R = R;
	this.G = G;
	this.B = B;
}

// All colors are calculated to give exactly 12 iterations
var lnbase = new myrgb(184,197,229);
var lnpeak = new myrgb(136,161,205);
var lnup = new myrgb(-4,-3,-2);
var lndn = new myrgb(4,3,2);

var sdbase = new myrgb(193,209,245);
var sdpeak = new myrgb(157,185,233);
var sdup = new myrgb(-3,-2,-1);
var sddn = new myrgb(3,2,1);

var oplnbase = new myrgb(204,62,33);
var oplnpeak = new myrgb(192,38,9);
var oplnup = new myrgb(-1,-2,-2);
var oplndn = new myrgb(1,2,2);

var opsdbase = new myrgb(229,66,37);
var opsdpeak = new myrgb(205,66,37);
var opsdup = new myrgb(-2,0,0);
var opsddn = new myrgb(2,0,0);

function q_elem (key1, key2, linktype, mouseIsOver, isNowFlowing) {
	this.key1 = key1;
	this.key2 = key2;
	this.linktype = linktype;
	this.over = mouseIsOver;
	this.flow = isNowFlowing;
}
my_q = new Array();

loading = true;

function do_up(i) {
	my_q[i].flow = true;
	if (my_q[i].linktype == 'offen')
		flow( i, 1, 'oplnbase', 'oplnpeak', 'oplnup', 'opsdbase', 'opsdpeak', 'opsdup');
	else
		flow( i, 1, 'lnbase', 'lnpeak', 'lnup', 'sdbase', 'sdpeak', 'sdup');
}

function do_dn(i) {
	my_q[i].flow = true;
	if (my_q[i].linktype == 'offen')
		flow( i, 0, 'oplnpeak', 'oplnbase', 'oplndn', 'opsdpeak', 'opsdbase', 'opsddn');
	else
		flow( i, 0, 'lnpeak', 'lnbase', 'lndn', 'sdpeak', 'sdbase', 'sddn');
}

function release(i) {
	my_q[i].key1 = '';
	my_q[i].key2 = '';
	my_q[i].linktype = '';
	my_q[i].over = true;
	my_q[i].flow = false;
}

var period = 12;

function reflow( i, up, sr1,sg1,sb1,str_finl1,str_incr1, sr2,sg2,sb2,str_finl2,str_incr2 ) {
	if (loading) { release(i); return; }
	var finl = eval(str_finl1);
	var incr = eval(str_incr1);
	if (incr.R > 0 && sr1 < finl.R) sr1 += incr.R;
	if (incr.R < 0 && sr1 > finl.R) sr1 += incr.R;
	if (incr.G > 0 && sg1 < finl.G) sg1 += incr.G;
	if (incr.G < 0 && sg1 > finl.G) sg1 += incr.G;
	if (incr.B > 0 && sb1 < finl.B) sb1 += incr.B;
	if (incr.B < 0 && sb1 > finl.B) sb1 += incr.B;
	var doner=false, doneg=false, doneb=false;
	if (incr.R == 0 || (incr.R > 0 && sr1 >= finl.R) || (incr.R < 0 && sr1 <= finl.R)) { sr1 = finl.R; doner=true; }
	if (incr.G == 0 || (incr.G > 0 && sg1 >= finl.G) || (incr.G < 0 && sg1 <= finl.G)) { sg1 = finl.G; doneg=true; }
	if (incr.B == 0 || (incr.B > 0 && sb1 >= finl.B) || (incr.B < 0 && sb1 <= finl.B)) { sb1 = finl.B; doneb=true; }
	var newcolor = "rgb(" + sr1 + "," + sg1 + "," + sb1 + ")";
	if (document.getElementById(my_q[i].key1))
		document.getElementById(my_q[i].key1).style.backgroundColor = newcolor;
	else {
		release(i); return;
		}
	finl = eval(str_finl2);
	incr = eval(str_incr2);
	if (incr.R > 0 && sr2 < finl.R) sr2 += incr.R;
	if (incr.R < 0 && sr2 > finl.R) sr2 += incr.R;
	if (incr.G > 0 && sg2 < finl.G) sg2 += incr.G;
	if (incr.G < 0 && sg2 > finl.G) sg2 += incr.G;
	if (incr.B > 0 && sb2 < finl.B) sb2 += incr.B;
	if (incr.B < 0 && sb2 > finl.B) sb2 += incr.B;
	if (incr.R == 0 || (incr.R > 0 && sr2 >= finl.R) || (incr.R < 0 && sr2 <= finl.R)) sr2 = finl.R;
	if (incr.G == 0 || (incr.G > 0 && sg2 >= finl.G) || (incr.G < 0 && sg2 <= finl.G)) sg2 = finl.G;
	if (incr.B == 0 || (incr.B > 0 && sb2 >= finl.B) || (incr.B < 0 && sb2 <= finl.B)) sb2 = finl.B;
	newcolor = "rgb(" + sr2 + "," + sg2 + "," + sb2 + ")";
	if (document.getElementById(my_q[i].key2))
		document.getElementById(my_q[i].key2).style.backgroundColor = newcolor;
	else {
		release(i); return;
		}
	if (doner && doneg && doneb) {
		if (up == 1) {
			if (my_q[i].over == false) do_dn(i); else my_q[i].flow = false;
			}
		else {
			if (my_q[i].over) do_up(i); else release(i);
			}
		return;
		}
	var aufruf = "reflow(" + i + "," + up + "," + sr1 + "," + sg1 + "," + sb1 + ",'" + str_finl1 + "','" + str_incr1 + "',"
												+ sr2 + "," + sg2 + "," + sb2 + ",'" + str_finl2 + "','" + str_incr2 + "')";
	window.setTimeout(aufruf,period);
}

function flow( i, up, str_start1, str_final1, str_incr1, str_start2, str_final2, str_incr2 ) {
	var start1 = eval(str_start1);
	var sr1 = start1.R, sg1 = start1.G, sb1 = start1.B;
	var start2 = eval(str_start2);
	var sr2 = start2.R, sg2 = start2.G, sb2 = start2.B;
	reflow( i, up, sr1, sg1, sb1, str_final1, str_incr1, sr2, sg2, sb2, str_final2, str_incr2 );
}

function flowup(id,linktype) {
	var key1 = 'link' + id;
	var key2 = 'side' + id;
	if (! document.getElementById(key1)) return;
	var i, l = my_q.length, freeslot = -1;
	for (i=0; i<l; i++) {
		if (my_q[i].key1 == key1) {
			break;
			}
		if (freeslot == -1 && my_q[i].key1 == '') freeslot = i;
		}
	if (i < l)
		my_q[i].over = true;
	else
	if (freeslot > -1) {
		i = freeslot;
		my_q[i].key1 = key1;
		my_q[i].key2 = key2;
		my_q[i].linktype = linktype;
		}
	else
		my_q[i] = new q_elem(key1,key2,linktype,true,false);
	if (my_q[i].flow == false) do_up(i);
}

function flowdn(id) {
	var key1 = 'link' + id;
	if (! document.getElementById(key1)) return;
	var i, l = my_q.length;
	for (i=0; i<l; i++) {
		if (my_q[i].key1 == key1) break;
		}
	// In case the mouse started over the button...
	if (i == l) return;
	// The mouse has moved out of this area
	my_q[i].over = false;
	// Start the flow down if the last flow up is finished
	if (my_q[i].flow == false) do_dn(i);
	// Otherwise it will be started deferred, in reflow()
}


