// Variables globales a la página

var il_total = 0; // Almacena el total de grids
var t
var block= new Array() // Array de cosas usadas
var gColor=new Array(3) // Componentes del color actual

var RGB = new Array(256); // Almacena todos los hexadecimales

var esExplorer = navigator.appName.match('Explorer');

// PARAMETROS DE FUNCIONAMIENTO
var paramTimer = 50; // Valor para el timer

var paramRNDEffEspon = 30; // RND(x)==1 para que salga el efecto espontaneo
var paramRNDEffEsponNum = 6; // RND(x) del número de bloques que salen en el efecto espontáneo

var paramTicksAnteOver = 11; // Se define 10 porque es el mínimo para empezar a desaparecer
var paramTicksAnteClick = 400; // Ticks que se definen cuando se hace click
var paramTicksAnteEFFEspon = 14; // Ticks en los que se inicializa el efecto espontáneo

function inic() {
   // Tabla de conversión RGB
   var hex = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
   k=0;
   for (i = 0; i < 16; i++) {
   	for (j = 0; j < 16; j++) {
   		RGB[k] = hex[i] + hex[j];
   		k++;
   	}
   }

   // RGB Inicial, que se irá modificando con el tiempo
   gColor[0]=rnd(255);
   gColor[1]=rnd(255);;
   gColor[2]=rnd(255);;

   loop();
}


// Devuelve el color actual pero en hexadecimal
function getCurrentHexColor() {
   return '#'+RGB[gColor[0]]+RGB[gColor[1]]+RGB[gColor[2]];
}

// Devuelve un color aleatorio pero en hexadecimal
function getRandomHexColor() {
   return '#'+RGB[rnd(255)]+RGB[rnd(255)]+RGB[rnd(255)];
}


// Bucle principal
function loop() {
   if (il_total>0) {
   	// Baja los que estén activos
      for (k=0; k<il_total; k++) {
         if (block[k] > 0) {
         	block[k] --;
         	if (block[k] <= 10) {
         		cuadroSetTrans(k,(block[k] / 10));
         	}

 //         if (block[k] == 0) {
 //         	cuadroSetColor(k,"transparent");
 //        	}

         }
      }

      // EFectos adicionales
      if (rnd(paramRNDEffEspon)==1) efectoEspontaneo(rnd(paramRNDEffEsponNum));
   }
   t = setTimeout('loop()', paramTimer);
}



// Pone el color a un cuadro
function cuadroSetColor(k,color) {
   o=document.getElementById('c'+k);
   if (o) {
   	o.style.backgroundColor=color;
   	objSetTrans(o, 1);
   }
}

// Pone el color a un cuadro
function cuadroSetTrans(k,trans) {
	o=document.getElementById('c'+k);
	if (o) objSetTrans(o, trans);
}


function objSetTrans(o, trans) {
	if (esExplorer) {
		o.style.filter='alpha(opacity='+(trans *  100)+')';
	} else {
		o.style.opacity=trans;
	}
}


// Esta función se ejecuta cada vez que se pasa por encima de uno de los grids
function eO(k) {
	if (block[k]==0) {
   	block[k]=paramTicksAnteOver; // Se define 10 porque es el mínimo para empezar a desaparecer
  		hexColor= getCurrentHexColor(colorModifica())
   	cuadroSetColor(k, hexColor);
   }
}

// Esta función se ejecuta cada vez que se pulsa un cuadro
function eC(k) {
   block[k]=paramTicksAnteClick;
   hexColor= getCurrentHexColor(colorModifica())
   cuadroSetColor(k, hexColor);
}


// Esta función genera unos cuantos cuadros aleatorios a lo largo de todo el grid
function efectoEspontaneo(num) {
	hexColor=getRandomHexColor();
	for (n=1; n<=num; n++) {
		k=rnd(il_total) - 1;
		if (block[k]==0) {
			block[k]=paramTicksAnteEFFEspon;
			cuadroSetColor(k, hexColor);
		}
	}
}



// Pinta el HTML con los grids
function gridPaint(w,h) {
   k = 1;
   document.write('<table WIDTH="100%" HEIGHT="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0">');
   for (n=1; n<=h; n++) {
      document.write('<tr>');
      for (i=1; i<=w; i++) {
         document.write('<td id="c'+k+'" onMouseOver="eO('+k+');" onClick="eC('+k+')">&nbsp;</td>');
         k++;
         block[k]=0;
      }
      document.write('</tr>');
   }
   document.write('</table>');
   il_total = k;
}



// Genera un color aleatorio
function colorRandom() {
   strHex='0123456789ABCDEF';
   color='#';
   for (i=0;i<6;i++){
      pos = rnd(16);
      color += strHex.substring(pos,pos+1);
   }
   return color;
}


// Modifica sutilmente el color
function colorModifica() {
   gColor[0] = valorFluctua(gColor[0], 8);
   gColor[1] = valorFluctua(gColor[1], 8);
   gColor[2] = valorFluctua(gColor[2], 8);
}

// Auxiliar: para modificar un valor
function valorFluctua(v, d) {
    v += (rnd(d) - Math.round(d / 2));
    if (v < 0) v = 0;
    if (v > 255) v = 255;
    return v;
}


// Va subiendo el color (usarlo para ir difuminando la cola, pero habría que meter el color en cada pos del array)
function colorSube() {
   gColor[0] = valorSube(gColor[0], 20);
   gColor[1] = valorSube(gColor[1], 20);
   gColor[2] = valorSube(gColor[2], 20);
   if ((gColor[0]==255) && (gColor[1]==255) && (gColor[2]==255) ) return true;
   return false;
}

// Auxiliar: para subir un valor
function valorSube(v, d) {
    v += (rnd(d));
    if (v > 255) v = 255;
    return v;
}

// Genera un número aleatorio
function rnd(a) {
   return Math.round(Math.random()*a);
}
