/* -*- javascript -*-
Copyright 2006-2008 Dr. Detlef Groth, Schwielowsee, Germany.
License: http://creativecommons.org/licenses/LGPL/2.1/
System        : JSCOMPONENTS_INIT_JS :
Created By    : Dr. Detlef Groth, Schwielowsee, Germany
Last Modified : <110527.1302>
ID            : $Id: jsComponents.js,v 1.45 2006/05/11 10:57:43 dgroth Exp $
Source        : $Source: /cygdrive/d/cvs/jsComponents/css-js/jsComponents.js,v $
$Log: jsComponents.js,v $
Description	
Notes
*/
/* http://www.delphifaq.com/faq/f1031.shtml */
String.prototype.trim = function () {
return this.replace(/^\s*/, "").replace(/\s*$/, "");
}
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
/* Event Utilities */
function evtGetTarget(evt) {
var elem;
if (evt.target) {
elem = (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target;
} else {
elem = evt.srcElement;
}
return elem;
}
/*
more efficient to construct the functions ones
Thanks to Dean Edwards http://dean.edwards.name/
*/
var evtAdd;
if (document.addEventListener) {
evtAdd = function(element, type, handler) {
element.addEventListener(type, handler, null);
};
} else if (document.attachEvent) {
evtAdd = function(element, type, handler) {
element.attachEvent("on" + type, handler);
};
} else {
alert("Your browser is not supported!");
}
/* XMLHttpRequestLoader - Class */
function XMLHttpRequestLoader () {
var xmlhttp = false;
if (typeof(XMLHttpRequest) != "undefined") {
xmlhttp = new XMLHttpRequest();
} else {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (ev0) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (ev1) {
xmlhttp = false;
}
}
}
this.loadXML = loadXML;
this.loadText = loadText;
this.loadIEText = loadIEText;
function loadText(url,cb,targetNode) {
if (typeof(XMLHttpRequest) != "undefined") {
loadMozText(url,cb,targetNode);
} else if (xmlhttp) {
loadIEText(url,cb,targetNode);
} else {
alert("Browser not supported or JavaScript or ActiveX (IE) is not enabled!");
}
}
function loadXML(url,cb,targetNode) {
if (typeof(XMLHttpRequest) != "undefined") {
load(url,cb,targetNode);
} else if (xmlhttp) {
loadIE(url,cb,targetNode);
} else {
alert("Browser not supported or JavaScript or ActiveX (IE) is not enabled!");
}
}
function load(srcUrl,cb,targetNode) {
var req = new XMLHttpRequest();
req.overrideMimeType('text/xml');
req.open("GET", srcUrl, true);
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (cb && targetNode) {
cb(req.responseXML, targetNode);
} else if (cb) {
cb(req.responseXML);
}
}
};
req.setRequestHeader('Content-Type', 'text/xml');
req.setRequestHeader('Cache-Control', 'no-cache');
req.send(null);
}
function loadMozText(srcUrl,cb,targetNode) {
var req = new XMLHttpRequest();
req.open("GET", srcUrl, true);
req.onreadystatechange = function() {
if (req.readyState == 4) {
var xmlText = req.responseText;
xmlText = xmlText.replace(/<\/html>/,"");
xmlText = xmlText.slice(xmlText.indexOf("<body>"));
xmlText = xmlText.replace(/<\/?body>/g,"");
if (cb && targetNode) {
cb(xmlText, targetNode);
} else if (cb) {
cb(xmlText);
}
}
};
req.setRequestHeader('Cache-Control', 'no-cache');
req.send(null);
}
function loadIE(srcUrl,cb,targetNode) {
xmlhttp.open("GET", srcUrl);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (cb) {
var xmlObj = xmlhttp.responseXML;
if(!xmlObj.hasChildNodes) {
xmlObj = new ActiveXObject("Msxml2.DOMDocument");
var xmlText = xmlhttp.responseText;
xmlText = xmlText.replace(/<\/html>/,"");
xmlText = xmlText.slice(xmlText.indexOf("<body>"));
xmlObj.loadXML(xmlText);
if (cb && targetNode) {
cb(xmlObj, targetNode);
} else {
cb(xmlObj);
}
} else {
if (cb && targetNode) {
cb(xmlhttp.responseXML, targetNode);
} else {
cb(xmlhttp.responseXML);
}
}
}
}
};
xmlhttp.setRequestHeader('Content-Type', 'text/xml');
xmlhttp.setRequestHeader('Cache-Control', 'no-cache');
xmlhttp.send(null);
}
function loadIEText(srcUrl,cb,targetNode) {
xmlhttp.open("GET", srcUrl);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (cb) {
var xmlText = xmlhttp.responseText;
xmlText = xmlText.replace(/<\/html>/,"");
xmlText = xmlText.slice(xmlText.indexOf("<body>"));
xmlText = xmlText.replace(/<\/?body>/g,"");
if (cb && targetNode) {
cb(xmlText, targetNode);
} else {
cb(xmlObj);
}
}
}
};
xmlhttp.setRequestHeader('Cache-Control', 'no-cache');
xmlhttp.send(null);
}
}
function jsComponent (node) {
try {
eval("mfunc = "+node.className+";");
mfunc(node);
} catch (ev) {}
}
window.onload = function() {
var divs = document.getElementsByTagName("DIV");
/* divs.length is ineffective but robust against adding new divs at runtime */
for (var i = 0 ; i < divs.length ; i++) {
if (divs.item(i).className && divs.item(i).className.match(/JS.+/)) {
var comp = new jsComponent(divs.item(i));
}
}
}
var maxZ = 100;
function JSDragArea (element) {
this.grabDown = grabDown;
this.grabClick = grabClick;
evtAdd(element,"mousedown",this.grabDown);
evtAdd(element,"mouseclick",this.grabClick);
/*    var dw = new DebugWindow();*/
function grabClick(e) {
e=e||window.event;
var node = evtGetTarget(e);
if (node.style.zIndex != maxZ) {
maxZ++;
node.style.zIndex = maxZ;
}
}
function grabDown(e) {
e=e||window.event;
var node = evtGetTarget(e);
if (node.style.zIndex != maxZ) {
maxZ++;
node.style.zIndex = maxZ;
}
var clientX0 = e.clientX;
var clientY0 = e.clientY;
var top=node.style.top;
var left=node.style.left;
window.document.onmousemove = function (e) {
var deltaX; var deltaY;
e=e||window.event;
deltaX = e.clientX - clientX0;
deltaY = e.clientY - clientY0;
node.style.left = parseInt(left)+parseInt(deltaX) + "px";
node.style.top =  parseInt(top)+parseInt(deltaY) + "px";
};
window.document.ondragstart = function(){return false};
window.document.onmouseup = function(e) {
this.onmousemove = null;
this.onmouseup = null;
this.ondragstart = null;
};
}
}



