(function($) { $.fn.toc = function(options) { var self = this; var opts = $.extend({}, jQuery.fn.toc.defaults, options); var container = $(opts.container); var headings = $(opts.selectors, container); var headingOffsets = []; var activeClassName = opts.prefix+'-active'; var scrollTo = function(e) { if (opts.smoothScrolling) { e.preventDefault(); var elScrollTo = $(e.target).attr('href'); var $el = $(elScrollTo); $('body,html').animate({ scrollTop: $el.offset().top }, 400, 'swing', function() { location.hash = elScrollTo; }); } $('li', self).removeClass(activeClassName); $(e.target).parent().addClass(activeClassName); }; //highlight on scroll var timeout; var highlightOnScroll = function(e) { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(function() { var top = $(window).scrollTop(), highlighted; for (var i = 0, c = headingOffsets.length; i < c; i++) { if (headingOffsets[i] >= top) { $('li', self).removeClass(activeClassName); highlighted = $('li:eq('+(i-1)+')', self).addClass(activeClassName); opts.onHighlight(highlighted); break; } } }, 50); }; if (opts.highlightOnScroll) { $(window).bind('scroll', highlightOnScroll); highlightOnScroll(); } //Perform search and hide unmatched elements var tocList; var treeObject = {}; //Create the tree var createTree = function(ul) { var prevLevel = {level: -1, index: -1, parent: -1, val: ''}; var levelParent = {0: -1}; tocList = ul.children("li"); tocList.each(function(i) { var me = $(this).removeClass("toc-active"); var currentLevel = parseInt(me.attr('class').trim().slice(-1)); if (currentLevel > prevLevel.level) { currentParent = prevLevel.index; } else if (currentLevel == prevLevel.level) { currentParent = prevLevel.parent; } else if (currentLevel < prevLevel.level) { currentParent = levelParent[currentLevel] || prevLevel.parent; } levelParent[currentLevel] = currentParent; var currentVal = $('a', this).text().trim().toLowerCase(); treeObject[i] = { val: currentVal, level: currentLevel, parent: currentParent } prevLevel = {index: i, val: currentVal, level: currentLevel, parent: currentParent}; }); } //Show the parents recursively var showParents = function(key) { var me = treeObject[key]; if (me.parent > -1) { $(tocList[me.parent]).show(); showParents(me.parent); } }; //Perform the search var search = function(searchVal) { searchVal = searchVal.trim().toLowerCase(); for (var key in treeObject) { var me = treeObject[key]; if (me.val.indexOf(searchVal) !== -1 || searchVal.length == 0) { $(tocList[key]).show(); if ($(tocList[me.parent]).is(":hidden")) { showParents(key); } } else { $(tocList[key]).hide(); } } } return this.each(function() { //build TOC var el = $(this); var searchVal = ''; var searchForm = $("
", {class: "form-search quick-search"}) .append($("", {type: "text", class: "input-medium search-query", placeholder: "Quick Search"})) .append($("", {class: "icon icon-search search-icon"})); searchForm.css({'position': 'fixed', 'top': '45px', 'padding-right': '20px'}); $(".search-icon", searchForm).css({'marginLeft': '-20px', 'marginTop': '3px'}); var ul = $('