From ebcf3977a28477df6e6fdbad3bf425581d19ccc1 Mon Sep 17 00:00:00 2001
From: Amanda Kassay <akassay@google.com>
Date: Thu, 31 Mar 2016 10:03:57 -0400
Subject: [PATCH] Tabs js error fix, DevSite css issues fix, Search filtering

Staged: http://akassay.nyc.corp.google.com:8080/index.html#q=Activity
Change-Id: Id25525a8d8c927ea67cd13b43652d75ce53733cf
---
 .../templates-sdk-dev/assets/css/default.css  |  30 +++++
 .../templates-sdk-dev/assets/js/docs.js       | 126 +++++++++++++-----
 2 files changed, 120 insertions(+), 36 deletions(-)

diff --git a/tools/droiddoc/templates-sdk-dev/assets/css/default.css b/tools/droiddoc/templates-sdk-dev/assets/css/default.css
index 3c045ce86..6fef2419d 100644
--- a/tools/droiddoc/templates-sdk-dev/assets/css/default.css
+++ b/tools/droiddoc/templates-sdk-dev/assets/css/default.css
@@ -9887,3 +9887,33 @@ a.video-shadowbox-button.white:hover::after {
   position: absolute;
   top: -4px;
 }
+
+/** CSS Fixes for DevSite (akassay@) */
+.dac-button-social,
+.dac-fab:not('.dac-scroll-button') {
+  position: relative;
+}
+
+.dac-button-social .dac-sprite,
+.dac-fab .dac-sprite,
+.play-button .dac-sprite {
+  margin-top: -7px;
+  position: relative;
+  top: 50%;
+}
+
+.dac-fab .dac-sprite.dac-arrow-down-gray {
+  margin-top: -3px;
+}
+
+.dac-button-social .dac-sprite.dac-gplus {
+  margin-top: -17px;
+}
+
+.play-button .dac-sprite {
+  margin-top: -10px;
+}
+
+.dac-nav-link-forward {
+  padding: 9px 0;
+}
diff --git a/tools/droiddoc/templates-sdk-dev/assets/js/docs.js b/tools/droiddoc/templates-sdk-dev/assets/js/docs.js
index 60cb860d1..9afed711e 100644
--- a/tools/droiddoc/templates-sdk-dev/assets/js/docs.js
+++ b/tools/droiddoc/templates-sdk-dev/assets/js/docs.js
@@ -15,7 +15,8 @@ $.ajaxSetup({
 $(document).ready(function() {
 
   // prep nav expandos
-  var pagePath = document.location.pathname;
+  var pagePath = devsite ?
+      location.href.replace(location.hash, '') : 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 /
@@ -3378,12 +3379,22 @@ window.changeLangPref = changeLangPref;
   })();
   var localeTarget = (function() {
     var localeTarget = locale;
-    if (location.pathname.substring(0,6) == "/intl/") {
-      var target = location.pathname.split('/')[2];
-      if (!(target === 0) || (LANGUAGES.indexOf(target) === -1)) {
-        localeTarget = target;
+    if (window.devsite) {
+      if (getQueryVariable('hl')) {
+        var target = getQueryVariable('hl');
+        if (!(target === 0) || (LANGUAGES.indexOf(target) === -1)) {
+          localeTarget = target;
+        }
+      }
+    } else {
+      if (location.pathname.substring(0,6) == "/intl/") {
+        var target = location.pathname.split('/')[2];
+        if (!(target === 0) || (LANGUAGES.indexOf(target) === -1)) {
+          localeTarget = target;
+        }
       }
     }
+
     return localeTarget;
   })();
 
@@ -5357,7 +5368,8 @@ window.metadata.search = (function() {
     return $.get('https://content.googleapis.com/customsearch/v1?' +  $.param(searchParams));
   }
 
-  function renderResults(el, results) {
+  function renderResults(el, results, searchAppliance) {
+    var referenceResults = searchAppliance.getReferenceResults();
     if (!results.items) {
       el.append($('<div>').text('No results'));
       return;
@@ -5365,27 +5377,37 @@ window.metadata.search = (function() {
 
     for (var i = 0; i < results.items.length; i++) {
       var item = results.items[i];
-      var hasImage = item.pagemap && item.pagemap.cse_thumbnail;
-      var sectionMatch = item.link.match(/developer\.android\.com\/(\w*)/);
-      var section = (sectionMatch && sectionMatch[1]) || 'blog';
+      var isDuplicate = false;
+      $(referenceResults.android).each(function(index, result) {
+        if (item.link.indexOf(result.link) > -1) {
+          isDuplicate = true;
+          return false;
+        }
+      });
 
-      var entry = $('<div>').addClass('dac-custom-search-entry cols');
+      if (!isDuplicate) {
+        var hasImage = item.pagemap && item.pagemap.cse_thumbnail;
+        var sectionMatch = item.link.match(/developer\.android\.com\/(\w*)/);
+        var section = (sectionMatch && sectionMatch[1]) || 'blog';
 
-      if (hasImage) {
-        var image = item.pagemap.cse_thumbnail[0];
-        entry.append($('<div>').addClass('dac-custom-search-image-wrapper')
-          .append($('<div>').addClass('dac-custom-search-image').css('background-image', 'url(' + image.src + ')')));
+        var entry = $('<div>').addClass('dac-custom-search-entry cols');
+
+        if (hasImage) {
+          var image = item.pagemap.cse_thumbnail[0];
+          entry.append($('<div>').addClass('dac-custom-search-image-wrapper')
+            .append($('<div>').addClass('dac-custom-search-image').css('background-image', 'url(' + image.src + ')')));
+        }
+
+        entry.append($('<div>').addClass('dac-custom-search-text-wrapper')
+          .append($('<p>').addClass('dac-custom-search-section').text(section))
+          .append(
+            $('<a>').text(item.title).attr('href', item.link).wrap('<h2>').parent().addClass('dac-custom-search-title')
+          )
+          .append($('<p>').addClass('dac-custom-search-snippet').html(item.htmlSnippet.replace(/<br>/g, '')))
+          .append($('<a>').addClass('dac-custom-search-link').text(item.formattedUrl).attr('href', item.link)));
+
+        el.append(entry);
       }
-
-      entry.append($('<div>').addClass('dac-custom-search-text-wrapper')
-        .append($('<p>').addClass('dac-custom-search-section').text(section))
-        .append(
-          $('<a>').text(item.title).attr('href', item.link).wrap('<h2>').parent().addClass('dac-custom-search-title')
-        )
-        .append($('<p>').addClass('dac-custom-search-snippet').html(item.htmlSnippet.replace(/<br>/g, '')))
-        .append($('<a>').addClass('dac-custom-search-link').text(item.formattedUrl).attr('href', item.link)));
-
-      el.append(entry);
     }
 
     if (results.queries.nextPage) {
@@ -5393,32 +5415,32 @@ window.metadata.search = (function() {
         .addClass('dac-custom-search-load-more')
         .text('Load more')
         .click(function() {
-          loadMoreResults(el, results);
+          loadMoreResults(el, results, searchAppliance);
         });
 
       el.append(loadMoreButton);
     }
-  }
+  };
 
-  function loadMoreResults(el, results) {
-    var query = results.queries.request.searchTerms;
-    var start = results.queries.nextPage.startIndex;
+  function loadMoreResults(el, results, searchAppliance) {
+    var query = results.queries.request[0].searchTerms;
+    var start = results.queries.nextPage[0].startIndex;
     var loadMoreButton = el.find('#dac-custom-search-load-more');
 
     loadMoreButton.text('Loading more...');
 
     customSearch(query, start).then(function(results) {
       loadMoreButton.remove();
-      renderResults(el, results);
+      renderResults(el, results, searchAppliance);
     });
   }
 
-  $.fn.customSearch = function(query) {
+  $.fn.customSearch = function(query, searchAppliance) {
     var el = $(this);
 
     customSearch(query).then(function(results) {
       el.empty();
-      renderResults(el, results);
+      renderResults(el, results, searchAppliance);
     });
   };
 })(jQuery);
@@ -5625,10 +5647,11 @@ window.metadata.search = (function() {
     this.searchResultsHero = $('#dac-search-results-hero');
     this.searchResultsReference = $('#dac-search-results-reference');
     this.searchHeader = $('[data-search]').data('search-input.dac');
+    this.currQueryReferenceResults = {};
   }
 
   Search.prototype.init = function() {
-    if (this.checkRedirectToIndex()) { return; }
+    if (!devsite && this.checkRedirectToIndex()) { return; }
 
     this.searchHistory = window.dacStore('search-history');
 
@@ -5639,9 +5662,8 @@ window.metadata.search = (function() {
     this.searchClose.click(this.close.bind(this));
 
     this.customSearch = $.fn.debounce(function(query) {
-      $('#dac-custom-search-results').customSearch(query);
-    }, 1000);
-
+      $('#dac-custom-search-results').customSearch(query, this);
+    }.bind(this), 1000);
     // Start search shortcut (/)
     $('body').keyup(function(event) {
       if (event.which === 191 && $(event.target).is(':not(:input)')) {
@@ -5764,6 +5786,10 @@ window.metadata.search = (function() {
     return this.searchInput.val().replace(/(^ +)|( +$)/g, '');
   };
 
+  Search.prototype.getReferenceResults = function() {
+    return this.currQueryReferenceResults;
+  };
+
   Search.prototype.onSearchChanged = function() {
     var query = this.getQuery();
 
@@ -5780,10 +5806,19 @@ window.metadata.search = (function() {
 
     this.lastQuery = query;
     this.searchResultsFor.text(query);
+
+    // CSE results lag behind the metadata/reference results. We need to empty
+    // the CSE results and add 'Loading' text so user's aren't looking at two
+    // different sets of search results at one time.
+    var $loadingEl =
+        $('<div class="loadingCustomSearchResults">Loading Results...</div>');
+    $('#dac-custom-search-results').empty().prepend($loadingEl);
+
     this.customSearch(query);
     var metadataResults = metadata.search(query);
     this.searchResultsResources.dacSearchRenderResources(metadataResults.resources, query);
     this.searchResultsReference.dacSearchRenderReferences(metadataResults, query);
+    this.currQueryReferenceResults = metadataResults;
     var hasHero = this.searchResultsHero.dacSearchRenderHero(metadataResults.resources, query);
     var hasQuery = !!query;
 
@@ -6502,3 +6537,22 @@ window.dacStore = (function(window) {
     initWideTable();
   });
 })(jQuery);
+
+/** Utilities */
+
+/* returns the given string with all HTML brackets converted to entities
+    TODO: move this to the site's JS library */
+function escapeHTML(string) {
+  return string.replace(/</g,"&lt;")
+                .replace(/>/g,"&gt;");
+};
+
+function getQueryVariable(variable) {
+  var query = window.location.search.substring(1);
+  var vars = query.split("&");
+  for (var i=0;i<vars.length;i++) {
+    var pair = vars[i].split("=");
+    if(pair[0] == variable){return pair[1];}
+  }
+  return(false);
+};