// // 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) }