diff --git a/build/tools/droiddoc/templates-cmsdk/assets/docs.js b/build/tools/droiddoc/templates-cmsdk/assets/docs.js
new file mode 100644
index 00000000..3ab4caf8
--- /dev/null
+++ b/build/tools/droiddoc/templates-cmsdk/assets/docs.js
@@ -0,0 +1,4339 @@
+var classesNav;
+var devdocNav;
+var sidenav;
+var cookie_namespace = 'android_developer';
+var NAV_PREF_TREE = "tree";
+var NAV_PREF_PANELS = "panels";
+var nav_pref;
+var isMobile = false; // true if mobile, so we can adjust some layout
+var mPagePath; // initialized in ready() function
+
+var basePath = getBaseUri(location.pathname);
+var SITE_ROOT = toRoot + basePath.substring(1,basePath.indexOf("/",1));
+var GOOGLE_DATA; // combined data for google service apis, used for search suggest
+
+// Ensure that all ajax getScript() requests allow caching
+$.ajaxSetup({
+ cache: true
+});
+
+/****** ON LOAD SET UP STUFF *********/
+
+$(document).ready(function() {
+
+ // show lang dialog if the URL includes /intl/
+ //if (location.pathname.substring(0,6) == "/intl/") {
+ // var lang = location.pathname.split('/')[2];
+ // if (lang != getLangPref()) {
+ // $("#langMessage a.yes").attr("onclick","changeLangPref('" + lang
+ // + "', true); $('#langMessage').hide(); return false;");
+ // $("#langMessage .lang." + lang).show();
+ // $("#langMessage").show();
+ // }
+ //}
+
+ // load json file for JD doc search suggestions
+ $.getScript(toRoot + 'jd_lists_unified.js');
+ // load json file for Android API search suggestions
+ $.getScript(toRoot + 'reference/lists.js');
+
+ // setup keyboard listener for search shortcut
+ $('body').keyup(function(event) {
+ if (event.which == 191) {
+ $('#search_autocomplete').focus();
+ }
+ });
+
+ // init the fullscreen toggle click event
+ $('#nav-swap .fullscreen').click(function(){
+ if ($(this).hasClass('disabled')) {
+ toggleFullscreen(true);
+ } else {
+ toggleFullscreen(false);
+ }
+ });
+
+ // initialize the divs with custom scrollbars
+ $('.scroll-pane').jScrollPane( {verticalGutter:0} );
+
+ // add HRs below all H2s (except for a few other h2 variants)
+ $('h2').not('#qv h2')
+ .not('#tb h2')
+ .not('.sidebox h2')
+ .not('#devdoc-nav h2')
+ .not('h2.norule').css({marginBottom:0})
+ .after('
');
+
+ // set up the search close button
+ $('.search .close').click(function() {
+ $searchInput = $('#search_autocomplete');
+ $searchInput.attr('value', '');
+ $(this).addClass("hide");
+ $("#search-container").removeClass('active');
+ $("#search_autocomplete").blur();
+ search_focus_changed($searchInput.get(), false);
+ hideResults();
+ });
+
+ // Set up quicknav
+ var quicknav_open = false;
+ $("#btn-quicknav").click(function() {
+ if (quicknav_open) {
+ $(this).removeClass('active');
+ quicknav_open = false;
+ collapse();
+ } else {
+ $(this).addClass('active');
+ quicknav_open = true;
+ expand();
+ }
+ })
+
+ var expand = function() {
+ $('#header-wrap').addClass('quicknav');
+ $('#quicknav').stop().show().animate({opacity:'1'});
+ }
+
+ var collapse = function() {
+ $('#quicknav').stop().animate({opacity:'0'}, 100, function() {
+ $(this).hide();
+ $('#header-wrap').removeClass('quicknav');
+ });
+ }
+
+
+ //Set up search
+ $("#search_autocomplete").focus(function() {
+ $("#search-container").addClass('active');
+ })
+ $("#search-container").mouseover(function() {
+ $("#search-container").addClass('active');
+ $("#search_autocomplete").focus();
+ })
+ $("#search-container").mouseout(function() {
+ if ($("#search_autocomplete").is(":focus")) return;
+ if ($("#search_autocomplete").val() == '') {
+ setTimeout(function(){
+ $("#search-container").removeClass('active');
+ $("#search_autocomplete").blur();
+ },250);
+ }
+ })
+ $("#search_autocomplete").blur(function() {
+ if ($("#search_autocomplete").val() == '') {
+ $("#search-container").removeClass('active');
+ }
+ })
+
+
+ // prep nav expandos
+ var pagePath = document.location.pathname;
+ // account for intl docs by removing the intl/*/ path
+ if (pagePath.indexOf("/intl/") == 0) {
+ pagePath = pagePath.substr(pagePath.indexOf("/",6)); // start after intl/ to get last /
+ }
+
+ if (pagePath.indexOf(SITE_ROOT) == 0) {
+ if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') {
+ pagePath += 'index.html';
+ }
+ }
+
+ // Need a copy of the pagePath before it gets changed in the next block;
+ // it's needed to perform proper tab highlighting in offline docs (see rootDir below)
+ var pagePathOriginal = pagePath;
+ if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') {
+ // If running locally, SITE_ROOT will be a relative path, so account for that by
+ // finding the relative URL to this page. This will allow us to find links on the page
+ // leading back to this page.
+ var pathParts = pagePath.split('/');
+ var relativePagePathParts = [];
+ var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3;
+ for (var i = 0; i < upDirs; i++) {
+ relativePagePathParts.push('..');
+ }
+ for (var i = 0; i < upDirs; i++) {
+ relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]);
+ }
+ relativePagePathParts.push(pathParts[pathParts.length - 1]);
+ pagePath = relativePagePathParts.join('/');
+ } else {
+ // Otherwise the page path is already an absolute URL
+ }
+
+ // Highlight the header tabs...
+ // highlight Design tab
+ if ($("body").hasClass("design")) {
+ $("#header li.design a").addClass("selected");
+ $("#sticky-header").addClass("design");
+
+ // highlight About tabs
+ } else if ($("body").hasClass("about")) {
+ var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1));
+ if (rootDir == "about") {
+ $("#nav-x li.about a").addClass("selected");
+ } else if (rootDir == "wear") {
+ $("#nav-x li.wear a").addClass("selected");
+ } else if (rootDir == "tv") {
+ $("#nav-x li.tv a").addClass("selected");
+ } else if (rootDir == "auto") {
+ $("#nav-x li.auto a").addClass("selected");
+ }
+ // highlight Develop tab
+ } else if ($("body").hasClass("develop") || $("body").hasClass("google")) {
+ $("#header li.develop a").addClass("selected");
+ $("#sticky-header").addClass("develop");
+ // In Develop docs, also highlight appropriate sub-tab
+ var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1));
+ if (rootDir == "training") {
+ $("#nav-x li.training a").addClass("selected");
+ } else if (rootDir == "guide") {
+ $("#nav-x li.guide a").addClass("selected");
+ } else if (rootDir == "reference") {
+ // If the root is reference, but page is also part of Google Services, select Google
+ if ($("body").hasClass("google")) {
+ $("#nav-x li.google a").addClass("selected");
+ } else {
+ $("#nav-x li.reference a").addClass("selected");
+ }
+ } else if ((rootDir == "tools") || (rootDir == "sdk")) {
+ $("#nav-x li.tools a").addClass("selected");
+ } else if ($("body").hasClass("google")) {
+ $("#nav-x li.google a").addClass("selected");
+ } else if ($("body").hasClass("samples")) {
+ $("#nav-x li.samples a").addClass("selected");
+ }
+
+ // highlight Distribute tab
+ } else if ($("body").hasClass("distribute")) {
+ $("#header li.distribute a").addClass("selected");
+ $("#sticky-header").addClass("distribute");
+
+ var baseFrag = pagePathOriginal.indexOf('/', 1) + 1;
+ var secondFrag = pagePathOriginal.substring(baseFrag, pagePathOriginal.indexOf('/', baseFrag));
+ if (secondFrag == "users") {
+ $("#nav-x li.users a").addClass("selected");
+ } else if (secondFrag == "engage") {
+ $("#nav-x li.engage a").addClass("selected");
+ } else if (secondFrag == "monetize") {
+ $("#nav-x li.monetize a").addClass("selected");
+ } else if (secondFrag == "analyze") {
+ $("#nav-x li.analyze a").addClass("selected");
+ } else if (secondFrag == "tools") {
+ $("#nav-x li.disttools a").addClass("selected");
+ } else if (secondFrag == "stories") {
+ $("#nav-x li.stories a").addClass("selected");
+ } else if (secondFrag == "essentials") {
+ $("#nav-x li.essentials a").addClass("selected");
+ } else if (secondFrag == "googleplay") {
+ $("#nav-x li.googleplay a").addClass("selected");
+ }
+ } else if ($("body").hasClass("about")) {
+ $("#sticky-header").addClass("about");
+ }
+
+ // set global variable so we can highlight the sidenav a bit later (such as for google reference)
+ // and highlight the sidenav
+ mPagePath = pagePath;
+ highlightSidenav();
+ buildBreadcrumbs();
+
+ // set up prev/next links if they exist
+ var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]');
+ var $selListItem;
+ if ($selNavLink.length) {
+ $selListItem = $selNavLink.closest('li');
+
+ // set up prev links
+ var $prevLink = [];
+ var $prevListItem = $selListItem.prev('li');
+
+ var crossBoundaries = ($("body.design").length > 0) || ($("body.guide").length > 0) ? true :
+false; // navigate across topic boundaries only in design docs
+ if ($prevListItem.length) {
+ if ($prevListItem.hasClass('nav-section') || crossBoundaries) {
+ // jump to last topic of previous section
+ $prevLink = $prevListItem.find('a:last');
+ } else if (!$selListItem.hasClass('nav-section')) {
+ // jump to previous topic in this section
+ $prevLink = $prevListItem.find('a:eq(0)');
+ }
+ } else {
+ // jump to this section's index page (if it exists)
+ var $parentListItem = $selListItem.parents('li');
+ $prevLink = $selListItem.parents('li').find('a');
+
+ // except if cross boundaries aren't allowed, and we're at the top of a section already
+ // (and there's another parent)
+ if (!crossBoundaries && $parentListItem.hasClass('nav-section')
+ && $selListItem.hasClass('nav-section')) {
+ $prevLink = [];
+ }
+ }
+
+ // set up next links
+ var $nextLink = [];
+ var startClass = false;
+ var isCrossingBoundary = false;
+
+ if ($selListItem.hasClass('nav-section') && $selListItem.children('div.empty').length == 0) {
+ // we're on an index page, jump to the first topic
+ $nextLink = $selListItem.find('ul:eq(0)').find('a:eq(0)');
+
+ // if there aren't any children, go to the next section (required for About pages)
+ if($nextLink.length == 0) {
+ $nextLink = $selListItem.next('li').find('a');
+ } else if ($('.topic-start-link').length) {
+ // as long as there's a child link and there is a "topic start link" (we're on a landing)
+ // then set the landing page "start link" text to be the first doc title
+ $('.topic-start-link').text($nextLink.text().toUpperCase());
+ }
+
+ // If the selected page has a description, then it's a class or article homepage
+ if ($selListItem.find('a[description]').length) {
+ // this means we're on a class landing page
+ startClass = true;
+ }
+ } else {
+ // jump to the next topic in this section (if it exists)
+ $nextLink = $selListItem.next('li').find('a:eq(0)');
+ if ($nextLink.length == 0) {
+ isCrossingBoundary = true;
+ // no more topics in this section, jump to the first topic in the next section
+ $nextLink = $selListItem.parents('li:eq(0)').next('li').find('a:eq(0)');
+ if (!$nextLink.length) { // Go up another layer to look for next page (lesson > class > course)
+ $nextLink = $selListItem.parents('li:eq(1)').next('li.nav-section').find('a:eq(0)');
+ if ($nextLink.length == 0) {
+ // if that doesn't work, we're at the end of the list, so disable NEXT link
+ $('.next-page-link').attr('href','').addClass("disabled")
+ .click(function() { return false; });
+ // and completely hide the one in the footer
+ $('.content-footer .next-page-link').hide();
+ }
+ }
+ }
+ }
+
+ if (startClass) {
+ $('.start-class-link').attr('href', $nextLink.attr('href')).removeClass("hide");
+
+ // if there's no training bar (below the start button),
+ // then we need to add a bottom border to button
+ if (!$("#tb").length) {
+ $('.start-class-link').css({'border-bottom':'1px solid #DADADA'});
+ }
+ } else if (isCrossingBoundary && !$('body.design').length) { // Design always crosses boundaries
+ $('.content-footer.next-class').show();
+ $('.next-page-link').attr('href','')
+ .removeClass("hide").addClass("disabled")
+ .click(function() { return false; });
+ // and completely hide the one in the footer
+ $('.content-footer .next-page-link').hide();
+ if ($nextLink.length) {
+ $('.next-class-link').attr('href',$nextLink.attr('href'))
+ .removeClass("hide")
+ .append(": " + $nextLink.html());
+ $('.next-class-link').find('.new').empty();
+ }
+ } else {
+ $('.next-page-link').attr('href', $nextLink.attr('href'))
+ .removeClass("hide");
+ // for the footer link, also add the next page title
+ $('.content-footer .next-page-link').append(": " + $nextLink.html());
+ }
+
+ if (!startClass && $prevLink.length) {
+ var prevHref = $prevLink.attr('href');
+ if (prevHref == SITE_ROOT + 'index.html') {
+ // Don't show Previous when it leads to the homepage
+ } else {
+ $('.prev-page-link').attr('href', $prevLink.attr('href')).removeClass("hide");
+ }
+ }
+
+ }
+
+
+
+ // Set up the course landing pages for Training with class names and descriptions
+ if ($('body.trainingcourse').length) {
+ var $classLinks = $selListItem.find('ul li a').not('#nav .nav-section .nav-section ul a');
+
+ // create an array for all the class descriptions
+ var $classDescriptions = new Array($classLinks.length);
+ var lang = getLangPref();
+ $classLinks.each(function(index) {
+ var langDescr = $(this).attr(lang + "-description");
+ if (typeof langDescr !== 'undefined' && langDescr !== false) {
+ // if there's a class description in the selected language, use that
+ $classDescriptions[index] = langDescr;
+ } else {
+ // otherwise, use the default english description
+ $classDescriptions[index] = $(this).attr("description");
+ }
+ });
+
+ var $olClasses = $('');
+ var $liClass;
+ var $imgIcon;
+ var $h2Title;
+ var $pSummary;
+ var $olLessons;
+ var $liLesson;
+ $classLinks.each(function(index) {
+ $liClass = $('');
+ $h2Title = $('