var menu_arr = 
  { submenu : [
          { title:'Home', path:'', src: 'index', ext: 'php' },
            { title:'My Account', path:'my_account', 
              submenu: [
                       { title:'Account Details', path:'', src:'account_details'}
                       ]
            },
          { title:'Announcements', path:'', src:'announcements' },
          { title:'Latest News', path:'', src:'latest_news' },
          { title:'Tree Container Library', path:'tree_container_library',
              submenu:  [ { title:'Overview', path:'', src:'overview' },
                      { title:'Usage', path:'usage', 
                        submenu:  [ { title:'General usage', path:'', src:'general_usage' },
                                { title:'unique_tree', path:'', src:'unique_tree' },
                                { title:'sequential_tree', path:'', src:'sequential_tree' }
                              ]
                      },
                      { title:'Interface', path:'interface', 
                        submenu:  [ { title:'Common Interface', path:'', src:'standard_interface' },
                                { title:'associative trees', path:'', src:'associative_trees' },
                                { title:'unique_tree', path:'', src:'unique_tree' },
                                { title:'sequential_tree', path:'', src:'sequential_tree' }
                              ]
                      },
                      { title:'Iterators', path:'iterators',
                        submenu:  [ { title:'Iterator Overview', path:'', src:'overview' },
                                    { title: 'Child Iterators', path:'child',
                                      submenu: [ { title:'Element Iterator', path:'', src:'element' },
                                                 { title:'Node Iterator', path:'', src:'node' }
                                               ]
                                    },
                                    { title:'Reverse Iterators', path:'reverse',
                                      submenu: [ { title:'Element Iterator', path:'', src:'element' },
                                                   { title:'Node Iterator', path:'', src:'node' }
                                               ]
                                    },
                                    { title:'Descendant Iterators', path:'descendant',
                                      submenu: [ { title:'Element Iterator', path:'', src:'element' },
                                                 { title:'Node Iterator', path:'', src:'node' }
                                               ]
                                    },
                                    { title:'Ordered_iterators', path:'', src:'ordered' }
                                   ]
                      },
                      { title:'Design', path:'', src:'design' },
                      { title:'Auxiliary Code', path:'', src:'auxiliary_code'},
                      { title:'Implementation', path:'implementation',
                        submenu:  [ { title:'basic_tree', path:'', src:'basic_tree' },
                                { title:'associative_tree', path:'', src:'associative_tree' },
                                { title:'tree/multitree', path:'', src:'tree_multitree' },
                                { title:'unique_tree', path:'', src:'unique_tree' },
                                { title:'sequential_tree', path:'', src:'sequential_tree' },
                                { title:'child iterators', path:'', src:'child_iterators' },
                                { title:'descendant iterators', path:'', src:'descendant_iterators' },
                                { title:'ordered iterators', path:'', src:'ordered_iterators' }
                              ]
                      },
                      { title:'Examples', path:'examples',
                        submenu:  [ { title:'Generic', path:'', src:'generic' },
                                { title:'unique_tree', path:'', src:'unique_tree' },
                                { title:'sequential_tree', path:'', src:'sequential_tree' },
                                { title:'Polymorphic', path:'', src:'polymorphic' },
                                { title:'TCL Test Suite', path:'', src:'tcl_test_suite' }
                              ]
                      },
                      { title:'STL compatibility', path:'stl_compatibility', 
                        submenu:  [ { title:'Overview', path:'', src:'overview' },
                                { title:'STL Containers', path:'', src:'stl_containers' },
                                { title:'STL Algorithms', path:'stl_algorithms',
                                    submenu:  [   { title:'Nonmodifying', path:'', src:'nonmodifying' },
                                            { title:'Modifying', path:'', src:'modifying' },
                                            { title:'Other Algorithms', path:'', src:'other_algorithms' }
                                          ]
                                }
                              ]     
                      },
                      { title:'Development History', path:'', src:'development_history' },
                      { title:'Version History', path:'', src:'version_history' },
                      { title:'Credits', path:'', src:'credits' },
                      { title:'Documentation', path:'', src:'documentation' },
                      { title:'Download', path:'', src:'download' }
                    ]
          },
          { title:'xhtml_gen', path:'xhtml_gen',
            submenu:  [ { title:'Overview', path:'', src:'overview' },
                        { title:'Download', path:'', src:'download' }
                  ]
          },
          { title:'Contribute', path:'', src:'contribute'},
          { title:'About Us', path:'about_us',
            submenu: [ 
                      { title: 'Overview', path:'', src:'overview'},
                      { title: 'Terms of Use', path:'', src:'terms_of_use'},
                      { title: 'Your Privacy', path:'', src:'your_privacy'},
                      { title: 'Contact Us', path: '', src:'contact_us'}
                    ]
          }
        ]
  }
        

