<!-- <![CDATA[

/* menu.js


Flicker free fast outline style menu generator for 5+ browsers
(c) PROPIX Ltd,  Written by Pintér Gábor
Székesfehérvár, Kriványi u. 15.
H-8000, HUNGARY
Tel: +36 30 3489752
Fax: +36 22 304326
Email: propix@freemail.hu
Web: http://www.propix.hu

Revisions:
  V1.0  09/26/2001  Original release
  V2.0  10/09/2001  Faster and with fallback for older browsers
  V2.01	21/04/2005  Fixes for weblogic
  V3.0	31/08/2006  Fixes for weblogic (Version 6 - XHTML compliant)


This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

http://www.gnu.org/copyleft/gpl.html
http://www.propix.hu/share/GPL.html

For commercial license, and for other professional
JavaScript and Java components please contact the author.





Usage:
  1. Include this file from the head of your page
  2. Define parameters or accept the defaults
  3. Construct the menu array
  4. Call menuwrite() to insert the menu



1. Include fastmenu.js from the head of your page
Insert the following line into the head of your page:
  <script src="fastmenu.js"></script>


2. Define parameters
You can accept the defaults or assign new values to these variables:

menuname="menu";
  Set to a unique name if you want the browser to remember the last position of the menu.
  Set to "" if you want to reset every time.
  Must be set to enable compatible mode operation in old browsers.

menuclass=""
  CSS style name of the menu lines.
  Use it to create special effects or just leave it blank.

menuindent=4
  Extra indenting of child lines.

menutarget="contents"
  The name of the target frame, where the linked item is displayed.

menuplusimg="plus.gif"
menuminusimg="minus.gif"
menublankimg="blank.gif"
  Outline symbols for the collapsed, expanded and primitive lines respectively.

menuexpand="Expand"
menucollapse="Collapse"
  Messages to display in the status line when the cursor is over an outline symbol.


3. The menu array
Each string in the menu array defines one menu line.
One line looks like: "1+Text|Link|Status"
  The first character is the outline level.
    Level 0 is top level and is not collapsible.
    Levels 1-9 are collapsible.
  The second character is the linking mode
    ' ' no link (rarely used)
    '+' frame menutarget
    't' frame _top
    's' frame _self
    'p' frame _parent
    'n' frame _new
  The substring from character 2 to the first | delimiter is the Text
    Text is the visible part of the menu
    It can be a text or an <img ...> tag
  The substring from the first | to the second | delimiter is the Link
    If the user clicks on the menu item this page will be loaded into
    frame menutarget. Link can be omitted.
  The substring from the second | to the end of the string is the Status
    The Status is displayed in the status line when the mouse is over
    the Link. Status can be empty, and is meaningless if Link is empty.


4. Insert the menu
Insert the following lines into body of your page where you want the menu to appear:
  <script>
    wrmenu();
  </script>


*/






// Defaults
var menuname= "menu";
var menuclass= "item";
var menuheight= 5;
var menuindent= 15;
var menutarget= "_self";
var menuplusimg= "plus.gif";
var menuminusimg= "minus.gif";
var menublankimg= "blank.gif";
var menuexpand= "Click here to expand the selection";
var menucollapse= "Click here to collapse the selection";
var menu= [];

// Internal variables

// Current state of menu lines:
//  bit 1..0:
//    00 bottom level (img blank)
//    01 top level (no img)
//    10 collapsible collapsed (img plus)
//    11 collapsible expanded (img minus)
//  bit 2:
//     0 hidden
//     1 visible
var menustate= [];

// General utils

// Find object by name or id
function menuobj(id) {
  var i, x;
  x= document[id];
  if (!x && document.all) x= document.all[id];
  for (i=0; !x && i<document.forms.length; i++) x= document.forms[i][id];
  if (!x && document.getElementById) x= document.getElementById(id);
  return(x);
}


// Set cookie name to value
function menusetcookie(name, value){
  document.cookie=name+"="+escape(value)+"; path=/";
}


// Get value of cookie name
function menugetcookie(name) {
  var s= document.cookie+";";
  b= s.indexOf(name+"=");
  if (b>=0) {
    b+= name.length+1;
    e= s.indexOf(";", b);
    return(unescape(s.substring(b, e)));
  }
  return("");
}




// Browser detection

// Global variables
var browserversion=0.0;
var browsertype=0; // 0: unknown; 1:MSIE; 2:NN

// Return true if MSIE or NN detected
function browserdetect() {
  var agt= navigator.userAgent.toLowerCase();
  var appVer= navigator.appVersion.toLowerCase();
  browserversion= parseFloat(appVer);
  var iePos= appVer.indexOf('msie');
  if (iePos!=-1) browserversion= parseFloat(appVer.substring(iePos+5, appVer.indexOf(';',iePos)));
  var nav6Pos = agt.indexOf('netscape6');
  if (nav6Pos!=-1) browserversion= parseFloat(agt.substring(nav6Pos+10))
  browsertype= (iePos!=-1) ? 1 : (agt.indexOf('mozilla')!=-1) ? 2 : 0;
}

browserdetect();




// Menu specific utilities

// Get menu level
function menulevel(m) {
  return(parseInt(menu[m].charAt(0)));
}


// Show menu line
function menushow(m) {
  var o= menuobj("menu"+m);
  if (o) {
    if (o.style) {
      o.style.visibility= "visible";
    } else {
      o.visibility= "show";
    }
  }
}


// Hide menu line
function menuhide(m) {
  var o= menuobj("menu"+m);
  if (o) {
    if (o.style) {
      o.style.visibility= "hidden";
    } else {
      o.visibility= "hide";
    }
  }
}


// Move menu line
function menumove(m, x, y) {
  var o= menuobj("menu"+m);
  if (o) {
    if (o.style) {
      o.style.left= x;
      o.style.top= y;
    } else {
      o.left= x;
      o.top= y;
    }
  }
}


// Get height of menu line
function menugetheight(m) {
  var o= menuobj("menu"+m);
  return(menuheight);
}


// Set menu state (menustate[m]=state; + reload image)
function menusetstate(m, state) {
  var pic= menuobj("menug"+m);
  if (menustate[m]!=state) {
    menustate[m]= state;
    if ((state&4)!=0) 
	  switch (state&3) {
      case 0: pic.src= menublankimg; break;
      case 1: break;
      case 2: pic.src= menuplusimg; break;
      case 3: pic.src= menuminusimg; break;
    }
  }
}


// Return expand/collapse info
function menustatus(m) {
  return((menustate[m]&1)!=0 ? menucollapse : menuexpand);
}


// Resize menu to reflect changes
function menuupdate() {
  var y= 0;
  var V6height = 15; // Set this to specify height of each menu item (added by Weblogics)
  for (i=0; i<menu.length; i++) {
    if ((menustate[i]&4)!=0) {
      menuhide(i);
      ilevel= menulevel(i);
	  menumove(i, ilevel>1 ? (ilevel-1)*menuindent : 0, y);
      menushow(i);
      y+= V6height;
	  
    } else {
      menuhide(i);
    }
  }  
  menuobj("menulayer").style.height= y;
  menusavestate();
}


// Expand/collapse
function menuclick(m) {	
  var i, level, ilevel;
  switch (menustate[m]) {
    case 7: // Collapse
      menusetstate(m, 6);
      level= menulevel(m);
      for (i=m+1; i<menu.length; i++) {
        ilevel= menulevel(i);
	if (ilevel>level) {
	  switch (menustate[i]&3) {
	    case 0:  menusetstate(i, 0); break;
	    case 1:  menusetstate(i, 1); break;
	    default: menusetstate(i, 2);
	  }
	} else break;
      }
      break;
    case 6: // Expand
	level= menulevel(m);		
      menusetstate(m, 7);
      
      for (i=m+1; i<menu.length; i++) {
        ilevel= menulevel(i);
	if (ilevel>level) {
	  if (ilevel==level+1) switch (menustate[i]&3) {
	    case 0:  menusetstate(i, 4); break;
	    case 1:  menusetstate(i, 5); break;
	    default: menusetstate(i, 6);
	  }
	} else break;
      }
      break;
  }
  menuupdate();
}

// Load, save and init

// Save menustate array
function menusavestate() {
  var i, s;
  if (menuname.length>0) {
    s="";
    for (i=0; i<menu.length; i++) {
      s+= menustate[i];
    }
    menusetcookie(menuname, s);
  }
}

// Load menustate array
function menuloadstate() {
  var i, s;
  if (menuname.length>0) {
    s= menugetcookie(menuname);
    if (s.length==menu.length) {
      for (i=0; i<s.length; i++) {
	menustate[i]= parseInt(s.charAt(i));
      }
      return(true);
    }
  }
  return(false);
}

// Construct menustate array
function menuinitstate() {
  var i;

  for (i=0; i<menu.length; i++) {
    level= menulevel(i);
    switch(level) {
      case 0:  menustate[i]= 5; break;
      case 1:
	if ((i+1==menu.length) || (menulevel(i+1)<=level)) {
          menustate[i]= 4;
	} else {
	  menustate[i]= 6;
	}
	break;
      default:
	if ((i+1==menu.length) || (menulevel(i+1)<=level)) {
          menustate[i]= 0;
	} else {
	  menustate[i]= 2;
	}
    }
  }
}

// Main

// Create menu
function menuwrite() {
  var i, j, k, y;
  var ilevel, istate;
  var target;
  var text, link, status;
  var wr;

  // Construct/load menustate array
  if (!menuloadstate()) menuinitstate();

  // Fallback
  if (browserversion<5.0) { menuoldwrite(); return }

  // Write all
  wr="<div id='menulayer' style='position:relative; top: 0; left: 0'>";
  document.write(wr);
  y= 0;
  for (i=0; i<menu.length; i++) {
    wr= "";

    // Split menu string into hasclass, text, link and status
    j=menu[i].indexOf('|',2);
    if (j>=0) {
      k=menu[i].indexOf('|',j+1);
      if (k>=0) {
	text=menu[i].substring(2,j);
	link=menu[i].substring(j+1,k);
	status=menu[i].substring(k+1);
      } else {
	text=menu[i].substring(2,j);
	link=menu[i].substring(j+1);
	status="";
      }
    } else {
      text=menu[i].substring(2);
      link="";
      status="";
    }
    switch (menu[i].charAt(1)) {
      case ' ': link='javascript:void(0)'; target='_self'; break;
      case 't': target='_top'; break;
      case 's': target='_self'; break;
      case 'p': target='_parent'; break;
      case 'n': target='_new'; break;
      default: target=menutarget; break;
    }

    // One menu item
    ilevel=menulevel(i);
    istate=menustate[i];
	inlinestyle='';
    wr+="<div id='menu"+i+"' "+
          "style='position: absolute; white-space: nowrap; "+
	    "top: "+y+"; "+
	    "left: "+(ilevel>1 ? (ilevel-1)*menuindent : 0)+"; "+
	    "visibility: "+((istate&4)!=0 ? "visible" : "hidden")+
	    " '"+
	">";
    if ((istate&2)!=0) {
      wr+="<a class='"+menuclass+"' href=\"#\">"+
         "<img name='menug"+i+"' border=0 style='cursor:pointer' "+
            "src='"+((istate&1)!=0 ? menuminusimg : menuplusimg)+"' "+
	    "onMouseOver=\"window.status=menustatus("+i+"); return(true)\" "+
	    "onMouseDown=\"menuclick("+i+"); return(true)\" "+
	    "onMouseUp=\"window.status=menustatus("+i+"); return(true)\" "+
	    "onMouseOut=\"window.status=''; return(true)\""+
	 "></a>";
    } else if ((istate&3)==0) { // when theres nothing underneath
      wr+="<img name='menug"+i+"' src='"+menublankimg+"' border=0>";
	  if (ilevel==1 || ilevel==2) { inlinestyle="padding-left: 5px;" } //added 26/10/2006 SA
    }
    wr+=link!="" ?
      "<a href='"+link+"' target='"+target+"' style='"+inlinestyle+"' "+
        "class='"+menuclass+"' "+
        "onMouseDown=\"window.status=''; return(true)\" "+
        "onMouseOver=\"window.status='"+status+"'; return(true)\" "+
	"onMouseOut=\"window.status=''; return(true)\">"+text+"</a>" :
      "<span class=\""+menuclass+"\">"+text+"</span>";
    wr+="</div>\n";
    document.write(wr);
    if ((istate&4)!=0) {
      y+=menugetheight(i);
    }
  }
  wr="</div>";
  
  document.write(wr);
  menuobj("menulayer").style.height = y;
  menuupdate();
}

// Fallback (no layer, no style)

// Expand/collapse
function menuoldclick(m) {
  var i, level, ilevel;
  switch (menustate[m]) {
    case 7: // Collapse
      dw("collapse");
      menustate[m]= 6;
      level= menulevel(m);
      for (i=m+1; i<menu.length; i++) {
        ilevel= menulevel(i);
	if (ilevel>level) {
	  switch (menustate[i]&3) {
	    case 0:  menustate[i]= 0; break;
	    case 1:  menustate[i]= 1; break;
	    default: menustate[i]= 2;
	  }
	} else break;
      }
      break;
    case 6: // Expand
      menustate[m]= 7;
      level= menulevel(m);
      for (i=m+1; i<menu.length; i++) {
        ilevel= menulevel(i);
	if (ilevel>level) {
	  if (ilevel==level+1) switch (menustate[i]&3) {
	    case 0:  menustate[i]= 4; break;
	    case 1:  menustate[i]= 5; break;
	    default: menustate[i]= 6;
	  }
	} else break;
      }
      break;
  }
  menusavestate();
  location.reload();
}

// Create menu
function menuoldwrite() {
  var i, j, k, y;
  var ilevel, istate;
  var target;
  var text, link, status;
  var wr;

  // Construct/load menustate array
  if (!menuloadstate()) menuinitstate();

  // Write all
  for (i=0; i<menu.length; i++) {
    wr= "";

    // Split menu string into hasclass, text, link and status
    j=menu[i].indexOf('|',2);
    if (j>=0) {
      k=menu[i].indexOf('|',j+1);
      if (k>=0) {
	text=menu[i].substring(2,j);
	link=menu[i].substring(j+1,k);
	status=menu[i].substring(k+1);
      } else {
	text=menu[i].substring(2,j);
	link=menu[i].substring(j+1);
	status="";
      }
    } else {
      text=menu[i].substring(2);
      link="";
      status="";
    }
    switch (menu[i].charAt(1)) {
      case ' ': link='javascript:void(0)'; target='_self'; break;
      case 't': target='_top'; break;
      case 's': target='_self'; break;
      case 'p': target='_parent'; break;
      case 'n': target='_new'; break;
      default: target=menutarget; break;
    }

    // One menu item
    ilevel=menulevel(i);
    istate=menustate[i];
    if ((istate&4)!=0) {
      wr+="<div >";
      for (j=1; j<ilevel; j++) wr+="&nbsp;";
      if ((istate&2)!=0) {
	wr+="<a href=\"javascript:menuoldclick("+i+")\" "+
	      "onMouseOver=\"window.status=menustatus("+i+"); return(true)\" "+
	      "onMouseOut=\"window.status=''; return(true)\""+
	      "onMouseUp=\"window.status=menustatus("+i+"); return(true)\" "+
	    ">"+
	   "<img name='menug"+i+"' border=0 "+
	      "src='"+((istate&1)!=0 ? menuminusimg : menuplusimg)+"' "+
	   "></a>";
      } else if ((istate&3)==0) {
	wr+="<img name='menug"+i+"' src='"+menublankimg+"' border=0>";
      }
      wr+=link!="" ?
	"<a href='"+link+"' target='"+target+"' "+
          "class='"+menuclass+"' "+
	  "onMouseDown=\"window.status=''; return(true)\" "+
	  "onMouseOver=\"window.status='"+status+"'; return(true)\" "+
	  "onMouseOut=\"window.status=''; return(true)\">"+text+"</a>" :
      "<span class=\""+menuclass+"\">"+text+"</span>";
      wr+="</div>\n";
      document.write(wr);
    }
  }
}
// ]]> -->
