dijkstra with setImmediate

A simple dijkstra implementation with a table to display the progression.

by francisfortier

CSS

body { margin: 0px; }
table { border-collpase: collapse; border: solid 1px #000; }
td { width: 6px; height: 6px; border: solid 1px #000; }
td.source { background-color: #f00; }
td.target { background-color: #00f; }
td.path { background-color: #0f0; }
td.close { background-color: #ccc; }
td.wall { background-color: #000; }

JavaScript

if (!window.setImmediate)
{
    window.setImmediate = (function() {
        
        var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
        var URL = window.URL || window.webkitURL;
        
        var bb = new BlobBuilder();
        
        bb.append('self.onmessage = function(e) { ' +
                  '    for (var i = 0; i < e.data; i++) { ' +
                  '        self.postMessage(i); ' +
                  '    } ' +
                  '}');
        
        var worker = new Worker(URL.createObjectURL(bb.getBlob("text/javascript")));
        
        var callback;
        
        worker.addEventListener("message", function(event) {
            callback();
        }, false);
        
        return function(cb) {
            callback = cb;
            
            worker.postMessage(1);
        }
    })();
}
    
COLS = Math.floor(window.innerWidth / 8);
ROWS = Math.floor(window.innerHeight / 8);

INFINITY = 0x7FFFFFFF;

var table = document.createElement("table");
var tbody = document.createElement("tbody");

for (var i = 0; i < ROWS; i++)
{
    var row = document.createElement("tr");
    
    for (var j = 0; j < COLS; j++)
    {
        row.appendChild(document.createElement("td"));
    }
    
    tbody.appendChild(row);
}

table.appendChild(tbody);
document.body.appendChild(table);

function setClass(index, className) {
    var cellIndex = index % COLS;
    var rowIndex = Math.floor(index / COLS);
    
    if (tbody.rows[rowIndex].cells[cellIndex].className == ""
        || tbody.rows[rowIndex].cells[cellIndex].className === "close")
    {
        tbody.rows[rowIndex].cells[cellIndex].className = className;
    }
}

Array.prototype.contains = function(value) {
    for (var i = 0; i < this.length; i++)
    {
        if (this[i] === value)
        {
            return true;
        }
    }
    
    return false;
}
    
Array.prototype.pushIfNotIn = function(value, arr) {
    if (!arr.contains(value))
    {
 ...