var blue_arrow_map;
var red_arrow_map;
var green_arrow_map;

var menu_movement_speed = 1;
var menu_movement_incr = 50;
var current_closing_menu_item;
var current_opening_menu_item;
var o_submenu_list;
var c_submenu_list;

function create_menu()
{
  load_arrow_array();
  var menu = document.createElement('div');
  menu.id = 'id_menu';
  var menu_container = document.getElementById('id_menu_container' );
  var menu_heading = document.createElement('h3');
  menu_heading.id = 'menu_header';
  add_top_corners( menu_container );
  menu_heading.appendChild( document.createTextNode('Menu') );

  menu_container.appendChild( menu_heading );
  menu_container.appendChild( menu );

  var level_0_menu = document.createElement('ul');
  level_0_menu.id = 'id_ul_mainmenu';
  level_0_menu.className = 'submenu';
  level_0_menu.setAttribute( 'align', 'right' );
  
  menu.appendChild( level_0_menu );
  insert_menu( [  ], level_0_menu, true );
  
  var menu_bottom = document.createElement('div');
  menu_bottom.id = 'menu_footer';
  menu_container.appendChild( menu_bottom );
  add_bottom_corners( menu_bottom );
}


function add_top_corners( container )
{
  var nw_corner = document.createElement('div');
  nw_corner.className = 'nw_corner';
  container.appendChild( nw_corner );
  var ne_corner = document.createElement('div');
  ne_corner.className = 'ne_corner';
  container.appendChild( ne_corner );
  
}

function add_bottom_corners( container )
{
  var se_corner = document.createElement('div');
  se_corner.className = 'se_corner';
  container.appendChild( se_corner );
  var sw_corner = document.createElement('div');
  sw_corner.className = 'sw_corner';
  container.appendChild( sw_corner );

}

function insert_menu( menu_level_array, menu, include_submenus )
{
  var menu_array = menu_arr.submenu;
  var link_path = '';

  for ( var menu_level = 0; menu_level < menu_level_array.length; ++menu_level ) {
    link_path += menu_array[ menu_level_array[menu_level] ].path + '/';
    menu_array =  menu_array[menu_level_array[menu_level] ].submenu;
  }

  var menu_id = link_path.replace( RegExp('/','g'), '_' );
  
  for ( var menu_item_no = 0; menu_item_no < menu_array.length; ++menu_item_no ) {
    var menu_item = document.createElement('li');
    menu_item.id = 'id_li_menuitem_' + menu_id + ( typeof menu_array[menu_item_no].src != 'undefined' ? menu_array[menu_item_no].src : menu_array[menu_item_no].path );

    menu_item.status = 'fixed';
    menu_item.style.height = navigator.userAgent.indexOf("MSIE 5")!=-1 ? '4ex' : '3ex';  // fix for ie5

    var possible_body_id_name = 'id_body_' + menu_id + ( typeof menu_array[menu_item_no].src != 'undefined' ? menu_array[menu_item_no].src : menu_array[menu_item_no].path );
    var at_page_in_menu = ( (document.body.id.substr(0, possible_body_id_name.length ) == possible_body_id_name && typeof menu_array[menu_item_no].submenu != 'undefined') || (document.body.id == possible_body_id_name));
    // special attn to index
    if (menu_array[menu_item_no].src == 'index' && menu_item_no != 0 || (document.body.id.substr(possible_body_id_name.length, 1) != '_' && document.body.id.length != possible_body_id_name.length))
      at_page_in_menu = false;
    menu_item.className = ( at_page_in_menu ? 'menu_item_selected' : 'menu_item' );
    
    if ( menu_level_array.length > 0 ) { // submenu?
      var width = 10 * menu_level_array.length;
      menu_item.style.marginLeft = width + 'px';
    }

    menu_item.onmouseover = on_mouse_over_menu_item;
    menu_item.onmouseout = on_mouse_out_menu_item;
    menu_item.onclick = on_mouse_click_menu_item;
    menu_item.menu_no = menu_item_no;
    
    var menu_text = document.createElement('span');
    menu_text.className = 'menu_text';
    menu_text.innerHTML = menu_array[menu_item_no].title;

    // check if My Accounts, and if not logged in
    var dont_show_my_account_sub = false;
    if (menu_array[menu_item_no].title == "My Account") {
      var login_status = document.getElementById('id_logged_in_status');
      if (login_status == null) {
        dont_show_my_account_sub = true;
        menu_array[menu_item_no].src = 'my_account';
        menu_array[menu_item_no].path = '';
      }
    }
      
    if ( typeof menu_array[menu_item_no].submenu == 'undefined' || dont_show_my_account_sub) {
      // not a submenu
      menu_item.status = 'fixed';
      var child_path = menu_array[menu_item_no].path;
      menu_item.lnk = '/' + link_path + child_path +  ( child_path.length > 0 ? '/' : '' ) + menu_array[menu_item_no].src + ( typeof menu_array[menu_item_no].ext != 'undefined' ? '.' + menu_array[menu_item_no].ext : '.php' );
      menu_item.appendChild( menu_text );
      menu.appendChild( menu_item );
    } else {
      // submenu
      var arrow = document.createElement('img');
      var arrow_color = at_page_in_menu ? include_submenus ? 'red_s' : 'red_e' : 'blue_e';
      arrow.src = '/menu_sidebar/images/arrow_' + arrow_color + '.gif';
      arrow.className = 'menu_arrow';
      menu_item.appendChild(arrow);
      menu_item.status = 'closed';
      menu_item.appendChild( menu_text );
      menu.appendChild( menu_item );
      if ( include_submenus && at_page_in_menu && typeof menu_array[menu_item_no].submenu != 'undefined' ) {
        show_sub_menu( menu_item );
        menu_item.status = 'open';
      }
    }
  }
}


