function Color(r,g,b) {
  if (r == undefined) {
    this.randomize();  
  } else {
    this.red=r;
    this.green=g;
    this.blue=b; 
  }
}
Color.prototype.set=function(r,g,b) {
    this.red=r;
    this.green=g;
    this.blue=b; 
}

Color.prototype.toString=function () {
   return "#"+(this.red<16?"0":"")+(this.red.toString(16))+ 
   (this.green<16?"0":"")+(this.green.toString(16))+ 
   (this.blue<16?"0":"")+(this.blue.toString(16));
}

function mergeXor(col) {
 this.red ^= col.red;
 this.blue ^= col.blue;
 this.green ^= col.green;
}

function mergeAvgWeight(w) {
 return function (col) {
  this.red = Math.round((this.red*(w-1)+col.red)/w);
  this.green = Math.round((this.green*(w-1)+col.green)/w);
  this.blue = Math.round((this.blue*(w-1)+col.blue)/w);
 }
}

Color.prototype.merge=mergeAvgWeight(3);

function randomizeColorSpread() {
    var c=new Array(3);
    for (var i=0;i<3;i++) {
     var x=0;
     for (var j=0;j<3;j++) 
       x+=Math.floor(Math.random()*0x55);
     c[i]=x^128;
    }
    this.red=c[0];
    this.green=c[1];
    this.blue=c[2];
}

function randomizeColorPrime(){
   this.red=(Math.random()>0.5)?255:0;
   this.green=(Math.random()>0.5)?255:0;
   this.blue=(Math.random()>0.5)?255:0;
   if (this.red==0 && this.green==0 && this.blue==0){
     this.red=255;
     this.green=255;
     this.blue=255;
   }
}
function randomizeColorRGB() {
   this.red=0;this.green=0;this.blue=0;
   switch(Math.floor(Math.random()*3)) { 
     case 0:this.red=255;break;
     case 1:this.green=255;break;
     case 2:this.blue=255;break;
   }
}

Color.prototype.randomize=randomizeColorRGB;

var colors;
var colorcodes;

function clear() {
  for(var i=0;i<10;i++)
    for(var j=0;j<10;j++)
      for(var k=0;k<4;k++)
        colors[i][j][k].set(0,0,0);
}

function splitVertical() {
   var col=new Color(); // Random color
   var line = Math.floor(Math.random()*9) // split between line and line+1
   var minline,maxline;
   if (Math.random()>=0.5) {
      minline=0;maxline=line;
   } else {
      minline=line+1;maxline=9;
   }
   for (var i=minline;i<=maxline;i++)
     for (var j=0;j<10;j++)
       for (var k=0;k<4;k++)
          colors[i][j][k].merge(col);
}
function splitHorizontal() {
   var col=new Color();
   var line = Math.floor(Math.random()*9) // split between line and line+1
   var minline,maxline;
   if (Math.random()>=0.5) {
      minline=0;maxline=line;
   } else {
      minline=line+1;maxline=9;
   }
   for (var i=0;i<10;i++)
     for (var j=minline;j<=maxline;j++)
       for (var k=0;k<4;k++) {
	  if (!colors[i][j]) alert(i+","+j+":"+colors[i][j]);
	  if (!colors[i][j][k]) alert(i+","+j+","+k+":"+colors[i][j][k]);
          colors[i][j][k].merge(col);
	}
}

function splitDiagonalUp() {
   var col=new Color();
   var dir = (Math.random()>=0.5);
   var line = Math.floor(Math.random()*19);
   for(var i=0;i<10;i++)
     for(var j=0;j<10;j++) {
       if ((i+j<line && dir)||(i+j>line && !dir)) {
         for (var k=0;k<4;k++)
           colors[i][j][k].merge(col);
       } else if (i+j==line) {
          if (dir) {
            colors[i][j][0].merge(col);
            colors[i][j][3].merge(col);
          } else {
            colors[i][j][1].merge(col);
            colors[i][j][2].merge(col);
          }
       }
     }
}

function splitDiagonalDown() {
   var col=new Color();
   var dir = (Math.random()>=0.5);
   var line = Math.floor(Math.random()*19);
   for(var i=0;i<10;i++)
     for(var j=0;j<10;j++) {
       if ((9-i+j<line && dir)||(9-i+j>line && !dir)) {
         for (var k=0;k<4;k++)
           colors[i][j][k].merge(col);
       } else if (9-i+j==line) {
          if (dir) {
            colors[i][j][2].merge(col);
            colors[i][j][3].merge(col);
          } else {
            colors[i][j][1].merge(col);
            colors[i][j][0].merge(col);
          }
       }
     }
}

function calculateColorcodes () {
 for(var i=0;i<10;i++)
   for(var j=0;j<10;j++) {
      var c=colors[i][j][0].toString();
      for (var k=1;k < 4;k++) {
       c += " "+colors[i][j][k].toString();
      }
      colorcodes[i][j]=c;
 }   
}

function redraw() {

 for(var i=0;i<10;i++)
   for(var j=0;j<10;j++) {
     var elem=document.getElementById("b"+i+"-"+j);
     elem.style.borderColor=colorcodes[i][j];
   }
}

function split() { 
 switch(Math.floor(Math.random()*4)) {
   case 2: splitHorizontal(); break;
   case 1: splitVertical(); break;
   case 3: splitDiagonalUp(); break;
   case 0: splitDiagonalDown(); break;
 }
 calculateColorcodes();
 redraw();
}

function init() {
      colors=new Array(10);
      colorcodes = new Array(10);
      for (var i=0;i<10;i++) {
        colors[i]=new Array(10);
        colorcodes[i]=new Array(10);
        for (var j=0;j<10;j++) {
          colorcodes[i][j]="black";
          colors[i][j]=new Array(4);
          for (var k=0;k<4;k++)
            colors[i][j][k]=new Color(0,0,0);
        }
      }
      setInterval(split,500);
}
