//
//  TODO comments
//
function setupDelayedTrigger(nodes, class_name, timeout)
{
    var timer

    for (var i = 0; i < nodes.length; i++) {
        var node = nodes[i]

        if (node.nodeType != 1) continue

        node.onmouseover = function(e)
        {
            if (timer != null) timer.fireNow()

            addClass(this, class_name)
        }

        node.onmouseout = function(e)
        {
            if (timer != null) timer.reset()

            var This = this
            timer = new Timer(function() { removeClass(This, class_name) },
                               timeout)
        }
    }
}

//
//  TODO comments
//
function arrayIndex(array, value)
{
    for (var i = 0; i < array.length; i++)
        if (array[i] == value) return i
}

//
//  TODO comments
//
function addClass(element, class_name)
{
    var classes = element.className.split(/\s+/g)

    if ( arrayIndex(classes, class_name) == null )
        element.className = class_name + ' ' + classes.join(' ')
}

//
//  TODO comments
//
function removeClass(element, class_name)
{
    var classes = element.className.split(/\s+/g),
        i = arrayIndex(classes, class_name)

    if (i == null) return

    classes = [].concat(classes.slice(0, i), classes.slice(i + 1))
    element.className = classes.join(' ')
}

//
//  TODO comments
//
function Timer(code, time)
{
    this.code = code
    this.timerID = setTimeout(this.code, time)
}
Timer.prototype.reset = function()
{
    clearTimeout(this.timerID)
}
Timer.prototype.fireNow = function()
{
    this.reset()

    if (typeof this.code == 'function')
        this.code()
    else
        eval(this.code)
}
