/*
 * Copyright 2005-2006 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
toggleNavigation = function() {
    if (document.getElementById) {
        navigationRoot = document.getElementById("navigation");
        if (navigationRoot) {
            navigationList = navigationRoot.getElementsByTagName("ul")[0];
            if (navigationList) {
                navigationList.style.visibility = "hidden";
                navigationRoot.onmouseover = function() {
                    navigationList.style.visibility = "visible";
                }
                navigationRoot.onmouseout = function() {
                    navigationList.style.visibility = "hidden";
                }
            }
        }
    }
}

window.onload = toggleNavigation;



