/* qlm_generatemenu.js obsahuje funkce generující HTML kód pro dynamické menu.
 * 	Požadavky: 1.Prohlížeč podporuje W3C DOM 2.Stránka obsahuje statické
 *	menu (<UL>) a element, do nějž bude generovaný kód vepsán.
 * Jakub Holy, 14.12.2003 AD
 */

var LINK=true;
var LABEL=false;
var AQUIRK_LEFT_MENU = null; /*Instance tridy QuirkLeftMenu, viz generateLMenu*/
// *************************************************************************************** generateItem
//Creates link/label and sets its attributes and content. Only called by processLI
//@param node of static menu to be processed; @param isLink true==generate a link, otherwise a label
//@return node ready to be appended //@param 
function generateItem ( node, isLink, elm_id ) {//try {cloneNode(true)}catch (e) { error("Can't remove submenu. ");}
    var tag;var item = null;

    if(isLink){
	tag = AQUIRK_LEFT_MENU.linkTAG;

	//Set item = ...;
	if(node.hasChildNodes){//Check for correct structure: (LI>[#text]A) )
	    var nodeName; var isFirstA = true;
	    for (var j=0;j<node.childNodes.length;j++){
		nodeName = node.childNodes[j].nodeName.toUpperCase();
		if( nodeName == '#TEXT' )  { continue; /*skip text not in <a> tag*/}
		else if( nodeName == 'A' )  {
		    try {item = node.childNodes[j].cloneNode(true)}
		    catch (e) { AQUIRK_LEFT_MENU.error('generateItem: selhalo klonování položky.\nID: '+elm_id);}
		    if (!isFirstA){AQUIRK_LEFT_MENU.error('generateItem: položka odkaz obsahuje víc tagů <a> než právě 1.\nID: '+elm_id);}
		    isFirstA = false;
		} else {
		    AQUIRK_LEFT_MENU.error('generateItem: obsah <li> jenž by měl být odkazem není zcela uzavřen mazi tagy <a> a </a>\nID: '+elm_id+'\nNodeName: '+nodeName);
		}//if-elseif-else test correct structure & set item = ...;
	    }//for all children
	}else { AQUIRK_LEFT_MENU.error('generateItem: Položka seznamu (<li>) nesmí být prázdná.\nID: '+elm_id);}//if-else has children
	if(!item) { return null; }

    } else {//if-else isLink
	tag = AQUIRK_LEFT_MENU.labelTAG;
	item = document.createElement(tag.itag);
	item.innerHTML = node.innerHTML;
    }//if-else is link

    //COMMON PART for link and label
    if( tag.iclass ) {item.className = tag.iclass; }
    item.id = elm_id;
    item.onclick = tag.ionclick;    
    return item;
}//generateItem
// *************************************************************************************** processLI
//If this LI has no submenu, generate a corresponding element (call generateLink), otherwise remove
// the submenu, process the changed LI and then process the submenu, append it below the LI.
//@param node of static menu to be processed//@return pair of nodes ready to be appended, 1 of them may be null (LI+its UL)
function processLI( node, elm_id ) {
    var result = {item:null,submenu:null};
    var submenu = removeSubmenu( node );//remove submenu from node if any and return it
    if (submenu) {
	result.item    = generateItem(node,LABEL, elm_id);
	result.submenu = processUL(submenu, elm_id+'_'); //calls processLI in turn
    } else {
	result.item    = generateItem(node,LINK, elm_id);
    }//if-else has submenus
    return result;
}//processLI
// *************************************************************************************** processUL
//Generate element to encapsulate items of the submenu (UL), process (by processLI) and append these items.
//@param node of static menu to be processed //@param 
//@return node ready to be appended (UL)
function processUL( node, elm_id ) {
    //if is LI ...
    var nodePair;
    var submenu = document.createElement(AQUIRK_LEFT_MENU.submenuTAG.itag);
    if( AQUIRK_LEFT_MENU.submenuTAG.iclass ) { submenu.className = AQUIRK_LEFT_MENU.submenuTAG.iclass; }
    if( node.hasChildNodes() ) {
	var counterLI = 0;//preincrement=>1st element will have 1.
	for (var j=0;j<node.childNodes.length;j++){
	    if( node.childNodes[j].nodeName.toUpperCase() == 'LI' )  { //Mozilla treats newlines as #text nodes
		nodePair = processLI( node.childNodes[j], elm_id + (++counterLI) );//LI->item[+submenu]
		if(nodePair.item) {submenu.appendChild( nodePair.item );} 
		else { AQUIRK_LEFT_MENU.error("processLI vrátil null pro item.");}
		if(nodePair.submenu){ submenu.appendChild(nodePair.submenu); }
	    }//if is IL
	}//for all children
    }//if has children
    return submenu;
}//processUL

// *************************************************************************************** removeSubmenu
//Ma-li polozka v sobe <UL>, odstran jej z ni a vrat ho jako navratovou hodnotu teto fce (JEN TEN PRVÝ!).
//@param polozka je element seznamu (LI)//@return submenu (UL element) pokud existuje, jinak null
function removeSubmenu( polozka ) {
  var submenu = null;
  if( polozka.hasChildNodes() ) {
      for (var j=0;j<polozka.childNodes.length;j++){
	  if( polozka.childNodes[j].nodeName.toUpperCase() == 'UL' )  {
	      submenu = polozka.childNodes[j];
	      try {
		  polozka.removeChild( submenu );
	      } catch (e) { AQUIRK_LEFT_MENU.error("Can't remove submenu. ");}
	      break;
	  }//if is UL
      }//for all children
  }//if has children
  return submenu;
}//hasSubmenus()

// *************************************************************************************** generateLMenu()
//"Precte" ze stranky UL s id= staticLMenuID a na zaklade toho generuje dynamicke menu (posloupnost DIVu aj.)
//@param var_aQuirkLeftMenu - instance tridy QuirkLeftMenu
function generateLMenu( var_aQuirkLeftMenu ) {
    AQUIRK_LEFT_MENU = var_aQuirkLeftMenu;/*Set global variable.*/
    //1. TEST W3C DOM support ............................................... 1
    var isW3CDOM = (!(navigator.userAgent.indexOf('MSIE 5') != -1 && navigator.userAgent.indexOf('Mac') != -1) && 		document.getElementsByTagName && document.createElement);
    if( !isW3CDOM ) { AQUIRK_LEFT_MENU.error('Browser nepodoporuje standard W3C DOM1, dynamické menu nebude generováno.');return false;}
    //2. VARIABLES ............................................... 2
    var staticLMenu  = document.getElementById( AQUIRK_LEFT_MENU.staticLMenuID );
    var dynamicLMenu = document.getElementById( AQUIRK_LEFT_MENU.dynamicLMenuID ); 
    if( !(staticLMenu && dynamicLMenu) ) { AQUIRK_LEFT_MENU.error("Element s id dynamicLMenu a/nebo staticLMenu na stránce neexistuje.");}
    //3. STATIC -> generated DYNAMIC .................................... 3
    if( staticLMenu.hasChildNodes() ) {
	dynamicLMenu.style.display = 'none';//hide until the whole menu is generated
	var topDIV = processUL(staticLMenu, 'itemID');
	topDIV.className = "";/*This div is actually unnecessary*/
	dynamicLMenu.appendChild( topDIV );//DO:toggle display of both;images;use depth
	dynamicLMenu.style.display = 'block';
	staticLMenu.style.display = 'none';
    } else AQUIRK_LEFT_MENU.error('Static menu: no child nodes');
}//generateLMenu()

