var led_display_enabled=true;

var led_display_msg_spacer = "                             ";
var led_display_msg = "One of my most productive days was throwing away 1000 lines of code."+
       " - Ken Thompson "+led_display_msg_spacer
 +"When in doubt, use brute force. - Ken Thompson "+
 led_display_msg_spacer+
 "Controlling complexity is the essence of computer programming. - Brian Kernigan"+
 led_display_msg_spacer+"Write less, do more. - jQuery slogan"+led_display_msg_spacer+
 "When in doubt, leave it out. - Joshua Bloch"+led_display_msg_spacer+
 "As a programmer, it is your job to put yourself out of business."+
 " - Doug McIlroy"+led_display_msg_spacer+
 "Good code is short, simple, and symmetrical - the challenge is figuring out how to get there."+
 " - Sean Parent"+led_display_msg_spacer+
 "I object to doing things that computers can do. - Olin Shivers"+led_display_msg_spacer;
 
var led_display_horizontal_cell_count = 150;
var led_display_vertical_cell_count = 17;
var led_display_scroll_position = Math.random()*10000;
var led_display_past_time=false;
var led_display_prev_values=false;

function led_display_stopAnimation()
{
  led_display_enabled=false;
}

function led_display_supportsCanvas()
{
  var canvas = document.createElement("canvas");
  
  if (!canvas.getContext)
     return false;
  if (!canvas.getContext("2d"))
     return false;
	 
  return true;
}

function led_display_getDisplayElement()
{
  return document.getElementById("LED_display");
}

function led_display_setCSSClass(e,className)
{
  if (e.setAttribute)
  {
      e.setAttribute("className",className);
  }
  e.className=className;
}

function led_display_isOn(x,y)
{
  x+=Math.floor(led_display_scroll_position);
 
  if (y>=led_display_char_height)
     return false;
  
  var charIndex = x/led_display_char_width;
  
    charIndex=charIndex%led_display_msg.length; 

  var glyphIndex = led_display_msg.charCodeAt(charIndex)
	    -led_display_char_index_offset;
	  
	  if (glyphIndex<0 || glyphIndex>=led_display_chars.length)
	     return false;
	  else
	  {
        x=x%led_display_char_width;
	    var val = led_display_chars[glyphIndex][x*led_display_char_height+y];
		
		  if (val==0)
		     return true;
		  else
		     return false;
	  }  
}

function led_display_refreshCanvas(canvas)
{
  if (!canvas)
     return;
	 
 var co = canvas.getContext("2d");
 if (!co)
    return;
	   
  var ON_COLOUR="#f00";	   
  var OFF_COLOUR="#000";	   
  var canvasWidth = canvas.width;
  var canvasHeight = canvas.height;
  var cellWidth = canvasWidth/led_display_horizontal_cell_count; 
   // get canvas width.
   //canvas.style.width=canvasWidth+"px";
   
  var cellHeight = canvasHeight/led_display_vertical_cell_count;
	   
   // loop through the trs.
   for (var i=0;i<led_display_horizontal_cell_count;i++)
   {
	 
      for (var j=0;j<led_display_vertical_cell_count;j++)
	  {	   
		 var on = led_display_isOn(i,j);
		 var matched=false;
		 if (led_display_prev_values)
		 {
		    if (on==led_display_prev_values[i][j])
			   matched=true;
		 }
		 if (!matched)
		 {
		   var colour = 0;
		   
		    // on or off?
            if (on)
               colour = ON_COLOUR;
            else
                colour = OFF_COLOUR;

			co.fillStyle = colour;
            // fill rectangle.				
			co.beginPath();

            co.rect(i*cellWidth,j*cellHeight,cellWidth-1,cellHeight-1);			
			co.fill();
			co.closePath();
		}
	  }
   }
}

function led_display_refreshTable(tbody)
{
  var trs = tbody.getElementsByTagName("tr");
  var newValues = new Array();  
  
   // loop through the trs.
   for (var i=0;i<trs.length;i++)
   {
     var j=0;
	 newValues.push(new Array());
	 
      for (var tdNode=trs[i].firstChild;tdNode;tdNode=tdNode.nextSibling)
	  {
	    if (!tdNode.tagName)
		   continue;
		if (!tdNode.tagName.toUpperCase()=="TD")
		   continue;
		   
		 var on = led_display_isOn(j,i);
		 newValues[i].push(on);
		 var matched=false;
		 if (led_display_prev_values)
		 {
		    if (on==led_display_prev_values[i][j])
			   matched=true;
		 }
		 if (!matched)
		 {
		    // on or off?
		    if (led_display_isOn(j,i))
			   led_display_setCSSClass(tdNode,"on");
            else
 			    led_display_setCSSClass(tdNode,"off");
		 }
		 j++;
	  }
   }
   led_display_prev_values=newValues;
}

function led_display_createDisplayTbodyElementNoStates()
{
  var tbody = document.createElement("tbody");
 
   for (var j=0;j<led_display_vertical_cell_count;j++)
   {
     var tr = document.createElement("tr");
      for (var i=0;i<led_display_horizontal_cell_count;i++)
      {
        var td = document.createElement("td");
		 td.appendChild(document.createTextNode(" "));
	     tr.appendChild(td);
      } 
      tbody.appendChild(tr);
   }
   
  return tbody;
}

function led_display_createCanvasElementNoStates()
{
 var canvas = document.createElement("canvas");

  return canvas;
}

function led_display_createDisplayTableElement()
{
  var table = document.createElement("table");
  var tbody = led_display_createDisplayTbodyElementNoStates();

   led_display_refreshTable(tbody);
   
   table.appendChild(tbody);
   return table;
}

function led_display_startAnimation()
{ 
 if (!led_display_enabled)
    return;
	
 /**
 For the time being, don't use the LED display.
 */
 
 var newTime = new Date().getTime();
 if (led_display_past_time)
 {
   var dt = newTime - led_display_past_time;

    led_display_scroll_position+= dt*0.02;
 }
    led_display_past_time = newTime;
  led_display_updateDisplay();
  setTimeout("led_display_startAnimation()",30);
}

function led_display_updateDisplay()
{
 var displayelement = led_display_getDisplayElement();
  if (displayelement)
  {
    var tbodies = displayelement.getElementsByTagName("tbody"); 
     if (tbodies.length>0)
     {
	    // update existing tbody.
        led_display_refreshTable(tbodies[0]);
	 }
	 else
	 {		 
	   var canvasElements = displayelement.getElementsByTagName("canvas");

         if (canvasElements.length>0)
         { // update the canvas.
		   led_display_refreshCanvas(canvasElements[0]);
		 }
         else // no canvas or tbody found so try to make one.
         {		 
		    // if supports canvas:
			if (led_display_supportsCanvas())
			{
  		       var canvas = led_display_createCanvasElementNoStates()
		         displayelement.appendChild(canvas);
			     led_display_refreshCanvas(canvas);
            }
			/*else
		        displayelement.appendChild(led_display_createDisplayTableElement());
			*/
		 }
	 }
  }
}
