////////////FADING////////////////////////////////////////////////
var fades = new Array();
function Fade(elementToFade, fadeIncrement, endOpacity, onComplete){
	doWhenDone = function(f){
		//find the fade and destroy it.
		for(var i=0; i<fades.length; i++){
			if (fades[i].element==f.element){
				fades.splice(i,1);
				break;
			}
		}
		if (onComplete!=null) onComplete();
	}
	var f = new Fader(elementToFade, fadeIncrement, endOpacity, doWhenDone);

	//search for a fade on this element...
	//if found stop it and destroy it.
	for(var i=0; i<fades.length; i++){
		if (fades[i].element==f.element){
			fades[i].stopFade();
			fades.splice(i, 1);
			break;
		}
	}

	fades.push(f);
	f.fade();
}
function Fader(elementToFade, fadeIncrement, endOpacity, onComplete){
	this.element = elementToFade;
	this.increment = fadeIncrement;
	if (endOpacity==1) endOpacity = .99;
	this.endOpacity = endOpacity;
	this.onComplete = onComplete;
	this.fadeCall = "";

	//initialize the style if necessary
	o = elementToFade.style.opacity;
	if (typeof o=="undefined" || (o=="" && o!="0")) elementToFade.style.opacity=1;
	if (elementToFade.style.visibility=='hidden') elementToFade.style.opacity=.01;

	var me = this;

	this.fade = function(){ this.fadeCall = setTimeout(me.incrementFade, 50); }

	this.stopFade = function(){ clearTimeout(this.fadeCall); }

	this.incrementFade = function(){
		opac = me.element.style.opacity*1 + me.increment;
		if (opac>0 && me.element.style != 'visible') me.element.style.visibility='visible';
		if ((me.increment > 0 && opac>=me.endOpacity) || (me.increment<0 && opac<=me.endOpacity)){
			me.endFade();
		}else{
			me.element.style.opacity = opac;
			me.element.style.filter = "alpha(opacity=" + opac*100 + ")";
			me.fade();
		}
	}

	this.endFade = function(){
		me.element.style.opacity = me.endOpacity;
		me.element.style.filter = "alpha(opacity=" + me.endOpacity*100 + ")";
		if (opac==0) me.element.style.visibility='hidden';
		me.onComplete(me);
	}
}


var Fat = {
	make_hex : function (r,g,b) {
		r = r.toString(16); if (r.length == 1) r = '0' + r;
		g = g.toString(16); if (g.length == 1) g = '0' + g;
		b = b.toString(16); if (b.length == 1) b = '0' + b;
		return "#" + r + g + b;
	},

	fade_all : function (){
		var a = document.getElementsByTagName("*");
		for (var i = 0; i < a.length; i++) {
			var o = a[i];
			var r = /fade-?(\w{3,6})?/.exec(o.className);
			if (r){
				if (!r[1]) r[1] = "";
				if (o.id) Fat.fade_element(o.id,null,null,"#"+r[1]);
			}
		}
	},

	fade_element : function (id, fps, duration, from, to) {
		if (!fps) fps = 30;
		if (!duration) duration = 3000;
		if (!from || from=="#") from = "#FFFF33";
		if (!to) to = this.get_bgcolor(id);

		var frames = Math.round(fps * (duration / 1000));
		var interval = duration / frames;
		var delay = interval;
		var frame = 0;

		if (from.length < 7) from += from.substr(1,3);
		if (to.length < 7) to += to.substr(1,3);

		var rf = parseInt(from.substr(1,2),16);
		var gf = parseInt(from.substr(3,2),16);
		var bf = parseInt(from.substr(5,2),16);
		var rt = parseInt(to.substr(1,2),16);
		var gt = parseInt(to.substr(3,2),16);
		var bt = parseInt(to.substr(5,2),16);

		var r,g,b,h;
		while (frame < frames) {
			r = Math.floor(rf * ((frames-frame)/frames) + rt * (frame/frames));
			g = Math.floor(gf * ((frames-frame)/frames) + gt * (frame/frames));
			b = Math.floor(bf * ((frames-frame)/frames) + bt * (frame/frames));
			h = this.make_hex(r,g,b);

			setTimeout("Fat.set_bgcolor('"+id+"','"+h+"')", delay);

			frame++;
			delay = interval * frame;
		}
		setTimeout("Fat.set_bgcolor('"+id+"','"+to+"')", delay);
	},

	set_bgcolor : function (id, c){
		var o = document.getElementById(id);
		o.style.backgroundColor = c;
	},

	get_bgcolor : function (id){
		var o = document.getElementById(id);
		while(o){
			var c;
			if (window.getComputedStyle) c = window.getComputedStyle(o,null).getPropertyValue("background-color");
			if (o.currentStyle) c = o.currentStyle.backgroundColor;
			if ((c != "" && c != "transparent") || o.tagName == "BODY") { break; }
			o = o.parentNode;
		}
		if (c == undefined || c == "" || c == "transparent") c = "#FFFFFF";
		var rgb = c.match(/rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/);
		if (rgb) c = this.make_hex(parseInt(rgb[1]),parseInt(rgb[2]),parseInt(rgb[3]));
		return c;
	}
}