// Append ?raw to the URL of this page to view the un-minified source, or ?pretty for a colorized version.

// A Handy-Dandy Fader Constructor
// Copyright 2005-2006 Tom W.M. (http://freecog.net/)
// 2:15 p.m. Saturday, April 8, 2006
// Free to use for any purpose, provided this notice is retained.
// No dependencies.

var Fader=function(objects,start,end,duration){var self=this;this.id=Fader.guid++;this.objects=[];this.callbacks=[];if(!(typeof(objects)=='object'&&objects.length>=1)){objects=[objects];}
for(var i=0,j=objects.length;i<j;i++){this.objects.push(Fader.getElement(objects[i]));}
for(var i=4,j=arguments.length;i<j;i++){this.addCallback(arguments[i]);}
start=(typeof(start)=='undefined')?1:start;end=end||0;duration=duration||500;if(typeof(duration)!='undefined'&&duration<=0){throw new Error('Invalid duration passed to Fader constructor: '+duration);}
if(start<0||start>1){throw new Error('Invalid start passed to Fader constructor: '+start);}
if(end<0||end>1){throw new Error('Invalid end passed to Fader constructor: '+end);}
this.object=this.objects[0];this.startOpacity=start;this.endOpacity=end;this.currentOpacity=start;this.duration=duration;this.isCompleted=false;this.isFadingIn=function(){return start<end;}
this.isFadingOut=function(){return end<start;}
this.getTimeElapsed=function(){var time=Fader.now()-startTime;return(time<=duration)?time:duration;};this.getTimeRemaining=function(){var time=duration-self.getTimeElapsed();return(time>=0)?time:0;}
var range=end-start;var startTime=Fader.now();function set(toWhat){var toWhatSafe=(toWhat==1)?0.9999:toWhat;for(var i=0,j=self.objects.length;i<j;i++){var s=self.objects[i].style;s.KhtmlOpacity=toWhatSafe;s.MozOpacity=toWhatSafe;s.filter="alpha(opacity="+(toWhat*100)+")";s.opacity=toWhat;}};this.step=function(){var percent=self.getTimeElapsed()/duration;if(percent<1){self.currentOpacity=start+(percent*range);set(self.currentOpacity);}else{self.currentOpacity=end;set(end);self.cancel();}};set(start);Fader.register(this);};Fader.INTERVAL_STEP=30;Fader.guid=0;(function(){var registry=[];var interval=null;function step(){var objs=[];for(var i=0,j=registry.length;i<j;i++){objs.push(registry[i]);}
for(var i=0,j=objs.length;i<j;i++){objs[i].step();}}
Fader.register=function(fader){registry.push(fader);if(!interval){interval=window.setInterval(step,Fader.INTERVAL_STEP);}};Fader.unregister=function(fader){for(var i=registry.length-1;i>=0;i--){if(registry[i].id===fader.id){registry.splice(i,1);}}
if(!registry.length&&interval){window.clearInterval(interval);interval=null;}}})();Fader.prototype={_callCallbacks:function(){for(var i=0,j=this.callbacks.length;i<j;i++){this.callbacks[i](this.object,this);}},cancelSilently:function(){this.isCompleted=true;Fader.unregister(this);},cancel:function(){this.cancelSilently();this._callCallbacks();},addCallback:function(func){this.callbacks.push(func);},removeCallback:function(func){for(var i=0,j=this.callbacks.length;i<j;i++){if(this.callbacks[i]===func){this.callbacks.splice(i,1);return true;}}
return false;},toString:function(){return"[object Fader #"+this.id+" ("+
Math.round(this.currentOpacity*100)+"% opacity, "+this.objects.length+" object"+
(this.objects.length==1?'':"s")+")]";}};Fader.now=function(){return(new Date()).getTime();};Fader.getElement=function(obj){return(typeof obj=='string')?document.getElementById(obj):obj;};Fader.toString=function(){return"[object Fader]";};