9df45a7d82c35a28fe8a3ebdddba4d6ef362bfd5
1 var navTreeSubIndices
= new Array();
3 function getData(varName
)
5 var i
= varName
.lastIndexOf('/');
6 var n
= i
>=0 ? varName
.substring(i
+1) : varName
;
7 return eval(n
.replace(/\-/g,'_'));
10 function stripPath(uri
)
12 return uri
.substring(uri
.lastIndexOf('/')+1);
15 function stripPath2(uri
)
17 var i
= uri
.lastIndexOf('/');
18 var s
= uri
.substring(i
+1);
19 var m
= uri
.substring(0,i
+1).match(/\/d\w\/d\w\w\/$/);
20 return m
? uri
.substring(i
-6) : s
;
25 return $(location
).attr('hash').substring(1).replace(/[^\w\-]/g,'');
30 return '#'+hashValue();
35 return $(location
).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_
|!:,.;\(\)]/g
, '');
38 function localStorageSupported()
41 return 'localStorage' in window
&& window
['localStorage'] !== null && window
.localStorage
.getItem
;
49 function storeLink(link
)
51 if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
52 window
.localStorage
.setItem('navpath',link
);
58 if (localStorageSupported()) {
59 window
.localStorage
.setItem('navpath','');
65 if (localStorageSupported()) {
66 return window
.localStorage
.getItem('navpath');
72 function getScript(scriptName
,func
,show
)
74 var head
= document
.getElementsByTagName("head")[0];
75 var script
= document
.createElement('script');
76 script
.id
= scriptName
;
77 script
.type
= 'text/javascript';
79 script
.src
= scriptName
+'.js';
80 if ($.browser
.msie
&& $.browser
.version
<=8) {
81 // script.onload does not work with older versions of IE
82 script
.onreadystatechange = function() {
83 if (script
.readyState
=='complete' || script
.readyState
=='loaded') {
84 func(); if (show
) showRoot();
88 head
.appendChild(script
);
91 function createIndent(o
,domNode
,node
,level
)
95 while (n
.parentNode
) { level
++; n
=n
.parentNode
; }
96 if (node
.childrenData
) {
97 var imgNode
= document
.createElement("img");
98 imgNode
.style
.paddingLeft
=(16*level
).toString()+'px';
102 node
.plus_img
= imgNode
;
103 node
.expandToggle
= document
.createElement("a");
104 node
.expandToggle
.href
= "javascript:void(0)";
105 node
.expandToggle
.onclick = function() {
107 $(node
.getChildrenUL()).slideUp("fast");
108 node
.plus_img
.src
= node
.relpath
+"arrowright.png";
109 node
.expanded
= false;
111 expandNode(o
, node
, false, false);
114 node
.expandToggle
.appendChild(imgNode
);
115 domNode
.appendChild(node
.expandToggle
);
116 imgNode
.src
= node
.relpath
+"arrowright.png";
118 var span
= document
.createElement("span");
119 span
.style
.display
= 'inline-block';
120 span
.style
.width
= 16*(level
+1)+'px';
121 span
.style
.height
= '22px';
122 span
.innerHTML
= ' ';
123 domNode
.appendChild(span
);
127 var animationInProgress
= false;
129 function gotoAnchor(anchor
,aname
,updateLocation
)
131 var pos
, docContent
= $('#doc-content');
132 var ancParent
= $(anchor
.parent());
133 if (ancParent
.hasClass('memItemLeft') ||
134 ancParent
.hasClass('fieldname') ||
135 ancParent
.hasClass('fieldtype') ||
136 ancParent
.is(':header'))
138 pos
= ancParent
.position().top
;
139 } else if (anchor
.position()) {
140 pos
= anchor
.position().top
;
143 var dist
= Math
.abs(Math
.min(
144 pos
-docContent
.offset().top
,
145 docContent
[0].scrollHeight
-
146 docContent
.height()-docContent
.scrollTop()));
147 animationInProgress
=true;
149 scrollTop
: pos
+ docContent
.scrollTop() - docContent
.offset().top
150 },Math
.max(50,Math
.min(500,dist
)),function(){
151 if (updateLocation
) window
.location
.href
=aname
;
152 animationInProgress
=false;
157 function newNode(o
, po
, text
, link
, childrenData
, lastNode
)
159 var node
= new Object();
160 node
.children
= Array();
161 node
.childrenData
= childrenData
;
162 node
.depth
= po
.depth
+ 1;
163 node
.relpath
= po
.relpath
;
164 node
.isLast
= lastNode
;
166 node
.li
= document
.createElement("li");
167 po
.getChildrenUL().appendChild(node
.li
);
168 node
.parentNode
= po
;
170 node
.itemDiv
= document
.createElement("div");
171 node
.itemDiv
.className
= "item";
173 node
.labelSpan
= document
.createElement("span");
174 node
.labelSpan
.className
= "label";
176 createIndent(o
,node
.itemDiv
,node
,0);
177 node
.itemDiv
.appendChild(node
.labelSpan
);
178 node
.li
.appendChild(node
.itemDiv
);
180 var a
= document
.createElement("a");
181 node
.labelSpan
.appendChild(a
);
182 node
.label
= document
.createTextNode(text
);
183 node
.expanded
= false;
184 a
.appendChild(node
.label
);
187 if (link
.substring(0,1)=='^') {
188 url
= link
.substring(1);
191 url
= node
.relpath
+link
;
193 a
.className
= stripPath(link
.replace('#',':'));
194 if (link
.indexOf('#')!=-1) {
195 var aname
= '#'+link
.split('#')[1];
196 var srcPage
= stripPath(pathName());
197 var targetPage
= stripPath(link
.split('#')[0]);
198 a
.href
= srcPage
!=targetPage
? url
: "javascript:void(0)";
199 a
.onclick = function(){
201 if (!$(a
).parent().parent().hasClass('selected'))
203 $('.item').removeClass('selected');
204 $('.item').removeAttr('id');
205 $(a
).parent().parent().addClass('selected');
206 $(a
).parent().parent().attr('id','selected');
208 var anchor
= $(aname
);
209 gotoAnchor(anchor
,aname
,true);
213 a
.onclick = function() { storeLink(link
); }
216 if (childrenData
!= null)
218 a
.className
= "nolink";
219 a
.href
= "javascript:void(0)";
220 a
.onclick
= node
.expandToggle
.onclick
;
224 node
.childrenUL
= null;
225 node
.getChildrenUL = function() {
226 if (!node
.childrenUL
) {
227 node
.childrenUL
= document
.createElement("ul");
228 node
.childrenUL
.className
= "children_ul";
229 node
.childrenUL
.style
.display
= "none";
230 node
.li
.appendChild(node
.childrenUL
);
232 return node
.childrenUL
;
240 var headerHeight
= $("#top").height();
241 var footerHeight
= $("#nav-path").height();
242 var windowHeight
= $(window
).height() - headerHeight
- footerHeight
;
243 (function (){ // retry until we can scroll to the selected item
245 var navtree
=$('#nav-tree');
246 navtree
.scrollTo('#selected',0,{offset
:-windowHeight
/2});
248 setTimeout(arguments
.callee
, 0);
253 function expandNode(o
, node
, imm
, showRoot
)
255 if (node
.childrenData
&& !node
.expanded
) {
256 if (typeof(node
.childrenData
)==='string') {
257 var varName
= node
.childrenData
;
258 getScript(node
.relpath
+varName
,function(){
259 node
.childrenData
= getData(varName
);
260 expandNode(o
, node
, imm
, showRoot
);
263 if (!node
.childrenVisited
) {
265 } if (imm
|| ($.browser
.msie
&& $.browser
.version
>8)) {
266 // somehow slideDown jumps to the start of tree for IE9 :-(
267 $(node
.getChildrenUL()).show();
269 $(node
.getChildrenUL()).slideDown("fast");
272 node
.plus_img
.src
= node
.relpath
+"arrowdown.png";
274 node
.plus_img
.src
= node
.relpath
+"arrowdown.png";
276 node
.expanded
= true;
281 function glowEffect(n
,duration
)
283 n
.addClass('glow').delay(duration
).queue(function(next
){
284 $(this).removeClass('glow');next();
288 function highlightAnchor()
290 var aname
= hashUrl();
291 var anchor
= $(aname
);
292 if (anchor
.parent().attr('class')=='memItemLeft'){
293 var rows
= $('.memberdecls tr[class$="'+hashValue()+'"]');
294 glowEffect(rows
.children(),300); // member without details
295 } else if (anchor
.parent().attr('class')=='fieldname'){
296 glowEffect(anchor
.parent().parent(),1000); // enum value
297 } else if (anchor
.parent().attr('class')=='fieldtype'){
298 glowEffect(anchor
.parent().parent(),1000); // struct field
299 } else if (anchor
.parent().is(":header")) {
300 glowEffect(anchor
.parent(),1000); // section header
302 glowEffect(anchor
.next(),1000); // normal member
304 gotoAnchor(anchor
,aname
,false);
307 function selectAndHighlight(hash
,n
)
311 var link
=stripPath(pathName())+':'+hash
.substring(1);
312 a
=$('.item a[class$="'+link
+'"]');
315 a
.parent().parent().addClass('selected');
316 a
.parent().parent().attr('id','selected');
319 $(n
.itemDiv
).addClass('selected');
320 $(n
.itemDiv
).attr('id','selected');
322 if ($('#nav-tree-contents .item:first').hasClass('selected')) {
323 $('#nav-sync').css('top','30px');
325 $('#nav-sync').css('top','5px');
330 function showNode(o
, node
, index
, hash
)
332 if (node
&& node
.childrenData
) {
333 if (typeof(node
.childrenData
)==='string') {
334 var varName
= node
.childrenData
;
335 getScript(node
.relpath
+varName
,function(){
336 node
.childrenData
= getData(varName
);
337 showNode(o
,node
,index
,hash
);
340 if (!node
.childrenVisited
) {
343 $(node
.getChildrenUL()).css({'display':'block'});
344 node
.plus_img
.src
= node
.relpath
+"arrowdown.png";
345 node
.expanded
= true;
346 var n
= node
.children
[o
.breadcrumbs
[index
]];
347 if (index
+1<o
.breadcrumbs
.length
) {
348 showNode(o
,n
,index
+1,hash
);
350 if (typeof(n
.childrenData
)==='string') {
351 var varName
= n
.childrenData
;
352 getScript(n
.relpath
+varName
,function(){
353 n
.childrenData
= getData(varName
);
355 showNode(o
,node
,index
,hash
); // retry with child node expanded
358 var rootBase
= stripPath(o
.toroot
.replace(/\..+$/, ''));
359 if (rootBase
=="index" || rootBase
=="pages" || rootBase
=="search") {
360 expandNode(o
, n
, true, true);
362 selectAndHighlight(hash
,n
);
367 selectAndHighlight(hash
);
371 function removeToInsertLater(element
) {
372 var parentNode
= element
.parentNode
;
373 var nextSibling
= element
.nextSibling
;
374 parentNode
.removeChild(element
);
377 parentNode
.insertBefore(element
, nextSibling
);
379 parentNode
.appendChild(element
);
384 function getNode(o
, po
)
386 var insertFunction
= removeToInsertLater(po
.li
);
387 po
.childrenVisited
= true;
388 var l
= po
.childrenData
.length
-1;
389 for (var i
in po
.childrenData
) {
390 var nodeData
= po
.childrenData
[i
];
391 po
.children
[i
] = newNode(o
, po
, nodeData
[0], nodeData
[1], nodeData
[2],
397 function gotoNode(o
,subIndex
,root
,hash
,relpath
)
399 var nti
= navTreeSubIndices
[subIndex
][root
+hash
];
400 o
.breadcrumbs
= $.extend(true, [], nti
? nti
: navTreeSubIndices
[subIndex
][root
]);
401 if (!o
.breadcrumbs
&& root
!=NAVTREE
[0][1]) { // fallback: show index
402 navTo(o
,NAVTREE
[0][1],"",relpath
);
403 $('.item').removeClass('selected');
404 $('.item').removeAttr('id');
407 o
.breadcrumbs
.unshift(0); // add 0 for root node
408 showNode(o
, o
.node
, 0, hash
);
412 function navTo(o
,root
,hash
,relpath
)
414 var link
= cachedLink();
416 var parts
= link
.split('#');
418 if (parts
.length
>1) hash
= '#'+parts
[1].replace(/[^\w\-]/g,'');
421 if (hash
.match(/^#l\d+$/)) {
422 var anchor
=$('a[name='+hash
.substring(1)+']');
423 glowEffect(anchor
.parent(),1000); // line number
424 hash
=''; // strip line number anchors
428 while (NAVTREEINDEX
[i
+1]<=url
) i
++;
429 if (i
==-1) { i
=0; root
=NAVTREE
[0][1]; } // fallback: show index
430 if (navTreeSubIndices
[i
]) {
431 gotoNode(o
,i
,root
,hash
,relpath
)
433 getScript(relpath
+'navtreeindex'+i
,function(){
434 navTreeSubIndices
[i
] = eval('NAVTREEINDEX'+i
);
435 if (navTreeSubIndices
[i
]) {
436 gotoNode(o
,i
,root
,hash
,relpath
);
442 function showSyncOff(n
,relpath
)
444 n
.html('<img src="'+relpath
+'sync_off.png" title="'+SYNCOFFMSG
+'"/>');
447 function showSyncOn(n
,relpath
)
449 n
.html('<img src="'+relpath
+'sync_on.png" title="'+SYNCONMSG
+'"/>');
452 function toggleSyncButton(relpath
)
454 var navSync
= $('#nav-sync');
455 if (navSync
.hasClass('sync')) {
456 navSync
.removeClass('sync');
457 showSyncOff(navSync
,relpath
);
458 storeLink(stripPath2(pathName())+hashUrl());
460 navSync
.addClass('sync');
461 showSyncOn(navSync
,relpath
);
466 function initNavTree(toroot
,relpath
)
468 var o
= new Object();
470 o
.node
= new Object();
471 o
.node
.li
= document
.getElementById("nav-tree-contents");
472 o
.node
.childrenData
= NAVTREE
;
473 o
.node
.children
= new Array();
474 o
.node
.childrenUL
= document
.createElement("ul");
475 o
.node
.getChildrenUL = function() { return o
.node
.childrenUL
; };
476 o
.node
.li
.appendChild(o
.node
.childrenUL
);
478 o
.node
.relpath
= relpath
;
479 o
.node
.expanded
= false;
480 o
.node
.isLast
= true;
481 o
.node
.plus_img
= document
.createElement("img");
482 o
.node
.plus_img
.src
= relpath
+"arrowright.png";
483 o
.node
.plus_img
.width
= 16;
484 o
.node
.plus_img
.height
= 22;
486 if (localStorageSupported()) {
487 var navSync
= $('#nav-sync');
489 showSyncOff(navSync
,relpath
);
490 navSync
.removeClass('sync');
492 showSyncOn(navSync
,relpath
);
494 navSync
.click(function(){ toggleSyncButton(relpath
); });
497 $(window
).load(function(){
498 navTo(o
,toroot
,hashUrl(),relpath
);
502 $(window
).bind('hashchange', function(){
503 if (window
.location
.hash
&& window
.location
.hash
.length
>1){
505 if ($(location
).attr('hash')){
506 var clslink
=stripPath(pathName())+':'+hashValue();
507 a
=$('.item a[class$="'+clslink
.replace(/</g
,'\\3c ')+'"]');
509 if (a
==null || !$(a
).parent().parent().hasClass('selected')){
510 $('.item').removeClass('selected');
511 $('.item').removeAttr('id');
513 var link
=stripPath2(pathName());
514 navTo(o
,link
,hashUrl(),relpath
);
515 } else if (!animationInProgress
) {
516 $('#doc-content').scrollTop(0);
517 $('.item').removeClass('selected');
518 $('.item').removeAttr('id');
519 navTo(o
,toroot
,hashUrl(),relpath
);