// set to true to start/stop throbbing based on key/mouse input
var throbOnActivity = true;
//var throbOnActivity = false;

if ( false == throbOnActivity )
{
 var numColors = 50;
 var cycleIntervalMs = 50;
 var fade = generateColors(255,255,255,225,220,220,numColors);
 pic_cycler();
}
else
{
 var numColors = 40;
 var cycleIntervalMs = 80;
 var fade = generateColors(255,255,255,85,80,80,numColors);
 var screensaverTimeout = 30000;
}

var myInterval = -1;
var cycleState = 0; // 0 == up, 1 == hold, 2 = down, 3 = hold, 4 = loop, 5 = stop

function stop_pic_cycler() {
 cycleState = 5;
 clearInterval(myInterval);
 myInterval = -1;
 resetCycle();
}

function resetCycle() {
 document.bgColor='#'+fade[0];
}

function pic_cycler () {

cycleState = 0;
var pic_number = 0;

nextState();

function nextState() {

  if(-1 != myInterval)
   clearInterval(myInterval);
  pic_number = 0;

switch(cycleState) {

case 4:
  cycleState = 0; // reset and fall through
case 0:
myInterval = setInterval(cycleUp, cycleIntervalMs);
break;

case 1:
myInterval = setInterval(hold, cycleIntervalMs);
break;

case 2:
myInterval = setInterval(cycleDown, cycleIntervalMs);
break;

case 3:
myInterval = setInterval(hold, cycleIntervalMs);
break;
};

cycleState++;
}

function cycleUp(){
 if (pic_number < numColors) {
  document.bgColor='#' + fade[pic_number];
  pic_number = pic_number + 1;
 }
 else { 
  nextState();
 }
}

function cycleDown(){
 if (pic_number < numColors) {
  document.bgColor='#' + fade[numColors - pic_number - 1];
  pic_number = pic_number + 1;
 }
 else { 
  nextState();
 }
}

function hold() {
 pic_number = pic_number + 2;
 if (pic_number >= numColors) {
  nextState();
 }
}

}




function toHex(dec) {
        // create list of hex characters
        var hexCharacters = "0123456789ABCDEF"
        // if number is out of range return limit
        if (dec < 0)
                return "00"
        if (dec > 255)
                return "FF"
        // decimal equivalent of first hex character in converted number
        var i = Math.floor(dec / 16)
        // decimal equivalent of second hex character in converted number
        var j = dec % 16
        // return hexadecimal equivalent
        return hexCharacters.charAt(i) + hexCharacters.charAt(j)
}

function generateColors(sred, sgreen, sblue, ered, egreen, eblue, howMany) {
	// loop to create
	var arColors = new Array();
	for(var i = 0; i < howMany; ++i) {
			// set current red descriptor
			var red = Math.floor(sred * ((howMany - i) / howMany) + ered * (i / howMany));

			// set current green descriptor
			var green = Math.floor(sgreen * ((howMany - i) / howMany) +egreen * (i / howMany));

			// set current green descriptor
			var blue = Math.floor(sblue * ((howMany - i) / howMany) + eblue * (i / howMany));
			
			arColors[i] = [toHex(red), toHex(green), toHex(blue)];
	}
	return arColors;
}


// - - - - - -



// waitTime is in milliseconds.
var ScreenSaver = function (waitTime) {
    this.lastActivity = new Date().getTime();
    this.waitTime = waitTime;

    var $this = this;
    this._timer = setInterval(function () { $this._checkTime.call($this) }, 1000);
    document.onmousemove = function () { $this._inputHandler.call($this) };
    document.onkeypress = function () { $this._inputHandler.call($this) };
    document.onclick = function () { $this._inputHandler.call($this) };
};

ScreenSaver.prototype = {
    _timer: null,

    lastActivity: 0,
    started: false,
    waitTime: 0,

    onstart: function () {},
    onend: function () {},

    dispose: function () {
        if (this._timer) clearInterval(this._timer);
        document.onmousemove = null;
    },

    _checkTime: function () {
        if (!this.started && new Date().getTime() - this.lastActivity >= this.waitTime) {
            this.started = true;
            this.onstart();
        }
    },

    _inputHandler: function () {
        this.lastActivity = new Date().getTime();
        if (this.started) {
            this.started = false;
            this.onend();
        }
    }
};

if (throbOnActivity) 
{
 var ss = new ScreenSaver(screensaverTimeout);

 ss.onstart = function () {
  //    document.getElementsByTagName("body")[0].style.backgroundColor = "#000";
  //document.title="starting"
  pic_cycler();
 };
 
 ss.onend = function () {
  //    document.getElementsByTagName("body")[0].style.backgroundColor = "#fff";
  //document.title="stopping"
  stop_pic_cycler();
 };
}