//*** NavMenu Class ************************************************************

function NavMenu(name) {
   this.name = name;
   this.children = new Array();
   this.childMap = new Array();
   this.add = NavMenu_add;
   this.get = NavMenu_get;
   this.print = NavMenu_print;
}

function NavMenu_add(menu) {
   this.children[this.children.length] = menu;
   this.childMap[menu.name] = menu;
}

function NavMenu_get(name) {
   return this.childMap[name];
}

function NavMenu_print(printFormatter, getAsString) {
   if (printFormatter.isMenuFormatter) {
      printFormatter.doMenu(this);
      return;
   }
   var holdString = printFormatter.startPrintNavMenu(this);
   var menu = null;
   for (var i = 0; i < this.children.length - 1; i++) {
      menu = this.children[i];
      holdString += menu.print(printFormatter);
      holdString += printFormatter.printMenuSeparator(menu);
   }
   if (this.children[i]) {
      menu = this.children[i];
      holdString += menu.print(printFormatter);
   }
   holdString += printFormatter.endPrintNavMenu(this);
   if (!getAsString) {
      document.write(holdString);
   } else {
      return holdString;
   }
}

//*** Menu Class ************************************************************

function Menu(name, popup, link) {
   this.name = name;
   this.link = link;
   this.popup = popup;
   this.children = new Array();
   this.childMap = new Array();
   this.add = Menu_add;
   this.get = Menu_get;
   this.print = Menu_print;
}

function Menu_add(subMenu) {
   this.children[this.children.length] = subMenu;
   this.childMap[subMenu.name] = subMenu;
}

function Menu_get(name) {
   return this.childMap[name];
}

function Menu_print(printFormatter) {
   var holdString;
   holdString = printFormatter.startPrintMenu(this);
   var subMenu = null; 
   var i;
   for (i = 0; i < this.children.length - 1; i++) {
      subMenu = this.children[i];
      holdString += subMenu.print(printFormatter);
      holdString += printFormatter.printSubMenuSeparator(subMenu);
   }
   if (this.children[i]) {
      subMenu = this.children[i];
      holdString += subMenu.print(printFormatter);
   }
   holdString += printFormatter.endPrintMenu(this);
   return holdString;
}

//*** SubMenu Class ************************************************************

function SubMenu(name, link) {
   this.name = name;
   this.link = link;
   this.print = SubMenu_print;
}

function SubMenu_print(printFormatter) {
   return printFormatter.printSubMenu(this);
}

//*** Sample PrintFormatter Classes ********************************************

//*** ListFormatterClass *******************************************************

function ListFormatter() {
   this.startPrintNavMenu = ListFormatter_startPrintNavMenu;
   this.endPrintNavMenu = ListFormatter_endPrintNavMenu;
   this.startPrintMenu = ListFormatter_startPrintMenu;
   this.endPrintMenu = ListFormatter_endPrintMenu;
   this.printMenuSeparator = ListFormatter_printMenuSeparator;
   this.printSubMenu = ListFormatter_printSubMenu;
   this.printSubMenuSeparator = ListFormatter_printSubMenuSeparator;
}

function ListFormatter_startPrintNavMenu(navMenu) {
   return "";
}

function ListFormatter_endPrintNavMenu(navMenu) {
   return "";
}

function ListFormatter_startPrintMenu(menu) {
   return "<A HREF='" + menu.link + "'>" + menu.name + "</A><BR>";
}

function ListFormatter_endPrintMenu(menu) {
   return "";
}

function ListFormatter_printMenuSeparator(menu) {
   return "";
}

function ListFormatter_printSubMenu(subMenu) {
   return "&nbsp;&nbsp;&nbsp;<A HREF='" + subMenu.link + "'>" + subMenu.name + "</A><BR>";
}

function ListFormatter_printSubMenuSeparator(subMenu) {
   return "";
}

