// Apache server-status user script
// version 1.2
// 2006-10-19
// Copyright (c) 2006, Henri Bourcereau
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Apache server-status", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name Apache server-status
// @namespace http://mmai.websiteburo.com/
// @description Enhance Apache server-status pages
// @include http://*/server-status*
// @include https://*/server-status*
// @include http://*/ovh-status*
// @include https://*/ovh-status*
// ==/UserScript==
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
function addGlobalJavascript(js) {
var head, javascript;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
javascript = document.createElement('script');
javascript.setAttribute('language', 'javascript');
javascript.innerHTML = js;
head.appendChild(javascript);
}
function getText(node) {
var letexte="";
var children = node.childNodes;
for (var i = 0; i < children.length; i++) {
if (children[i].nodeType == 3) { // Text node
letexte = letexte+children[i].nodeValue;
}
else {
letexte = letexte + getText(children[i]) ;
}
if (children[i] == children[i].parentNode.lastChild) {
return letexte;
}
}
}
//On specifie un style pour la table des slots
var tableElement = document.getElementsByTagName('table')[0];
tableElement.setAttribute('class', 'sortable')
tableElement.setAttribute('id', 'stats')
var listeth;
//Si version originale avec des th
listeth = tableElement.getElementsByTagName('th');
for (i=0; i<listeth.length; i++){
listeth[i].setAttribute('class', 'tab');
}
//Sinon : il faut d'abord remplacer les td par des th
if (listeth.length == 0){
lignetr = tableElement.getElementsByTagName('tr')[0];
listetd = lignetr.getElementsByTagName('td');
var trElement = document.createElement('tr');
var tdElement;
var stri = "";
for (var i=0; i<listetd.length; i++){
tdElement = listetd[i];
var newElement = document.createElement('th')
newElement.setAttribute('class', 'tab');
var texteElement = document.createTextNode(getText(tdElement));
newElement.appendChild(texteElement);
trElement.appendChild(newElement);
}
lignetr.parentNode.replaceChild(trElement, lignetr);
}
//On applique les styles
addGlobalStyle('BODY,TD,TH,P{font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10pt;} TD {background:#FFFFFF; padding:2px;} PRE {font-family: Courier, Courier New; letter-spacing:2pt;} TD.numeric {text-align:right;} TD.centered {text-align:center;} table.sortable a.sortheader {background-color:#eee; color:#666666;font-weight: bold;text-decoration: none; display: block;} table.sortable span.sortarrow {color: black;text-decoration: none;} a.bouton {float: right;color: #000000;font-size:12px;font-family:verdana;font-weight:bold;text-decoration: none;border:4px outset darkgray;background-color:lightgray;display: block;padding: 3px 5px;margin: 1px;}a.bouton:hover {background-color: gray;color:#000000;padding-left:4px;border:4px inset darkgray;}');
//On rafraichit la page toutes les 5 secondes
window.toggleRefresh = function(){
if (window.letimeout){
window.clearTimeout(window.letimeout);
window.lienStop.innerHTML='<font color="green">Enable reloads</font>';
window.letimeout = 0;
}
else{
window.letimeout = window.setTimeout( "window.location.reload()", 5000);
window.lienStop.innerHTML='<font color="red">Disable reloads</font>';
}
}
window.letimeout = window.setTimeout( "window.location.reload()", 5000);
//Lien pour annuler le rafraichissement
window.lienStop = document.createElement('a');
//window.lienStop.setAttribute('onClick', 'window.toggleRefresh();');
window.lienStop.addEventListener("click", window.toggleRefresh, true);
window.lienStop.setAttribute('class', 'bouton');
window.lienStop.innerHTML='<font color="red">Disable reloads</font>';
//On ajoute le lien apres le titre
var titre;
titre = document.getElementsByTagName('h1')[0];
if (titre) {
titre.parentNode.insertBefore(window.lienStop, titre.nextSibling);
}
//On insere la bibliotheque de sorttable.js (http://www.kryogenix.org/code/browser/sorttable/) modifiee par Frank Ralf
addGlobalJavascript("sortTables();\n\nfunction sortTables() {\n if (!document.getElementsByTagName) return;\n var tbls = document.getElementsByTagName(\"table\");\n \n for (var ti=0;ti<tbls.length;ti++) {\n var thisTbl = tbls[ti];\n if (((' '+thisTbl.className+' ').indexOf(\"sortable\") != -1) && (thisTbl.id)) {\n ts_makeSortable(thisTbl);\n }\n }\n}\n\nfunction ts_makeSortable (table) {\n if (table.rows && table.rows.length > 0) {\n var firstRow = table.rows[0];\n }\n if (!firstRow) return;\n \n for (var i=0;i<firstRow.cells.length;i++) {\n var cell = firstRow.cells[i];\n var txt = ts_getInnerText(cell);\n\n cell.innerHTML = '<a href=\"#\" class=\"sortheader\" column=\"'+i+'\">'+txt+'<span class=\"sortarrow\"> </span></a>';\n\n elmLinks = cell.getElementsByTagName(\"a\")\n elmLinks[0].addEventListener(\n 'click', \n function(event){\n var lnk = event.target\n var col = lnk.getAttribute('column')\n ts_resortTable(lnk, col) \n }, \n false)\n }\n}\n\n\nfunction ts_getInnerText(el) {\n if (typeof el == \"string\") return el;\n if (typeof el == \"undefined\") { return el };\n if (el.innerText) return el.innerText;\n var str = \"\";\n \n var cs = el.childNodes;\n var l = cs.length;\n for (var i = 0; i < l; i++) {\n switch (cs[i].nodeType) {\n case 1: \n str += ts_getInnerText(cs[i]);\n break;\n case 3:\n str += cs[i].nodeValue;\n break;\n }\n }\n return str;\n}\n\nfunction ts_resortTable(lnk) {\n\n var span;\n for (var ci=0;ci<lnk.childNodes.length;ci++) {\n if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];\n }\n var spantext = ts_getInnerText(span);\n var td = lnk.parentNode;\n var column = td.cellIndex;\n var table = getParent(td,'TABLE');\n\n if (table.rows.length <= 1) return;\n var itm = ts_getInnerText(table.rows[1].cells[column]);\n sortfn = ts_sort_caseinsensitive;\n if (itm.match(/^\\d\\d[\\/-]\\d\\d[\\/-]\\d\\d\\d\\d$/)) sortfn = ts_sort_date;\n if (itm.match(/^\\d\\d[\\/-]\\d\\d[\\/-]\\d\\d$/)) sortfn = ts_sort_date;\n if (itm.match(/^[$]/)) sortfn = ts_sort_currency;\n if (itm.match(/^[\\d\\.]+$/)) sortfn = ts_sort_numeric;\n SORT_COLUMN_INDEX = column;\n var firstRow = new Array();\n var newRows = new Array();\n for (i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }\n for (j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }\n\n newRows.sort(sortfn);\n\n if (span.getAttribute(\"sortdir\") == 'down') {\n ARROW = ' ↑';\n newRows.reverse();\n span.setAttribute('sortdir','up');\n } else {\n ARROW = ' ↓';\n span.setAttribute('sortdir','down');\n }\n \n\n for (i=0;i<newRows.length;i++) { if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) table.tBodies[0].appendChild(newRows[i]);}\n\n for (i=0;i<newRows.length;i++) { if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) table.tBodies[0].appendChild(newRows[i]);}\n \n\n var allspans = document.getElementsByTagName(\"span\");\n for (var ci=0;ci<allspans.length;ci++) {\n if (allspans[ci].className == 'sortarrow') {\n if ( getParent(allspans[ci],\"table\") == getParent(lnk,\"table\")) {\n allspans[ci].innerHTML = ' ';\n }\n }\n }\n \n span.innerHTML = ARROW;\n}\n\nfunction getParent (el, pTagName) {\n if (el == null) return null;\n else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) \n return el;\n else\n return getParent(el.parentNode, pTagName);\n}\nfunction ts_sort_date(a,b) {\n\n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);\n if (aa.length == 10) {\n dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);\n } else {\n yr = aa.substr(6,2);\n if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }\n dt1 = yr+aa.substr(3,2)+aa.substr(0,2);\n }\n if (bb.length == 10) {\n dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);\n } else {\n yr = bb.substr(6,2);\n if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }\n dt2 = yr+bb.substr(3,2)+bb.substr(0,2);\n }\n if (dt1==dt2) return 0;\n if (dt1<dt2) return -1;\n return 1;\n}\n\nfunction ts_sort_currency(a,b) { \n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n return parseFloat(aa) - parseFloat(bb);\n}\n\nfunction ts_sort_numeric(a,b) { \n aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));\n if (isNaN(aa)) aa = 0;\n bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); \n if (isNaN(bb)) bb = 0;\n return aa-bb;\n}\n\nfunction ts_sort_caseinsensitive(a,b) {\n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();\n if (aa==bb) return 0;\n if (aa<bb) return -1;\n return 1;\n}\n\nfunction ts_sort_default(a,b) {\n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);\n if (aa==bb) return 0;\n if (aa<bb) return -1;\n return 1;\n}\n\n\nfunction addEvent(elm, evType, fn, useCapture)\n\n{\n if (elm.addEventListener){\n elm.addEventListener(evType, fn, useCapture);\n return true;\n } else if (elm.attachEvent){\n var r = elm.attachEvent(\"on\"+evType, fn);\n return r;\n } else {\n alert(\"Handler could not be removed\");\n }\n} \n");