cmlenz@39: // Used for dynamically updating the height of a textarea cmlenz@39: function resizeTextArea(id, rows) { cmlenz@39: var textarea = document.getElementById(id); cmlenz@39: if (!textarea || (typeof(textarea.rows) == "undefined")) return; cmlenz@39: textarea.rows = rows; cmlenz@39: } cmlenz@39: cmlenz@39: // A better way than for example hardcoding foo.onload cmlenz@39: function addEvent(element, type, func){ cmlenz@39: if (element.addEventListener) { cmlenz@39: element.addEventListener(type, func, false); cmlenz@39: return true; cmlenz@39: } else if (element.attachEvent) { cmlenz@39: return element.attachEvent("on" + type, func); cmlenz@39: } cmlenz@39: return false; cmlenz@39: } cmlenz@39: cmlenz@39: // Convenience function for the nearest ancestor element with a specific tag cmlenz@39: // name cmlenz@39: function getAncestorByTagName(e, tagName) { cmlenz@39: tagName = tagName.toLowerCase(); cmlenz@39: do { cmlenz@39: e = e.parentNode; cmlenz@39: } while ((e.nodeType == 1) && (e.tagName.toLowerCase() != tagName)); cmlenz@39: return (e.nodeType == 1) ? e : null; cmlenz@39: } cmlenz@39: cmlenz@39: // Adapted from http://www.kryogenix.org/code/browser/searchhi/ cmlenz@39: function searchHighlight() { cmlenz@39: if (!document.createElement) return; cmlenz@39: cmlenz@39: var div = document.getElementById("searchable"); cmlenz@39: if (!div) return; cmlenz@39: cmlenz@39: function getSearchWords(url) { cmlenz@39: if (url.indexOf('?') == -1) return []; cmlenz@39: var queryString = url.substr(url.indexOf('?') + 1); cmlenz@39: var params = queryString.split('&'); cmlenz@39: for (var p in params) { cmlenz@39: var param = params[p].split('='); cmlenz@39: if (param.length < 2) continue; cmlenz@39: if (param[0] == 'q' || param[0] == 'p') { // q= for Google, p= for Yahoo cmlenz@39: var query = unescape(param[1].replace(/\+/g, ' ')); cmlenz@39: if (query[0] == '!') query = query.slice(1); cmlenz@39: words = query.split(/(".*?")|('.*?')|(\s+)/); cmlenz@39: var words2 = new Array(); cmlenz@39: for (var w in words) { cmlenz@39: words[w] = words[w].replace(/^\s+$/, ''); cmlenz@39: if (words[w] != '') { cmlenz@39: words2.push(words[w].replace(/^['"]/, '').replace(/['"]$/, '')); cmlenz@39: } cmlenz@39: } cmlenz@39: return words2; cmlenz@39: } cmlenz@39: } cmlenz@39: return []; cmlenz@39: } cmlenz@39: cmlenz@39: function highlightWord(node, word, searchwordindex) { cmlenz@39: // If this node is a text node and contains the search word, highlight it by cmlenz@39: // surrounding it with a span element cmlenz@39: if (node.nodeType == 3) { // Node.TEXT_NODE cmlenz@39: var pos = node.nodeValue.toLowerCase().indexOf(word.toLowerCase()); cmlenz@39: if (pos >= 0 && !/^searchword\d$/.test(node.parentNode.className)) { cmlenz@39: var span = document.createElement("span"); cmlenz@39: span.className = "searchword" + (searchwordindex % 5); cmlenz@39: span.appendChild(document.createTextNode( cmlenz@39: node.nodeValue.substr(pos, word.length))); cmlenz@39: node.parentNode.insertBefore(span, node.parentNode.insertBefore( cmlenz@39: document.createTextNode(node.nodeValue.substr(pos + word.length)), cmlenz@39: node.nextSibling)); cmlenz@39: node.nodeValue = node.nodeValue.substr(0, pos); cmlenz@39: return true; cmlenz@39: } cmlenz@39: } else if (!node.nodeName.match(/button|select|textarea/i)) { cmlenz@39: // Recurse into child nodes cmlenz@39: for (var i = 0; i < node.childNodes.length; i++) { cmlenz@39: if (highlightWord(node.childNodes[i], word, searchwordindex)) i++; cmlenz@39: } cmlenz@39: } cmlenz@39: return false; cmlenz@39: } cmlenz@39: cmlenz@39: var words = getSearchWords(document.URL); cmlenz@39: if (!words.length) words = getSearchWords(document.referrer); cmlenz@39: if (words.length) { cmlenz@39: for (var w in words) { cmlenz@39: if (words[w].length) highlightWord(div, words[w], w); cmlenz@39: } cmlenz@39: } cmlenz@39: } cmlenz@39: cmlenz@39: function enableControl(id, enabled) { cmlenz@39: if (typeof(enabled) == "undefined") enabled = true; cmlenz@39: var control = document.getElementById(id); cmlenz@39: if (!control) return; cmlenz@39: control.disabled = !enabled; cmlenz@39: var label = getAncestorByTagName(control, "label"); cmlenz@39: if (label) { cmlenz@39: label.className = enabled ? "enabled" : "disabled"; cmlenz@39: } else { cmlenz@39: var labels = document.getElementsByTagName("label"); cmlenz@39: for (var i = 0; i < labels.length; i++) { cmlenz@39: if (labels[i].htmlFor == id) { cmlenz@39: labels[i].className = enabled ? "enabled" : "disabled"; cmlenz@39: break; cmlenz@39: } cmlenz@39: } cmlenz@39: } cmlenz@39: } cmlenz@39: cmlenz@39: function addHeadingLinks(container) { cmlenz@39: var base = document.location.pathname; cmlenz@39: function addLinks(elems) { cmlenz@39: for (var i = 0; i < elems.length; i++) { cmlenz@39: var hn = elems[i]; cmlenz@39: if (hn.id) { cmlenz@39: var link = document.createElement('a'); cmlenz@39: link.href = base + '#' + hn.id; cmlenz@39: link.className = 'anchor'; cmlenz@39: link.title = "Link to this section"; cmlenz@39: link.appendChild(document.createTextNode(" \u00B6")); cmlenz@39: hn.appendChild(link); cmlenz@39: } cmlenz@39: } cmlenz@39: } cmlenz@39: for (var lvl = 0; lvl <= 6; lvl++) { cmlenz@39: addLinks(container.getElementsByTagName('h' + lvl)); cmlenz@39: } cmlenz@39: }