<SCRIPT LANGUAGE="JavaScript">


<!--

// set messages (specify backslash in double form (i.e, \\)
var messages = new Array()
messages[0] = "welcome to my page"
messages[1] = "cool led sign eh"
messages[2] = "you can add a lot.."
messages[3] = "of messages to this."


// number of milliseconds to pause between two messages
var pause = 3000

// set normal spacing between two characters (no whitespace inbetween)
var space = 1

// set height width of each character
var height = 5
var width = 3

// create object of all supported characters in font
var letters = new letterArray()

// initialize image variables
var on = new Image(5, 5)
var off = new Image(5, 5)

// set image URLs
on.src = "on.gif"
off.src = "off.gif"

// get number of images already laid out in page
var imageNum = document.images.length

// compute width of board
//var boardWidth = longest * (width + space) - space

// set maximum message length in images
var boardWidth = 0
for (var i = 0; i < messages.length; ++i) {
        var lengthWithNoSpaces = messages[i].split(" ").join("").length
        var numberOfSpaces = messages[i].length - lengthWithNoSpaces
        var currentBoardWidth = lengthWithNoSpaces * (width + space) - space + numberOfSpaces * space * 2
        if (boardWidth < currentBoardWidth)
                boardWidth = currentBoardWidth
}

// sign is currently not running
var running = false
var timerID = null