function load_arrow_array()
{
  var img_path = '/menu_sidebar/images/';

  blue_arrow_map = new Array();
  blue_arrow_map['e'] = new Image( 30, 30 );
  blue_arrow_map['s'] = new Image( 30, 30 );
  
  blue_arrow_map['e'].src = img_path  + 'arrow_blue_e.gif';
  blue_arrow_map['s'].src = img_path + 'arrow_blue_s.gif';
  
  green_arrow_map = new Array();
  green_arrow_map['e'] = new Image( 30, 30 );
  green_arrow_map['s'] = new Image( 30, 30 );
  
  green_arrow_map['e'].src = img_path + 'arrow_green_e.gif';
  green_arrow_map['s'].src = img_path + 'arrow_green_s.gif';
  
  red_arrow_map = new Array();
  red_arrow_map['e'] = new Image( 30, 30 );
  red_arrow_map['s'] = new Image( 30, 30 );
  
  red_arrow_map['e'].src = img_path + 'arrow_red_e.gif';
  red_arrow_map['s'].src = img_path + 'arrow_red_s.gif';
}



function on_mouse_over_menu_item()
{
  this.className = 'menu_item_mouseover';
  
  if ( this.status != 'fixed' ) {
    var arrow_direction = this.status == 'open' ? 's' : 'e';
    this.lastChild.src = '/menu_sidebar/images/arrow_green_' + arrow_direction + '.gif';
  }
}

function on_mouse_out_menu_item()
{
  var body_id_name = 'id_body_' + this.id.substr( 15 );
  this.className = ( ((document.body.id.substr(0, body_id_name.length) == body_id_name && this.status != 'fixed') || (document.body.id == body_id_name)) ? 'menu_item_selected' : 'menu_item' );
  // special check for forum item
  if (this.status == 'fixed' && this.lnk.substr(1, 5) == 'forum')
    this.className = 'menu_item';

  if ( this.status != 'fixed' ) {
    var arrow_type;
    if ( this.status == 'open' )
      arrow_type = this.className == 'menu_item_selected' ? 'red_s' : 'blue_s';
    else
      arrow_type = this.className == 'menu_item_selected' ? 'red_e' : 'blue_e';

    this.lastChild.src = '/menu_sidebar/images/arrow_' + arrow_type + '.gif';
  }

}

function on_mouse_click_menu_item()
{
  if ( this.status == 'closed' ) {
    current_opening_menu_item = document.getElementById( this.id );
    current_opening_menu_item.lastChild.src = '';
    document.menu_busy = true;
    open_submenu( this.id );
  } else if ( this.status == 'open' ) {
    this.status = 'closing';
    current_closing_menu_item = document.getElementById( this.id );
    c_submenu_list = current_closing_menu_item.nextSibling;
    document.menu_busy = true;
    close_submenu1( this.id, 0 );
  } else if ( this.status == 'fixed' ) {
    window.location = this.lnk;
  }

}