function JSDynContent(div) {
var dsrc=div.getAttribute("datasrc");
this.loadSource = loadSource;
var src = null ;
evtAdd(div, "click", this.loadSource);   
function initializeResult(response,el) {
el.innerHTML=response;
var divs = el.getElementsByTagName("DIV") ;
el.style.cursor = 'auto';
for (var i = 0 ; i < divs.length ; i++) {
if (divs.item(i).className && divs.item(i).className.match(/JS.+/)) {
var comp = new jsComponent(divs.item(i));
}
}
src.style.cursor = 'pointer';
}
function loadSource(e) {
e=e||window.event;
var element = evtGetTarget(e);
var dsrc=element.getAttribute("datasrc");
var items = dsrc.split(",");
var target=document.getElementById(items[1]);
element.style.cursor = 'wait' ;
target.style.cursor = 'wait';
var loader = new XMLHttpRequestLoader;
src=element ;
loader.loadText(items[0],initializeResult,target)
}
}
function JSDynListAbbr (element) {
var parent = element.parentNode;
var abbrs = parent.getElementsByTagName("abbr");
var targetList = document.createElement("dl");

var l = abbrs.length;   
var resList = new Array();
for (var x = 0 ; x < l ; x++) {
rx = /(.+)\((.+)\)/;
res = rx.exec(abbrs.item(x).innerHTML.replace(/[\n\r]/g," "));
if (res) {
resList.push(""+RegExp.$2+":::"+RegExp.$1);
}
}
resList.sort();
l = resList.length;
for (var x = 0 ; x < l ; x++) {
var arr = resList[x].split(":::");
var dt = document.createElement("dt");
dt.appendChild(document.createTextNode(arr[0]));
var dd = document.createElement("dd");
dd.appendChild(document.createTextNode(arr[1]));
targetList.appendChild(dt);
targetList.appendChild(dd);
}
element.appendChild(targetList) ;
}
function JSDynListDfn (element) {
var parent = element.parentNode;
var dfns = parent.getElementsByTagName("dfn");
var targetList = document.createElement("dl");

var l = dfns.length;   

var resList = new Array();
for (var x = 0 ; x < l ; x++) {
rx = /(.+) - (.+)/mg;
text = dfns.item(x).innerHTML.replace(/[\r\n]/g, " ");
res = rx.exec(text);
if (res) {
resList.push(""+RegExp.$1+":::"+RegExp.$2);
}
}
resList.sort();
l = resList.length;
for (var x = 0 ; x < l ; x++) {
var arr = resList[x].split(":::");
var dt = document.createElement("dt");
dt.appendChild(document.createTextNode(arr[0]));
var dd = document.createElement("dd");
dd.appendChild(document.createTextNode(arr[1]));
targetList.appendChild(dt);
targetList.appendChild(dd);
}
element.appendChild(targetList) ;
}
function JSDynListLink (element) {
var parent = element.parentNode;
var ls = parent.getElementsByTagName("a");
var targetList = document.createElement("ol");
var l = ls.length;
var y = 0 ;
for (var x = 0 ; x < l ; x++) {
if (ls.item(x).getAttribute("href") && ls.item(x).getAttribute("href").match(/^http:/)) {
var as = targetList.getElementsByTagName("a") ;
var found = 0 ;
for (var z = 0 ; z < as.length ; z++) {
if (as.item(z).getAttribute("href") == ls.item(x).getAttribute("href")) {
ls.item(x).innerHTML = z+1 ;
found = 1 ;
break;
}
}
if (found == 0) {
var li = document.createElement("li");
var a = document.createElement("a");
y = y +1 ;
a.setAttribute("href", ls.item(x).getAttribute("href"));
a.appendChild(document.createTextNode(ls.item(x).getAttribute("href")));
li.appendChild(document.createTextNode(ls.item(x).innerHTML+ " "));
li.appendChild(a);
targetList.appendChild(li);
ls.item(x).innerHTML = ""+y ;
}
}
}
element.appendChild(targetList);
}
function JSDynListRef (element) {
var parent= element.parentNode;
var ol = element.getElementsByTagName("ol")[0];

var lliste = ol.getElementsByTagName("li");
if (lliste && lliste.length > 0) {
var cites = parent.getElementsByTagName("cite");
for (var x = 0 ; x < cites.length; x++) {
var cites_text = "" ;
var refs = cites.item(x).innerHTML.split(",");
for (var y = 0 ; y < refs.length; y++) {
for (var z = 0 ; z < lliste.length; z++) {
if (lliste.item(z).getAttribute("id") && 
lliste.item(z).getAttribute("id") == refs[y]) {

if (cites_text != "") {
cites_text = cites_text+","
}
cites_text = cites_text+""+(z+1);
}	
}

}
cites.item(x).innerHTML = cites_text;
}
}
}
JSDynListToc.counter=0;
function JSDynListToc (element) {
JSDynListToc.counter++;
var lastArray = new Array(4);
var next = element.nextSibling;
var targetList = document.createElement("ul");
var x = 1 ;
var lastidx = 0;
while (next) {
	if (next.tagName &&  next.tagName.match(/h([1-4])/i)) {
var idx = RegExp.$1 ;
var pidx = idx-1;
var name = "test";
var as = next.getElementsByTagName("a");
var alink =document.createElement("a");
if (as.length > 0 && as.item(0).getAttribute("name")) {
name = as.item(0).getAttribute("name");
} else {
var a = document.createElement("a");
name = "dynlistoc"+JSDynListToc.counter+"x"+x++ ;
a.setAttribute("name",name);
a.setAttribute("id",name);
next.appendChild(a);


}
alink.setAttribute("href", "#"+name);
var li = document.createElement("li");  
li.appendChild(alink);
alink.appendChild(document.createTextNode(next.innerHTML.replace(/<.+?>/g,"")));
if (idx > 1 && lastArray[pidx]) {
if (idx > lastidx) {
var ul = document.createElement("ul");
ul.appendChild(li);
lastArray[pidx].appendChild(ul);
lastArray[idx] = ul ;
} else if (idx == lastidx) {
lastArray[idx].appendChild(li);
} else {
lastArray[pidx].appendChild(li);
}
} else {
targetList.appendChild(li);
lastArray[idx] = targetList ;

}
lastidx = idx;

}
next = next.nextSibling;
}
element.appendChild(targetList);
}
/*var el = document.getElementById("toc");*/
/*el.innerHTML = "" ;*/
/*JSDynListToc(el);*/
function JSFormInputInteger (el) {
var input = el.getElementsByTagName("input").item(0);
input.onkeypress = function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
if (charCode> 57 || charCode == 40 || charCode == 41 || charCode == 44 || charCode == 46 || charCode == 32) {
return false;
}
/* && /[A0-9]/.test(charStr) */
};
}
function JSFormInputFloat (el) {
var input = el.getElementsByTagName("input").item(0);
input.onkeypress = function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
if (charCode> 57 || charCode == 44 || charCode == 32) {
return false;
}
/* && /[A0-9]/.test(charStr) */
};
}
function JSFormInputIntegers (el) {
var input = el.getElementsByTagName("input").item(0);
input.onkeypress = function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
if (charCode> 57 || charCode == 46) {
return false;
}
/* && /[A0-9]/.test(charStr) */
};
}
function JSFormInputFloats (el) {
var input = el.getElementsByTagName("input").item(0);
input.onkeypress = function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
if (charCode> 57) {
return false;
}
/* && /[A0-9]/.test(charStr) */
};
}
function JSFormInputName (el) {
var input = el.getElementsByTagName("input").item(0);
input.onkeypress = function(evt) {
evt = evt || window.event;
var charCode = evt.which || evt.keyCode;
var charStr = String.fromCharCode(charCode);
if (charCode == 40 || charCode == 41 || (charCode > 46 && charCode< 58)) {
return false;
}
/* && /[A0-9]/.test(charStr) */
};
}
function JSFormInputEmail (el) {
var inp=el.getElementsByTagName("input").item(0);
this.onChange=onChange;
evtAdd(inp,"change",this.onChange);
function onChange (evt) {
target=evtGetTarget(evt);
val=target.value;
val=val.trim()
target.value=val
if (!val.match(/^[-A-Za-z0-9\.]+@[-a-z0-9\.]+?\.[a-z]+$/)) {
alert("Only valid email adresses allowed! You entered: '"+target.value+"'");
target.focus();
} 
}
}
function JSSearchList (element) {
this.keyup = keyup;
var div = window.document.createElement("div");
var text = window.document.createTextNode("Search: ");
div.className = "input";
div.appendChild(text);
var input = window.document.createElement("input");
input.setAttribute("name", "inputvalue");
input.setAttribute("type", "text");
evtAdd(input, "keyup", this.keyup);
div.appendChild(input);
element.insertBefore(div, element.firstChild);
element.style.listStylePosition = "outside";
function keyup(e) {
var input = evtGetTarget(e);
var element = input.parentNode.parentNode;
var links = element.getElementsByTagName("A");
var  m = input.value;
if (e.keyCode == 13) {
for (var i = 0 ; i < links.length; i++) {
if (links[i].parentNode.style.display == "") {
if ((links[i].getAttribute("target") == "" ||
links[i].getAttribute("target") == null) &&
(window.document.getElementsByTagName("BASE").item(0) == null ||
window.document.getElementsByTagName("BASE").item(0).getAttribute("target") == null ||
window.document.getElementsByTagName("BASE").item(0).getAttribute("target") == ""))
{
window.location.href = links[i].getAttribute("href");
} else {
if (links[i].getAttribute("target") != null && links[i].getAttribute("target") != "") {
eval("parent.frames."+links[i].getAttribute("target")+".location.href = '"+links[i].getAttribute("href")+"';");
} else {
eval("parent.frames."+window.document.getElementsByTagName("BASE").item(0).getAttribute("target")+".location.href = '"+links[i].getAttribute("href")+"';");
}
}
break;
}
}
} else {
var found = 0;
if (m == "") {
for (var i = 0 ; i < links.length; i++) {
links[i].parentNode.style.display ="";
if (found == 0) {
links[i].parentNode.style.backgroundColor = "#dddddd";
} else {
links[i].parentNode.style.backgroundColor = "white";
}
found ++;
}
} else {
for (var i = 0 ; i < links.length; i++) {
if (links[i].firstChild.data.match(eval("/^"+m+"/i"))) {
links[i].parentNode.style.display ="";
if (found == 0) {
links[i].parentNode.style.backgroundColor = "#dddddd";
} else {
links[i].parentNode.style.backgroundColor = "white";
}
found ++;
} else {
links[i].parentNode.style.display ="none";
links[i].parentNode.style.backgroundColor = "white";
}
}
}
}
}
}
/*function debug (txt) {
deb=document.getElementById("debug");
if (deb) {
deb.innerHTML=deb.innerHTML+"\n"+txt;
} else {
deb=document.createElement("pre");
document.body.appendChild(deb);
deb.createAtrribute("debug");
deb.setAtrribute("id","debug");
deb.innerHTML=txt;
}
}*/
function JSSelectsCombined (el) {
this.optionChange=optionChange;
this.optionChangeSecond=optionChangeSecond;
var selects=el.getElementsByTagName("select");
evtAdd(selects.item(0),"change",this.optionChange);
if (selects.length == 3) {
evtAdd(selects.item(1),"change",this.optionChangeSecond);
}
selects.item(0).selectedIndex=0;
var selects2=selects.item(1).innerHTML;
var options2=new Array;
var options3 = new Array;
for (var j = 1; j < selects.length;j++) {
sibling=selects.item(j);
options=sibling.getElementsByTagName("option");
sibling.selectedIndex=0;
for (var i = options.length-1; i>0;i--) {
if (j ==1) {
options2.push(sibling.removeChild(options.item(i)));
}
if (j ==2) {
options3.push(sibling.removeChild(options.item(i)));
}
}
}
function optionChangeSecond (evt) {
target=evtGetTarget(evt);
options=target.getElementsByTagName("option");
idxB=target.selectedIndex;
siblingBefore=target.parentNode.getElementsByTagName("select").item(0);
idxA=siblingBefore.selectedIndex;
siblingAfter=target.parentNode.getElementsByTagName("select").item(2);
options=siblingAfter.getElementsByTagName("option");
for (var i = options.length-1; i>0;i--) {
siblingAfter.removeChild(options.item(i));
}
siblingAfter.selectedIndex=0;
currIdxA=1;
currIdxB=1;
for (var i = options3.length-1;i>=0;i--) {
if (options3[i].innerHTML.match(/^-+$/)) {
currIdxA=currIdxA+1;
currIdxB=1;
continue;
}
if (options3[i].innerHTML.match(/^\s*$/)) {
currIdxB=currIdxB+1;
continue;
}
if (currIdxA == idxA && currIdxB==idxB) {
siblingAfter.appendChild(options3[i]);
}
}
}
function optionChange (evt) {
target=evtGetTarget(evt);
options=target.getElementsByTagName("option");
idx=target.selectedIndex;
selects=target.parentNode.getElementsByTagName("select");
opt2=selects.item(1).getElementsByTagName("option");
for (var i = opt2.length-1; i>0;i--) {
selects.item(1).removeChild(opt2.item(i));
}
currIdx=1;
for (var i = options2.length-1; i>= 0;i--) {
if (options2[i].innerHTML.match(/^\s*$/)) {
currIdx=currIdx+1;
continue;
}
if (currIdx == idx) {
selects.item(1).appendChild(options2[i]);
}
if (currIdx>idx) {
break
}
}
selects.item(1).selectedIndex=0;
if (selects.item(2)) {
selects.item(2).selectedIndex=0;
options=selects.item(2).getElementsByTagName("option");
for (var i = options.length-1; i>0;i--) {
siblingAfter.removeChild(options.item(i));
}
}
}
}
function JSTabBox (element) {
var ie5 = document.all && 
document.getElementById && 
navigator.userAgent.toLowerCase().indexOf('opera')==-1?1:0 ;

this.raiseTab = raiseTab ;
evtAdd(element, "click", this.raiseTab); 
var div = document.createElement("DIV") ;

div.setAttribute("nowrap","true");


element.insertBefore(div,element.firstChild) ;
var ul = document.createElement("UL");
div.appendChild(ul);
var panels = element.getElementsByTagName("DIV") ;
if (panels.item(1).getAttribute("title") == "N") {
div.className = "JSTabNumbers" ;
} else {
div.className = "JSTabs" ;
}
var k = 0 ;
var curr = 0 ;
for (var j = 0 ; j < panels.length ; j++) {

if (panels.item(j).className == "JSTabPanel" && 
panels.item(j).parentNode == element && panels.item(j).getAttribute("title")) {
var li = document.createElement("LI");
if (panels.item(j).getAttribute("current")) {
if (panels.item(j).getAttribute("current") == "true") {
li.className = "current" ;
curr = k ;
}
}
var t ;
if (div.className == "JSTabs") {
t = document.createTextNode(" "+panels.item(j).getAttribute("title")+" ");
} else {
t = document.createTextNode(" "+(k+1)+" ");
}
panels.item(j).removeAttribute("title");
li.appendChild(t);
li.style.cursor = (ie5 ? "hand" : "pointer") ; 
ul.appendChild(li);
k++ ;
}
}
ul.getElementsByTagName("LI").item(curr).className = "current" ;
ul.getElementsByTagName("LI").item(curr).pointer = "" ;
if (k == 1) {
div.style.display="none";
}
showPanel(element, curr);
function showPanel (parent,index) {
var child = parent.firstChild ;
var  curr = 0 ; 
while (child != null) {
if (child.className == "JSTabPanel") {
if (index == curr) {
child.style.display = "block" ;
} else {
child.style.display = "none" ;
}
curr++ ;
}
child = child.nextSibling ;
}
}
function getIndex (el) {
var idx = 0 ;
var sibling  = el.previousSibling ; 
while (sibling != null)  {
if (sibling.nodeName == el.nodeName) {
idx++ ;
}
sibling = sibling.previousSibling ;
}
return idx ;
}
function raiseTab (e) {
e=e||window.event;
var node = evtGetTarget(e);
var parent = node.parentNode ;
if (parent.parentNode.className != "JSTabs" && parent.parentNode.className != "JSTabNumbers") { return }
var a= parent.getElementsByTagName("LI");
for (var x = 0 ; x < a.length ; x++) {
a[x].className = "" ;
a[x].style.cursor = (ie5 ? "hand" : "pointer") ;
}
node.className= "current" ;
node.style.cursor = "" ;
var index = getIndex(node) ;
showPanel(node.parentNode.parentNode.parentNode, index);
}
}
function JSTableFilter (div) {
this.keyup = keyup;
this.ie = navigator.appName.search(/Internet Explorer/) > 0
var start = new Date().getTime();
var ths = div.getElementsByTagName("th");
this.tbody = div.getElementsByTagName("tbody")[0]
this.trs = tbody.getElementsByTagName("tr");
for (var i = 0 ; i< ths.length; i++) {
var inputs=ths.item(i).getElementsByTagName("input");
var input= null;
var div=null;
if (inputs.length==1) {
input=inputs.item(0);
} else {
if (ths.item(i).className != "ignore") {
div = window.document.createElement("div");
div.className = "input";
input = document.createElement("input");
div.appendChild(input);
ths.item(i).appendChild(div)
}
}
if (input) {
input.setAttribute("name", "inputvalue"+i);
input.setAttribute("type", "text");
evtAdd(input, "keyup", this.keyup);
}
}
if (ie) {
this.dta=new Array(trs.length);
this.rows=trs.length;
this.cols=tbody.getElementsByTagName("td").length/trs.length;
for (var i = 0 ; i < trs.length;i++) {
var tds=trs.item(i).getElementsByTagName("td");
this.dta[i] = new Array(tds.length);
for  (var j=0;j<tds.length;j++) {
this.dta[i][j]=tds.item(j).innerHTML;
}
}
} else {
tr = document.createElement("tr");
td=document.createElement("td");
td.setAttribute("colspan",ths.length);
tr.appendChild(td);
this.tbody.appendChild(tr);
}
function keyup(e) {
var start = new Date().getTime();
var input = evtGetTarget(e);
idx=input.getAttribute("name").substr(10,1)
val=input.value ; //getAttribute("value")
var patt = new RegExp("^"+val)
var founds = 0
if (window.event && window.event.keyCode) {
var key = window.event.keyCode
} else if (e.which) {
key=e.which
}
if (key!=13) {
return
}
if (ie) {
if(tbody.innerText) {
tbody.innerText="";
} else {
tbody.innerHTML="";
}
for (var i = 0 ; i < rows;i++) {
if(dta[i][idx] != null && patt.test(dta[i][idx])) {
var tr = document.createElement("tr");
for (var j =0 ; j < cols; j++) {
var td = document.createElement("td");
td.innerHTML=dta[i][j];
tr.appendChild(td);
}
tbody.appendChild(tr);
}
}
var tr  = document.createElement("tr");
for (var j =0 ; j < cols; j++) {
var td = document.createElement("td");
tr.appendChild(td);
if (j == 0) {
td.innerHTML= (new Date().getTime()-start+" milliseconds");
}
}
tbody.appendChild(tr);
} else {
tbody.style.display="none";
l=trs.length-1;
for (var i = 0; i < l;i++) {
tr=trs.item(i)
var inp=tr.getElementsByTagName("td")[idx];
txt=inp.innerHTML
if(patt.test(txt)) {
tr.style.display="";
founds = founds+1;
} else {
tr.style.display="none";
}
}
tds=trs.item(trs.length-1).getElementsByTagName("td");
tds.item(0).innerHTML=(new Date().getTime()-start+" milliseconds");
tbody.style.display="";
}
}
}
function JSFilterTable (div) {
JSTableFilter (div)
}
function JSTableStripe(div) {
var table = div.getElementsByTagName("table")[0];
var types = new Array("even","odd");
var trs = table.getElementsByTagName("tr");
for (var i = 0 ; i < trs.length ;i++) {
var mod = i % 2;
trs.item(i).className = types[mod];
}
}
function JSTableSort(div) {
var table = div.getElementsByTagName("table")[0];
var types = new Array();
var headers = table.getElementsByTagName('th');
var order = "asc";
var lastI = 100;
tr=table.getElementsByTagName("tr").item(0);
tds=tr.getElementsByTagName("th");
var widths=new Array()
for (var i= 0 ; i< tds.length;i++) {
widths[i]=getStyle(tds.item(i),"width")
}
for (var i = 0; i < headers.length;i++) {
types[i] = headers.item(i).className;
}
for (var i = 0; i < headers.length;i++) {
if (headers.item(i).className.match(/SortNumber/)) {
headers[i].onclick = build_sorter(table,i,"n");
} else if (headers.item(i).className.match(/SortString/)) {
headers[i].onclick = build_sorter(table,i,"s");
}
}
function sort_table (table,extract_fct,sort_fct) {
var clones = new Array();
var tbody = table.getElementsByTagName('tbody')[0];
var rows = tbody.getElementsByTagName('tr');
var l = rows.length;
for (var i = 0; i < l;i++) {
var r = rows[i];
var v = extract_fct(r);
clones[i] = {
value : v,
element : r
};
}
if (sort_fct) {
clones.sort(sort_fct);
} else {
clones.sort();
}
if (order == "asc") {
clones.reverse();
}
while(tbody.firstChild) {
tbody.removeChild(tbody.firstChild);
}
for (var i = 0; i < l; i++) {
tbody.appendChild(clones[i].element);
}
if (rows.item(0).className == "even" || rows.item(0).className == "odd") {
JSTableStripe(table.parentNode);
}
tr=table.getElementsByTagName("tr").item(0);
tds=tr.getElementsByTagName("td");
for (var i = 0 ; i < tds.length;i++) {
tds.item(i).style.width=widths[i];
}
}
function compare_numbers(a,b) {
return (a.value-b.value);
}
function compare_strings(a,b) {
a = a.value ; b = b.value;
if (""+a<""+b) return (-1);
if (""+a>""+b) return (1);
if (""+a==""+b) return (0);
}
function extract_string_ci (r,i) {
var text = r.getElementsByTagName('td')[i].innerHTML.toLowerCase();
text = text.replace(/<.+?>/g,"");
text=text.replace(/ö/,"o").replace(/ä/,"a").replace(/ü/,"u").replace(/ß/,"ss");
return String(text);
}
function extract_string_c (r,i) {
var text = r.getElementsByTagName('td')[i].innerHTML;
text = text.replace(/<.+?>/g,"");
return String(text);
}
function extract_number (r,i) {
var n = r.getElementsByTagName('td')[i].innerHTML;
return parseFloat(n);
}
function build_sorter(table,i,type) {
return function() {
var ths = table.getElementsByTagName("th");
if(ths.length==0) {
ths=table.parentNode.parentNode.getElementsByTagName("th");
}
for (var j = 0 ; j < ths.length;j++) {
ths.item(j).className = types[j];
}
if (order == 'desc' && lastI == 1) {
order = "asc";
ths.item(i).className=ths.item(i).className.replace(/ Sort(Asc|Desc)/,"");
ths.item(i).className=ths.item(i).className+" SortAsc";
} else {
ths.item(i).className=ths.item(i).className.replace(/ Sort(Asc|Desc)/,"");
ths.item(i).className=ths.item(i).className+" SortDesc";
order = "desc";
}
lastI = 1;
if(type == 'n') {
sort_table(
table,function(r) {
return extract_number(r,i);
},
compare_numbers
);
} else if (type == 's') {
sort_table(
table, function (r) {
return extract_string_ci(r,i);
},
compare_strings
);
}
}
}
}
function getStyle(oElm, strCssRule){
var strValue = "";
if(document.defaultView && document.defaultView.getComputedStyle){
strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
}
else if(oElm.currentStyle){
try{
strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
return p1.toUpperCase();
});
strValue = oElm.currentStyle[strCssRule];
}
catch(e){
}
	}
	return strValue;
}
function JSTableScrollable (el) {
thead=el.getElementsByTagName("thead").item(0);
thead.className="JSTheadScrollable";
tr=el.getElementsByTagName("tbody").item(0).getElementsByTagName("tr").item(0);
tableScroll=el.getElementsByTagName("table").item(0);
tableScroll.className="JSTableScrollable";
thead=thead.parentNode.removeChild(thead);
tableNew=document.createElement("table")
tableNew.appendChild(thead)
attrs=Array("width","cellpadding","cellspacing","border");
for (i in attrs) {
if (attrs[i]=="width") {
tableNew.setAttribute(attrs[i],tableScroll.getAttribute(attrs[i]));
} else {
tableNew.setAttribute(attrs[i],tableScroll.getAttribute(attrs[i]));
}
}
tableNew.className="JSTableScrollable";
el.parentNode.insertBefore(tableNew,el);
tableNew.style.width=parseInt(tableScroll.getAttribute("width"))
tableScroll.style.width=parseInt(tableScroll.getAttribute("width"))
ths=tableNew.getElementsByTagName("th");
tds=tr.getElementsByTagName("td")
for (var j = 0 ; j < 3 ; j++) {
for (var i= 0 ; i< tds.length;i++) {
/*        alert("New:TH="+getStyle(ths.item(i),"width"))*/
width=parseInt(getStyle(tds.item(i),"width"));
if (j==1) {
tds.item(i).style.width=width;
}
w=width+1+"px"
ths.item(i).style.width=w;
}
}
}
function JSTableEdit (el) {
var tbody = el.getElementsByTagName("tbody")[0];
this.cellClick=cellClick;
this.onBlurInput=onBlurInput;
this.lastInput=null;
var initData= { inputs : [] }
evtAdd(tbody, "click", this.cellClick);
var ins = tbody.getElementsByTagName("input");
for (var i = 0 ; i < ins.length;i++) {
evtAdd(ins.item(i),"blur",this.onBlurInput);
ins.item(i).style.display="none";
initData.inputs[ins.item(i).name]=ins.item(i).value
}
function onBlurInput (e) {
var inp = evtGetTarget(e);
inp.style.display="none";
if(!inp.nextSibling) {
inp.parentNode.appendChild(document.createTextNode(" "));
}
inp.parentNode.className="changed";
if (initData.inputs[inp.name] == inp.value) {
inp.parentNode.className="";
}
inp.nextSibling.data =inp.value;
this.lastInput=null;
}
function cellClick (e) {
var el = evtGetTarget(e);
inp=el.getElementsByTagName("input").item(0);
if (inp) {
if (this.lastInput) {
this.lastInput.style.display="none";
if(!this.lastInput.nextSibling) {
this.lastInput.parentNode.appendChild(document.createTextNode(" "));
}
this.lastInput.parentNode.className="changed";
if (initData.inputs[this.lastInput.name] == this.lastInput.value) {
this.lastInput.parentNode.className="";
}
this.lastInput.nextSibling.data =this.lastInput.value;
}
inp.style.display="";
if(!inp.nextSibling) {
inp.parentNode.appendChild(document.createTextNode(" "));
}
this.lastData=inp.nextSibling.data;
inp.nextSibling.data =""
this.lastInput=inp;
}
}
}
/* JSTTip-Class */
function JSTTip (varname,filename,t) {
var tipId ;
var lastTipId = "null" ;
var responseXML = false ;
var vname = varname ;
var file = filename ;
var timeout = t ;
var lastNode = null ;
var timeMulti = 2 ;
function getTooltip() {
/* tooltip construction */
var id = "ttip" ;
if (arguments[0]) { id = arguments[0]; }
var tooltip ;
if (!document.getElementById(id)) {
tooltip = document.createElement("DIV");
tooltip.visibility = "hidden" ;
tooltip.setAttribute("id", id);
document.body.appendChild(tooltip);
}  else {
tooltip = document.getElementById(id);
}
return tooltip ;
}
function getTTip (evt) {
/* event resolution and tip positioning */
var e = evt || window.event ;

var node = evtGetTarget(e);
var div = getTooltip() ;
if (node.className == "JSTTip" || node.className == "JSInlineTooltip") {
/*            alert(node);*/
if (e.stopPropagation) e.stopPropagation();
e.cancelBubble = true;


}

tipId = node.getAttribute("id");
window.setTimeout(''+vname+'.hideTTip()',timeout);
if (tipId) {
tipId = tipId.slice(0, 6);
}
if (window.pageXOffset || window.pageYOffset) {
x = window.pageXOffset+e.clientX ;
y = window.pageYOffset+e.clientY ;
} else if (document.documentElement.scrollTop || document.documentElement.scrollLeft) {
x = document.documentElement.scrollLeft+e.clientX ;
y = document.documentElement.scrollTop+e.clientY ;
} else {
x = document.body.scrollLeft+e.clientX ;
y = document.body.scrollTop+e.clientY ;
}
if (x > 500) {
x -= 250 ;
}
if (y > 300) {
y -= 30;
}
div.style.left = x+"px";
div.style.top = y+"px";
if (file == null) {
var spans = node.getElementsByTagName("span");
if (spans[0]) {
div.innerHTML = spans[0].innerHTML;
div.style.visibility = "visible" ;
}
} else if (node.className == "JSTTip" && !responseXML) {
div.style.visibility = "visible" ;
div.innerHTML = "Loading data ..." ;
var loader = new XMLHttpRequestLoader;
loader.loadXML(file,displayTTip);
} else if (node.className == "JSTTip") {
div.style.visibility = "visible" ;
div.innerHTML = "Loading data ..." ;
timeMulti = 1 ;
displayTTip(responseXML);
}
}
function displayTTip (response) {
if (!tipId) {
return;
}
responseXML=response ;
var divs = responseXML.getElementsByTagName("div");
for (var x = 0 ; x < divs.length ; x++) {
if (divs.item(x).getAttribute('id').search(tipId) >= 0) {
var div = getTooltip() ;
if (divs.item(x).innerHTML) {
div.innerHTML = divs.item(x).innerHTML;
} else if (divs.item(x).xml) {
div.innerHTML = divs.item(x).xml ;
}

break ;
}
}


}
function hideTTip() {
if (lastTipId == tipId) {
var div = getTooltip() ;
div.style.visibility = "hidden" ;
} else {
window.setTimeout(''+vname+'.hideTTip()',timeout*timeMulti);
}
lastTipId = tipId ;
}
function addEventsTTips () {
var spans = document.getElementsByTagName("span");
for (var i = 0 ; i< spans.length;i++) {
if(spans.item(i).className) {
if(spans.item(i).className == "JSTTip") {
evtAdd(spans.item(i),"mouseover",getTTip);
} else if (spans.item(i).className == "tip") {
evtAdd(spans.item(i).parentNode,"mouseover",getTTip);
}
}
}

}
this.hideTTip = hideTTip;
addEventsTTips();
}
var jstt ;
function JSToolTip (element) {
var path ;
var outtime ;
if (element.getAttribute("data") == null) {
alert("JSToolTip: error you need data attribute like so data='path/tips.xhtml,timout'!");
} else {
var text = element.getAttribute("data");
var items = text.split(",");
}
jstt = new JSTTip('jstt',items[0],items[1]);    
}
function JSInlineTooltip (div) {
jstt = new JSTTip('jstt',null,5000);
}
function JSCollapse(element) {
var c = new JSTree(element);
}
function JSTree (element) {
var lists = element.getElementsByTagName("LI") ;
this.toggleDisplay = toggleDisplay ;
this.expandcollapse = expandcollapse ;
this.hideAllSubLists = hideAllSubLists ;
this.listInit = listInit;
this.insertInclude = insertInclude;
evtAdd(element, "click", this.expandcollapse);    
listInit(lists);
hideAllSubLists(element, "");
function listInit(lists) {
for (var i = 0 ; i < lists.length; i++) {
var listslists = lists.item(i).getElementsByTagName("LI") ;
if (listslists.length > 0) {    
if (lists.item(i).className != "opened") {
toggleDisplay(lists.item(i));
}
} else if (lists.item(i).className != "include") {
lists.item(i).className = "leaf" ;
}
}
}

function hideAllSubLists(element, display) {
var ul = element.childNodes ;
for (var i = 0 ; i < ul.length ; i++) {
var node = ul.item(i) ;
if (node.nodeName == "LI" && node.getElementsByTagName("UL").item(0) &&
node.getElementsByTagName("UL").item(0).nodeName == "UL") {
node = node.getElementsByTagName("UL").item(0) ;
}
if (node.nodeName == "UL") {
node.style.display = display ;
}
}
}
function getNodeUp (node, nodeType) {
while (node.nodeName != nodeType) {
node=node.parentNode;
}
return node ;
}
function expandcollapse (e) {
e=e||window.event;
var element = evtGetTarget(e);
var child ;
/*        e.cancelBubble = true;*/

/*        if (e.stopPropagation) e.stopPropagation();*/
try { if(window.event.srcElement.tagName != "LI" && window.event.srcElement.tagName != "SPAN") return; } catch (ev) {}
toggleDisplay(element) ;
}
function insertInclude (response,el) {
div = el.getElementsByTagName("div")[0];
el.removeChild(div);
el.innerHTML = el.innerHTML+response;
var lis = el.getElementsByTagName("LI");
if (lis.length > 0) {    
el.className = "opened" ;
listInit(lis);
hideAllSubLists(el, "");

} else {
el.className = "leaf";
}
el.style.cursor = 'pointer';
}
function toggleDisplay(el) {
if (el.className == "include") {
el.style.cursor = 'wait';
var loader = new XMLHttpRequestLoader;
var dsrcdiv = el.getElementsByTagName("div")[0] ;
loader.loadText(dsrcdiv.getAttribute("datasrc"),insertInclude,el);
return ;

}

child = el.getElementsByTagName("UL")[0];
if (!child) {
child = el.nextSibling ;
while (child != null) {
if (child.nodeName == "UL") { break } ; //"[object HTMLUListElement]") { break }
child = child.nextSibling ;
}
}
if (child) {
bCollapsed = (child.style.display == "none");
if (bCollapsed) {
if (element.className == "JSTree" || element.className == "JSCollapse") {
el.className = "opened" ;
}
child.style.display = "";
} else {
if (element.className == "JSTree" || element.className == "JSCollapse") {
el.className = "" ;
}
child.style.display = "none" ;
}
} else {
el.className = "leaf" ;
}
}

}