function letterArray() {
        this.a = new Array(height)
        this.a[0] = " * "
        this.a[1] = "* *"
        this.a[2] = "***"
        this.a[3] = "* *"
        this.a[4] = "* *"

        this.b = new Array(height)
        this.b[0] = "** "
        this.b[1] = "* *"
        this.b[2] = "** "
        this.b[3] = "* *"
        this.b[4] = "** "

        this.c = new Array(height)
        this.c[0] = "***"
        this.c[1] = "*  "
        this.c[2] = "*  "
        this.c[3] = "*  "
        this.c[4] = "***"

        this.d = new Array(height)
        this.d[0] = "** "
        this.d[1] = "* *"
        this.d[2] = "* *"
        this.d[3] = "* *"
        this.d[4] = "** "

        this.e = new Array(height)
        this.e[0] = "*** "
        this.e[1] = "*  "
        this.e[2] = "***"
        this.e[3] = "*  "
        this.e[4] = "***"

        this.f = new Array(height)
        this.f[0] = "***"
        this.f[1] = "*  "
        this.f[2] = "***"
        this.f[3] = "*  "
        this.f[4] = "*  "

        this.g = new Array(height)
        this.g[0] = "***"
        this.g[1] = "*  "
        this.g[2] = "***"
        this.g[3] = "* *"
        this.g[4] = "***"

        this.h = new Array(height)
        this.h[0] = "* *"
        this.h[1] = "* *"
        this.h[2] = "***"
        this.h[3] = "* *"
        this.h[4] = "* *"

        this.i = new Array(height)
        this.i[0] = "***"
        this.i[1] = " * "
        this.i[2] = " * "
        this.i[3] = " * "
        this.i[4] = "***"

        this.j = new Array(height)
        this.j[0] = "  *"
        this.j[1] = "  *"
        this.j[2] = "  *"
        this.j[3] = "* *"
        this.j[4] = "***"
        
        this.k = new Array(height)
        this.k[0] = "* *"
        this.k[1] = "* *"
        this.k[2] = "** "
        this.k[3] = "* *"
        this.k[4] = "* *"

        this.l = new Array(height)
        this.l[0] = "*  "
        this.l[1] = "*  "
        this.l[2] = "*  "
        this.l[3] = "*  "
        this.l[4] = "***"

        this.m = new Array(height)
        this.m[0] = "* *"
        this.m[1] = "***"
        this.m[2] = "***"
        this.m[3] = "* *"
        this.m[4] = "* *"

        this.n = new Array(height)
        this.n[0] = "* *"
        this.n[1] = "***"
        this.n[2] = "***"
        this.n[3] = "***"
        this.n[4] = "* *"

        this.o = new Array(height)
        this.o[0] = "***"
        this.o[1] = "* *"
        this.o[2] = "* *"
        this.o[3] = "* *"
        this.o[4] = "***"

        this.p = new Array(height)
        this.p[0] = "** "
        this.p[1] = "* *"
        this.p[2] = "** "
        this.p[3] = "*  "
        this.p[4] = "*  "

        this.q = new Array(height)
        this.q[0] = "***"
        this.q[1] = "* *"
        this.q[2] = "* *"
        this.q[3] = "***"
        this.q[4] = "***"

        this.r = new Array(height)
        this.r[0] = "** "
        this.r[1] = "* *"
        this.r[2] = "** "
        this.r[3] = "* *"
        this.r[4] = "* *"

        this.s = new Array(height)
        this.s[0] = "***"
        this.s[1] = "*  "
        this.s[2] = "***"
        this.s[3] = "  *"
        this.s[4] = "***"

        this.t = new Array(height)
        this.t[0] = "***"
        this.t[1] = " * "
        this.t[2] = " * "
        this.t[3] = " * "
        this.t[4] = " * "

        this.u = new Array(height)
        this.u[0] = "* *"
        this.u[1] = "* *"
        this.u[2] = "* *"
        this.u[3] = "* *"
        this.u[4] = "***"

        this.v = new Array(height)
        this.v[0] = "* *"
        this.v[1] = "* *"
        this.v[2] = "* *"
        this.v[3] = "* *"
        this.v[4] = " * "

        this.w = new Array(height)
        this.w[0] = "* *"
        this.w[1] = "* *"
        this.w[2] = "***"
        this.w[3] = "***"
        this.w[4] = "***"

        this.x = new Array(height)
        this.x[0] = "* *"
        this.x[1] = "* *"
        this.x[2] = " * "
        this.x[3] = "* *"
        this.x[4] = "* *"

        this.y = new Array(height)
        this.y[0] = "* *"
        this.y[1] = "* *"
        this.y[2] = "***"
        this.y[3] = " * "
        this.y[4] = " * "

        this.z = new Array(height)
        this.z[0] = "***"
        this.z[1] = "  *"
        this.z[2] = " * "
        this.z[3] = "*  "
        this.z[4] = "***"

        this['!'] = new Array(height)
        this['!'][0] = " * "
        this['!'][1] = " * "
        this['!'][2] = " * "
        this['!'][3] = "   "
        this['!'][4] = " * "

        this[':'] = new Array(height)
        this[':'][0] = "   "
        this[':'][1] = " * "
        this[':'][2] = "   "
        this[':'][3] = " * "
        this[':'][4] = "   "

        this['.'] = new Array(height)
        this['.'][0] = "   "
        this['.'][1] = "   "
        this['.'][2] = "   "
        this['.'][3] = "   "
        this['.'][4] = " * "

        this['='] = new Array(height)
        this['='][0] = "   "
        this['='][1] = "***"
        this['='][2] = "   "
        this['='][3] = "***"
        this['='][4] = "   "

        this['='] = new Array(height)
        this['='][0] = "   "
        this['='][1] = "***"
        this['='][2] = "   "
        this['='][3] = "***"
        this['='][4] = "   "

        this['+'] = new Array(height)
        this['+'][0] = "   "
        this['+'][1] = " * "
        this['+'][2] = "***"
        this['+'][3] = " * "
        this['+'][4] = "   "

        this['-'] = new Array(height)
        this['-'][0] = "   "
        this['-'][1] = "   "
        this['-'][2] = "***"
        this['-'][3] = "   "
        this['-'][4] = "   "

        this['/'] = new Array(height)
        this['/'][0] = "  *"
        this['/'][1] = "  *"
        this['/'][2] = " * "
        this['/'][3] = "*  "
        this['/'][4] = "*  "

        this['\\'] = new Array(height)
        this['\\'][0] = "*  "
        this['\\'][1] = "*  "
        this['\\'][2] = " * "
        this['\\'][3] = "  *"
        this['\\'][4] = "  *"

        this['\\'] = new Array(height)
        this['\\'][0] = "*  "
        this['\\'][1] = "*  "
        this['\\'][2] = " * "
        this['\\'][3] = "  *"
        this['\\'][4] = "  *"

        this['"'] = new Array(height)
        this['"'][0] = "* *"
        this['"'][1] = "* *"
        this['"'][2] = "* *"
        this['"'][3] = "   "
        this['"'][4] = "   "

        this["'"] = new Array(height)
        this["'"][0] = " * "
        this["'"][1] = " * "
        this["'"][2] = " * "
        this["'"][3] = "   "
        this["'"][4] = "   "

        this['('] = new Array(height)
        this['('][0] = "  *"
        this['('][1] = " * "
        this['('][2] = " * "
        this['('][3] = " * "
        this['('][4] = "  *"

        this[')'] = new Array(height)
        this[')'][0] = "*  "
        this[')'][1] = " * "
        this[')'][2] = " * "
        this[')'][3] = " * "
        this[')'][4] = "*  "

        this['*'] = new Array(height)
        this['*'][0] = "   "
        this['*'][1] = "***"
        this['*'][2] = "***"
        this['*'][3] = "***"
        this['*'][4] = "   "

        this['?'] = new Array(height)
        this['?'][0] = "** "
        this['?'][1] = "  *"
        this['?'][2] = " * "
        this['?'][3] = "   "
        this['?'][4] = " * "

        this['0'] = new Array(height)
        this['0'][0] = " * "
        this['0'][1] = "* *"
        this['0'][2] = "* *"
        this['0'][3] = "* *"
        this['0'][4] = " * "

        this['1'] = new Array(height)
        this['1'][0] = " * "
        this['1'][1] = " * "
        this['1'][2] = " * "
        this['1'][3] = " * "
        this['1'][4] = " * "

        this['2'] = new Array(height)
        this['2'][0] = "***"
        this['2'][1] = "  *"
        this['2'][2] = "***"
        this['2'][3] = "*  "
        this['2'][4] = "***"

        this['3'] = new Array(height)
        this['3'][0] = "***"
        this['3'][1] = "  *"
        this['3'][2] = "***"
        this['3'][3] = "  *"
        this['3'][4] = "***"

        this['4'] = new Array(height)
        this['4'][0] = "* *"
        this['4'][1] = "* *"
        this['4'][2] = "***"
        this['4'][3] = "  *"
        this['4'][4] = "  *"

        this['5'] = new Array(height)
        this['5'][0] = "***"
        this['5'][1] = "*  "
        this['5'][2] = "***"
        this['5'][3] = "  *"
        this['5'][4] = "** "

        this['6'] = new Array(height)
        this['6'][0] = "** "
        this['6'][1] = "*  "
        this['6'][2] = "***"
        this['6'][3] = "* *"
        this['6'][4] = "***"

        this['7'] = new Array(height)
        this['7'][0] = "***"
        this['7'][1] = "  *"
        this['7'][2] = " * "
        this['7'][3] = "*  "
        this['7'][4] = "*  "

        this['8'] = new Array(height)
        this['8'][0] = "***"
        this['8'][1] = "* *"
        this['8'][2] = "***"
        this['8'][3] = "* *"
        this['8'][4] = "***"

        this['9'] = new Array(height)
        this['9'][0] = "***"
        this['9'][1] = "* *"
        this['9'][2] = "***"
        this['9'][3] = "  *"
        this['9'][4] = "***"
}

