1541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar classesNav;
2541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar devdocNav;
3541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar sidenav;
4541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar cookie_namespace = 'android_developer';
5541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar NAV_PREF_TREE = "tree";
6541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar NAV_PREF_PANELS = "panels";
7541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar nav_pref;
8541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar isMobile = false; // true if mobile, so we can adjust some layout
9541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar mPagePath; // initialized in ready() function
10541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
11541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar basePath = getBaseUri(location.pathname);
12541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar SITE_ROOT = toRoot + basePath.substring(1,basePath.indexOf("/",1));
13541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar GOOGLE_DATA; // combined data for google service apis, used for search suggest
14541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
15541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// Ensure that all ajax getScript() requests allow caching
16541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty$.ajaxSetup({
17541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  cache: true
18541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty});
19541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
20541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/******  ON LOAD SET UP STUFF *********/
21541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
22541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar navBarIsFixed = false;
23541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty$(document).ready(function() {
24541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
25541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // load json file for JD doc search suggestions
26541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $.getScript(toRoot + 'jd_lists_unified.js');
27541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // load json file for Android API search suggestions
28541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $.getScript(toRoot + 'reference/lists.js');
29541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // load json files for Google services API suggestions
30541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $.getScript(toRoot + 'reference/gcm_lists.js', function(data, textStatus, jqxhr) {
31541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // once the GCM json (GCM_DATA) is loaded, load the GMS json (GMS_DATA) and merge the data
32541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if(jqxhr.status === 200) {
33541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $.getScript(toRoot + 'reference/gms_lists.js', function(data, textStatus, jqxhr) {
34541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if(jqxhr.status === 200) {
35541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  // combine GCM and GMS data
36541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  GOOGLE_DATA = GMS_DATA;
37541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  var start = GOOGLE_DATA.length;
38541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  for (var i=0; i<GCM_DATA.length; i++) {
39541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                      GOOGLE_DATA.push({id:start+i, label:GCM_DATA[i].label,
40541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                              link:GCM_DATA[i].link, type:GCM_DATA[i].type});
41541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  }
42541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
43541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          });
44541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
45541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
46541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
47541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // setup keyboard listener for search shortcut
48541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('body').keyup(function(event) {
49541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (event.which == 191) {
50541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('#search_autocomplete').focus();
51541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
52541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
53541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
54541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // init the fullscreen toggle click event
55541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('#nav-swap .fullscreen').click(function(){
56541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($(this).hasClass('disabled')) {
57541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      toggleFullscreen(true);
58541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
59541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      toggleFullscreen(false);
60541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
61541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
62541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
63541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // initialize the divs with custom scrollbars
64541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('.scroll-pane').jScrollPane( {verticalGutter:0} );
65541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
66541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // add HRs below all H2s (except for a few other h2 variants)
67541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('h2').not('#qv h2').not('#tb h2').not('.sidebox h2').not('#devdoc-nav h2').not('h2.norule').css({marginBottom:0}).after('<hr/>');
68541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
69541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // set up the search close button
70541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('.search .close').click(function() {
71541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $searchInput = $('#search_autocomplete');
72541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $searchInput.attr('value', '');
73541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(this).addClass("hide");
74541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#search-container").removeClass('active');
75541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#search_autocomplete").blur();
76541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    search_focus_changed($searchInput.get(), false);
77541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    hideResults();
78541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
79541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
80541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Set up quicknav
81541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var quicknav_open = false;
82541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#btn-quicknav").click(function() {
83541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (quicknav_open) {
84541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(this).removeClass('active');
85541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      quicknav_open = false;
86541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      collapse();
87541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
88541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(this).addClass('active');
89541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      quicknav_open = true;
90541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      expand();
91541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
92541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  })
93541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
94541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var expand = function() {
95541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty   $('#header-wrap').addClass('quicknav');
96541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty   $('#quicknav').stop().show().animate({opacity:'1'});
97541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
98541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
99541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var collapse = function() {
100541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $('#quicknav').stop().animate({opacity:'0'}, 100, function() {
101541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(this).hide();
102541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('#header-wrap').removeClass('quicknav');
103541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
104541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
105541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
106541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
107541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //Set up search
108541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#search_autocomplete").focus(function() {
109541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#search-container").addClass('active');
110541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  })
111541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#search-container").mouseover(function() {
112541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#search-container").addClass('active');
113541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#search_autocomplete").focus();
114541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  })
115541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#search-container").mouseout(function() {
116541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($("#search_autocomplete").is(":focus")) return;
117541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($("#search_autocomplete").val() == '') {
118541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      setTimeout(function(){
119541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $("#search-container").removeClass('active');
120541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $("#search_autocomplete").blur();
121541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      },250);
122541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
123541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  })
124541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#search_autocomplete").blur(function() {
125541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($("#search_autocomplete").val() == '') {
126541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#search-container").removeClass('active');
127541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
128541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  })
129541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
130541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
131541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // prep nav expandos
132541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var pagePath = document.location.pathname;
133541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // account for intl docs by removing the intl/*/ path
134541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (pagePath.indexOf("/intl/") == 0) {
135541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    pagePath = pagePath.substr(pagePath.indexOf("/",6)); // start after intl/ to get last /
136541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
137541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
138541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (pagePath.indexOf(SITE_ROOT) == 0) {
139541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') {
140541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      pagePath += 'index.html';
141541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
142541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
143541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
144541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Need a copy of the pagePath before it gets changed in the next block;
145541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // it's needed to perform proper tab highlighting in offline docs (see rootDir below)
146541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var pagePathOriginal = pagePath;
147541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') {
148541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // If running locally, SITE_ROOT will be a relative path, so account for that by
149541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // finding the relative URL to this page. This will allow us to find links on the page
150541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // leading back to this page.
151541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var pathParts = pagePath.split('/');
152541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var relativePagePathParts = [];
153541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3;
154541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i = 0; i < upDirs; i++) {
155541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      relativePagePathParts.push('..');
156541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
157541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i = 0; i < upDirs; i++) {
158541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]);
159541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
160541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    relativePagePathParts.push(pathParts[pathParts.length - 1]);
161541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    pagePath = relativePagePathParts.join('/');
162541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
163541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Otherwise the page path is already an absolute URL
164541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
165541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
166541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Highlight the header tabs...
167541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // highlight Design tab
168541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($("body").hasClass("design")) {
169541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#header li.design a").addClass("selected");
17008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $("#sticky-header").addClass("design");
171541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
172541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // highlight Develop tab
173541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if ($("body").hasClass("develop") || $("body").hasClass("google")) {
174541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#header li.develop a").addClass("selected");
17508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $("#sticky-header").addClass("develop");
176541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // In Develop docs, also highlight appropriate sub-tab
177541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1));
178541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (rootDir == "training") {
179541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#nav-x li.training a").addClass("selected");
180541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if (rootDir == "guide") {
181541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#nav-x li.guide a").addClass("selected");
182541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if (rootDir == "reference") {
183541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // If the root is reference, but page is also part of Google Services, select Google
184541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ($("body").hasClass("google")) {
185541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $("#nav-x li.google a").addClass("selected");
186541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      } else {
187541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $("#nav-x li.reference a").addClass("selected");
188541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
189541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if ((rootDir == "tools") || (rootDir == "sdk")) {
190541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#nav-x li.tools a").addClass("selected");
191541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if ($("body").hasClass("google")) {
192541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#nav-x li.google a").addClass("selected");
193541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if ($("body").hasClass("samples")) {
194541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#nav-x li.samples a").addClass("selected");
195541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
196541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
197541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // highlight Distribute tab
198541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if ($("body").hasClass("distribute")) {
199541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#header li.distribute a").addClass("selected");
20008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $("#sticky-header").addClass("distribute");
20108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
20208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var baseFrag = pagePathOriginal.indexOf('/', 1) + 1;
20308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var secondFrag = pagePathOriginal.substring(baseFrag, pagePathOriginal.indexOf('/', baseFrag));
20408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    if (secondFrag == "users") {
20508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $("#nav-x li.users a").addClass("selected");
20608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (secondFrag == "engage") {
20708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $("#nav-x li.engage a").addClass("selected");
20808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (secondFrag == "monetize") {
20908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $("#nav-x li.monetize a").addClass("selected");
21008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (secondFrag == "tools") {
21108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $("#nav-x li.disttools a").addClass("selected");
21208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (secondFrag == "stories") {
21308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $("#nav-x li.stories a").addClass("selected");
21408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (secondFrag == "essentials") {
21508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $("#nav-x li.essentials a").addClass("selected");
21608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (secondFrag == "googleplay") {
21708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $("#nav-x li.googleplay a").addClass("selected");
21808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
219318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty  } else if ($("body").hasClass("about")) {
220318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    $("#sticky-header").addClass("about");
221318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty  }
222318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty
223541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // set global variable so we can highlight the sidenav a bit later (such as for google reference)
224541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // and highlight the sidenav
225541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  mPagePath = pagePath;
226541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  highlightSidenav();
22720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  buildBreadcrumbs();
228541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
229541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // set up prev/next links if they exist
230541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]');
231541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $selListItem;
232541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($selNavLink.length) {
233541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $selListItem = $selNavLink.closest('li');
234541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
235541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // set up prev links
236541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $prevLink = [];
237541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $prevListItem = $selListItem.prev('li');
238541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
239541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var crossBoundaries = ($("body.design").length > 0) || ($("body.guide").length > 0) ? true :
240541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfalse; // navigate across topic boundaries only in design docs
241541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($prevListItem.length) {
242541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ($prevListItem.hasClass('nav-section')) {
243541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // jump to last topic of previous section
244541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $prevLink = $prevListItem.find('a:last');
245541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      } else if (!$selListItem.hasClass('nav-section')) {
246541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // jump to previous topic in this section
247541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $prevLink = $prevListItem.find('a:eq(0)');
248541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
249541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
250541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // jump to this section's index page (if it exists)
251541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var $parentListItem = $selListItem.parents('li');
252541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $prevLink = $selListItem.parents('li').find('a');
253541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
254541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // except if cross boundaries aren't allowed, and we're at the top of a section already
255541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // (and there's another parent)
256541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (!crossBoundaries && $parentListItem.hasClass('nav-section')
257541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                           && $selListItem.hasClass('nav-section')) {
258541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $prevLink = [];
259541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
260541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
261541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
262541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // set up next links
263541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $nextLink = [];
264541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var startClass = false;
265541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var training = $(".next-class-link").length; // decides whether to provide "next class" link
266541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var isCrossingBoundary = false;
267541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
268541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($selListItem.hasClass('nav-section') && $selListItem.children('div.empty').length == 0) {
269541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // we're on an index page, jump to the first topic
270541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $nextLink = $selListItem.find('ul:eq(0)').find('a:eq(0)');
271541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
272541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // if there aren't any children, go to the next section (required for About pages)
273541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if($nextLink.length == 0) {
274541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $nextLink = $selListItem.next('li').find('a');
275541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      } else if ($('.topic-start-link').length) {
276541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // as long as there's a child link and there is a "topic start link" (we're on a landing)
277541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // then set the landing page "start link" text to be the first doc title
278541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('.topic-start-link').text($nextLink.text().toUpperCase());
279541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
280541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
281541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // If the selected page has a description, then it's a class or article homepage
282541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ($selListItem.find('a[description]').length) {
283541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // this means we're on a class landing page
284541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        startClass = true;
285541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
286541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
287541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // jump to the next topic in this section (if it exists)
288541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $nextLink = $selListItem.next('li').find('a:eq(0)');
289541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ($nextLink.length == 0) {
290541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        isCrossingBoundary = true;
291541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // no more topics in this section, jump to the first topic in the next section
292541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $nextLink = $selListItem.parents('li:eq(0)').next('li.nav-section').find('a:eq(0)');
293541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (!$nextLink.length) {  // Go up another layer to look for next page (lesson > class > course)
294541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $nextLink = $selListItem.parents('li:eq(1)').next('li.nav-section').find('a:eq(0)');
295541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          if ($nextLink.length == 0) {
296541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // if that doesn't work, we're at the end of the list, so disable NEXT link
297541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $('.next-page-link').attr('href','').addClass("disabled")
298541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                                .click(function() { return false; });
299541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
300541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
301541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
302541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
303541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
304541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (startClass) {
305541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.start-class-link').attr('href', $nextLink.attr('href')).removeClass("hide");
306541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
307541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // if there's no training bar (below the start button),
308541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // then we need to add a bottom border to button
309541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (!$("#tb").length) {
310541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('.start-class-link').css({'border-bottom':'1px solid #DADADA'});
311541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
312541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if (isCrossingBoundary && !$('body.design').length) {  // Design always crosses boundaries
313541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.content-footer.next-class').show();
314541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.next-page-link').attr('href','')
315541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                          .removeClass("hide").addClass("disabled")
316541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                          .click(function() { return false; });
317541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ($nextLink.length) {
318541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('.next-class-link').attr('href',$nextLink.attr('href'))
319541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                             .removeClass("hide").append($nextLink.html());
320541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('.next-class-link').find('.new').empty();
321541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
322541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
323541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.next-page-link').attr('href', $nextLink.attr('href')).removeClass("hide");
324541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
325541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
326541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (!startClass && $prevLink.length) {
327541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var prevHref = $prevLink.attr('href');
328541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (prevHref == SITE_ROOT + 'index.html') {
329541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // Don't show Previous when it leads to the homepage
330541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      } else {
331541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('.prev-page-link').attr('href', $prevLink.attr('href')).removeClass("hide");
332541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
333541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
334541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
335541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // If this is a training 'article', there should be no prev/next nav
336541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // ... if the grandparent is the "nav" ... and it has no child list items...
337541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (training && $selListItem.parents('ul').eq(1).is('[id="nav"]') &&
338541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        !$selListItem.find('li').length) {
339541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.next-page-link,.prev-page-link').attr('href','').addClass("disabled")
340541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                          .click(function() { return false; });
341541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
342541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
343541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
344541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
345541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
346541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
347541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Set up the course landing pages for Training with class names and descriptions
348541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($('body.trainingcourse').length) {
349541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $classLinks = $selListItem.find('ul li a').not('#nav .nav-section .nav-section ul a');
350541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $classDescriptions = $classLinks.attr('description');
351541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
352541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $olClasses  = $('<ol class="class-list"></ol>');
353541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $liClass;
354541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $imgIcon;
355541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $h2Title;
356541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $pSummary;
357541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $olLessons;
358541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $liLesson;
359541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $classLinks.each(function(index) {
360541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $liClass  = $('<li></li>');
361541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $h2Title  = $('<a class="title" href="'+$(this).attr('href')+'"><h2>' + $(this).html()+'</h2><span></span></a>');
362541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $pSummary = $('<p class="description">' + $(this).attr('description') + '</p>');
363541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
364541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $olLessons  = $('<ol class="lesson-list"></ol>');
365541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
366541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $lessons = $(this).closest('li').find('ul li a');
367541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
368541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ($lessons.length) {
369541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $imgIcon = $('<img src="'+toRoot+'assets/images/resource-tutorial.png" '
370541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            + ' width="64" height="64" alt=""/>');
371541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $lessons.each(function(index) {
372541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $olLessons.append('<li><a href="'+$(this).attr('href')+'">' + $(this).html()+'</a></li>');
373541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        });
374541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      } else {
375541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $imgIcon = $('<img src="'+toRoot+'assets/images/resource-article.png" '
376541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            + ' width="64" height="64" alt=""/>');
377541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $pSummary.addClass('article');
378541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
379541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
380541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $liClass.append($h2Title).append($imgIcon).append($pSummary).append($olLessons);
381541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $olClasses.append($liClass);
382541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
383541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $('.jd-descr').append($olClasses);
384541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
385541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
386541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Set up expand/collapse behavior
387541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  initExpandableNavItems("#nav");
388541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
389541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
390541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(".scroll-pane").scroll(function(event) {
391541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      event.preventDefault();
392541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return false;
393541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
394541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
395541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  /* Resize nav height when window height changes */
396541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(window).resize(function() {
397541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($('#side-nav').length == 0) return;
398541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]');
399541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    setNavBarLeftPos(); // do this even if sidenav isn't fixed because it could become fixed
400541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // make sidenav behave when resizing the window and side-scolling is a concern
401541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (navBarIsFixed) {
402541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ((stylesheet.attr("disabled") == "disabled") || stylesheet.length == 0) {
403541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        updateSideNavPosition();
404541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      } else {
405541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        updateSidenavFullscreenWidth();
406541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
407541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
408541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    resizeNav();
409541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
410541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
411541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
412541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var navBarLeftPos;
413541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($('#devdoc-nav').length) {
414541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    setNavBarLeftPos();
415541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
416541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
417541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
418541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Set up play-on-hover <video> tags.
419541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('video.play-on-hover').bind('click', function(){
420541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(this).get(0).load(); // in case the video isn't seekable
421541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(this).get(0).play();
422541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
423541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
424541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Set up tooltips
425541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var TOOLTIP_MARGIN = 10;
426541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('acronym,.tooltip-link').each(function() {
427541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $target = $(this);
428541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $tooltip = $('<div>')
429541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        .addClass('tooltip-box')
430541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        .append($target.attr('title'))
431541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        .hide()
432541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        .appendTo('body');
433541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $target.removeAttr('title');
434541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
435541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $target.hover(function() {
436541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // in
437541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var targetRect = $target.offset();
438541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      targetRect.width = $target.width();
439541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      targetRect.height = $target.height();
440541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
441541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $tooltip.css({
442541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        left: targetRect.left,
443541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        top: targetRect.top + targetRect.height + TOOLTIP_MARGIN
444541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      });
445541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $tooltip.addClass('below');
446541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $tooltip.show();
447541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }, function() {
448541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // out
449541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $tooltip.hide();
450541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
451541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
452541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
453541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Set up <h2> deeplinks
454541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('h2').click(function() {
455541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var id = $(this).attr('id');
456541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (id) {
457541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      document.location.hash = id;
458541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
459541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
460541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
461541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //Loads the +1 button
462541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
463541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  po.src = 'https://apis.google.com/js/plusone.js';
464541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
465541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
466541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
467541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Revise the sidenav widths to make room for the scrollbar
468541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // which avoids the visible width from changing each time the bar appears
469541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $sidenav = $("#side-nav");
470541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var sidenav_width = parseInt($sidenav.innerWidth());
471541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
472541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#devdoc-nav  #nav").css("width", sidenav_width - 4 + "px"); // 4px is scrollbar width
473541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
474541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
475541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller
476541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
477541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($(".scroll-pane").length > 1) {
478541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Check if there's a user preference for the panel heights
479541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var cookieHeight = readCookie("reference_height");
480541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (cookieHeight) {
481541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      restoreHeight(cookieHeight);
482541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
483541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
484541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
485541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  resizeNav();
486541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
487541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  /* init the language selector based on user cookie for lang */
488541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  loadLangPref();
489541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  changeNavLang(getLangPref());
490541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
491541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  /* setup event handlers to ensure the overflow menu is visible while picking lang */
492541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#language select")
493541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      .mousedown(function() {
494541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $("div.morehover").addClass("hover"); })
495541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      .blur(function() {
496541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $("div.morehover").removeClass("hover"); });
497541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
498541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  /* some global variable setup */
499541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  resizePackagesNav = $("#resize-packages-nav");
500541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  classesNav = $("#classes-nav");
501541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  devdocNav = $("#devdoc-nav");
502541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
503541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var cookiePath = "";
504541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (location.href.indexOf("/reference/") != -1) {
505541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    cookiePath = "reference_";
506541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if (location.href.indexOf("/guide/") != -1) {
507541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    cookiePath = "guide_";
508541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if (location.href.indexOf("/tools/") != -1) {
509541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    cookiePath = "tools_";
510541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if (location.href.indexOf("/training/") != -1) {
511541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    cookiePath = "training_";
512541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if (location.href.indexOf("/design/") != -1) {
513541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    cookiePath = "design_";
514541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if (location.href.indexOf("/distribute/") != -1) {
515541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    cookiePath = "distribute_";
516541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
517541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
518541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty});
519541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// END of the onload event
520541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
521541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
522541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction initExpandableNavItems(rootTag) {
523541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(rootTag + ' li.nav-section .nav-section-header').click(function() {
524541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var section = $(this).closest('li.nav-section');
525541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (section.hasClass('expanded')) {
526541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    /* hide me and descendants */
527541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      section.find('ul').slideUp(250, function() {
528541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // remove 'expanded' class from my section and any children
529541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        section.closest('li').removeClass('expanded');
530541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('li.nav-section', section).removeClass('expanded');
531541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        resizeNav();
532541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      });
533541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
534541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    /* show me */
535541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // first hide all other siblings
536541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var $others = $('li.nav-section.expanded', $(this).closest('ul')).not('.sticky');
537541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $others.removeClass('expanded').children('ul').slideUp(250);
538541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
539541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // now expand me
540541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      section.closest('li').addClass('expanded');
541541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      section.children('ul').slideDown(250, function() {
542541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        resizeNav();
543541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      });
544541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
545541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
546541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
547541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Stop expand/collapse behavior when clicking on nav section links
548541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // (since we're navigating away from the page)
549541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // This selector captures the first instance of <a>, but not those with "#" as the href.
550541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('.nav-section-header').find('a:eq(0)').not('a[href="#"]').click(function(evt) {
551541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    window.location.href = $(this).attr('href');
552541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return false;
553541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
554541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
555541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
55620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
55720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main/** Create the list of breadcrumb links in the sticky header */
55820cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Mainfunction buildBreadcrumbs() {
55920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  var $breadcrumbUl =  $("#sticky-header ul.breadcrumb");
56020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  // Add the secondary horizontal nav item, if provided
56120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  var $selectedSecondNav = $("div#nav-x ul.nav-x a.selected").clone().removeClass("selected");
56220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  if ($selectedSecondNav.length) {
56320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main    $breadcrumbUl.prepend($("<li>").append($selectedSecondNav))
56420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  }
56520cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  // Add the primary horizontal nav
56620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  var $selectedFirstNav = $("div#header-wrap ul.nav-x a.selected").clone().removeClass("selected");
5677a6ab434bc34319f06818d12d3abaf9070630684Scott Main  // If there's no header nav item, use the logo link and title from alt text
5687a6ab434bc34319f06818d12d3abaf9070630684Scott Main  if ($selectedFirstNav.length < 1) {
5697a6ab434bc34319f06818d12d3abaf9070630684Scott Main    $selectedFirstNav = $("<a>")
5707a6ab434bc34319f06818d12d3abaf9070630684Scott Main        .attr('href', $("div#header .logo a").attr('href'))
5717a6ab434bc34319f06818d12d3abaf9070630684Scott Main        .text($("div#header .logo img").attr('alt'));
5727a6ab434bc34319f06818d12d3abaf9070630684Scott Main  }
57320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  $breadcrumbUl.prepend($("<li>").append($selectedFirstNav));
57420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main}
57520cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
57620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
57720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
578541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/** Highlight the current page in sidenav, expanding children as appropriate */
579541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction highlightSidenav() {
580541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // if something is already highlighted, undo it. This is for dynamic navigation (Samples index)
581541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($("ul#nav li.selected").length) {
582541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    unHighlightSidenav();
583541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
584541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // look for URL in sidenav, including the hash
585541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $selNavLink = $('#nav').find('a[href="' + mPagePath + location.hash + '"]');
586541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
587541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // If the selNavLink is still empty, look for it without the hash
588541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($selNavLink.length == 0) {
589541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $selNavLink = $('#nav').find('a[href="' + mPagePath + '"]');
590541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
591541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
592541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $selListItem;
593541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($selNavLink.length) {
594541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Find this page's <li> in sidenav and set selected
595541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $selListItem = $selNavLink.closest('li');
596541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $selListItem.addClass('selected');
597541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
598541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Traverse up the tree and expand all parent nav-sections
599541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $selNavLink.parents('li.nav-section').each(function() {
600541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(this).addClass('expanded');
601541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(this).children('ul').show();
602541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
603541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
604541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
605541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
606541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction unHighlightSidenav() {
607541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("ul#nav li.selected").removeClass("selected");
608541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('ul#nav li.nav-section.expanded').removeClass('expanded').children('ul').hide();
609541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
610541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
611541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggleFullscreen(enable) {
612541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var delay = 20;
613541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var enabled = true;
614541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]');
615541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (enable) {
616541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Currently NOT USING fullscreen; enable fullscreen
617541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    stylesheet.removeAttr('disabled');
618541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $('#nav-swap .fullscreen').removeClass('disabled');
619541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $('#devdoc-nav').css({left:''});
620541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    setTimeout(updateSidenavFullscreenWidth,delay); // need to wait a moment for css to switch
621541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    enabled = true;
622541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
623541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Currently USING fullscreen; disable fullscreen
624541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    stylesheet.attr('disabled', 'disabled');
625541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $('#nav-swap .fullscreen').addClass('disabled');
626541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    setTimeout(updateSidenavFixedWidth,delay); // need to wait a moment for css to switch
627541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    enabled = false;
628541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
629541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  writeCookie("fullscreen", enabled, null, null);
630541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  setNavBarLeftPos();
631541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  resizeNav(delay);
632541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  updateSideNavPosition();
633541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  setTimeout(initSidenavHeightResize,delay);
634541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
635541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
636541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
637541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction setNavBarLeftPos() {
638541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  navBarLeftPos = $('#body-content').offset().left;
639541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
640541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
641541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
642541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction updateSideNavPosition() {
643541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var newLeft = $(window).scrollLeft() - navBarLeftPos;
644541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('#devdoc-nav').css({left: -newLeft});
645541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('#devdoc-nav .totop').css({left: -(newLeft - parseInt($('#side-nav').css('margin-left')))});
646541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
647541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
648541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// TODO: use $(document).ready instead
649541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction addLoadEvent(newfun) {
650541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var current = window.onload;
651541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (typeof window.onload != 'function') {
652541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    window.onload = newfun;
653541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
654541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    window.onload = function() {
655541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      current();
656541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      newfun();
657541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
658541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
659541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
660541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
661541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar agent = navigator['userAgent'].toLowerCase();
662541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// If a mobile phone, set flag and do mobile setup
663541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyif ((agent.indexOf("mobile") != -1) ||      // android, iphone, ipod
664541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    (agent.indexOf("blackberry") != -1) ||
665541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    (agent.indexOf("webos") != -1) ||
666541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    (agent.indexOf("mini") != -1)) {        // opera mini browsers
667541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  isMobile = true;
668541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
669541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
670541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
671541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty$(document).ready(function() {
672541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("pre:not(.no-pretty-print)").addClass("prettyprint");
673541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  prettyPrint();
674541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty});
675541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
676541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
677541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
678541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
679541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ######### RESIZE THE SIDENAV HEIGHT ########## */
680541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
681541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction resizeNav(delay) {
682541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $nav = $("#devdoc-nav");
683541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $window = $(window);
684541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var navHeight;
685541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
686541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Get the height of entire window and the total header height.
687541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Then figure out based on scroll position whether the header is visible
688541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var windowHeight = $window.height();
689541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var scrollTop = $window.scrollTop();
69020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  var headerHeight = $('#header-wrapper').outerHeight();
69120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main  var headerVisible = scrollTop < stickyTop;
692541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
693541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // get the height of space between nav and top of window.
694541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Could be either margin or top position, depending on whether the nav is fixed.
695541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var topMargin = (parseInt($nav.css('margin-top')) || parseInt($nav.css('top'))) + 1;
696541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // add 1 for the #side-nav bottom margin
697541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
698541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Depending on whether the header is visible, set the side nav's height.
699541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (headerVisible) {
700541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // The sidenav height grows as the header goes off screen
70120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main    navHeight = windowHeight - (headerHeight - scrollTop) - topMargin;
702541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
703541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Once header is off screen, the nav height is almost full window height
704541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    navHeight = windowHeight - topMargin;
705541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
706541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
707541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
708541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
709541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $scrollPanes = $(".scroll-pane");
710541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($scrollPanes.length > 1) {
711541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // subtract the height of the api level widget and nav swapper from the available nav height
712541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    navHeight -= ($('#api-nav-header').outerHeight(true) + $('#nav-swap').outerHeight(true));
713541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
714541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#swapper").css({height:navHeight + "px"});
715541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($("#nav-tree").is(":visible")) {
716541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#nav-tree").css({height:navHeight});
717541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
718541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
719541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var classesHeight = navHeight - parseInt($("#resize-packages-nav").css("height")) - 10 + "px";
720541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    //subtract 10px to account for drag bar
721541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
722541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // if the window becomes small enough to make the class panel height 0,
723541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // then the package panel should begin to shrink
724541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (parseInt(classesHeight) <= 0) {
725541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#resize-packages-nav").css({height:navHeight - 10}); //subtract 10px for drag bar
726541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#packages-nav").css({height:navHeight - 10});
727541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
728541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
729541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#classes-nav").css({'height':classesHeight, 'margin-top':'10px'});
730541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#classes-nav .jspContainer").css({height:classesHeight});
731541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
732541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
733541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
734541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $nav.height(navHeight);
735541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
736541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
737541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (delay) {
738541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    updateFromResize = true;
739541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    delayedReInitScrollbars(delay);
740541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
741541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    reInitScrollbars();
742541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
743541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
744541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
745541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
746541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar updateScrollbars = false;
747541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar updateFromResize = false;
748541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
749541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Re-initialize the scrollbars to account for changed nav size.
750541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * This method postpones the actual update by a 1/4 second in order to optimize the
751541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * scroll performance while the header is still visible, because re-initializing the
752541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * scroll panes is an intensive process.
753541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty */
754541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction delayedReInitScrollbars(delay) {
755541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // If we're scheduled for an update, but have received another resize request
756541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // before the scheduled resize has occured, just ignore the new request
757541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // (and wait for the scheduled one).
758541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (updateScrollbars && updateFromResize) {
759541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    updateFromResize = false;
760541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return;
761541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
762541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
763541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // We're scheduled for an update and the update request came from this method's setTimeout
764541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (updateScrollbars && !updateFromResize) {
765541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    reInitScrollbars();
766541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    updateScrollbars = false;
767541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
768541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    updateScrollbars = true;
769541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    updateFromResize = false;
770541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    setTimeout('delayedReInitScrollbars()',delay);
771541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
772541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
773541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
774541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Re-initialize the scrollbars to account for changed nav size. */
775541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction reInitScrollbars() {
776541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var pane = $(".scroll-pane").each(function(){
777541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var api = $(this).data('jsp');
778541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (!api) { setTimeout(reInitScrollbars,300); return;}
779541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    api.reinitialise( {verticalGutter:0} );
780541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
781541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller
782541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
783541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
784541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
785541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Resize the height of the nav panels in the reference,
786541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * and save the new size to a cookie */
787541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction saveNavPanels() {
788541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var basePath = getBaseUri(location.pathname);
789541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var section = basePath.substring(1,basePath.indexOf("/",1));
790541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  writeCookie("height", resizePackagesNav.css("height"), section, null);
791541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
792541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
793541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
794541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
795541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction restoreHeight(packageHeight) {
796541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#resize-packages-nav").height(packageHeight);
797541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#packages-nav").height(packageHeight);
798541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //  var classesHeight = navHeight - packageHeight;
799541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty //   $("#classes-nav").css({height:classesHeight});
800541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //  $("#classes-nav .jspContainer").css({height:classesHeight});
801541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
802541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
803541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
804541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
805541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ######### END RESIZE THE SIDENAV HEIGHT ########## */
806541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
807541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
808541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
809541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
810541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
811541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/** Scroll the jScrollPane to make the currently selected item visible
812541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    This is called when the page finished loading. */
813541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction scrollIntoView(nav) {
814541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $nav = $("#"+nav);
815541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var element = $nav.jScrollPane({/* ...settings... */});
816541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var api = element.data('jsp');
817541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
818541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($nav.is(':visible')) {
819541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $selected = $(".selected", $nav);
820541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ($selected.length == 0) {
821541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // If no selected item found, exit
822541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return;
823541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
824541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // get the selected item's offset from its container nav by measuring the item's offset
825541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // relative to the document then subtract the container nav's offset relative to the document
826541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var selectedOffset = $selected.offset().top - $nav.offset().top;
827541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (selectedOffset > $nav.height() * .8) { // multiply nav height by .8 so we move up the item
828541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                                               // if it's more than 80% down the nav
829541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // scroll the item up by an amount equal to 80% the container nav's height
830541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      api.scrollTo(0, selectedOffset - ($nav.height() * .8), false);
831541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
832541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
833541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
834541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
835541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
836541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
837541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
838541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
839541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
840541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Show popup dialogs */
841541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction showDialog(id) {
842541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $dialog = $("#"+id);
843541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $dialog.prepend('<div class="box-border"><div class="top"> <div class="left"></div> <div class="right"></div></div><div class="bottom"> <div class="left"></div> <div class="right"></div> </div> </div>');
844541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $dialog.wrapInner('<div/>');
845541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $dialog.removeClass("hide");
846541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
847541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
848541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
849541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
850541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
851541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
852541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* #########    COOKIES!     ########## */
853541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
854541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction readCookie(cookie) {
855541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var myCookie = cookie_namespace+"_"+cookie+"=";
856541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (document.cookie) {
857541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var index = document.cookie.indexOf(myCookie);
858541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (index != -1) {
859541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var valStart = index + myCookie.length;
860541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var valEnd = document.cookie.indexOf(";", valStart);
861541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (valEnd == -1) {
862541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        valEnd = document.cookie.length;
863541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
864541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var val = document.cookie.substring(valStart, valEnd);
865541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return val;
866541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
867541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
868541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return 0;
869541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
870541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
871541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction writeCookie(cookie, val, section, expiration) {
872541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (val==undefined) return;
873541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  section = section == null ? "_" : "_"+section+"_";
874541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (expiration == null) {
875541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var date = new Date();
876541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
877541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    expiration = date.toGMTString();
878541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
879541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var cookieValue = cookie_namespace + section + cookie + "=" + val
880541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    + "; expires=" + expiration+"; path=/";
881541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  document.cookie = cookieValue;
882541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
883541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
884541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* #########     END COOKIES!     ########## */
885541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
886541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
887541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
888541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
889d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Mainvar stickyTop;
890d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main/* Sets the vertical scoll position at which the sticky bar should appear.
891d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main   This method is called to reset the position when search results appear or hide */
892d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Mainfunction setStickyTop() {
893d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main  stickyTop = $('#header-wrapper').outerHeight() - $('#sticky-header').outerHeight();
894d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main}
895d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main
896541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
89708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty/*
89808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty * Displays sticky nav bar on pages when dac header scrolls out of view
89908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty */
90008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty(function() {
90108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  $(document).ready(function() {
90208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
903d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main    setStickyTop();
90408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var sticky = false;
90508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var hiding = false;
90608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var $stickyEl = $('#sticky-header');
90708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var $menuEl = $('.menu-container');
90808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
90920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main    var prevScrollLeft = 0; // used to compare current position to previous position of horiz scroll
91020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
91108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $(window).scroll(function() {
91220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // Exit if there's no sidenav
91320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      if ($('#side-nav').length == 0) return;
91420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // Exit if the mouse target is a DIV, because that means the event is coming
91520cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // from a scrollable div and so there's no need to make adjustments to our layout
91620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      if (event.target.nodeName == "DIV") {
91720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        return;
91820cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      }
91920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
92020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
92108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var top = $(window).scrollTop();
92220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // we set the navbar fixed when the scroll position is beyond the height of the site header...
92320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      var shouldBeSticky = top >= stickyTop;
92420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // ... except if the document content is shorter than the sidenav height.
92520cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // (this is necessary to avoid crazy behavior on OSX Lion due to overscroll bouncing)
92620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      if ($("#doc-col").height() < $("#side-nav").height()) {
92720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        shouldBeSticky = false;
92820cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      }
92920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
93020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // Don't continue if the header is sufficently far away
93120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // (to avoid intensive resizing that slows scrolling)
93220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      if (sticky && shouldBeSticky) {
93320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        return;
93420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      }
93508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
93620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // Account for horizontal scroll
93720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      var scrollLeft = $(window).scrollLeft();
93820cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // When the sidenav is fixed and user scrolls horizontally, reposition the sidenav to match
93920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      if (navBarIsFixed && (scrollLeft != prevScrollLeft)) {
94020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        updateSideNavPosition();
94120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        prevScrollLeft = scrollLeft;
94220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      }
94320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
94420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // If sticky header visible and position is now near top, hide sticky
94520cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      if (sticky && !shouldBeSticky) {
94608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        sticky = false;
94708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        hiding = true;
94820cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        // make the sidenav static again
94920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        $('#devdoc-nav')
95020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main            .removeClass('fixed')
95120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main            .css({'width':'auto','margin':''})
95220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main            .prependTo('#side-nav');
95320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        // delay hide the sticky
95420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        $menuEl.removeClass('sticky-menu');
95520cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        $stickyEl.fadeOut(250);
95620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        hiding = false;
95720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
95820cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        // update the sidenaav position for side scrolling
95920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        updateSideNavPosition();
96020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      } else if (!sticky && shouldBeSticky) {
96108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        sticky = true;
96220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        $stickyEl.fadeIn(10);
96308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        $menuEl.addClass('sticky-menu');
96408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
96520cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        // make the sidenav fixed
96620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        var width = $('#devdoc-nav').width();
96720cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        $('#devdoc-nav')
96820cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main            .addClass('fixed')
96920cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main            .css({'width':width+'px'})
97020cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main            .prependTo('#body-content');
97120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
97220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        // update the sidenaav position for side scrolling
97320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        updateSideNavPosition();
97420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main
97508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      } else if (hiding && top < 15) {
97608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        $menuEl.removeClass('sticky-menu');
97708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        $stickyEl.hide();
97808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        hiding = false;
97908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
98008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
98120cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      resizeNav(250); // pass true in order to delay the scrollbar re-initialization for performance
98208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    });
98308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
98408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    // Stack hover states
98508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $('.section-card-menu').each(function(index, el) {
98608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var height = $(el).height();
98708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $(el).css({height:height+'px', position:'relative'});
98808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var $cardInfo = $(el).find('.card-info');
98908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
99008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $cardInfo.css({position: 'absolute', bottom:'0px', left:'0px', right:'0px', overflow:'visible'});
99108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    });
99208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
99320cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main    resizeNav();  // must resize once loading is finished
99408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  });
99508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
99608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty})();
997541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
998541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
999541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1000541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1001541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1002541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1003541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1004541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1005541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1006541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1007541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1008541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1009541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1010541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1011541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/*      MISC LIBRARY FUNCTIONS     */
1012541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1013541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1014541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1015541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1016541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1017541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggle(obj, slide) {
1018541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var ul = $("ul:first", obj);
1019541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var li = ul.parent();
1020541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (li.hasClass("closed")) {
1021541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (slide) {
1022541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      ul.slideDown("fast");
1023541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
1024541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      ul.show();
1025541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1026541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    li.removeClass("closed");
1027541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    li.addClass("open");
1028541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(".toggle-img", li).attr("title", "hide pages");
1029541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1030541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    ul.slideUp("fast");
1031541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    li.removeClass("open");
1032541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    li.addClass("closed");
1033541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(".toggle-img", li).attr("title", "show pages");
1034541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1035541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1036541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1037541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1038541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction buildToggleLists() {
1039541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(".toggle-list").each(
1040541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    function(i) {
1041541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("div:first", this).append("<a class='toggle-img' href='#' title='show pages' onClick='toggle(this.parentNode.parentNode, true); return false;'></a>");
1042541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(this).addClass("closed");
1043541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
1044541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1045541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1046541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1047541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1048541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction hideNestedItems(list, toggle) {
1049541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $list = $(list);
1050541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // hide nested lists
1051541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if($list.hasClass('showing')) {
1052541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("li ol", $list).hide('fast');
1053541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $list.removeClass('showing');
1054541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // show nested lists
1055541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1056541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("li ol", $list).show('fast');
1057541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $list.addClass('showing');
1058541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1059541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(".more,.less",$(toggle)).toggle();
1060541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1061541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1062541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1063541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1064541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1065541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1066541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1067541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1068541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1069541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1070541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1071541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1072541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1073541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1074541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1075541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1076541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1077541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1078541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1079541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1080541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1081541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1082541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1083541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1084541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1085541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1086541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1087541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1088541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1089541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/*      REFERENCE NAV SWAP     */
1090541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1091541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1092541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction getNavPref() {
1093541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var v = readCookie('reference_nav');
1094541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (v != NAV_PREF_TREE) {
1095541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    v = NAV_PREF_PANELS;
1096541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1097541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return v;
1098541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1099541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1100541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction chooseDefaultNav() {
1101541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  nav_pref = getNavPref();
1102541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (nav_pref == NAV_PREF_TREE) {
1103541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#nav-panels").toggle();
1104541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#panel-link").toggle();
1105541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#nav-tree").toggle();
1106541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#tree-link").toggle();
1107541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1108541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1109541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1110541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction swapNav() {
1111541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (nav_pref == NAV_PREF_TREE) {
1112541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    nav_pref = NAV_PREF_PANELS;
1113541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1114541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    nav_pref = NAV_PREF_TREE;
1115541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    init_default_navtree(toRoot);
1116541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1117541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var date = new Date();
1118541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
1119541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  writeCookie("nav", nav_pref, "reference", date.toGMTString());
1120541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1121541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#nav-panels").toggle();
1122541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#panel-link").toggle();
1123541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#nav-tree").toggle();
1124541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#tree-link").toggle();
1125541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1126541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  resizeNav();
1127541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1128541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Gross nasty hack to make tree view show up upon first swap by setting height manually
1129541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#nav-tree .jspContainer:visible")
1130541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      .css({'height':$("#nav-tree .jspContainer .jspPane").height() +'px'});
1131541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Another nasty hack to make the scrollbar appear now that we have height
1132541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  resizeNav();
1133541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1134541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ($("#nav-tree").is(':visible')) {
1135541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    scrollIntoView("nav-tree");
1136541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1137541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    scrollIntoView("packages-nav");
1138541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    scrollIntoView("classes-nav");
1139541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1140541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1141541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1142541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1143541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1144541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ############################################ */
1145541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ##########     LOCALIZATION     ############ */
1146541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ############################################ */
1147541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1148541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction getBaseUri(uri) {
1149541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var intlUrl = (uri.substring(0,6) == "/intl/");
1150541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (intlUrl) {
1151541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    base = uri.substring(uri.indexOf('intl/')+5,uri.length);
1152541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    base = base.substring(base.indexOf('/')+1, base.length);
1153541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      //alert("intl, returning base url: /" + base);
1154541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return ("/" + base);
1155541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1156541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      //alert("not intl, returning uri as found.");
1157541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return uri;
1158541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1159541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1160541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1161541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction requestAppendHL(uri) {
1162541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty//append "?hl=<lang> to an outgoing request (such as to blog)
1163541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var lang = getLangPref();
1164541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (lang) {
1165541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var q = 'hl=' + lang;
1166541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    uri += '?' + q;
1167541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    window.location = uri;
1168541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return false;
1169541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1170541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return true;
1171541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1172541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1173541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1174541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1175541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction changeNavLang(lang) {
1176541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $links = $("#devdoc-nav,#header,#nav-x,.training-nav-top,.content-footer").find("a["+lang+"-lang]");
1177541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $links.each(function(i){ // for each link with a translation
1178541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $link = $(this);
1179541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (lang != "en") { // No need to worry about English, because a language change invokes new request
1180541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // put the desired language from the attribute as the text
1181541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $link.text($link.attr(lang+"-lang"))
1182541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1183541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
1184541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1185541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1186541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction changeLangPref(lang, submit) {
1187541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var date = new Date();
1188541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  expires = date.toGMTString(date.setTime(date.getTime()+(10*365*24*60*60*1000)));
1189541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // keep this for 50 years
1190541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //alert("expires: " + expires)
1191541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  writeCookie("pref_lang", lang, null, expires);
1192541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1193541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //  #######  TODO:  Remove this condition once we're stable on devsite #######
1194541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //  This condition is only needed if we still need to support legacy GAE server
1195541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (devsite) {
1196541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Switch language when on Devsite server
1197541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (submit) {
1198541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $("#setlang").submit();
1199541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1200541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1201541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Switch language when on legacy GAE server
1202541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (submit) {
1203541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      window.location = getBaseUri(location.pathname);
1204541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1205541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1206541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1207541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1208541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction loadLangPref() {
1209541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var lang = readCookie("pref_lang");
1210541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (lang != 0) {
1211541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#language").find("option[value='"+lang+"']").attr("selected",true);
1212541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1213541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1214541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1215541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction getLangPref() {
1216541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var lang = $("#language").find(":selected").attr("value");
1217541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (!lang) {
1218541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    lang = readCookie("pref_lang");
1219541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1220541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return (lang != 0) ? lang : 'en';
1221541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1222541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1223541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ##########     END LOCALIZATION     ############ */
1224541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1225541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1226541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1227541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1228541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1229541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1230541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Used to hide and reveal supplemental content, such as long code samples.
1231541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty   See the companion CSS in android-developer-docs.css */
1232541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggleContent(obj) {
1233541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var div = $(obj).closest(".toggle-content");
1234541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var toggleMe = $(".toggle-content-toggleme:eq(0)",div);
1235541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (div.hasClass("closed")) { // if it's closed, open it
1236541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    toggleMe.slideDown();
1237541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(".toggle-content-text:eq(0)", obj).toggle();
1238541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    div.removeClass("closed").addClass("open");
1239541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(".toggle-content-img:eq(0)", div).attr("title", "hide").attr("src", toRoot
1240541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  + "assets/images/triangle-opened.png");
1241541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else { // if it's open, close it
1242541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    toggleMe.slideUp('fast', function() {  // Wait until the animation is done before closing arrow
1243541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(".toggle-content-text:eq(0)", obj).toggle();
1244541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      div.removeClass("open").addClass("closed");
1245541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      div.find(".toggle-content").removeClass("open").addClass("closed")
1246541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              .find(".toggle-content-toggleme").hide();
1247541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(".toggle-content-img", div).attr("title", "show").attr("src", toRoot
1248541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  + "assets/images/triangle-closed.png");
1249541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
1250541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1251541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return false;
1252541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1253541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1254541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1255541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* New version of expandable content */
1256541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggleExpandable(link,id) {
1257541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if($(id).is(':visible')) {
1258541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(id).slideUp();
1259541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(link).removeClass('expanded');
1260541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
1261541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(id).slideDown();
1262541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(link).addClass('expanded');
1263541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
1264541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1265541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1266541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction hideExpandable(ids) {
1267541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(ids).slideUp();
1268541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(ids).prev('h4').find('a.expandable').removeClass('expanded');
1269541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1270541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1271541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1272541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1273541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1274541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1275541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/*
1276541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  Slideshow 1.0
1277541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  Used on /index.html and /develop/index.html for carousel
1278541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1279541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  Sample usage:
1280541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  HTML -
1281541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  <div class="slideshow-container">
1282541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <a href="" class="slideshow-prev">Prev</a>
1283541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <a href="" class="slideshow-next">Next</a>
1284541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <ul>
1285541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee1.jpg"></li>
1286541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee2.jpg"></li>
1287541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee3.jpg"></li>
1288541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee4.jpg"></li>
1289541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   </ul>
1290541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  </div>
1291541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1292541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <script type="text/javascript">
1293541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   $('.slideshow-container').dacSlideshow({
1294541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       auto: true,
1295541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       btnPrev: '.slideshow-prev',
1296541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       btnNext: '.slideshow-next'
1297541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   });
1298541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   </script>
1299541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1300541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  Options:
1301541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  btnPrev:    optional identifier for previous button
1302541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  btnNext:    optional identifier for next button
1303541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  btnPause:   optional identifier for pause button
1304541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  auto:       whether or not to auto-proceed
1305541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  speed:      animation speed
1306541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  autoTime:   time between auto-rotation
1307541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  easing:     easing function for transition
1308541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  start:      item to select by default
1309541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  scroll:     direction to scroll in
1310541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  pagination: whether or not to include dotted pagination
1311541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1312541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty */
1313541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1314541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty (function($) {
1315541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty $.fn.dacSlideshow = function(o) {
1316541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1317541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     //Options - see above
1318541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     o = $.extend({
1319541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         btnPrev:   null,
1320541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         btnNext:   null,
1321541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         btnPause:  null,
1322541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         auto:      true,
1323541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         speed:     500,
1324541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         autoTime:  12000,
1325541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         easing:    null,
1326541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         start:     0,
1327541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         scroll:    1,
1328541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         pagination: true
1329541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1330541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     }, o || {});
1331541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1332541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     //Set up a carousel for each
1333541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return this.each(function() {
1334541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1335541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var running = false;
1336541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var animCss = o.vertical ? "top" : "left";
1337541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var sizeCss = o.vertical ? "height" : "width";
1338541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var div = $(this);
1339541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var ul = $("ul", div);
1340541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var tLi = $("li", ul);
1341541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var tl = tLi.size();
1342541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var timer = null;
1343541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1344541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var li = $("li", ul);
1345541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var itemLength = li.size();
1346541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var curr = o.start;
1347541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1348541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         li.css({float: o.vertical ? "none" : "left"});
1349541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         ul.css({margin: "0", padding: "0", position: "relative", "list-style-type": "none", "z-index": "1"});
1350541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         div.css({position: "relative", "z-index": "2", left: "0px"});
1351541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1352541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var liSize = o.vertical ? height(li) : width(li);
1353541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var ulSize = liSize * itemLength;
1354541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var divSize = liSize;
1355541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1356541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         li.css({width: li.width(), height: li.height()});
1357541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         ul.css(sizeCss, ulSize+"px").css(animCss, -(curr*liSize));
1358541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1359541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         div.css(sizeCss, divSize+"px");
1360541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1361541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Pagination
1362541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         if (o.pagination) {
1363541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             var pagination = $("<div class='pagination'></div>");
1364541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             var pag_ul = $("<ul></ul>");
1365541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             if (tl > 1) {
1366541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty               for (var i=0;i<tl;i++) {
1367541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    var li = $("<li>"+i+"</li>");
1368541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    pag_ul.append(li);
1369541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    if (i==o.start) li.addClass('active');
1370541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                        li.click(function() {
1371541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                        go(parseInt($(this).text()));
1372541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    })
1373541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                }
1374541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                pagination.append(pag_ul);
1375541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                div.append(pagination);
1376541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             }
1377541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         }
1378541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1379541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Previous button
1380541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         if(o.btnPrev)
1381541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             $(o.btnPrev).click(function(e) {
1382541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 e.preventDefault();
1383541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 return go(curr-o.scroll);
1384541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             });
1385541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1386541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Next button
1387541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         if(o.btnNext)
1388541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             $(o.btnNext).click(function(e) {
1389541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 e.preventDefault();
1390541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 return go(curr+o.scroll);
1391541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             });
1392541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1393541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Pause button
1394541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         if(o.btnPause)
1395541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             $(o.btnPause).click(function(e) {
1396541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 e.preventDefault();
1397541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 if ($(this).hasClass('paused')) {
1398541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     startRotateTimer();
1399541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 } else {
1400541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     pauseRotateTimer();
1401541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 }
1402541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             });
1403541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1404541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Auto rotation
1405541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         if(o.auto) startRotateTimer();
1406541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1407541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         function startRotateTimer() {
1408541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             clearInterval(timer);
1409541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             timer = setInterval(function() {
1410541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  if (curr == tl-1) {
1411541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    go(0);
1412541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  } else {
1413541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    go(curr+o.scroll);
1414541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  }
1415541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }, o.autoTime);
1416541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             $(o.btnPause).removeClass('paused');
1417541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         }
1418541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1419541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         function pauseRotateTimer() {
1420541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             clearInterval(timer);
1421541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             $(o.btnPause).addClass('paused');
1422541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         }
1423541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1424541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Go to an item
1425541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         function go(to) {
1426541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             if(!running) {
1427541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1428541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 if(to<0) {
1429541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    to = itemLength-1;
1430541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 } else if (to>itemLength-1) {
1431541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    to = 0;
1432541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 }
1433541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 curr = to;
1434541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1435541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 running = true;
1436541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1437541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 ul.animate(
1438541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     animCss == "left" ? { left: -(curr*liSize) } : { top: -(curr*liSize) } , o.speed, o.easing,
1439541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     function() {
1440541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                         running = false;
1441541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     }
1442541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 );
1443541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1444541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 $(o.btnPrev + "," + o.btnNext).removeClass("disabled");
1445541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 $( (curr-o.scroll<0 && o.btnPrev)
1446541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     ||
1447541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    (curr+o.scroll > itemLength && o.btnNext)
1448541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     ||
1449541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                    []
1450541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  ).addClass("disabled");
1451541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1452541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1453541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 var nav_items = $('li', pagination);
1454541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 nav_items.removeClass('active');
1455541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 nav_items.eq(to).addClass('active');
1456541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1457541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1458541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             }
1459541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             if(o.auto) startRotateTimer();
1460541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             return false;
1461541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         };
1462541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     });
1463541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1464541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1465541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty function css(el, prop) {
1466541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return parseInt($.css(el[0], prop)) || 0;
1467541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1468541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty function width(el) {
1469541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
1470541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1471541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty function height(el) {
1472541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
1473541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1474541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1475541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty })(jQuery);
1476541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1477541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1478541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/*
1479541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  dacSlideshow 1.0
1480541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  Used on develop/index.html for side-sliding tabs
1481541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1482541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  Sample usage:
1483541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  HTML -
1484541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  <div class="slideshow-container">
1485541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <a href="" class="slideshow-prev">Prev</a>
1486541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <a href="" class="slideshow-next">Next</a>
1487541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <ul>
1488541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee1.jpg"></li>
1489541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee2.jpg"></li>
1490541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee3.jpg"></li>
1491541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       <li class="item"><img src="images/marquee4.jpg"></li>
1492541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   </ul>
1493541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  </div>
1494541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1495541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   <script type="text/javascript">
1496541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   $('.slideshow-container').dacSlideshow({
1497541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       auto: true,
1498541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       btnPrev: '.slideshow-prev',
1499541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *       btnNext: '.slideshow-next'
1500541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   });
1501541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *   </script>
1502541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1503541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  Options:
1504541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  btnPrev:    optional identifier for previous button
1505541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  btnNext:    optional identifier for next button
1506541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  auto:       whether or not to auto-proceed
1507541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  speed:      animation speed
1508541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  autoTime:   time between auto-rotation
1509541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  easing:     easing function for transition
1510541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  start:      item to select by default
1511541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  scroll:     direction to scroll in
1512541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *  pagination: whether or not to include dotted pagination
1513541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *
1514541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty */
1515541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty (function($) {
1516541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty $.fn.dacTabbedList = function(o) {
1517541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1518541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     //Options - see above
1519541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     o = $.extend({
1520541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         speed : 250,
1521541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         easing: null,
1522541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         nav_id: null,
1523541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         frame_id: null
1524541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     }, o || {});
1525541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1526541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     //Set up a carousel for each
1527541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return this.each(function() {
1528541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1529541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var curr = 0;
1530541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var running = false;
1531541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var animCss = "margin-left";
1532541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var sizeCss = "width";
1533541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var div = $(this);
1534541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1535541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var nav = $(o.nav_id, div);
1536541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var nav_li = $("li", nav);
1537541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var nav_size = nav_li.size();
1538541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var frame = div.find(o.frame_id);
1539541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         var content_width = $(frame).find('ul').width();
1540541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Buttons
1541541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         $(nav_li).click(function(e) {
1542541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty           go($(nav_li).index($(this)));
1543541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         })
1544541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1545541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         //Go to an item
1546541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         function go(to) {
1547541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             if(!running) {
1548541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 curr = to;
1549541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 running = true;
1550541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1551541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 frame.animate({ 'margin-left' : -(curr*content_width) }, o.speed, o.easing,
1552541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     function() {
1553541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                         running = false;
1554541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                     }
1555541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 );
1556541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1557541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1558541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 nav_li.removeClass('active');
1559541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 nav_li.eq(to).addClass('active');
1560541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1561541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1562541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             }
1563541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty             return false;
1564541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty         };
1565541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     });
1566541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1567541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1568541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty function css(el, prop) {
1569541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return parseInt($.css(el[0], prop)) || 0;
1570541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1571541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty function width(el) {
1572541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
1573541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1574541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty function height(el) {
1575541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty     return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
1576541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty };
1577541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1578541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty })(jQuery);
1579541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1580541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1581541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1582541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1583541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1584541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ######################################################## */
1585541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ################  SEARCH SUGGESTIONS  ################## */
1586541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ######################################################## */
1587541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1588541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1589541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1590541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gSelectedIndex = -1;  // the index position of currently highlighted suggestion
1591541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gSelectedColumn = -1;  // which column of suggestion lists is currently focused
1592541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1593541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gMatches = new Array();
1594541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gLastText = "";
1595541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gInitialized = false;
1596541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar ROW_COUNT_FRAMEWORK = 20;       // max number of results in list
1597541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gListLength = 0;
1598541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1599541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1600541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gGoogleMatches = new Array();
1601541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar ROW_COUNT_GOOGLE = 15;          // max number of results in list
1602541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gGoogleListLength = 0;
1603541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1604541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gDocsMatches = new Array();
1605541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar ROW_COUNT_DOCS = 100;          // max number of results in list
1606541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar gDocsListLength = 0;
1607541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1608541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction onSuggestionClick(link) {
1609541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // When user clicks a suggested document, track it
1610541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  _gaq.push(['_trackEvent', 'Suggestion Click', 'clicked: ' + $(link).text(),
1611541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            'from: ' + $("#search_autocomplete").val()]);
1612541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1613541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1614541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction set_item_selected($li, selected)
1615541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
1616541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (selected) {
1617541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $li.attr('class','jd-autocomplete jd-selected');
1618541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
1619541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $li.attr('class','jd-autocomplete');
1620541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1621541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1622541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1623541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction set_item_values(toroot, $li, match)
1624541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
1625541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $link = $('a',$li);
1626541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $link.html(match.__hilabel || match.label);
1627541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $link.attr('href',toroot + match.link);
1628541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1629541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1630541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction set_item_values_jd(toroot, $li, match)
1631541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
1632541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $link = $('a',$li);
1633541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $link.html(match.title);
1634541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $link.attr('href',toroot + match.url);
1635541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1636541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1637541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction new_suggestion($list) {
1638541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $li = $("<li class='jd-autocomplete'></li>");
1639541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $list.append($li);
1640541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1641541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $li.mousedown(function() {
1642541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        window.location = this.firstChild.getAttribute("href");
1643541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
1644541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $li.mouseover(function() {
1645541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('.search_filtered_wrapper li').removeClass('jd-selected');
1646541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $(this).addClass('jd-selected');
1647541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gSelectedColumn = $(".search_filtered:visible").index($(this).closest('.search_filtered'));
1648541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gSelectedIndex = $("li", $(".search_filtered:visible")[gSelectedColumn]).index(this);
1649541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
1650541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $li.append("<a onclick='onSuggestionClick(this)'></a>");
1651541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $li.attr('class','show-item');
1652541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return $li;
1653541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1654541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1655541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction sync_selection_table(toroot)
1656541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
1657541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $li; //list item jquery object
1658541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var i; //list item iterator
1659541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1660541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // if there are NO results at all, hide all columns
1661541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (!(gMatches.length > 0) && !(gGoogleMatches.length > 0) && !(gDocsMatches.length > 0)) {
1662541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('.suggest-card').hide(300);
1663541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return;
1664541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1665541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1666541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // if there are api results
1667541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ((gMatches.length > 0) || (gGoogleMatches.length > 0)) {
1668541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // reveal suggestion list
1669541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.suggest-card.dummy').show();
1670541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.suggest-card.reference').show();
1671541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var listIndex = 0; // list index position
1672541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1673541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // reset the lists
1674541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(".search_filtered_wrapper.reference li").remove();
1675541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1676541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // ########### ANDROID RESULTS #############
1677541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (gMatches.length > 0) {
1678541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1679541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // determine android results to show
1680541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          gListLength = gMatches.length < ROW_COUNT_FRAMEWORK ?
1681541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                        gMatches.length : ROW_COUNT_FRAMEWORK;
1682541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (i=0; i<gListLength; i++) {
1683541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              var $li = new_suggestion($(".suggest-card.reference ul"));
1684541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              set_item_values(toroot, $li, gMatches[i]);
1685541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              set_item_selected($li, i == gSelectedIndex);
1686541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
1687541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
1688541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1689541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // ########### GOOGLE RESULTS #############
1690541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (gGoogleMatches.length > 0) {
1691541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // show header for list
1692541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".suggest-card.reference ul").append("<li class='header'>in Google Services:</li>");
1693541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1694541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // determine google results to show
1695541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          gGoogleListLength = gGoogleMatches.length < ROW_COUNT_GOOGLE ? gGoogleMatches.length : ROW_COUNT_GOOGLE;
1696541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (i=0; i<gGoogleListLength; i++) {
1697541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              var $li = new_suggestion($(".suggest-card.reference ul"));
1698541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              set_item_values(toroot, $li, gGoogleMatches[i]);
1699541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              set_item_selected($li, i == gSelectedIndex);
1700541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
1701541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
1702541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
1703541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.suggest-card.reference').hide();
1704541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.suggest-card.dummy').hide();
1705541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1706541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1707541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // ########### JD DOC RESULTS #############
1708541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (gDocsMatches.length > 0) {
1709541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // reset the lists
1710541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $(".search_filtered_wrapper.docs li").remove();
1711541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1712541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // determine google results to show
1713541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // NOTE: The order of the conditions below for the sugg.type MUST BE SPECIFIC:
1714541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // The order must match the reverse order that each section appears as a card in
1715541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // the suggestion UI... this may be only for the "develop" grouped items though.
1716541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gDocsListLength = gDocsMatches.length < ROW_COUNT_DOCS ? gDocsMatches.length : ROW_COUNT_DOCS;
1717541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        for (i=0; i<gDocsListLength; i++) {
1718541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var sugg = gDocsMatches[i];
1719541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var $li;
1720541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (sugg.type == "design") {
1721541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $li = new_suggestion($(".suggest-card.design ul"));
1722541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            } else
1723541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (sugg.type == "distribute") {
1724541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $li = new_suggestion($(".suggest-card.distribute ul"));
1725541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            } else
1726541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (sugg.type == "samples") {
1727541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $li = new_suggestion($(".suggest-card.develop .child-card.samples"));
1728541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            } else
1729541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (sugg.type == "training") {
1730541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $li = new_suggestion($(".suggest-card.develop .child-card.training"));
1731541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            } else
1732541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (sugg.type == "about"||"guide"||"tools"||"google") {
1733541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $li = new_suggestion($(".suggest-card.develop .child-card.guides"));
1734541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            } else {
1735541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              continue;
1736541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1737541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1738541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            set_item_values_jd(toroot, $li, sugg);
1739541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            set_item_selected($li, i == gSelectedIndex);
1740541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1741541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1742541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // add heading and show or hide card
1743541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($(".suggest-card.design li").length > 0) {
1744541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".suggest-card.design ul").prepend("<li class='header'>Design:</li>");
1745541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".suggest-card.design").show(300);
1746541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        } else {
1747541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $('.suggest-card.design').hide(300);
1748541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1749541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($(".suggest-card.distribute li").length > 0) {
1750541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".suggest-card.distribute ul").prepend("<li class='header'>Distribute:</li>");
1751541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".suggest-card.distribute").show(300);
1752541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        } else {
1753541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $('.suggest-card.distribute').hide(300);
1754541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1755541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($(".child-card.guides li").length > 0) {
1756541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".child-card.guides").prepend("<li class='header'>Guides:</li>");
1757541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".child-card.guides li").appendTo(".suggest-card.develop ul");
1758541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1759541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($(".child-card.training li").length > 0) {
1760541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".child-card.training").prepend("<li class='header'>Training:</li>");
1761541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".child-card.training li").appendTo(".suggest-card.develop ul");
1762541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1763541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($(".child-card.samples li").length > 0) {
1764541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".child-card.samples").prepend("<li class='header'>Samples:</li>");
1765541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".child-card.samples li").appendTo(".suggest-card.develop ul");
1766541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1767541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1768541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($(".suggest-card.develop li").length > 0) {
1769541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".suggest-card.develop").show(300);
1770541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        } else {
1771541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $('.suggest-card.develop').hide(300);
1772541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1773541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1774541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
1775541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $('.search_filtered_wrapper.docs .suggest-card:not(.dummy)').hide(300);
1776541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1777541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
1778541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1779541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/** Called by the search input's onkeydown and onkeyup events.
1780541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  * Handles navigation with keyboard arrows, Enter key to invoke search,
1781541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  * otherwise invokes search suggestions on key-up event.
1782541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  * @param e       The JS event
1783541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  * @param kd      True if the event is key-down
1784541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  * @param toroot  A string for the site's root path
1785541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  * @returns       True if the event should bubble up
1786541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  */
1787541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction search_changed(e, kd, toroot)
1788541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
1789541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var currentLang = getLangPref();
1790541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var search = document.getElementById("search_autocomplete");
1791541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var text = search.value.replace(/(^ +)|( +$)/g, '');
1792541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // get the ul hosting the currently selected item
1793541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    gSelectedColumn = gSelectedColumn >= 0 ? gSelectedColumn :  0;
1794541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $columns = $(".search_filtered_wrapper").find(".search_filtered:visible");
1795541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $selectedUl = $columns[gSelectedColumn];
1796541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1797541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // show/hide the close button
1798541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (text != '') {
1799541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $(".search .close").removeClass("hide");
1800541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
1801541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $(".search .close").addClass("hide");
1802541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1803541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // 27 = esc
1804541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (e.keyCode == 27) {
1805541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // close all search results
1806541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (kd) $('.search .close').trigger('click');
1807541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return true;
1808541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1809541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // 13 = enter
1810541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else if (e.keyCode == 13) {
1811541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (gSelectedIndex < 0) {
1812541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $('.suggest-card').hide();
1813541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if ($("#searchResults").is(":hidden") && (search.value != "")) {
1814541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if results aren't showing (and text not empty), return true to allow search to execute
18154868e9bf92fb88a94c377dfda5d97e38b0948b7dScott Main              $('body,html').animate({scrollTop:0}, '500', 'swing');
1816541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              return true;
1817541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            } else {
1818541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // otherwise, results are already showing, so allow ajax to auto refresh the results
1819541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // and ignore this Enter press to avoid the reload.
1820541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              return false;
1821541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1822541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        } else if (kd && gSelectedIndex >= 0) {
1823541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // click the link corresponding to selected item
1824541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $("a",$("li",$selectedUl)[gSelectedIndex]).get()[0].click();
1825541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            return false;
1826541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1827541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1828541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Stop here if Google results are showing
1829541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else if ($("#searchResults").is(":visible")) {
1830541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return true;
1831541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1832541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // 38 UP ARROW
1833541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else if (kd && (e.keyCode == 38)) {
1834541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // if the next item is a header, skip it
1835541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($($("li", $selectedUl)[gSelectedIndex-1]).hasClass("header")) {
1836541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            gSelectedIndex--;
1837541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1838541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (gSelectedIndex >= 0) {
1839541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $('li', $selectedUl).removeClass('jd-selected');
1840541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            gSelectedIndex--;
1841541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
1842541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // If user reaches top, reset selected column
1843541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (gSelectedIndex < 0) {
1844541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gSelectedColumn = -1;
1845541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1846541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1847541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return false;
1848541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1849541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // 40 DOWN ARROW
1850541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else if (kd && (e.keyCode == 40)) {
1851541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // if the next item is a header, skip it
1852541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header")) {
1853541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            gSelectedIndex++;
1854541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1855541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ((gSelectedIndex < $("li", $selectedUl).length-1) ||
1856541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                        ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header"))) {
1857541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $('li', $selectedUl).removeClass('jd-selected');
1858541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            gSelectedIndex++;
1859541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
1860541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1861541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return false;
1862541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1863541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Consider left/right arrow navigation
1864541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // NOTE: Order of suggest columns are reverse order (index position 0 is on right)
1865541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else if (kd && $columns.length > 1 && gSelectedColumn >= 0) {
1866541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // 37 LEFT ARROW
1867541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // go left only if current column is not left-most column (last column)
1868541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (e.keyCode == 37 && gSelectedColumn < $columns.length - 1) {
1869541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('li', $selectedUl).removeClass('jd-selected');
1870541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gSelectedColumn++;
1871541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $selectedUl = $columns[gSelectedColumn];
1872541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // keep or reset the selected item to last item as appropriate
1873541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gSelectedIndex = gSelectedIndex >
1874541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $("li", $selectedUl).length-1 ?
1875541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $("li", $selectedUl).length-1 : gSelectedIndex;
1876541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // if the corresponding item is a header, move down
1877541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) {
1878541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          gSelectedIndex++;
1879541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1880541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // set item selected
1881541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
1882541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return false;
1883541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
1884541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // 39 RIGHT ARROW
1885541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // go right only if current column is not the right-most column (first column)
1886541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      else if (e.keyCode == 39 && gSelectedColumn > 0) {
1887541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('li', $selectedUl).removeClass('jd-selected');
1888541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gSelectedColumn--;
1889541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $selectedUl = $columns[gSelectedColumn];
1890541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // keep or reset the selected item to last item as appropriate
1891541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gSelectedIndex = gSelectedIndex >
1892541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $("li", $selectedUl).length-1 ?
1893541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                $("li", $selectedUl).length-1 : gSelectedIndex;
1894541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // if the corresponding item is a header, move down
1895541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) {
1896541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          gSelectedIndex++;
1897541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1898541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // set item selected
1899541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
1900541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return false;
1901541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
1902541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
1903541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1904541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // if key-up event and not arrow down/up/left/right,
1905541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // read the search query and add suggestions to gMatches
1906541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else if (!kd && (e.keyCode != 40)
1907541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 && (e.keyCode != 38)
1908541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 && (e.keyCode != 37)
1909541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                 && (e.keyCode != 39)) {
1910541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gSelectedIndex = -1;
1911541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gMatches = new Array();
1912541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        matchedCount = 0;
1913541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gGoogleMatches = new Array();
1914541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        matchedCountGoogle = 0;
1915541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gDocsMatches = new Array();
1916541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        matchedCountDocs = 0;
1917541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1918541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // Search for Android matches
1919541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        for (var i=0; i<DATA.length; i++) {
1920541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = DATA[i];
1921541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (text.length != 0 &&
1922541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) {
1923541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                gMatches[matchedCount] = s;
1924541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matchedCount++;
1925541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1926541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1927541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        rank_autocomplete_api_results(text, gMatches);
1928541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        for (var i=0; i<gMatches.length; i++) {
1929541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = gMatches[i];
1930541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1931541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1932541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1933541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // Search for Google matches
1934541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        for (var i=0; i<GOOGLE_DATA.length; i++) {
1935541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = GOOGLE_DATA[i];
1936541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (text.length != 0 &&
1937541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) {
1938541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                gGoogleMatches[matchedCountGoogle] = s;
1939541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matchedCountGoogle++;
1940541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1941541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1942541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        rank_autocomplete_api_results(text, gGoogleMatches);
1943541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        for (var i=0; i<gGoogleMatches.length; i++) {
1944541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = gGoogleMatches[i];
1945541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
1946541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1947541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        highlight_autocomplete_result_labels(text);
1948541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1949541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1950541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1951541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // Search for matching JD docs
1952541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (text.length >= 3) {
1953541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Regex to match only the beginning of a word
1954541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          var textRegex = new RegExp("\\b" + text.toLowerCase(), "g");
1955541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1956541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1957541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for Training classes
1958541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<TRAINING_RESOURCES.length; i++) {
1959541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
1960541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
1961541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = TRAINING_RESOURCES[i];
1962541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
1963541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
1964541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
1965541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1966541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
1967541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
1968541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
1969541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
1970541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
1971541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
1972541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
1973541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1974541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Don't consider doc title for lessons (only for class landing pages),
1975541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // unless the lesson has a tag that already matches
1976541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if ((s.lang == currentLang) &&
1977541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                  (!(s.type == "training" && s.url.indexOf("index.html") == -1) || matched)) {
1978541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches the doc title
1979541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
1980541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
1981541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
1982541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
1983541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1984541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
1985541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
1986541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
1987541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
1988541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
1989541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1990541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
1991541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for API Guides
1992541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<GUIDE_RESOURCES.length; i++) {
1993541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
1994541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
1995541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = GUIDE_RESOURCES[i];
1996541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
1997541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
1998541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
1999541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2000541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
2001541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
2002541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
2003541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
2004541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2005541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
2006541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2007541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2008541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches the doc title, but only for current language
2009541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (s.lang == currentLang) {
2010541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if query matches the doc title
2011541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
2012541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2013541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
2014541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2015541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2016541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
2017541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
2018541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
2019541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2020541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2021541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2022541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2023541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for Tools Guides
2024541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<TOOLS_RESOURCES.length; i++) {
2025541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
2026541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
2027541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = TOOLS_RESOURCES[i];
2028541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
2029541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
2030541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
2031541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2032541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
2033541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
2034541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
2035541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
2036541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2037541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
2038541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2039541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2040541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches the doc title, but only for current language
2041541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (s.lang == currentLang) {
2042541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if query matches the doc title
2043541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
2044541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2045541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
2046541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2047541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2048541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
2049541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
2050541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
2051541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2052541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2053541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2054541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2055541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for About docs
2056541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<ABOUT_RESOURCES.length; i++) {
2057541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
2058541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
2059541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = ABOUT_RESOURCES[i];
2060541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
2061541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
2062541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
2063541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2064541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
2065541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
2066541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
2067541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
2068541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2069541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
2070541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2071541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2072541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches the doc title, but only for current language
2073541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (s.lang == currentLang) {
2074541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if query matches the doc title
2075541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
2076541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2077541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
2078541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2079541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2080541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
2081541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
2082541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
2083541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2084541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2085541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2086541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2087541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for Design guides
2088541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<DESIGN_RESOURCES.length; i++) {
2089541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
2090541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
2091541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = DESIGN_RESOURCES[i];
2092541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
2093541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
2094541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
2095541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2096541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
2097541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
2098541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
2099541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
2100541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2101541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
2102541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2103541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2104541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches the doc title, but only for current language
2105541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (s.lang == currentLang) {
2106541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if query matches the doc title
2107541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
2108541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2109541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
2110541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2111541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2112541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
2113541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
2114541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
2115541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2116541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2117541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2118541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2119541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for Distribute guides
2120541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<DISTRIBUTE_RESOURCES.length; i++) {
2121541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
2122541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
2123541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = DISTRIBUTE_RESOURCES[i];
2124541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
2125541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
2126541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
2127541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2128541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
2129541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
2130541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
2131541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
2132541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2133541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
2134541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2135541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2136541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches the doc title, but only for current language
2137541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (s.lang == currentLang) {
2138541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if query matches the doc title
2139541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
2140541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2141541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
2142541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2143541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2144541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
2145541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
2146541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
2147541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2148541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2149541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2150541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2151541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for Google guides
2152541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<GOOGLE_RESOURCES.length; i++) {
2153541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
2154541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
2155541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = GOOGLE_RESOURCES[i];
2156541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
2157541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
2158541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
2159541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2160541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
2161541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
2162541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
2163541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
2164541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2165541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
2166541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2167541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2168541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches the doc title, but only for current language
2169541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (s.lang == currentLang) {
2170541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if query matches the doc title
2171541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
2172541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2173541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
2174541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2175541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2176541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
2177541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
2178541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
2179541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2180541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2181541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2182541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2183541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Search for Samples
2184541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          for (var i=0; i<SAMPLES_RESOURCES.length; i++) {
2185541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // current search comparison, with counters for tag and title,
2186541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // used later to improve ranking
2187541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var s = SAMPLES_RESOURCES[i];
2188541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_tag = 0;
2189541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            s.matched_title = 0;
2190541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var matched = false;
2191541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches any tags; work backwards toward 1 to assist ranking
2192541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            for (var j = s.keywords.length - 1; j >= 0; j--) {
2193541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // it matches a tag
2194541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.keywords[j].toLowerCase().match(textRegex)) {
2195541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2196541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_tag = j + 1; // add 1 to index position
2197541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2198541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2199541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // Check if query matches the doc title, but only for current language
2200541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (s.lang == currentLang) {
2201541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              // if query matches the doc title.t
2202541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              if (s.title.toLowerCase().match(textRegex)) {
2203541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                matched = true;
2204541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                s.matched_title = 1;
2205541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              }
2206541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2207541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (matched) {
2208541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              gDocsMatches[matchedCountDocs] = s;
2209541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              matchedCountDocs++;
2210541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2211541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2212541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2213541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // Rank/sort all the matched pages
2214541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          rank_autocomplete_doc_results(text, gDocsMatches);
2215541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
2216541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2217541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // draw the suggestions
2218541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        sync_selection_table(toroot);
2219541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return true; // allow the event to bubble up to the search api
2220541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2221541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2222541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2223541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Order the jd doc result list based on match quality */
2224541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction rank_autocomplete_doc_results(query, matches) {
2225541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    query = query || '';
2226541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (!matches || !matches.length)
2227541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return;
2228541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2229541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var _resultScoreFn = function(match) {
2230541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        var score = 1.0;
2231541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2232541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // if the query matched a tag
2233541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (match.matched_tag > 0) {
2234541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // multiply score by factor relative to position in tags list (max of 3)
2235541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          score *= 3 / match.matched_tag;
2236541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2237541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // if it also matched the title
2238541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          if (match.matched_title > 0) {
2239541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            score *= 2;
2240541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2241541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        } else if (match.matched_title > 0) {
2242541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          score *= 3;
2243541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
2244541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2245541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return score;
2246541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    };
2247541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2248541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i=0; i<matches.length; i++) {
2249541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        matches[i].__resultScore = _resultScoreFn(matches[i]);
2250541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2251541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2252541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    matches.sort(function(a,b){
2253541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        var n = b.__resultScore - a.__resultScore;
2254541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (n == 0) // lexicographical sort if scores are the same
2255541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            n = (a.label < b.label) ? -1 : 1;
2256541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return n;
2257541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
2258541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2259541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2260541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Order the result list based on match quality */
2261541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction rank_autocomplete_api_results(query, matches) {
2262541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    query = query || '';
2263541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (!matches || !matches.length)
2264541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return;
2265541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2266541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // helper function that gets the last occurence index of the given regex
2267541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // in the given string, or -1 if not found
2268541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var _lastSearch = function(s, re) {
2269541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (s == '')
2270541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return -1;
2271541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var l = -1;
2272541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var tmp;
2273541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      while ((tmp = s.search(re)) >= 0) {
2274541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (l < 0) l = 0;
2275541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        l += tmp;
2276541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        s = s.substr(tmp + 1);
2277541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
2278541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return l;
2279541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    };
2280541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2281541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // helper function that counts the occurrences of a given character in
2282541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // a given string
2283541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var _countChar = function(s, c) {
2284541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var n = 0;
2285541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      for (var i=0; i<s.length; i++)
2286541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (s.charAt(i) == c) ++n;
2287541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return n;
2288541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    };
2289541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2290541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var queryLower = query.toLowerCase();
2291541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var queryAlnum = (queryLower.match(/\w+/) || [''])[0];
2292541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var partPrefixAlnumRE = new RegExp('\\b' + queryAlnum);
2293541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var partExactAlnumRE = new RegExp('\\b' + queryAlnum + '\\b');
2294541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2295541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var _resultScoreFn = function(result) {
2296541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // scores are calculated based on exact and prefix matches,
2297541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // and then number of path separators (dots) from the last
2298541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // match (i.e. favoring classes and deep package names)
2299541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        var score = 1.0;
2300541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        var labelLower = result.label.toLowerCase();
2301541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        var t;
2302541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        t = _lastSearch(labelLower, partExactAlnumRE);
2303541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (t >= 0) {
2304541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            // exact part match
2305541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            var partsAfter = _countChar(labelLower.substr(t + 1), '.');
2306541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            score *= 200 / (partsAfter + 1);
2307541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        } else {
2308541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            t = _lastSearch(labelLower, partPrefixAlnumRE);
2309541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            if (t >= 0) {
2310541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                // part prefix match
2311541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                var partsAfter = _countChar(labelLower.substr(t + 1), '.');
2312541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                score *= 20 / (partsAfter + 1);
2313541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            }
2314541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
2315541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2316541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return score;
2317541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    };
2318541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2319541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i=0; i<matches.length; i++) {
2320541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // if the API is deprecated, default score is 0; otherwise, perform scoring
2321541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (matches[i].deprecated == "true") {
2322541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          matches[i].__resultScore = 0;
2323541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        } else {
2324541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          matches[i].__resultScore = _resultScoreFn(matches[i]);
2325541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
2326541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2327541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2328541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    matches.sort(function(a,b){
2329541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        var n = b.__resultScore - a.__resultScore;
2330541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if (n == 0) // lexicographical sort if scores are the same
2331541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            n = (a.label < b.label) ? -1 : 1;
2332541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return n;
2333541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
2334541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2335541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2336541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Add emphasis to part of string that matches query */
2337541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction highlight_autocomplete_result_labels(query) {
2338541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    query = query || '';
2339541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ((!gMatches || !gMatches.length) && (!gGoogleMatches || !gGoogleMatches.length))
2340541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return;
2341541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2342541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var queryLower = query.toLowerCase();
2343541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var queryAlnumDot = (queryLower.match(/[\w\.]+/) || [''])[0];
2344541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var queryRE = new RegExp(
2345541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        '(' + queryAlnumDot.replace(/\./g, '\\.') + ')', 'ig');
2346541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i=0; i<gMatches.length; i++) {
2347541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gMatches[i].__hilabel = gMatches[i].label.replace(
2348541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            queryRE, '<b>$1</b>');
2349541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2350541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i=0; i<gGoogleMatches.length; i++) {
2351541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        gGoogleMatches[i].__hilabel = gGoogleMatches[i].label.replace(
2352541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            queryRE, '<b>$1</b>');
2353541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2354541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2355541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2356541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction search_focus_changed(obj, focused)
2357541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2358541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (!focused) {
2359541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        if(obj.value == ""){
2360541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $(".search .close").addClass("hide");
2361541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }
2362541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $(".suggest-card").hide();
2363541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2364541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2365541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2366541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction submit_search() {
2367541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var query = document.getElementById('search_autocomplete').value;
2368541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  location.hash = 'q=' + query;
2369541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  loadSearchResults();
2370d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main  $("#searchResults").slideDown('slow', setStickyTop);
2371541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return false;
2372541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2373541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2374541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2375541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction hideResults() {
2376d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main  $("#searchResults").slideUp('fast', setStickyTop);
2377541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(".search .close").addClass("hide");
2378541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  location.hash = '';
2379541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2380541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#search_autocomplete").val("").blur();
2381541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2382541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // reset the ajax search callback to nothing, so results don't appear unless ENTER
2383541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.setSearchStartingCallback(this, function(control, searcher, query) {});
2384541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2385541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // forcefully regain key-up event control (previously jacked by search api)
2386541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#search_autocomplete").keyup(function(event) {
2387541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return search_changed(event, false, toRoot);
2388541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2389541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2390541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return false;
2391541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2392541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2393541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2394541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2395541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ########################################################## */
2396541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ################  CUSTOM SEARCH ENGINE  ################## */
2397541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ########################################################## */
2398541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2399541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar searchControl;
2400541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertygoogle.load('search', '1', {"callback" : function() {
2401541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            searchControl = new google.search.SearchControl();
2402541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          } });
2403541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2404541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction loadSearchResults() {
2405541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  document.getElementById("search_autocomplete").style.color = "#000";
2406541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2407541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl = new google.search.SearchControl();
2408541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2409541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // use our existing search form and use tabs when multiple searchers are used
2410541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  drawOptions = new google.search.DrawOptions();
2411541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  drawOptions.setDrawMode(google.search.SearchControl.DRAW_MODE_TABBED);
2412541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  drawOptions.setInput(document.getElementById("search_autocomplete"));
2413541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2414541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // configure search result options
2415541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchOptions = new google.search.SearcherOptions();
2416541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchOptions.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
2417541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2418541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // configure each of the searchers, for each tab
2419541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  devSiteSearcher = new google.search.WebSearch();
2420541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  devSiteSearcher.setUserDefinedLabel("All");
2421541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  devSiteSearcher.setSiteRestriction("001482626316274216503:zu90b7s047u");
2422541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2423541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  designSearcher = new google.search.WebSearch();
2424541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  designSearcher.setUserDefinedLabel("Design");
2425541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  designSearcher.setSiteRestriction("http://developer.android.com/design/");
2426541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2427541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  trainingSearcher = new google.search.WebSearch();
2428541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  trainingSearcher.setUserDefinedLabel("Training");
2429541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  trainingSearcher.setSiteRestriction("http://developer.android.com/training/");
2430541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2431541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  guidesSearcher = new google.search.WebSearch();
2432541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  guidesSearcher.setUserDefinedLabel("Guides");
2433541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  guidesSearcher.setSiteRestriction("http://developer.android.com/guide/");
2434541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2435541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  referenceSearcher = new google.search.WebSearch();
2436541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  referenceSearcher.setUserDefinedLabel("Reference");
2437541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  referenceSearcher.setSiteRestriction("http://developer.android.com/reference/");
2438541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2439541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  googleSearcher = new google.search.WebSearch();
2440541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  googleSearcher.setUserDefinedLabel("Google Services");
2441541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  googleSearcher.setSiteRestriction("http://developer.android.com/google/");
2442541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2443541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  blogSearcher = new google.search.WebSearch();
2444541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  blogSearcher.setUserDefinedLabel("Blog");
2445541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  blogSearcher.setSiteRestriction("http://android-developers.blogspot.com");
2446541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2447541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // add each searcher to the search control
2448541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.addSearcher(devSiteSearcher, searchOptions);
2449541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.addSearcher(designSearcher, searchOptions);
2450541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.addSearcher(trainingSearcher, searchOptions);
2451541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.addSearcher(guidesSearcher, searchOptions);
2452541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.addSearcher(referenceSearcher, searchOptions);
2453541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.addSearcher(googleSearcher, searchOptions);
2454541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.addSearcher(blogSearcher, searchOptions);
2455541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2456541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // configure result options
2457541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
2458541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.setLinkTarget(google.search.Search.LINK_TARGET_SELF);
2459541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.setTimeoutInterval(google.search.SearchControl.TIMEOUT_SHORT);
2460541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.setNoResultsString(google.search.SearchControl.NO_RESULTS_DEFAULT_STRING);
2461541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2462541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // upon ajax search, refresh the url and search title
2463541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.setSearchStartingCallback(this, function(control, searcher, query) {
2464541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    updateResultTitle(query);
2465541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var query = document.getElementById('search_autocomplete').value;
2466541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    location.hash = 'q=' + query;
2467541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2468541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2469541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // once search results load, set up click listeners
2470541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.setSearchCompleteCallback(this, function(control, searcher, query) {
2471541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    addResultClickListeners();
2472541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2473541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2474541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // draw the search results box
2475541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.draw(document.getElementById("leftSearchControl"), drawOptions);
2476541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2477541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // get query and execute the search
2478541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.execute(decodeURI(getQuery(location.hash)));
2479541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2480541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  document.getElementById("search_autocomplete").focus();
2481541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  addTabListeners();
2482541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2483541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// End of loadSearchResults
2484541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2485541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2486541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertygoogle.setOnLoadCallback(function(){
2487541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (location.hash.indexOf("q=") == -1) {
2488541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // if there's no query in the url, don't search and make sure results are hidden
2489541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $('#searchResults').hide();
2490541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return;
2491541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
2492541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // first time loading search results for this page
2493d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main    $('#searchResults').slideDown('slow', setStickyTop);
2494541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(".search .close").removeClass("hide");
2495541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    loadSearchResults();
2496541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2497541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}, true);
2498541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2499541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// when an event on the browser history occurs (back, forward, load) requery hash and do search
2500541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty$(window).hashchange( function(){
25014868e9bf92fb88a94c377dfda5d97e38b0948b7dScott Main  // If the hash isn't a search query or there's an error in the query,
25024868e9bf92fb88a94c377dfda5d97e38b0948b7dScott Main  // then adjust the scroll position to account for sticky header, then exit.
2503541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ((location.hash.indexOf("q=") == -1) || (query == "undefined")) {
2504541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // If the results pane is open, close it.
2505541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (!$("#searchResults").is(":hidden")) {
2506541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      hideResults();
2507541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
25084868e9bf92fb88a94c377dfda5d97e38b0948b7dScott Main    // Adjust the scroll position to account for sticky header
25094868e9bf92fb88a94c377dfda5d97e38b0948b7dScott Main    $(window).scrollTop($(window).scrollTop() - 60);
2510541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return;
2511541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2512541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2513541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Otherwise, we have a search to do
2514541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var query = decodeURI(getQuery(location.hash));
2515541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  searchControl.execute(query);
2516d6a8e662cf43f72acd219ff39b6ff73a5011da22Scott Main  $('#searchResults').slideDown('slow', setStickyTop);
2517541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#search_autocomplete").focus();
2518541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(".search .close").removeClass("hide");
2519541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2520541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  updateResultTitle(query);
2521541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty});
2522541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2523541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction updateResultTitle(query) {
2524541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#searchTitle").html("Results for <em>" + escapeHTML(query) + "</em>");
2525541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2526541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2527541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// forcefully regain key-up event control (previously jacked by search api)
2528541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty$("#search_autocomplete").keyup(function(event) {
2529541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return search_changed(event, false, toRoot);
2530541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty});
2531541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2532541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// add event listeners to each tab so we can track the browser history
2533541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction addTabListeners() {
2534541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var tabHeaders = $(".gsc-tabHeader");
2535541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  for (var i = 0; i < tabHeaders.length; i++) {
2536541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(tabHeaders[i]).attr("id",i).click(function() {
2537541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    /*
2538541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // make a copy of the page numbers for the search left pane
2539541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      setTimeout(function() {
2540541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // remove any residual page numbers
2541541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('#searchResults .gsc-tabsArea .gsc-cursor-box.gs-bidi-start-align').remove();
2542541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // move the page numbers to the left position; make a clone,
2543541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // because the element is drawn to the DOM only once
2544541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // and because we're going to remove it (previous line),
2545541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        // we need it to be available to move again as the user navigates
2546541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $('#searchResults .gsc-webResult .gsc-cursor-box.gs-bidi-start-align:visible')
2547541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                        .clone().appendTo('#searchResults .gsc-tabsArea');
2548541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        }, 200);
2549541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      */
2550541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
2551541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2552541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  setTimeout(function(){$(tabHeaders[0]).click()},200);
2553541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2554541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2555541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// add analytics tracking events to each result link
2556541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction addResultClickListeners() {
2557541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#searchResults a.gs-title").each(function(index, link) {
2558541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // When user clicks enter for Google search results, track it
2559541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(link).click(function() {
2560541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      _gaq.push(['_trackEvent', 'Google Click', 'clicked: ' + $(this).text(),
2561541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                'from: ' + $("#search_autocomplete").val()]);
2562541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
2563541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2564541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2565541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2566541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2567541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction getQuery(hash) {
2568541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var queryParts = hash.split('=');
2569541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return queryParts[1];
2570541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2571541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2572541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* returns the given string with all HTML brackets converted to entities
2573541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    TODO: move this to the site's JS library */
2574541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction escapeHTML(string) {
2575541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return string.replace(/</g,"&lt;")
2576541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty                .replace(/>/g,"&gt;");
2577541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2578541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2579541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2580541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2581541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2582541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2583541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2584541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2585541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ######################################################## */
2586541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* #################  JAVADOC REFERENCE ################### */
2587541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* ######################################################## */
2588541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2589541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Initialize some droiddoc stuff, but only if we're in the reference */
2590541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyif (location.pathname.indexOf("/reference") == 0) {
2591541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if(!(location.pathname.indexOf("/reference-gms/packages.html") == 0)
2592541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    && !(location.pathname.indexOf("/reference-gcm/packages.html") == 0)
2593541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    && !(location.pathname.indexOf("/reference/com/google") == 0)) {
2594541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(document).ready(function() {
2595541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // init available apis based on user pref
2596541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      changeApiLevel();
2597541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      initSidenavHeightResize()
2598541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      });
2599541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2600541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2601541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2602541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar API_LEVEL_COOKIE = "api_level";
2603541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar minLevel = 1;
2604541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar maxLevel = 1;
2605541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2606541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/******* SIDENAV DIMENSIONS ************/
2607541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2608541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  function initSidenavHeightResize() {
2609541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Change the drag bar size to nicely fit the scrollbar positions
2610541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var $dragBar = $(".ui-resizable-s");
2611541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $dragBar.css({'width': $dragBar.parent().width() - 5 + "px"});
2612541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2613541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $( "#resize-packages-nav" ).resizable({
2614541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      containment: "#nav-panels",
2615541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      handles: "s",
2616541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      alsoResize: "#packages-nav",
2617541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      resize: function(event, ui) { resizeNav(); }, /* resize the nav while dragging */
2618541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      stop: function(event, ui) { saveNavPanels(); } /* once stopped, save the sizes to cookie  */
2619541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      });
2620541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2621541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2622541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2623541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction updateSidenavFixedWidth() {
2624541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (!navBarIsFixed) return;
2625541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('#devdoc-nav').css({
2626541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    'width' : $('#side-nav').css('width'),
2627541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    'margin' : $('#side-nav').css('margin')
2628541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2629541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('#devdoc-nav a.totop').css({'display':'block','width':$("#nav").innerWidth()+'px'});
2630541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2631541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  initSidenavHeightResize();
2632541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2633541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2634541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction updateSidenavFullscreenWidth() {
2635541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (!navBarIsFixed) return;
2636541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('#devdoc-nav').css({
2637541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    'width' : $('#side-nav').css('width'),
2638541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    'margin' : $('#side-nav').css('margin')
2639541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2640541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $('#devdoc-nav .totop').css({'left': 'inherit'});
2641541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2642541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  initSidenavHeightResize();
2643541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2644541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2645541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction buildApiLevelSelector() {
2646541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  maxLevel = SINCE_DATA.length;
2647541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var userApiLevel = parseInt(readCookie(API_LEVEL_COOKIE));
2648541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  userApiLevel = userApiLevel == 0 ? maxLevel : userApiLevel; // If there's no cookie (zero), use the max by default
2649541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2650541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  minLevel = parseInt($("#doc-api-level").attr("class"));
2651541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Handle provisional api levels; the provisional level will always be the highest possible level
2652541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Provisional api levels will also have a length; other stuff that's just missing a level won't,
2653541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // so leave those kinds of entities at the default level of 1 (for example, the R.styleable class)
2654541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (isNaN(minLevel) && minLevel.length) {
2655541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    minLevel = maxLevel;
2656541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2657541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var select = $("#apiLevelSelector").html("").change(changeApiLevel);
2658541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  for (var i = maxLevel-1; i >= 0; i--) {
2659541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var option = $("<option />").attr("value",""+SINCE_DATA[i]).append(""+SINCE_DATA[i]);
2660541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //  if (SINCE_DATA[i] < minLevel) option.addClass("absent"); // always false for strings (codenames)
2661541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    select.append(option);
2662541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2663541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2664541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true)
2665541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var selectedLevelItem = $("#apiLevelSelector option[value='"+userApiLevel+"']").get(0);
2666541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  selectedLevelItem.setAttribute('selected',true);
2667541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2668541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2669541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction changeApiLevel() {
2670541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  maxLevel = SINCE_DATA.length;
2671541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var selectedLevel = maxLevel;
2672541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2673541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  selectedLevel = parseInt($("#apiLevelSelector option:selected").val());
2674541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  toggleVisisbleApis(selectedLevel, "body");
2675541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2676541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var date = new Date();
2677541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
2678541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var expiration = date.toGMTString();
2679541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  writeCookie(API_LEVEL_COOKIE, selectedLevel, null, expiration);
2680541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2681541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (selectedLevel < minLevel) {
2682541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class";
2683541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#naMessage").show().html("<div><p><strong>This " + thing
2684541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + " requires API level " + minLevel + " or higher.</strong></p>"
2685541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "<p>This document is hidden because your selected API level for the documentation is "
2686541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + selectedLevel + ". You can change the documentation API level with the selector "
2687541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "above the left navigation.</p>"
2688541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "<p>For more information about specifying the API level your app requires, "
2689541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "read <a href='" + toRoot + "training/basics/supporting-devices/platforms.html'"
2690541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + ">Supporting Different Platform Versions</a>.</p>"
2691541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "<input type='button' value='OK, make this page visible' "
2692541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "title='Change the API level to " + minLevel + "' "
2693541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "onclick='$(\"#apiLevelSelector\").val(\"" + minLevel + "\");changeApiLevel();' />"
2694541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "</div>");
2695541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
2696541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#naMessage").hide();
2697541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2698541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2699541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2700541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggleVisisbleApis(selectedLevel, context) {
2701541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var apis = $(".api",context);
2702541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  apis.each(function(i) {
2703541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var obj = $(this);
2704541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var className = obj.attr("class");
2705541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var apiLevelIndex = className.lastIndexOf("-")+1;
2706541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
2707541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
2708541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
2709541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (apiLevel.length == 0) { // for odd cases when the since data is actually missing, just bail
2710541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return;
2711541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2712541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    apiLevel = parseInt(apiLevel);
2713541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2714541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Handle provisional api levels; if this item's level is the provisional one, set it to the max
2715541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var selectedLevelNum = parseInt(selectedLevel)
2716541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var apiLevelNum = parseInt(apiLevel);
2717541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (isNaN(apiLevelNum)) {
2718541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        apiLevelNum = maxLevel;
2719541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2720541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2721541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // Grey things out that aren't available and give a tooltip title
2722541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (apiLevelNum > selectedLevelNum) {
2723541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      obj.addClass("absent").attr("title","Requires API Level \""
2724541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            + apiLevel + "\" or higher. To reveal, change the target API level "
2725541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty              + "above the left navigation.");
2726541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2727541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else obj.removeClass("absent").removeAttr("title");
2728541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2729541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2730541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2731541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2732541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2733541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2734541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* #################  SIDENAV TREE VIEW ################### */
2735541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2736541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction new_node(me, mom, text, link, children_data, api_level)
2737541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2738541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var node = new Object();
2739541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.children = Array();
2740541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.children_data = children_data;
2741541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.depth = mom.depth + 1;
2742541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2743541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.li = document.createElement("li");
2744541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  mom.get_children_ul().appendChild(node.li);
2745541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2746541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.label_div = document.createElement("div");
2747541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.label_div.className = "label";
2748541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (api_level != null) {
2749541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(node.label_div).addClass("api");
2750541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(node.label_div).addClass("api-level-"+api_level);
2751541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2752541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.li.appendChild(node.label_div);
2753541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2754541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (children_data != null) {
2755541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.expand_toggle = document.createElement("a");
2756541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.expand_toggle.href = "javascript:void(0)";
2757541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.expand_toggle.onclick = function() {
2758541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          if (node.expanded) {
2759541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            $(node.get_children_ul()).slideUp("fast");
2760541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
2761541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            node.expanded = false;
2762541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          } else {
2763541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            expand_node(me, node);
2764541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
2765541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty       };
2766541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.label_div.appendChild(node.expand_toggle);
2767541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2768541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.plus_img = document.createElement("img");
2769541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
2770541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.plus_img.className = "plus";
2771541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.plus_img.width = "8";
2772541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.plus_img.border = "0";
2773541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.expand_toggle.appendChild(node.plus_img);
2774541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2775541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.expanded = false;
2776541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2777541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2778541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var a = document.createElement("a");
2779541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.label_div.appendChild(a);
2780541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.label = document.createTextNode(text);
2781541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  a.appendChild(node.label);
2782541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (link) {
2783541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    a.href = me.toroot + link;
2784541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
2785541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (children_data != null) {
2786541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      a.className = "nolink";
2787541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      a.href = "javascript:void(0)";
2788541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      a.onclick = node.expand_toggle.onclick;
2789541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // This next line shouldn't be necessary.  I'll buy a beer for the first
2790541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // person who figures out how to remove this line and have the link
2791541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // toggle shut on the first try. --joeo@android.com
2792541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      node.expanded = false;
2793541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2794541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2795541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2796541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2797541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.children_ul = null;
2798541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.get_children_ul = function() {
2799541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (!node.children_ul) {
2800541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node.children_ul = document.createElement("ul");
2801541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node.children_ul.className = "children_ul";
2802541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node.children_ul.style.display = "none";
2803541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node.li.appendChild(node.children_ul);
2804541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
2805541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return node.children_ul;
2806541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    };
2807541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2808541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return node;
2809541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2810541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2811541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2812541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2813541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2814541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction expand_node(me, node)
2815541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2816541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (node.children_data && !node.expanded) {
2817541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (node.children_visited) {
2818541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(node.get_children_ul()).slideDown("fast");
2819541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
2820541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      get_node(me, node);
2821541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if ($(node.label_div).hasClass("absent")) {
2822541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        $(node.get_children_ul()).addClass("absent");
2823541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
2824541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(node.get_children_ul()).slideDown("fast");
2825541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2826541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png";
2827541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.expanded = true;
2828541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2829541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // perform api level toggling because new nodes are new to the DOM
2830541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var selectedLevel = $("#apiLevelSelector option:selected").val();
2831541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    toggleVisisbleApis(selectedLevel, "#side-nav");
2832541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2833541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2834541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2835541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction get_node(me, mom)
2836541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2837541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  mom.children_visited = true;
2838541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  for (var i in mom.children_data) {
2839541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var node_data = mom.children_data[i];
2840541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    mom.children[i] = new_node(me, mom, node_data[0], node_data[1],
2841541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node_data[2], node_data[3]);
2842541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2843541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2844541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2845541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction this_page_relative(toroot)
2846541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2847541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var full = document.location.pathname;
2848541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var file = "";
2849541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (toroot.substr(0, 1) == "/") {
2850541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (full.substr(0, toroot.length) == toroot) {
2851541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return full.substr(toroot.length);
2852541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else {
2853541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // the file isn't under toroot.  Fail.
2854541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return null;
2855541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2856541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
2857541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (toroot != "./") {
2858541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      toroot = "./" + toroot;
2859541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2860541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    do {
2861541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") {
2862541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        var pos = full.lastIndexOf("/");
2863541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        file = full.substr(pos) + file;
2864541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        full = full.substr(0, pos);
2865541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        toroot = toroot.substr(0, toroot.length-3);
2866541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
2867541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } while (toroot != "" && toroot != "/");
2868541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return file.substr(1);
2869541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2870541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2871541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2872541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction find_page(url, data)
2873541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2874541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var nodes = data;
2875541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var result = null;
2876541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  for (var i in nodes) {
2877541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var d = nodes[i];
2878541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (d[1] == url) {
2879541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return new Array(i);
2880541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2881541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    else if (d[2] != null) {
2882541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      result = find_page(url, d[2]);
2883541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (result != null) {
2884541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        return (new Array(i).concat(result));
2885541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
2886541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2887541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2888541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return null;
2889541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2890541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2891541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction init_default_navtree(toroot) {
2892541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // load json file for navtree data
2893541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $.getScript(toRoot + 'navtree_data.js', function(data, textStatus, jqxhr) {
2894541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // when the file is loaded, initialize the tree
2895541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if(jqxhr.status === 200) {
2896541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          init_navtree("tree-list", toroot, NAVTREE_DATA);
2897541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
2898541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
2899541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2900541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // perform api level toggling because because the whole tree is new to the DOM
2901541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var selectedLevel = $("#apiLevelSelector option:selected").val();
2902541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  toggleVisisbleApis(selectedLevel, "#side-nav");
2903541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2904541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2905541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction init_navtree(navtree_id, toroot, root_nodes)
2906541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2907541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var me = new Object();
2908541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.toroot = toroot;
2909541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node = new Object();
2910541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2911541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.li = document.getElementById(navtree_id);
2912541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.children_data = root_nodes;
2913541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.children = new Array();
2914541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.children_ul = document.createElement("ul");
2915541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.get_children_ul = function() { return me.node.children_ul; };
2916541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //me.node.children_ul.className = "children_ul";
2917541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.li.appendChild(me.node.children_ul);
2918541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.depth = 0;
2919541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2920541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  get_node(me, me.node);
2921541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2922541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.this_page = this_page_relative(toroot);
2923541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.breadcrumbs = find_page(me.this_page, root_nodes);
2924541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (me.breadcrumbs != null && me.breadcrumbs.length != 0) {
2925541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var mom = me.node;
2926541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i in me.breadcrumbs) {
2927541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var j = me.breadcrumbs[i];
2928541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      mom = mom.children[j];
2929541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      expand_node(me, mom);
2930541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
2931541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    mom.label_div.className = mom.label_div.className + " selected";
2932541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    addLoadEvent(function() {
2933541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      scrollIntoView("nav-tree");
2934541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      });
2935541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2936541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2937541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2938541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2939541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2940541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2941541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2942541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2943541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2944541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2945541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* TODO: eliminate redundancy with non-google functions */
2946541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction init_google_navtree(navtree_id, toroot, root_nodes)
2947541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2948541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var me = new Object();
2949541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.toroot = toroot;
2950541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node = new Object();
2951541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2952541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.li = document.getElementById(navtree_id);
2953541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.children_data = root_nodes;
2954541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.children = new Array();
2955541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.children_ul = document.createElement("ul");
2956541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.get_children_ul = function() { return me.node.children_ul; };
2957541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  //me.node.children_ul.className = "children_ul";
2958541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.li.appendChild(me.node.children_ul);
2959541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  me.node.depth = 0;
2960541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2961541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  get_google_node(me, me.node);
2962541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
2963541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2964541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction new_google_node(me, mom, text, link, children_data, api_level)
2965541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
2966541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var node = new Object();
2967541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var child;
2968541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.children = Array();
2969541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.children_data = children_data;
2970541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.depth = mom.depth + 1;
2971541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.get_children_ul = function() {
2972541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (!node.children_ul) {
2973541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node.children_ul = document.createElement("ul");
2974541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node.children_ul.className = "tree-list-children";
2975541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        node.li.appendChild(node.children_ul);
2976541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
2977541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      return node.children_ul;
2978541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    };
2979541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.li = document.createElement("li");
2980541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2981541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  mom.get_children_ul().appendChild(node.li);
2982541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2983541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2984541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if(link) {
2985541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    child = document.createElement("a");
2986541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2987541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2988541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  else {
2989541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    child = document.createElement("span");
2990541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    child.className = "tree-list-subtitle";
2991541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
2992541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
2993541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (children_data != null) {
2994541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.li.className="nav-section";
2995541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.label_div = document.createElement("div");
2996541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.label_div.className = "nav-section-header-ref";
2997541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.li.appendChild(node.label_div);
2998541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    get_google_node(me, node);
2999541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.label_div.appendChild(child);
3000541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3001541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  else {
3002541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    node.li.appendChild(child);
3003541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3004541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if(link) {
3005541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    child.href = me.toroot + link;
3006541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3007541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.label = document.createTextNode(text);
3008541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  child.appendChild(node.label);
3009541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3010541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  node.children_ul = null;
3011541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3012541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return node;
3013541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3014541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3015541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction get_google_node(me, mom)
3016541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
3017541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  mom.children_visited = true;
3018541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var linkText;
3019541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  for (var i in mom.children_data) {
3020541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var node_data = mom.children_data[i];
3021541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    linkText = node_data[0];
3022541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3023541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if(linkText.match("^"+"com.google.android")=="com.google.android"){
3024541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      linkText = linkText.substr(19, linkText.length);
3025541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
3026541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      mom.children[i] = new_google_node(me, mom, linkText, node_data[1],
3027541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          node_data[2], node_data[3]);
3028541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3029541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3030541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3031541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3032541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3033541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3034541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3035541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3036541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/****** NEW version of script to build google and sample navs dynamically ******/
3037541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// TODO: update Google reference docs to tolerate this new implementation
3038541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3039541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar NODE_NAME = 0;
3040541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar NODE_HREF = 1;
3041541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar NODE_GROUP = 2;
3042541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar NODE_TAGS = 3;
3043541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar NODE_CHILDREN = 4;
3044541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3045541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction init_google_navtree2(navtree_id, data)
3046541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
3047541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $containerUl = $("#"+navtree_id);
3048541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  for (var i in data) {
3049541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var node_data = data[i];
3050541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $containerUl.append(new_google_node2(node_data));
3051541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3052541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3053541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // Make all third-generation list items 'sticky' to prevent them from collapsing
3054541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $containerUl.find('li li li.nav-section').addClass('sticky');
3055541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3056541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  initExpandableNavItems("#"+navtree_id);
3057541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3058541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3059541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction new_google_node2(node_data)
3060541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty{
3061541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var linkText = node_data[NODE_NAME];
3062541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if(linkText.match("^"+"com.google.android")=="com.google.android"){
3063541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    linkText = linkText.substr(19, linkText.length);
3064541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3065541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $li = $('<li>');
3066541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $a;
3067541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (node_data[NODE_HREF] != null) {
3068541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >'
3069541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        + linkText + '</a>');
3070541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
3071541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $a = $('<a href="#" onclick="return false;" title="' + linkText + '" >'
3072541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        + linkText + '/</a>');
3073541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3074541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $childUl = $('<ul>');
3075541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (node_data[NODE_CHILDREN] != null) {
3076541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $li.addClass("nav-section");
3077541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $a = $('<div class="nav-section-header">').append($a);
3078541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (node_data[NODE_HREF] == null) $a.addClass('empty');
3079541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3080541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    for (var i in node_data[NODE_CHILDREN]) {
3081541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var child_node_data = node_data[NODE_CHILDREN][i];
3082541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $childUl.append(new_google_node2(child_node_data));
3083541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
3084541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $li.append($childUl);
3085541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3086541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $li.prepend($a);
3087541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3088541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return $li;
3089541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3090541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3091541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3092541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3093541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3094541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3095541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3096541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3097541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3098541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3099541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3100541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3101541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction showGoogleRefTree() {
3102541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  init_default_google_navtree(toRoot);
3103541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  init_default_gcm_navtree(toRoot);
3104541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3105541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3106541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction init_default_google_navtree(toroot) {
3107541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // load json file for navtree data
3108541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $.getScript(toRoot + 'gms_navtree_data.js', function(data, textStatus, jqxhr) {
3109541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // when the file is loaded, initialize the tree
3110541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if(jqxhr.status === 200) {
3111541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          init_google_navtree("gms-tree-list", toroot, GMS_NAVTREE_DATA);
3112541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          highlightSidenav();
3113541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          resizeNav();
3114541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
3115541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
3116541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3117541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3118541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction init_default_gcm_navtree(toroot) {
3119541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // load json file for navtree data
3120541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $.getScript(toRoot + 'gcm_navtree_data.js', function(data, textStatus, jqxhr) {
3121541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // when the file is loaded, initialize the tree
3122541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if(jqxhr.status === 200) {
3123541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          init_google_navtree("gcm-tree-list", toroot, GCM_NAVTREE_DATA);
3124541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          highlightSidenav();
3125541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          resizeNav();
3126541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
3127541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
3128541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3129541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3130541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction showSamplesRefTree() {
3131541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  init_default_samples_navtree(toRoot);
3132541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3133541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3134541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction init_default_samples_navtree(toroot) {
3135541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  // load json file for navtree data
3136541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $.getScript(toRoot + 'samples_navtree_data.js', function(data, textStatus, jqxhr) {
3137541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      // when the file is loaded, initialize the tree
3138541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if(jqxhr.status === 200) {
3139541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // hack to remove the "about the samples" link then put it back in
3140541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          // after we nuke the list to remove the dummy static list of samples
3141541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          var $firstLi = $("#nav.samples-nav > li:first-child").clone();
3142541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $("#nav.samples-nav").empty();
3143541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          $("#nav.samples-nav").append($firstLi);
3144541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3145541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          init_google_navtree2("nav.samples-nav", SAMPLES_NAVTREE_DATA);
3146541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          highlightSidenav();
3147541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          resizeNav();
3148541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          if ($("#jd-content #samples").length) {
3149541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty            showSamples();
3150541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty          }
3151541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
3152541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
3153541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3154541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3155541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* TOGGLE INHERITED MEMBERS */
3156541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3157541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Toggle an inherited class (arrow toggle)
3158541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * @param linkObj  The link that was clicked.
3159541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
3160541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *                'null' to simply toggle.
3161541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty */
3162541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggleInherited(linkObj, expand) {
3163541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var base = linkObj.getAttribute("id");
3164541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var list = document.getElementById(base + "-list");
3165541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var summary = document.getElementById(base + "-summary");
3166541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var trigger = document.getElementById(base + "-trigger");
3167541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var a = $(linkObj);
3168541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if ( (expand == null && a.hasClass("closed")) || expand ) {
3169541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        list.style.display = "none";
3170541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        summary.style.display = "block";
3171541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        trigger.src = toRoot + "assets/images/triangle-opened.png";
3172541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        a.removeClass("closed");
3173541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        a.addClass("opened");
3174541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if ( (expand == null && a.hasClass("opened")) || (expand == false) ) {
3175541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        list.style.display = "block";
3176541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        summary.style.display = "none";
3177541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        trigger.src = toRoot + "assets/images/triangle-closed.png";
3178541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        a.removeClass("opened");
3179541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        a.addClass("closed");
3180541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
3181541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    return false;
3182541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3183541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3184541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Toggle all inherited classes in a single table (e.g. all inherited methods)
3185541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * @param linkObj  The link that was clicked.
3186541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
3187541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty *                'null' to simply toggle.
3188541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty */
3189541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggleAllInherited(linkObj, expand) {
3190541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var a = $(linkObj);
3191541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var table = $(a.parent().parent().parent()); // ugly way to get table/tbody
3192541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var expandos = $(".jd-expando-trigger", table);
3193541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if ( (expand == null && a.text() == "[Expand]") || expand ) {
3194541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    expandos.each(function(i) {
3195541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      toggleInherited(this, true);
3196541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3197541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    a.text("[Collapse]");
3198541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else if ( (expand == null && a.text() == "[Collapse]") || (expand == false) ) {
3199541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    expandos.each(function(i) {
3200541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      toggleInherited(this, false);
3201541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3202541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    a.text("[Expand]");
3203541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3204541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return false;
3205541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3206541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3207541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Toggle all inherited members in the class (link in the class title)
3208541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty */
3209541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction toggleAllClassInherited() {
3210541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var a = $("#toggleAllClassInherited"); // get toggle link from class title
3211541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var toggles = $(".toggle-all", $("#body-content"));
3212541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (a.text() == "[Expand All]") {
3213541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    toggles.each(function(i) {
3214541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      toggleAllInherited(this, true);
3215541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3216541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    a.text("[Collapse All]");
3217541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  } else {
3218541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    toggles.each(function(i) {
3219541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      toggleAllInherited(this, false);
3220541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3221541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    a.text("[Expand All]");
3222541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3223541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  return false;
3224541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3225541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3226541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* Expand all inherited members in the class. Used when initiating page search */
3227541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction ensureAllInheritedExpanded() {
3228541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var toggles = $(".toggle-all", $("#body-content"));
3229541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  toggles.each(function(i) {
3230541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    toggleAllInherited(this, true);
3231541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
3232541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#toggleAllClassInherited").text("[Collapse All]");
3233541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3234541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3235541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3236541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* HANDLE KEY EVENTS
3237541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty * - Listen for Ctrl+F (Cmd on Mac) and expand all inherited members (to aid page search)
3238541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty */
3239541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar agent = navigator['userAgent'].toLowerCase();
3240541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar mac = agent.indexOf("macintosh") != -1;
3241541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3242541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty$(document).keydown( function(e) {
3243541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar control = mac ? e.metaKey && !e.ctrlKey : e.ctrlKey; // get ctrl key
3244541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (control && e.which == 70) {  // 70 is "F"
3245541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    ensureAllInheritedExpanded();
3246541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3247541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty});
3248541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3249541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3250541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3251541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3252541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3253541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3254541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/* On-demand functions */
3255541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3256541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/** Move sample code line numbers out of PRE block and into non-copyable column */
3257541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction initCodeLineNumbers() {
3258541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var numbers = $("#codesample-block a.number");
3259541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  if (numbers.length) {
3260541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#codesample-line-numbers").removeClass("hidden").append(numbers);
3261541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  }
3262541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3263541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $(document).ready(function() {
3264541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // select entire line when clicked
3265541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("span.code-line").click(function() {
3266541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      if (!shifted) {
3267541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        selectText(this);
3268541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      }
3269541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3270541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // invoke line link on double click
3271541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $(".code-line").dblclick(function() {
3272541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      document.location.hash = $(this).attr('id');
3273541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3274541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    // highlight the line when hovering on the number
3275541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#codesample-line-numbers a.number").mouseover(function() {
3276541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var id = $(this).attr('href');
3277541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(id).css('background','#e7e7e7');
3278541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3279541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    $("#codesample-line-numbers a.number").mouseout(function() {
3280541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var id = $(this).attr('href');
3281541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $(id).css('background','none');
3282541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    });
3283541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
3284541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3285541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3286541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// create SHIFT key binder to avoid the selectText method when selecting multiple lines
3287541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyvar shifted = false;
3288541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty$(document).bind('keyup keydown', function(e){shifted = e.shiftKey; return true;} );
3289541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3290541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty// courtesy of jasonedelman.com
3291541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction selectText(element) {
3292541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    var doc = document
3293541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        , range, selection
3294541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    ;
3295541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    if (doc.body.createTextRange) { //ms
3296541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        range = doc.body.createTextRange();
3297541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        range.moveToElementText(element);
3298541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        range.select();
3299541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    } else if (window.getSelection) { //all others
3300541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        selection = window.getSelection();
3301541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        range = doc.createRange();
3302541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        range.selectNodeContents(element);
3303541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        selection.removeAllRanges();
3304541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty        selection.addRange(range);
3305541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    }
3306541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
3307541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3308541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3309541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3310541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3311541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty/** Display links and other information about samples that match the
3312541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty    group specified by the URL */
3313541b494103857da31505ba745b0da5bdbe0499b9Dirk Doughertyfunction showSamples() {
3314541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var group = $("#samples").attr('class');
3315541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#samples").html("<p>Here are some samples for <b>" + group + "</b> apps:</p>");
3316541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3317541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  var $ul = $("<ul>");
3318541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $selectedLi = $("#nav li.selected");
3319541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3320541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $selectedLi.children("ul").children("li").each(function() {
3321541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      var $li = $("<li>").append($(this).find("a").first().clone());
3322541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty      $ul.append($li);
3323541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  });
3324541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3325541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty  $("#samples").append($ul);
3326541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty
3327541b494103857da31505ba745b0da5bdbe0499b9Dirk Dougherty}
332808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
332908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
333008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
333108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty/* ########################################################## */
333208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty/* ###################  RESOURCE CARDS  ##################### */
333308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty/* ########################################################## */
333408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
333508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty/** Handle resource queries, collections, and grids (sections). Requires
333608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    jd_tag_helpers.js and the *_unified_data.js to be loaded. */
333708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
333808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty(function() {
333908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  // Prevent the same resource from being loaded more than once per page.
334008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  var addedPageResources = {};
334108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
334208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  $(document).ready(function() {
334308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $('.resource-widget').each(function() {
334408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      initResourceWidget(this);
334508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    });
334608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
3347318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    /* Pass the line height to ellipsisfade() to adjust the height of the
3348318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    text container to show the max number of lines possible, without
3349318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    showing lines that are cut off. This works with the css ellipsis
3350318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    classes to fade last text line and apply an ellipsis char. */
3351318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty
3352318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    //card text currently uses 15px line height.
3353318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    var lineHeight = 15;
3354318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    $('.card-info .text').ellipsisfade(lineHeight);
335508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  });
335608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
335708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  /*
335808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    Three types of resource layouts:
335908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    Flow - Uses a fixed row-height flow using float left style.
3360318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    Carousel - Single card slideshow all same dimension absolute.
336108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    Stack - Uses fixed columns and flexible element height.
336208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  */
336308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function initResourceWidget(widget) {
336408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var $widget = $(widget);
336508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var isFlow = $widget.hasClass('resource-flow-layout'),
336608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        isCarousel = $widget.hasClass('resource-carousel-layout'),
336708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        isStack = $widget.hasClass('resource-stack-layout');
336808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
336908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    // find size of widget by pulling out its class name
337008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var sizeCols = 1;
337108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var m = $widget.get(0).className.match(/\bcol-(\d+)\b/);
337208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    if (m) {
337308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      sizeCols = parseInt(m[1], 10);
337408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
337508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
337608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var opts = {
337708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      cardSizes: ($widget.data('cardsizes') || '').split(','),
337808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      maxResults: parseInt($widget.data('maxresults') || '100', 10),
337908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      itemsPerPage: $widget.data('itemsperpage'),
338008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      sortOrder: $widget.data('sortorder'),
338108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      query: $widget.data('query'),
338208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      section: $widget.data('section'),
338308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      sizeCols: sizeCols
338408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    };
338508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
338608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    // run the search for the set of resources to show
338708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
338808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var resources = buildResourceList(opts);
338908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
339008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    if (isFlow) {
339108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      drawResourcesFlowWidget($widget, opts, resources);
339208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (isCarousel) {
339308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      drawResourcesCarouselWidget($widget, opts, resources);
339408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else if (isStack) {
339508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var sections = buildSectionList(opts);
339608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      opts['numStacks'] = $widget.data('numstacks');
339708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      drawResourcesStackWidget($widget, opts, resources, sections);
339808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
339908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
340008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
340108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  /* Initializes a Resource Carousel Widget */
340208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function drawResourcesCarouselWidget($widget, opts, resources) {
340308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $widget.empty();
3404318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    var plusone = true; //always show plusone on carousel
340508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
340608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $widget.addClass('resource-card slideshow-container')
340708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      .append($('<a>').addClass('slideshow-prev').text('Prev'))
340808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      .append($('<a>').addClass('slideshow-next').text('Next'));
340908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
341008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var css = { 'width': $widget.width() + 'px',
341108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty                'height': $widget.height() + 'px' };
341208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
341308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var $ul = $('<ul>');
341408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
341508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < resources.length; ++i) {
341608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      //keep url clean for matching and offline mode handling
341708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var urlPrefix = resources[i].url.indexOf("//") > -1 ? "" : toRoot;
341808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var $card = $('<a>')
341908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .attr('href', urlPrefix + resources[i].url)
3420318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        .decorateResourceCard(resources[i],plusone);
342108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
342208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $('<li>').css(css)
342308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .append($card)
342408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .appendTo($ul);
342508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
342608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
342708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $('<div>').addClass('frame')
342808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      .append($ul)
342908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      .appendTo($widget);
343008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
343108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $widget.dacSlideshow({
343208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      auto: true,
343308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      btnPrev: '.slideshow-prev',
343408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      btnNext: '.slideshow-next'
343508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    });
343608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  };
343708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
343808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  /* Initializes a Resource Card Stack Widget (column-based layout) */
343908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function drawResourcesStackWidget($widget, opts, resources, sections) {
344008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    // Don't empty widget, grab all items inside since they will be the first
344108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    // items stacked, followed by the resource query
3442318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    var plusone = true; //by default show plusone on section cards
344308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var cards = $widget.find('.resource-card').detach().toArray();
344408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var numStacks = opts.numStacks || 1;
344508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var $stacks = [];
344608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var urlString;
344708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
344808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < numStacks; ++i) {
344908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $stacks[i] = $('<div>').addClass('resource-card-stack')
345008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .appendTo($widget);
345108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
345208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
345308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var sectionResources = [];
345408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
345508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    // Extract any subsections that are actually resource cards
345608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < sections.length; ++i) {
345708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (!sections[i].sections || !sections[i].sections.length) {
345808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        //keep url clean for matching and offline mode handling
345908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        urlPrefix = sections[i].url.indexOf("//") > -1 ? "" : toRoot;
346008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        // Render it as a resource card
346108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
346208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        sectionResources.push(
346308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          $('<a>')
346408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            .addClass('resource-card section-card')
346508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            .attr('href', urlPrefix + sections[i].resource.url)
3466318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            .decorateResourceCard(sections[i].resource,plusone)[0]
346708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        );
346808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
346908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      } else {
347008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        cards.push(
347108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          $('<div>')
347208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            .addClass('resource-card section-card-menu')
3473318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            .decorateResourceSection(sections[i],plusone)[0]
347408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        );
347508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
347608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
347708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
347808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    cards = cards.concat(sectionResources);
347908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
348008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < resources.length; ++i) {
348108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      //keep url clean for matching and offline mode handling
348208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      urlPrefix = resources[i].url.indexOf("//") > -1 ? "" : toRoot;
348308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var $card = $('<a>')
348408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .addClass('resource-card related-card')
348508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .attr('href', urlPrefix + resources[i].url)
3486318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty          .decorateResourceCard(resources[i],plusone);
348708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
348808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      cards.push($card[0]);
348908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
349008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
349108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < cards.length; ++i) {
349208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // Find the stack with the shortest height, but give preference to
349308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // left to right order.
349408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var minHeight = $stacks[0].height();
349508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var minIndex = 0;
349608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
349708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      for (var j = 1; j < numStacks; ++j) {
349808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var height = $stacks[j].height();
349908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        if (height < minHeight - 45) {
350008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          minHeight = height;
350108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          minIndex = j;
350208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
350308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
350408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
350508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      $stacks[minIndex].append($(cards[i]));
350608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
350708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
350808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  };
350908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
351008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  /* Initializes a flow widget, see distribute.scss for generating accompanying css */
351108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function drawResourcesFlowWidget($widget, opts, resources) {
351208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $widget.empty();
351308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var cardSizes = opts.cardSizes || ['6x6'];
351408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var i = 0, j = 0;
3515318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    var plusone = true; // by default show plusone on resource cards
351608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
351708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    while (i < resources.length) {
351808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var cardSize = cardSizes[j++ % cardSizes.length];
351908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      cardSize = cardSize.replace(/^\s+|\s+$/,'');
3520318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty      console.log("cardsize is " + cardSize);
3521318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty      // Some card sizes do not get a plusone button, such as where space is constrained
3522318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty      // or for cards commonly embedded in docs (to improve overall page speed).
3523318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty      plusone = !((cardSize == "6x2") || (cardSize == "6x3") ||
3524318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                  (cardSize == "9x2") || (cardSize == "9x3") ||
3525318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                  (cardSize == "12x2") || (cardSize == "12x3"));
352608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
352708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // A stack has a third dimension which is the number of stacked items
352808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var isStack = cardSize.match(/(\d+)x(\d+)x(\d+)/);
352908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var stackCount = 0;
353008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var $stackDiv = null;
353108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
353208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (isStack) {
353308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        // Create a stack container which should have the dimensions defined
353408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        // by the product of the items inside.
353508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        $stackDiv = $('<div>').addClass('resource-card-stack resource-card-' + isStack[1]
353608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            + 'x' + isStack[2] * isStack[3]) .appendTo($widget);
353708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
353808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
353908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // Build each stack item or just a single item
354008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      do {
354108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var resource = resources[i];
354208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        //keep url clean for matching and offline mode handling
354308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        urlPrefix = resource.url.indexOf("//") > -1 ? "" : toRoot;
354408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var $card = $('<a>')
354508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            .addClass('resource-card resource-card-' + cardSize + ' resource-card-' + resource.type)
354608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            .attr('href', urlPrefix + resource.url);
354708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
354808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        if (isStack) {
354908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          $card.addClass('resource-card-' + isStack[1] + 'x' + isStack[2]);
355008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          if (++stackCount == parseInt(isStack[3])) {
355108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            $card.addClass('resource-card-row-stack-last');
355208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            stackCount = 0;
355308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          }
355408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        } else {
355508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          stackCount = 0;
355608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
355708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
3558318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        $card.decorateResourceCard(resource,plusone)
355908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .appendTo($stackDiv || $widget);
356008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
356108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      } while (++i < resources.length && stackCount > 0);
356208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
356308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
356408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
356508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  /* Build a site map of resources using a section as a root. */
356608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function buildSectionList(opts) {
356708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    if (opts.section && SECTION_BY_ID[opts.section]) {
356808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      return SECTION_BY_ID[opts.section].sections || [];
356908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
357008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return [];
357108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
357208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
357308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function buildResourceList(opts) {
357408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var maxResults = opts.maxResults || 100;
357508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
357608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var query = opts.query || '';
357708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var expressions = parseResourceQuery(query);
357808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var addedResourceIndices = {};
357908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var results = [];
358008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
358108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < expressions.length; i++) {
358208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var clauses = expressions[i];
358308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
358408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // build initial set of resources from first clause
358508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var firstClause = clauses[0];
358608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var resources = [];
358708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      switch (firstClause.attr) {
358808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'type':
358908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          resources = ALL_RESOURCES_BY_TYPE[firstClause.value];
359008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
359108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'lang':
359208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          resources = ALL_RESOURCES_BY_LANG[firstClause.value];
359308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
359408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'tag':
359508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          resources = ALL_RESOURCES_BY_TAG[firstClause.value];
359608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
359708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'collection':
359808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          var urls = RESOURCE_COLLECTIONS[firstClause.value].resources || [];
359908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; });
360008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
360108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'section':
360208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          var urls = SITE_MAP[firstClause.value].sections || [];
360308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; });
360408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
360508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
360620cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main      // console.log(firstClause.attr + ':' + firstClause.value);
360708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      resources = resources || [];
360808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
360908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // use additional clauses to filter corpus
361008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (clauses.length > 1) {
361108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var otherClauses = clauses.slice(1);
361208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        resources = resources.filter(getResourceMatchesClausesFilter(otherClauses));
361308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
361408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
361508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // filter out resources already added
361608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (i > 1) {
361708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        resources = resources.filter(getResourceNotAlreadyAddedFilter(addedResourceIndices));
361808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
361908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
362008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // add to list of already added indices
362108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      for (var j = 0; j < resources.length; j++) {
362220cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main        // console.log(resources[j].title);
362308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        addedResourceIndices[resources[j].index] = 1;
362408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
362508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
362608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // concat to final results list
362708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      results = results.concat(resources);
362808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
362908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
363008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    if (opts.sortOrder && results.length) {
363108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var attr = opts.sortOrder;
363208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
363308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (opts.sortOrder == 'random') {
363408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var i = results.length, j, temp;
363508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        while (--i) {
363608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          j = Math.floor(Math.random() * (i + 1));
363708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          temp = results[i];
363808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          results[i] = results[j];
363908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          results[j] = temp;
364008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
364108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      } else {
364208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var desc = attr.charAt(0) == '-';
364308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        if (desc) {
364408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          attr = attr.substring(1);
364508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
364608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        results = results.sort(function(x,y) {
364708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          return (desc ? -1 : 1) * (parseInt(x[attr], 10) - parseInt(y[attr], 10));
364808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        });
364908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
365008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
365108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
365208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    results = results.filter(getResourceNotAlreadyAddedFilter(addedPageResources));
365308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    results = results.slice(0, maxResults);
365408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
365508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var j = 0; j < results.length; ++j) {
365608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      addedPageResources[results[j].index] = 1;
365708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
365808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
365908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return results;
366008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
366108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
366208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
366308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function getResourceNotAlreadyAddedFilter(addedResourceIndices) {
366408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return function(resource) {
366508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      return !addedResourceIndices[resource.index];
366608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    };
366708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
366808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
366908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
367008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function getResourceMatchesClausesFilter(clauses) {
367108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return function(resource) {
367208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      return doesResourceMatchClauses(resource, clauses);
367308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    };
367408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
367508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
367608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
367708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function doesResourceMatchClauses(resource, clauses) {
367808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < clauses.length; i++) {
367908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var map;
368008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      switch (clauses[i].attr) {
368108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'type':
368208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          map = IS_RESOURCE_OF_TYPE[clauses[i].value];
368308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
368408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'lang':
368508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          map = IS_RESOURCE_IN_LANG[clauses[i].value];
368608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
368708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        case 'tag':
368808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          map = IS_RESOURCE_TAGGED[clauses[i].value];
368908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
369008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
369108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
369208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (!map || (!!clauses[i].negative ? map[resource.index] : !map[resource.index])) {
369308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        return clauses[i].negative;
369408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
369508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
369608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return true;
369708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
369808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
369908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
370008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  function parseResourceQuery(query) {
370108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    // Parse query into array of expressions (expression e.g. 'tag:foo + type:video')
370208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var expressions = [];
370308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var expressionStrs = query.split(',') || [];
370408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    for (var i = 0; i < expressionStrs.length; i++) {
370508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var expr = expressionStrs[i] || '';
370608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
370708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // Break expression into clauses (clause e.g. 'tag:foo')
370808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var clauses = [];
370908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var clauseStrs = expr.split(/(?=[\+\-])/);
371008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      for (var j = 0; j < clauseStrs.length; j++) {
371108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var clauseStr = clauseStrs[j] || '';
371208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
371308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        // Get attribute and value from clause (e.g. attribute='tag', value='foo')
371408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var parts = clauseStr.split(':');
371508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var clause = {};
371608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
371708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        clause.attr = parts[0].replace(/^\s+|\s+$/g,'');
371808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        if (clause.attr) {
371908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          if (clause.attr.charAt(0) == '+') {
372008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            clause.attr = clause.attr.substring(1);
372108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          } else if (clause.attr.charAt(0) == '-') {
372208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            clause.negative = true;
372308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            clause.attr = clause.attr.substring(1);
372408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          }
372508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
372608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
372708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        if (parts.length > 1) {
372808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          clause.value = parts[1].replace(/^\s+|\s+$/g,'');
372908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
373008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
373108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        clauses.push(clause);
373208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
373308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
373408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (!clauses.length) {
373508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        continue;
373608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
373708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
373808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      expressions.push(clauses);
373908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
374008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
374108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return expressions;
374208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  }
374308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty})();
374408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
374508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty(function($) {
374608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  /* Simple jquery function to create dom for a standard resource card */
3747318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty  $.fn.decorateResourceCard = function(resource,plusone) {
374808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var section = resource.group || resource.type;
374908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var imgUrl;
375008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    if (resource.image) {
375108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      //keep url clean for matching and offline mode handling
375208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var urlPrefix = resource.image.indexOf("//") > -1 ? "" : toRoot;
375308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      imgUrl = urlPrefix + resource.image;
375408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
3755318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    //add linkout logic here. check url or type, assign a class, map to css :after
375608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    $('<div>')
375708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .addClass('card-bg')
375808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .css('background-image', 'url(' + (imgUrl || toRoot + 'assets/images/resource-card-default-android.jpg') + ')')
375908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      .appendTo(this);
3760318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    if (!plusone) {
3761318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty      $('<div>').addClass('card-info' + (!resource.summary ? ' empty-desc' : ''))
376208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .append($('<div>').addClass('section').text(section))
376308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .append($('<div>').addClass('title').html(resource.title))
3764318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        .append($('<div>').addClass('description ellipsis')
3765318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            .append($('<div>').addClass('text').html(resource.summary))
3766318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty          .append($('<div>').addClass('util')))
3767318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty          .appendTo(this);
3768318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    } else {
3769318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty      $('<div>').addClass('card-info' + (!resource.summary ? ' empty-desc' : ''))
3770318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        .append($('<div>').addClass('section').text(section))
3771318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        .append($('<div>').addClass('title').html(resource.title))
3772318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        .append($('<div>').addClass('description ellipsis')
3773318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            .append($('<div>').addClass('text').html(resource.summary))
377408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .append($('<div>').addClass('util')
377508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            .append($('<div>').addClass('g-plusone')
377608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty              .attr('data-size', 'small')
377708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty              .attr('data-align', 'right')
377808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty              .attr('data-href', resource.url))))
3779318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            .appendTo(this);
3780318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    }
378108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
378208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return this;
378308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  };
378408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
378508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  /* Simple jquery function to create dom for a resource section card (menu) */
3786318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty  $.fn.decorateResourceSection = function(section,plusone) {
378708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var resource = section.resource;
378808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    //keep url clean for matching and offline mode handling
378908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var urlPrefix = resource.image.indexOf("//") > -1 ? "" : toRoot;
379008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var $base = $('<a>')
379108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .addClass('card-bg')
379208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .attr('href', resource.url)
379308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .append($('<div>').addClass('card-section-icon')
379408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .append($('<div>').addClass('icon'))
379508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .append($('<div>').addClass('section').html(resource.title)))
379608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      .appendTo(this);
379708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
379808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    var $cardInfo = $('<div>').addClass('card-info').appendTo(this);
379908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
380008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    if (section.sections && section.sections.length) {
380108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // Recurse the section sub-tree to find a resource image.
380208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var stack = [section];
380308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
380408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      while (stack.length) {
380508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        if (stack[0].resource.image) {
380608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          $base.css('background-image', 'url(' + urlPrefix + stack[0].resource.image + ')');
380708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          break;
380808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
380908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
381008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        if (stack[0].sections) {
381108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          stack = stack.concat(stack[0].sections);
381208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        }
381308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
381408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        stack.shift();
381508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
381608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
381708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var $ul = $('<ul>')
381808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .appendTo($cardInfo);
381908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
382008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      var max = section.sections.length > 3 ? 3 : section.sections.length;
382108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
382208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      for (var i = 0; i < max; ++i) {
382308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
382408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        var subResource = section.sections[i];
3825318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        if (!plusone) {
3826318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty          $('<li>')
3827318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            .append($('<a>').attr('href', subResource.url)
3828318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty              .append($('<div>').addClass('title').html(subResource.title))
3829318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty              .append($('<div>').addClass('description ellipsis')
3830318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                .append($('<div>').addClass('text').html(subResource.summary))
3831318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                .append($('<div>').addClass('util'))))
3832318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty          .appendTo($ul);
3833318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        } else {
3834318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty          $('<li>')
3835318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            .append($('<a>').attr('href', subResource.url)
3836318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty              .append($('<div>').addClass('title').html(subResource.title))
3837318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty              .append($('<div>').addClass('description ellipsis')
3838318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                .append($('<div>').addClass('text').html(subResource.summary))
3839318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                .append($('<div>').addClass('util')
3840318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                  .append($('<div>').addClass('g-plusone')
3841318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                    .attr('data-size', 'small')
3842318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                    .attr('data-align', 'right')
3843318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty                    .attr('data-href', resource.url)))))
3844318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty          .appendTo($ul);
3845318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty        }
384608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
384708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
384808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // Add a more row
384908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      if (max < section.sections.length) {
385008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        $('<li>')
385108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty          .append($('<a>').attr('href', resource.url)
385208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            .append($('<div>')
385308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty              .addClass('title')
385408032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty              .text('More')))
385508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        .appendTo($ul);
385608032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      }
385708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    } else {
385808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty      // No sub-resources, just render description?
385908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    }
386008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
386108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    return this;
386208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty  };
386308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty})(jQuery);
3864318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty/* Calculate the vertical area remaining */
386508032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty(function($) {
3866318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty    $.fn.ellipsisfade= function(lineHeight) {
386708032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        this.each(function() {
386808032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            // get element text
386908032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty            var $this = $(this);
3870318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            var remainingHeight = $this.parent().parent().height();
3871318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            $this.parent().siblings().each(function ()
3872318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            {
3873318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty              var h = $(this).height();
3874318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty              remainingHeight = remainingHeight - h;
3875318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            });
3876318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty
3877318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            adjustedRemainingHeight = ((remainingHeight)/lineHeight>>0)*lineHeight
3878318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            $this.parent().css({'height': adjustedRemainingHeight});
3879318fb97168396d21a958a415e9a1cf8167ebdc86Dirk Dougherty            $this.css({'height': "auto"});
388008032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        });
388108032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty
388208032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty        return this;
388308032409b4dd29740e1c8e703eada0d1ce86e58cDirk Dougherty    };
388420cf2a91f0c157875574dd0b0d9b4e040f94e656Scott Main}) (jQuery);
3885