blob: 97f2a9818e6080475923d30b6ebbae7b0713aaaa [file] [log] [blame]
/* Progressive enhancement JavaScript for Jena web site.
* If JavaScript is available, we make the navigation links
* look a bit more visually appealing and less overwhelming.
*/
var JenaNavigation = function() {
var currentPage = {};
var currentSection = {};
var currentTopicListElem = null;
var init = function(){
getLocation();
setTopLevelNavigation();
setSideNavigationVisibility();
moveToC( currentTopicListElem );
};
/**
* Attache class 'selected' to the given menu element
* @param {Object} el
*/
var setSelectedMenu = function( el ) {
$(el).addClass( "selected" );
};
/**
* Set the top-level (horizontal) menu to show the current section
* selection
*/
var setTopLevelNavigation = function() {
findTopMenu( currentSection.fileName, setSelectedMenu );
};
/**
* Identify which top-level menu element matches the current file name,
* and apply the given function to it.
* @param {Object} fileName
* @param {Object} fn
*/
var findTopMenu = function( fileName, fn ) {
var expr = (fileName == 'about_jena') ? "#home_menu" : "#topmenu a[href*='" + fileName + "']";
$(expr).first().each( function( n ) {
fn( this );
} );
};
/**
* Identify current page and section.
*/
var getLocation = function() {
var url = document.URL;
var matches = url.match( /^.*jena.*apache\.org\/([^\/]*)\/(.*)$/ );
if (matches) {
currentSection.fileName = matches[1];
currentPage.fileName = matches[2];
}
else {
currentSection.fileName = "about_jena";
currentPage.fileName = "index.html";
}
currentSection.title = asTitle( currentSection.fileName );
currentPage.title = asTitle( currentPage.fileName.replace( /.html$/, '' ) );
};
/**
* Hide the irrelevant parts of the side menu. We keep the
* quick links section and the ASF section, and the section
* containing the current page. Also styles the menu to
* highlight the current page, and adds to the navigation
* menu the ToC from the main page.
*/
var setSideNavigationVisibility = function() {
$("#navigation>h1").hide();
$("#navigation>ul").hide();
showMenu( "#quick-links" );
showMenu( "#asf-links" );
var currentTopicMenu = "#" + currentSection.fileName.replace( /\_/g, "-" );
showMenu( currentTopicMenu );
// make the current topic link styled as 'current'
currentTopicListElem = $( currentTopicMenu ).next()
.find( "a[href$='" + currentPage.fileName + "']" )
.first()
.parent();
currentTopicListElem.toggleClass( "selected" );
};
/**
* Show a menu with the given element ID, which we take to
* that element and its next sibling
* @param {Object} id
*/
var showMenu = function( id ) {
$(id).show();
$(id).next().show();
};
/**
* Return the given name as a title (space separators,
* leading capital letter)
* @param {Object} f
*/
var asTitle = function( f ) {
f = f.replace( /\_/g, " " );
return f.slice( 0, 1 ).toUpperCase() + f.slice( 1 );
};
/**
* Move the table of contents to be the child of the given node
*/
var moveToC = function( newParent ) {
$( "#table_of_contents" ).next().appendTo( newParent );
$( "#table_of_contents" ).hide();
};
// Return the public variables/functions for this module
return {
init : init
};
}();
// Initialize on load
$(function(){ JenaNavigation.init(); });