function drawBlank() {
        // assign greater than symbol to variable
        var gt = unescape("%3e")

        document.write('<TABLE BORDER=2 CELLPADDING=8' + gt + '<TR' + gt + '<TD BGCOLOR ALIGN="center" VALIGN="center"' + gt)

        // print entire board of off images
        for (var y = 0; y < height; ++y) {
                for (var x = 0; x < boardWidth; ++x) {
                        document.write('<IMG SRC="' + off.src + '" HEIGHT=5 WIDTH=5' + gt)
                }
                document.write('<BR' + gt)
        }
        document.write('</TD' + gt + '</TR' + gt + '</TABLE' + gt)
}

function setLight(state, x, y) {
        // set a specific light in sign to on (true) or off (false)
        if (state)
                document.images[computeIndex(x, y)].src = on.src
        else
                document.images[computeIndex(x, y)].src = off.src
}

function drawLetter(letter, startX) {
        // draws a letter at the given x coordinate
        for (var x = 0; x < width; ++x) {
                for (var y = 0; y < height; ++y) {
                        setLight(letters[letter][y].charAt(x) == "*", startX + x, y)
                }
        }
}

function drawSpace(startX) {
        // create a small space between each two characters
        for (var x = 0; x < space; ++x) {
                for (var y = 0; y < height; ++y) {
                        setLight(false, startX + x, y)
                }
        }
}

function computeIndex(x, y) {
        // compute the document index of an image in the sign, based on the x-y coordinates 
        return (y * boardWidth + x) + imageNum
}

function floodBoard(startX) {
        // set all lights from startX to off
        for (var x = startX; x < boardWidth; ++x) {
                for (var y = 0; y < height; ++y) {
                        setLight(false, x, y)
                }
        }
}

function drawMessage(num) {
        // initialize variable to current message
        var text = messages[num]

        // initialize two counters (j - current character in message, i - current x coordinate)
        var i = 0
        var j = 0

        while (1) {
                if (text.charAt(j) != " ") {
                        // draw current letter
                        drawLetter(text.charAt(j), i)
        
                        // increment i by the constant width of an image
                        i += width
                } else {
                        // add an extra space (do not advance j yet)
                        drawSpace(i)
                        i += space
                }

                // if j is less that index of last character
                if (j < text.length - 1) {
                        drawSpace(i)
                        i += space
                } else // j is the index of the last character (lsat character already printed)
                        break

                // increment j by one because one letter was printed
                ++j
        }

        // flood the remaining piece of the sign (turn it off)
        floodBoard(i)

        // if message printed this time was not the last one in the array
        if (num < messages.length - 1)
                // val *must* be a global variable for use with the timeout
                val = ++num
        else
                val = 0 // start cycle over again
        
        // recursive call after waiting 3 seconds (some of the time already passed during printing)
        timerID = setTimeout("drawMessage(val)", pause)
}

function startSign() {
        running = true

        // wait 3 seconds and then call function to print first message
        drawMessage(0)
}

function stopSign() {
        if(running)
                clearTimeout(timerID)
        running = false
}

// open form
document.write('<FORM>')

// create initial sign (all sign is off)
drawBlank()

document.write('<INPUT TYPE="button" VALUE="start" onClick="startSign()">')
document.write('<INPUT TYPE="button" VALUE="stop" onClick="stopSign(); floodBoard(0)">')
document.write('</FORM>')

// -->


</SCRIPT>