/*
=======
PageTOC
=======

historie:
1.0 - 15.9.2008, prvni vydani

DYNAMICKY OBSAH STRANKY
Script vlozi do stranky obsah, ktery je sestaveny z tagu H.
Obsah muze byt zavirany kliknutim (vhodne pro plovouci obsah).
Pokud stranka obsahuje jeden nebo zadny nadpis, obsah se nevytvori.

NAVOD K POUZITI
- Na stranku umistete prazdny DIV.
- Po nacteni stranky spustte funkci insertTOC, napr.:
  <body onload="javascript:insertTOC('idobsah',1,8)"> 
  ... vlozi obsah do DIVu s ID idobsah, a to tagy H1 az H8
- Paramtery funkce insertTOC:
    - id DIVu, do ktereho bude ulozen obsah
    - od ktereho H bude obsah vytvoren
    - do ktereho H bude obsah vytvoren
- dalsi vlastnosti lze ovlivnit promennymi (viz kod); ty lze nastavit take z dokumentu,
  coz se muze hodit pro individualni nastaveni stranky

STYLY
V obsahu jsou pouzity tyto styly (kazdy radek je element P):

    tocHeader - nadpis
    tocH1, tocH2 atd. - polozky obsahu H1, H2...
    
UKAZKA STYLU
Zde je vyuzit atribu ID, kdy pomoci # je uvedeno ID DIVu, v kterem je obsah
        #toc {border-left-style:solid;border-left-width:1px;border-left-color:#000080}
        #toc p {font-size:9pt;margin-top:4pt;margin-bottom:4pt}
        #toc a {color:black;text-decoration:none}
        .tocH1 {font-weight:bold;}
        .tocH2 {margin-left:2em}
        .tocH3 {margin-left:4em}
        
Pokud bychom chteli barvit kazdou uroven zvlast, musime modifikovat tag A pro kazdy tocHx, napr.:
        #toc a {text-decoration:none} 
        .tocH1 a {color:Red; font-weight:bold;}
        .tocH2 a {color:Aqua; margin-left:2em}
        .tocH3 a {color:Green; margin-left:4em}


    
POZNAMKY
Napsano s podle http://www.quirksmode.org/dom/toc.html
Zname problemy: Nefunguje s nekterymi starsimi non-IE prohlizeci; IE by mel pracovat od verze 5 (netestovano)
*/


var sShow = 'show page contents'; //zahlavi obsahu, pokud je obsah skryty, napr. 'show page contents'
var sHide = 'hide page contents'; //zahlavi obsahu, pokud je obsah ukazany,napr. 'hide page contents'
var bShowOnLoad = true; //zda se obsah ukaze po nacteni stranky
var bActive = true; //pokud true, tak se po kliknuti obsah schova


//hlavni funkce, ktera se vola z dokumentu
function insertTOC(sDivId,nFrom,nTo) {
    var oToc = createTOC(nFrom,nTo);
    if(oToc) { //pokud je false, tak stranka nema nadpisy
        document.getElementById(sDivId).appendChild(oToc);
    }
}

//podle http://www.quirksmode.org/dom/toc.html
function createTOC(nFrom, nTo) {
	//vytvorim hlavni DIV
	var oTocDiv = document.createElement('div');
	oTocDiv.id = 'innertoc';
	if((sHide + sShow).length) { //pokud je definovano zahlavi, vlozim jej
	    var oHdr = oTocDiv.appendChild(document.createElement('p'));
	    if(bActive) { //pokud je to povoleno, schova se po kliknuti
	        oHdr.onclick = showhideTOC;
	    }
	    oHdr.id = 'contentheader';
	    oHdr.className = 'tocHeader';
	    oHdr.innerHTML = bShowOnLoad ? sHide : sShow; //text s oznamenim show/hide contents
	    if (bActive) oHdr.style.cursor = 'pointer';
	}
	//vytvorim DIV, var kterem jsou polozky obsahu
	var oListDiv = oTocDiv.appendChild(document.createElement('div'));
	oListDiv.onclick = bActive ? showhideTOC : null; //pokud se klikne na polozku obsahu, obsah se schova (je-li to povoleno)
	oListDiv.style.display = bShowOnLoad ? 'block' : 'none'; //obsah se zobrazi hned pri otevreni stranky (je-li to povoleno)
	//sestavim seznam tagu H, ktere budu zpracovavat
	var sHdrList = '';
	for(var i=nFrom;i<=nTo;i++) {
	    sHdrList =  sHdrList + (sHdrList.length?',':'') + 'h' + i;
	}
	//ziskam setriden seznam tagu H
	var toBeTOCced = getElementsByTagNames(sHdrList);
	if (toBeTOCced.length < 2) return false; //obsah s jedinou polozkou nedelam
    //sestavim obsah
	for (var i=0;i<toBeTOCced.length;i++) {
		var oA = document.createElement('a');
		oA.innerHTML = InnerText(toBeTOCced[i]);
		var oP = document.createElement('p');
		oP.className = 'toc' + toBeTOCced[i].nodeName;
		oP.appendChild(oA);
		oListDiv.appendChild(oP);
		var headerId = toBeTOCced[i].id || 'link' + i; //vytvori se nove id, ale jen pokud jiz neexistuje
		oA.href = '#' + headerId;
		toBeTOCced[i].id = headerId;
	}
	return oTocDiv;
}

//zobrazi/skryje obsah
function showhideTOC() {
    var oListDiv = document.getElementById('innertoc').lastChild; //ziskam vnitrni DIV se seznamem
	var TOCstate = (oListDiv.style.display == 'none') ? 'block' : 'none'; //nastavim budouci stav jako opacny k soucasnemu
	if((sHide + sShow).length)
	{
	    var newText = (TOCstate == 'none') ? sShow : sHide; //vlozim zahlavi obsahu
	    document.getElementById('contentheader').innerHTML = newText;
	}
	document.getElementById('innertoc').lastChild.style.display = TOCstate; //zobrazim nebo skryji obsah
}


//vrati text z uzlu - nahrad innerText pomoci DOMu
function InnerText(node) {
    var sText = '';
    var oNode = node.firstChild;
    if(oNode) {
        do {
            if (oNode.nodeType==3) {
                //je to textovy uzel
                sText += oNode.nodeValue; //pridam text,
            }
            else {
                //je to jiny uzel
                //pokud je to tag urcujici konec radku, vlozim newline (pozor, asi to neni zcela dokonaly vycet)
                sText += " P BR DIV CENTER H1 H2 H3 H4 H5 H6 BLOCKQUOTE ADRESS PRE HR LI OL UL DIR MENU DL DT DD TD ".indexOf(' '+oNode.nodeName+' ') ? '' : '\r\n';
                sText += InnerText(oNode)
            }
            
            oNode = oNode.nextSibling;
        }
        while(oNode);
    }
    return(sText); 
}    
// podle http://www.quirksmode.org/dom/getElementsByTagNames.html
function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) { //sourceIndex only for IE
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else {
	    if (testNode.compareDocumentPosition) { //compareDocumentPosition for FF and Opera
		    resultArray.sort(function (a,b) {
				    return 3 - (a.compareDocumentPosition(b) & 6);
		    });
		 }
		 else { //for Safari
		    resultArray.sort(function (a,b) {
                  var range1, range2, compare;
                  
                  range1 = document.createRange();
                  range1.selectNode(a);
                  range1.collapse(true);

                  range2 = document.createRange();
                  range2.selectNode(b);
                  range2.collapse(true);

                  return range1.compareBoundaryPoints(Range.START_TO_END, range2);
		    });
		 }
		    
	}
	return resultArray;
}

