var styles = new Array();
var index = 0;
var delay = 50;
var multiple = 1;
var maxstep = 16;
var dostatus = false;

//var last   = new Array(random(255), random(255), random(255));
var last   = new Array(0, 0, 0);
var cycles;
var step;

var bodystyle;
function init() {
  var count = 0;
  var docstyles = document.styleSheets;
  for (var i=0; i < docstyles.length; i++) {
    var ss = docstyles[i];
    var rules = ss.cssRules ? ss.cssRules : ss.rules;
    for (var j=0; j < rules.length; j++) {
      var rule = rules[j];
      if (rule.selectorText.substring(0,2) == ".x") {
	styles.push(rule);
	count++;
      }
      if (rule.selectorText == "body") {
	bodystyle = rule;
      }
    }
  }  
  recalibrate();
  for (var i=0;i    window.setTimeout(iterate, 1000+((i+1)*200));
}

function recalibrate() {
  cycles = new Array(rndbool(), rndbool(), rndbool());
  step = new Array(random(maxstep), random(maxstep), random(maxstep));
  window.setTimeout(recalibrate, 10000);
}

function rndjump() {
  index = random(styles.length);
}

function rndbool() {
  return Math.random() > 0.5;
}

function iterate() {
  if (index >= styles.length) index = 0;

  var style = styles[index++];
  var c = "#" + nextrgb();
  style.style["color"] = c;
  window.setTimeout(iterate, delay);
  if (dostatus) {
    window.status = "x" + hpad(index.toString(16)) +
      ": " + step + " // " + cycles + " // " + c.substring(1);
  }
  return true;
}

function nextrgb() {
  var c = "";
  for (var i=0; i < cycles.length; i++) {
    if (cycles[i]) last[i] += step[i];
    else last[i] -= step[i];

    if (last[i] < 0) {
      last[i] = last[i] + step[i] + 1;
      cycles[i] = true;
    }
    if (last[i] > 255) {
      last[i] = last[i] - step[i] - 1;
      cycles[i] = false;
    }
    c = c + hpad(last[i].toString(16));
  }
  return c;
}

function hpad(s) {
  if (s.length == 1) return "0" + s;
  return s;
}

function random(max) {
  return Math.round(Math.random()*max);
}

init();