// utility function to remove returns and special symbols like formfeeds etc
function stringRemoveReturns (str) {
    var res = "" ;
    var idx = 0;
    while ( idx < str.length) {
        if (str.charCodeAt(idx) > 31) {
            res = res.concat(str.slice(idx,idx+1));
        } else {
            res = res.concat(" ");
        }
        idx++;

    }
    return res ;
}
// JSDynListAcronym Start
function JSDynListAcronym (element) {
    var parent = element.parentNode;
    var abbrs = parent.getElementsByTagName("acronym");
    var targetList = document.createElement("dl");
    // RegExp speichern
    // Nur Einträge der Form "Text für die Abkürzung (Abk)"
    // wie bei erstmaliger Verwendung üblich werden berücksichtigt
    var rx = new RegExp("(.+)\\((.+)\\)");
    var l = abbrs.length;   
    // Ein Array erstellen um später einfach zu sortieren
    var resList = new Array();
    for (var x = 0 ; x < l ; x++) {
        var text = stringRemoveReturns(abbrs.item(x).innerHTML);
        var res = rx.exec(text);
        if (res) {
            resList.push(""+RegExp.$2+":::"+RegExp.$1);
        }
    }
    resList.sort();
    var l2 = resList.length;
    // Nun Anhängen der Abkürzungen
    for (var x = 0 ; x < l2 ; 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) ;
}
// JSDynListAcronym End
function JSDynListDfn (element) {
    var parent = element.parentNode;
    var dfns = parent.getElementsByTagName("dfn");
    var targetList = document.createElement("dl");
    // RegExp speichern
    // Nur Einträge der Form "Term [:,-] Beschreibung"
    // werden berücksichtigt
    var rx = /(.+)[-,:](.+)/;
    // how to replace returns ??
    var l = dfns.length;   

    // Ein Array erstellen um später einfach zu sortieren
    var resList = new Array();
    for (var x = 0 ; x < l ; x++) {
        var text = dfns.item(x).innerHTML;
        var res = rx.exec(stringRemoveReturns(text));
        if (res) {
            resList.push(""+RegExp.$1+":::"+RegExp.$2);
        }
    }
    resList.sort();
    l = resList.length;
    // Nun Anhängen der Definitionen
    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++) {
                // get the Entry
                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).hasAttribute("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);
print (el.innerHTML);
*/