function open_submenu( id )
{
  var menu_list = document.getElementById( 'id_ul_mainmenu' );
  
  var menu_level_array = get_menu_level_array( id );
  
  var submenu_container = document.createElement('ul');
  submenu_container.className = 'submenu';

  insert_menu( menu_level_array, submenu_container, false );
  submenu_container.menu_no = current_opening_menu_item.menu_no; // need this for opening submenu items
  
  if ( submenu_container.hasChildNodes() ) {
    submenu_container.visibility = 'hidden';
    menu_list.appendChild( submenu_container );

    var height = submenu_container.offsetHeight;  
    
    menu_list.removeChild( submenu_container );
    submenu_container.style.overflow = 'hidden';

    submenu_container.visibility = 'visible';
    submenu_container.style.height = '1px';
    
    current_opening_menu_item.parentNode.insertBefore( submenu_container, current_opening_menu_item.nextSibling );
    current_opening_menu_item.status = 'opening';
    o_submenu_list = current_opening_menu_item.nextSibling;
    opening_submenu( id, height, 0 );
  }
}

// id = clicked menu item
// returns menu path. eg: xport->interface->xhtml_documents->element->insert
function get_menu_level_array( id ) 
{
  // if 
  var menu_item = document.getElementById( id );
  var menu_list = document.getElementById( 'id_ul_mainmenu' );

  var menu_level_array = new Array();
  var menu_walker = menu_item.parentNode;

  while ( menu_walker != menu_list ) {
    menu_level_array[menu_level_array.length] = menu_walker.menu_no;
    menu_walker = menu_walker.parentNode;
  }
  
  menu_level_array.reverse();
  
  menu_level_array[menu_level_array.length] = menu_item.menu_no;

  return menu_level_array;
}

function opening_submenu( id, final_height, iteration )
{
  var height = o_submenu_list.offsetHeight;
  
  if ( height > final_height - menu_movement_incr ) {
    o_submenu_list.style.height = 'auto';
    o_submenu_list.style.overflow = 'visible';
    
    var possible_body_id = 'id_body_' + id.substr( 16 );
    var arrow_color = document.body.id.substr( 0, possible_body_id.length ) == possible_body_id ? 'red' : 'blue';
    
    current_opening_menu_item.lastChild.src = '/menu_sidebar/images/arrow_' + arrow_color + '_s.gif';
    current_opening_menu_item.status = 'open';
    document.menu_busy = false;
    return;
  }

  o_submenu_list.style.height = height + menu_movement_incr + 'px'; 
  
  ++iteration;
  var call_fcn = "opening_submenu('" + id + "'," + final_height + ", " + iteration + " )";
  setTimeout( call_fcn, menu_movement_speed );
  
}


function close_submenu1( id, interval )
{
  var height = c_submenu_list.offsetHeight;
  c_submenu_list.style.overflow = 'hidden';
  
  if ( height < menu_movement_incr + 1 ) {
    var possible_body_id = 'id_body_' + id.substr( 16 );
    var arrow_color = document.body.id.substr( 0, possible_body_id.length ) == possible_body_id ? 'red' : 'blue';
    
    current_closing_menu_item.lastChild.src = '/menu_sidebar/images/arrow_' + arrow_color + '_e.gif'; 
    c_submenu_list.parentNode.removeChild( c_submenu_list );
    current_closing_menu_item.status = 'closed';
    document.menu_busy = false;
    return;
  }

  c_submenu_list.style.height = height - menu_movement_incr + 'px';
  ++interval;
  
  var call_fcn = "close_submenu1('" + id + "',"  + interval + " )";
  setTimeout( call_fcn, menu_movement_speed );
}



// opens a submenu
// menu_item = submenu clicked
function show_sub_menu( menu_item )
{
  if ( menu_item.status != 'fixed' ) {

    var menu_level_array = get_menu_level_array( menu_item.id );
    var submenu_container = document.createElement('ul');
    submenu_container.className = 'submenu';  
    submenu_container.menu_no = menu_item.menu_no; // need this for opening submenu items
    submenu_container.setAttribute( 'align', 'right' );
    menu_item.parentNode.appendChild( submenu_container );
    
    insert_menu( menu_level_array, submenu_container, true );

  }

}






