blob: b96e1366c9b3cab018e7f0c982eb2eb64ecec0f0 [file] [log] [blame]
The Android Open Source Project88b60792009-03-03 19:28:42 -08001
Scott Main25fda192009-08-04 11:26:30 -07002/* API LEVEL TOGGLE */
3addLoadEvent(changeApiLevel);
Scott Main9b5fdb92009-10-27 15:09:15 -07004
5var API_LEVEL_ENABLED_COOKIE = "api_level_enabled";
Scott Main25fda192009-08-04 11:26:30 -07006var API_LEVEL_COOKIE = "api_level";
7var minLevel = 1;
8
Scott Main9b5fdb92009-10-27 15:09:15 -07009function toggleApiLevelSelector(checkbox) {
10 var date = new Date();
11 date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
12 var expiration = date.toGMTString();
13 if (checkbox.checked) {
14 $("#apiLevelSelector").removeAttr("disabled");
15 $("#api-level-toggle label").removeClass("disabled");
16 writeCookie(API_LEVEL_ENABLED_COOKIE, 1, null, expiration);
17 } else {
18 $("#apiLevelSelector").attr("disabled","disabled");
19 $("#api-level-toggle label").addClass("disabled");
20 writeCookie(API_LEVEL_ENABLED_COOKIE, 0, null, expiration);
21 }
22 changeApiLevel();
23}
24
25function buildApiLevelSelector() {
26 var maxLevel = SINCE_DATA.length;
27 var userApiLevelEnabled = readCookie(API_LEVEL_ENABLED_COOKIE);
28 var userApiLevel = readCookie(API_LEVEL_COOKIE);
29
30 if (userApiLevelEnabled == 0) {
31 $("#apiLevelSelector").attr("disabled","disabled");
32 } else {
33 $("#apiLevelCheckbox").attr("checked","checked");
34 $("#api-level-toggle label").removeClass("disabled");
35 }
Scott Main25fda192009-08-04 11:26:30 -070036
37 minLevel = $("body").attr("class");
Scott Main9b5fdb92009-10-27 15:09:15 -070038 var select = $("#apiLevelSelector").html("").change(changeApiLevel);
39 for (var i = maxLevel-1; i >= 0; i--) {
40 var option = $("<option />").attr("value",""+SINCE_DATA[i]).append(""+SINCE_DATA[i]);
41 // if (SINCE_DATA[i] < minLevel) option.addClass("absent"); // always false for strings (codenames)
42 select.append(option);
43 }
Scott Main25fda192009-08-04 11:26:30 -070044
45 // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true)
Scott Main9b5fdb92009-10-27 15:09:15 -070046 var selectedLevelItem = $("#apiLevelSelector option[value='"+userApiLevel+"']").get(0);
Scott Main25fda192009-08-04 11:26:30 -070047 selectedLevelItem.setAttribute('selected',true);
48}
49
50function changeApiLevel() {
Scott Main9b5fdb92009-10-27 15:09:15 -070051 var maxLevel = SINCE_DATA.length;
52 var userApiLevelEnabled = readCookie(API_LEVEL_ENABLED_COOKIE);
53 var selectedLevel = maxLevel;
54
55 if (userApiLevelEnabled == 0) {
56 toggleVisisbleApis(selectedLevel, "body");
57 } else {
58 selectedLevel = $("#apiLevelSelector option:selected").val();
59 toggleVisisbleApis(selectedLevel, "body");
60
61 var date = new Date();
62 date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
63 var expiration = date.toGMTString();
64 writeCookie(API_LEVEL_COOKIE, selectedLevel, null, expiration);
65 }
Scott Main69497272009-08-24 17:33:06 -070066
Scott Main9b5fdb92009-10-27 15:09:15 -070067 if (selectedLevel < minLevel) {
68 var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class";
69 $("#naMessage").show().html("<div><p><strong>This " + thing + " is not available with API Level " + selectedLevel + ".</strong></p>"
Scott Main25fda192009-08-04 11:26:30 -070070 + "<p>To use this " + thing + ", your application must specify API Level " + minLevel + " or higher in its manifest "
71 + "and be compiled against a version of the Android library that supports an equal or higher API Level. To reveal this "
72 + "document, change the value of the API Level filter above.</p>"
73 + "<p><a href='" +toRoot+ "guide/appendix/api-levels.html'>What is the API Level?</a></p></div>");
Scott Main9b5fdb92009-10-27 15:09:15 -070074 } else {
Scott Main25fda192009-08-04 11:26:30 -070075 $("#naMessage").hide();
76 }
77}
78
Scott Main69497272009-08-24 17:33:06 -070079function toggleVisisbleApis(selectedLevel, context) {
80 var apis = $(".api",context);
81 apis.each(function(i) {
82 var obj = $(this);
83 var className = obj.attr("class");
84 var apiLevelIndex = className.lastIndexOf("-")+1;
85 var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
86 apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
87 var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
88 if (apiLevel > selectedLevel) obj.addClass("absent").attr("title","Requires API Level "+apiLevel+" or higher");
89 else obj.removeClass("absent").removeAttr("title");
90 });
91}
92
Scott Main25fda192009-08-04 11:26:30 -070093/* NAVTREE */
94
95function new_node(me, mom, text, link, children_data, api_level)
The Android Open Source Project88b60792009-03-03 19:28:42 -080096{
97 var node = new Object();
98 node.children = Array();
99 node.children_data = children_data;
100 node.depth = mom.depth + 1;
101
102 node.li = document.createElement("li");
103 mom.get_children_ul().appendChild(node.li);
104
105 node.label_div = document.createElement("div");
Scott Main25fda192009-08-04 11:26:30 -0700106 node.label_div.className = "label";
107 if (api_level != null) {
108 $(node.label_div).addClass("api");
109 $(node.label_div).addClass("api-level-"+api_level);
110 }
The Android Open Source Project88b60792009-03-03 19:28:42 -0800111 node.li.appendChild(node.label_div);
112 node.label_div.style.paddingLeft = 10*node.depth + "px";
The Android Open Source Project88b60792009-03-03 19:28:42 -0800113
114 if (children_data == null) {
115 // 12 is the width of the triangle and padding extra space
116 node.label_div.style.paddingLeft = ((10*node.depth)+12) + "px";
117 } else {
118 node.label_div.style.paddingLeft = 10*node.depth + "px";
119 node.expand_toggle = document.createElement("a");
120 node.expand_toggle.href = "javascript:void(0)";
121 node.expand_toggle.onclick = function() {
122 if (node.expanded) {
123 $(node.get_children_ul()).slideUp("fast");
124 node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
125 node.expanded = false;
126 } else {
127 expand_node(me, node);
128 }
129 };
130 node.label_div.appendChild(node.expand_toggle);
131
132 node.plus_img = document.createElement("img");
133 node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
134 node.plus_img.className = "plus";
135 node.plus_img.border = "0";
136 node.expand_toggle.appendChild(node.plus_img);
137
138 node.expanded = false;
139 }
140
141 var a = document.createElement("a");
142 node.label_div.appendChild(a);
143 node.label = document.createTextNode(text);
144 a.appendChild(node.label);
145 if (link) {
146 a.href = me.toroot + link;
147 } else {
148 if (children_data != null) {
149 a.className = "nolink";
150 a.href = "javascript:void(0)";
151 a.onclick = node.expand_toggle.onclick;
152 // This next line shouldn't be necessary. I'll buy a beer for the first
153 // person who figures out how to remove this line and have the link
154 // toggle shut on the first try. --joeo@android.com
155 node.expanded = false;
156 }
157 }
158
159
160 node.children_ul = null;
161 node.get_children_ul = function() {
162 if (!node.children_ul) {
163 node.children_ul = document.createElement("ul");
164 node.children_ul.className = "children_ul";
165 node.children_ul.style.display = "none";
166 node.li.appendChild(node.children_ul);
167 }
168 return node.children_ul;
169 };
170
171 return node;
172}
173
174function expand_node(me, node)
175{
176 if (node.children_data && !node.expanded) {
177 if (node.children_visited) {
178 $(node.get_children_ul()).slideDown("fast");
179 } else {
180 get_node(me, node);
Scott Main25fda192009-08-04 11:26:30 -0700181 if ($(node.label_div).hasClass("absent")) $(node.get_children_ul()).addClass("absent");
The Android Open Source Project88b60792009-03-03 19:28:42 -0800182 $(node.get_children_ul()).slideDown("fast");
183 }
184 node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png";
185 node.expanded = true;
Scott Main69497272009-08-24 17:33:06 -0700186
187 // perform api level toggling because new nodes are new to the DOM
Scott Main9b5fdb92009-10-27 15:09:15 -0700188 var selectedLevel = $("#apiLevelSelector option:selected").val();
Scott Main69497272009-08-24 17:33:06 -0700189 toggleVisisbleApis(selectedLevel, "#side-nav");
The Android Open Source Project88b60792009-03-03 19:28:42 -0800190 }
191}
192
193function get_node(me, mom)
194{
195 mom.children_visited = true;
196 for (var i in mom.children_data) {
197 var node_data = mom.children_data[i];
198 mom.children[i] = new_node(me, mom, node_data[0], node_data[1],
Scott Main25fda192009-08-04 11:26:30 -0700199 node_data[2], node_data[3]);
The Android Open Source Project88b60792009-03-03 19:28:42 -0800200 }
201}
202
203function this_page_relative(toroot)
204{
205 var full = document.location.pathname;
206 var file = "";
207 if (toroot.substr(0, 1) == "/") {
208 if (full.substr(0, toroot.length) == toroot) {
Scott Main25fda192009-08-04 11:26:30 -0700209 return full.substr(toroot.length);
The Android Open Source Project88b60792009-03-03 19:28:42 -0800210 } else {
211 // the file isn't under toroot. Fail.
212 return null;
213 }
214 } else {
215 if (toroot != "./") {
216 toroot = "./" + toroot;
217 }
218 do {
219 if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") {
220 var pos = full.lastIndexOf("/");
221 file = full.substr(pos) + file;
222 full = full.substr(0, pos);
223 toroot = toroot.substr(0, toroot.length-3);
224 }
225 } while (toroot != "" && toroot != "/");
226 return file.substr(1);
227 }
228}
229
230function find_page(url, data)
231{
232 var nodes = data;
233 var result = null;
234 for (var i in nodes) {
235 var d = nodes[i];
236 if (d[1] == url) {
237 return new Array(i);
238 }
239 else if (d[2] != null) {
240 result = find_page(url, d[2]);
241 if (result != null) {
242 return (new Array(i).concat(result));
243 }
244 }
245 }
246 return null;
247}
248
Scott Main5b53cd72009-06-04 11:10:17 -0700249function load_navtree_data(toroot) {
250 var navtreeData = document.createElement("script");
251 navtreeData.setAttribute("type","text/javascript");
252 navtreeData.setAttribute("src", toroot+"navtree_data.js");
253 $("head").append($(navtreeData));
Scott Main25fda192009-08-04 11:26:30 -0700254}
Scott Main5b53cd72009-06-04 11:10:17 -0700255
256function init_default_navtree(toroot) {
Scott Main5b53cd72009-06-04 11:10:17 -0700257 init_navtree("nav-tree", toroot, NAVTREE_DATA);
Scott Main69497272009-08-24 17:33:06 -0700258
259 // perform api level toggling because because the whole tree is new to the DOM
Scott Main9b5fdb92009-10-27 15:09:15 -0700260 var selectedLevel = $("#apiLevelSelector option:selected").val();
Scott Main69497272009-08-24 17:33:06 -0700261 toggleVisisbleApis(selectedLevel, "#side-nav");
Scott Main5b53cd72009-06-04 11:10:17 -0700262}
263
The Android Open Source Project88b60792009-03-03 19:28:42 -0800264function init_navtree(navtree_id, toroot, root_nodes)
Scott Main25fda192009-08-04 11:26:30 -0700265{
The Android Open Source Project88b60792009-03-03 19:28:42 -0800266 var me = new Object();
267 me.toroot = toroot;
268 me.node = new Object();
269
270 me.node.li = document.getElementById(navtree_id);
271 me.node.children_data = root_nodes;
272 me.node.children = new Array();
273 me.node.children_ul = document.createElement("ul");
274 me.node.get_children_ul = function() { return me.node.children_ul; };
275 //me.node.children_ul.className = "children_ul";
276 me.node.li.appendChild(me.node.children_ul);
277 me.node.depth = 0;
278
279 get_node(me, me.node);
280
281 me.this_page = this_page_relative(toroot);
282 me.breadcrumbs = find_page(me.this_page, root_nodes);
283 if (me.breadcrumbs != null && me.breadcrumbs.length != 0) {
284 var mom = me.node;
285 for (var i in me.breadcrumbs) {
286 var j = me.breadcrumbs[i];
287 mom = mom.children[j];
288 expand_node(me, mom);
289 }
290 mom.label_div.className = mom.label_div.className + " selected";
291 addLoadEvent(function() {
292 scrollIntoView("nav-tree");
293 });
294 }
295}