<!-- 
     //  elektronengehirn.net  
     //  matrixflow.js - Version 1.01
     //  thomas.graf@elektronengehirn.net
// -->

     var matrx;
     numOfLeds = 5;
     matrixWidth = 10;
     matrixHeight = 10;
     inactiveLeds = 24; // highest flux - 0, 1, 2, 3, 4, 6, 12, 24, 48, 96, 192 - lowest flux
     distr = new Array( inactiveLeds, 2, 1, 1, 2 );
     wait = 200; // milliseconds
     
     now = new Date();
     counter = 0;

     function initialize() {
       matrx = new Matrix( numOfLeds, matrixWidth, matrixHeight);
       matrx.setDistribution( distr );
       counter = 0;
       //changeMatrix();
       //makeFlow();
       animMatrix();
     }
     
     
     function getFromArray( array, index, defaultVal ) {
       if (index>=array.length)
         return defaultVal;         
       else
         return array[index];        
     }
     function getIntFromArray( array, index, defaultVal ) {
       if (index>=array.length)
         return defaultVal;
         
       intValue = array[index];
       if (isNaN(intValue) == true)
         return defaultVal;
       else
         return Number(intValue);        
     }
     
     animMode = 1;
     function setAnimMode(mode) {
       animMode = mode;
       counter = 0;
       var args = setAnimMode.arguments;
       
       switch(mode) {
         case 0:
           break;
         case 1:  //matrx.changeRandImg();
           wait = 200;
           break;
         case 2:  //flowTo(flowTargetX, flowTargetY);
           wait = 10;
           flowTargetX = getIntFromArray( args, 1, flowTargetX );
           flowTargetY = getIntFromArray( args, 2, flowTargetY );
           break;
         default:
           break;
       }        
     }
     
     function animMatrix() {
       switch(animMode) {
         case 0:
           break;
         case 1:
           wait = 200;
           matrx.changeRandImg();
           break;
         case 2:
           wait = 10;
           flowTo(flowTargetX, flowTargetY);
           if (counter%20 == 0)
             matrx.changeRandImg();
           break;
         default:
           break;
       }
       counter++;
       //statustext( "mode(" + animMode + ")  counter(" + counter + ")" );
       window.setTimeout( "animMatrix()", wait );      
     }
     
     
     function changeMatrix() {
       matrx.changeRandImg();
       counter++;
       matrx.timer = window.setTimeout( "changeMatrix()",wait );
       //return timer;
     }

     flowTargetX = 4;     
     flowTargetY = 4;     
     function setFlowTarget(x,y) {
       setAnimMode(2);
       flowTargetX = x;
       flowTargetY = y;
     }
        
     function makeFlow() {
       flowTo(flowTargetX, flowTargetY);
       counter++;
       matrx.timer = window.setTimeout( "makeFlow()",10 );
       //return timer;
     }
     
     
     
     function flowTo(xTarget,yTarget) {
       imgFilenameOFF = matrx.buildImgFilename(0);
       imgCounter = 0;
       max = matrx.width*matrx.height*4;
       do {
         xStart = getRandInt(matrx.width);
         yStart = getRandInt(matrx.height);
         imgTagname  = matrx.buildimgTagnameXY(xStart,yStart);
         imgCounter++;
       } while (imgCounter<max  &&  (document.images[imgTagname].src.indexOf(imgFilenameOFF)>=0))
       
       if (imgCounter>=max) {
         alert("flowTo("+xTarget+", "+yTarget+"): couldn't find empty img (" + imgFilenameOFF + ")");
         return;
       }
       else
         flowFromTo(xStart,yStart, xTarget,yTarget);
     }
     
     
     function flowFromTo(xStart,yStart, xTarget,yTarget) {
       imgTagname   = matrx.buildimgTagnameXY(xStart, yStart);
       imgFilenameOFF = matrx.buildImgFilename(0);

       /*
         alert(
                    "source: document.images[" + imgTagname + "].sr = " + document.images[imgTagname].src 
                //+ "\ntarget: document.images[" + _imgTagname + "].sr = " + document.images[_imgTagname].src 
                + "\nimgFilenameOFF: " + imgFilenameOFF
              );
       */

       
       mx = xTarget - xStart;
       my = yTarget - yStart;
       xDir = (mx>0)?1:-1;
       yDir = (my>0)?1:-1;
       if (mx == 0)
         m = yDir * matrx.width * matrx.width;
       else 
         m  = my / mx;
       
       dir = new Array();
       x = 0;
       y = 1;
       /*dir = new Array(3);
       for (i=0; i<dir.length; i++) {
         dir[i][x] = 0;
         dir[i][y] = 0;
       }*/
       
       i = 0;
       if (Math.abs(mx) > Math.abs(my)) {
         dir[i]    = new Array(2);
         dir[i][x] = xDir;
         dir[i][y] = 0;
         if ( Math.abs(m*dir[i][x]) >= 0.5 ) {
           dir[i][y] = yDir;
           i++;
           
           dir[i]    = new Array(2);
           dir[i][x] = xDir;
           dir[i][y] = 0;
         }  
         i++;
         dir[i]    = new Array(2);
         dir[i][x] = 0;
         dir[i][y] = yDir;
       }
       else {
         dir[i]    = new Array(2);
         dir[i][x] = 0;
         dir[i][y] = yDir;
         if ( Math.abs(dir[i][y]/m) >= 0.5 ) {
           dir[i][x] = xDir;
           i++;
           
           dir[i]    = new Array(2);
           dir[i][x] = 0;
           dir[i][y] = yDir;
         }  
         i++;
         dir[i]    = new Array(2);
         dir[i][x] = xDir;
         dir[i][y] = 0;
       }
         
       var xTmp;
       var yTmp;
       for (i=0; i<dir.length; i++) {
         xTmp = xStart + dir[i][x];
         yTmp = yStart + dir[i][y];
         if ( xTmp<0  ||  xTmp>=matrx.width  ||  yTmp<0  ||  yTmp>=matrx.height ) 
           continue;
         
         _imgTagname  = matrx.buildimgTagnameXY(xTmp, yTmp);
         if (!document.images[_imgTagname]) {
           alert("error: document.images[" + _imgTagname + "] not found");
           continue;
         }
         

         /*
         targetsrc = document.images[matrx.buildimgTagnameXY(xTarget,yTarget)].src;
         document.images[matrx.buildimgTagnameXY(xTarget,yTarget)].src = "/images/led3_blue.gif";
         tmpsrc = document.images[imgTagname].src;
         document.images[imgTagname].src = "/images/led3_red_off.gif";
         _tmpsrc = document.images[_imgTagname].src;
         document.images[_imgTagname].src = "/images/led3_red.gif";
         for (j=0; j<55*5; j++)
           __a = Math.sin( getRandInt(99*99*99*99) );
         alert(
                    "source: document.images[" + imgTagname + "].sr = " + tmpsrc
                + "\ntarget: document.images[" + _imgTagname + "].sr = " + _tmpsrc 
                + "\ndir: " + dir
                + "\ndir["+i+"]: " + dir[i]
                //+ "\nimgFilenameOFF: " + imgFilenameOFF
              );
         document.images[imgTagname].src  = tmpsrc;
         document.images[_imgTagname].src = _tmpsrc;
         document.images[matrx.buildimgTagnameXY(xTarget,yTarget)].src = targetsrc;
         */
         
         
         if (document.images[_imgTagname].src.indexOf( imgFilenameOFF )>=0  ||  (xTmp==xTarget && yTmp==yTarget)) {
           //alert(imgTagname + " -> " + _imgTagname);
           document.images[_imgTagname].src = document.images[imgTagname].src;
           document.images[imgTagname].src  = imgFilenameOFF;
           //if (xTmp==xTarget && yTmp==yTarget)
           //  document.images[_imgTagname].src = imgFilenameOFF;
           //document.images[imgTagname].src  = "images/pixel.gif";
           break;
         }
       }         
     } // function flowFromTo
       

     
