toc_bx.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /*
  2. Licensed Materials - Property of IBM
  3. BI and PM: DOCS
  4. © Copyright IBM Corp. 1999, 2009.
  5. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  6. */
  7. var globalLastSyncNode;
  8. var globalMenuObj;
  9. var globalBookName;
  10. window.onload = SetUp;
  11. function findSync()
  12. {
  13. var ank = parent.content.location.hash;
  14. var anySearch = parent.content.location.search;
  15. var nPos = parent.content.location.href.lastIndexOf('/');
  16. var sFilenameID = (nPos != -1) ? parent.content.location.href.substring( nPos+1, parent.content.location.href.length ) : "";
  17. var sSyncSuccess = false;
  18. if( anySearch ) {
  19. var searchPos = sFilenameID.lastIndexOf('?');
  20. sFilenameID = (searchPos != -1) ? sFilenameID.substring( 0, searchPos ) : sFilenameID;
  21. }
  22. if( ank && sFilenameID ) {
  23. sSyncSuccess = syncMe( sFilenameID );
  24. }
  25. else {
  26. var tempObjList = parent.content.document.getElementsByTagName('body');
  27. if( tempObjList[0] ) {
  28. var firstAobj = myFindFirstChildElementOfType( myFindFirstChildElementOfType( tempObjList[0], 'h2' ), 'a' );
  29. if( firstAobj != null ) {
  30. if( firstAobj.name ) {
  31. sSyncSuccess = syncMe( sFilenameID + "#" + firstAobj.name );
  32. }
  33. }
  34. else {
  35. firstAobj = myFindFirstChildElementOfType( tempObjList[0], 'a' );
  36. if( firstAobj != null ) {
  37. var nextSibA = firstAobj.nextSibling;
  38. if( nextSibA != null ) {
  39. if( nextSibA.nodeType == 1 && nextSibA.tagName.toLowerCase() == 'a' && nextSibA.name ) {
  40. sSyncSuccess = syncMe( sFilenameID + "#" + nextSibA.name );
  41. }
  42. }
  43. }
  44. }
  45. }
  46. }
  47. if( !sSyncSuccess ) {
  48. // no success yet
  49. // track down the numeric id and sync to that
  50. nPos = ank.lastIndexOf('#');
  51. var sNameAnchor = (nPos != -1) ? ank.substring( nPos+1, ank.length ) : "";
  52. //check to see if the anchor actually exists otherwise don't bother trying to sync cus it don't exist
  53. if ( parent.content.document.getElementsByName( sNameAnchor ).length > 0) {
  54. var sNameAnchorParentElementFirstAobj = myFindFirstChildElementOfType( parent.content.document.getElementsByName( sNameAnchor ).item(0).parentNode, 'a' );
  55. var sFilenameOnlyPos = sFilenameID.lastIndexOf('#');
  56. var sFilenameOnly = (sFilenameOnlyPos != -1) ? sFilenameID.substring( 0, sFilenameOnlyPos ) : sFilenameID;
  57. if( sNameAnchorParentElementFirstAobj != null ) {
  58. sSyncSuccess = syncMe( sFilenameOnly + "#" + sNameAnchorParentElementFirstAobj.name );
  59. }
  60. }
  61. }
  62. }
  63. function syncMe( objID, noHighlight )
  64. {
  65. if( document.getElementById( objID ) ) {
  66. var objShowMeLi = document.getElementById( objID ).parentNode;
  67. var objShowMeLiRecurseTemp = objShowMeLi;
  68. if( globalLastSyncNode ) globalLastSyncNode.style.background = '#FFFFFF';
  69. do {
  70. updateAllChildElementsOf( myFindFirstChildElementOfType( objShowMeLiRecurseTemp, 'ul' ) );
  71. objShowMeLiRecurseTemp = objShowMeLiRecurseTemp.parentNode.parentNode;
  72. } while( objShowMeLiRecurseTemp.tagName.toLowerCase() == 'li' )
  73. objShowMeLiRecurseTemp = objShowMeLi;
  74. var tempMainMenuObj = document.getElementById( 'maintocnav' );
  75. do {
  76. var parentTreeLiElement = objShowMeLiRecurseTemp.parentNode.parentNode;
  77. if( parentTreeLiElement.tagName.toLowerCase() == 'li' ) {
  78. var tempIMGNode = myFindFirstChildElementOfType( myFindFirstChildElementOfType( parentTreeLiElement, 'a'), 'img' );
  79. if( parentTreeLiElement.parentNode == tempMainMenuObj ) {
  80. tempIMGNode.src = 'common/oMinus_root.gif';
  81. }
  82. else {
  83. if( myFindLastChildElement( parentTreeLiElement.parentNode ) == parentTreeLiElement )
  84. tempIMGNode.src = 'common/oLminus.gif';
  85. else
  86. tempIMGNode.src = 'common/oTminus.gif';
  87. }
  88. }
  89. objShowMeLiRecurseTemp.parentNode.style.display = 'block';
  90. objShowMeLiRecurseTemp = objShowMeLiRecurseTemp.parentNode.parentNode;
  91. } while( objShowMeLiRecurseTemp.tagName.toLowerCase() == 'li' )
  92. if( !noHighlight ) {
  93. globalLastSyncNode = myFindFirstChildElementOfType( objShowMeLi ).nextSibling; // nextSibling reliable in mozilla?
  94. if( globalLastSyncNode ) globalLastSyncNode.style.background = '#DEEEFF';
  95. window.scroll ( 0, ( findPosY(objShowMeLi)-findMiddle() ) );
  96. }
  97. savestate();
  98. return true ;
  99. }
  100. else {
  101. return false ;
  102. }
  103. }
  104. function vState( state )
  105. {
  106. var objNested = globalMenuObj.getElementsByTagName('ul');
  107. for (var i=0; i<objNested.length; i++)
  108. {
  109. updateAllChildElementsOf( myFindFirstChildElementOfType( objNested[i].parentNode, 'ul' ) );
  110. var parentTreeLiElement = objNested[i].parentNode;
  111. if( parentTreeLiElement.tagName.toLowerCase() == 'li' ) {
  112. var tempIMGNode = myFindFirstChildElementOfType( myFindFirstChildElementOfType( parentTreeLiElement, 'a'), 'img' );
  113. if( parentTreeLiElement.parentNode == globalMenuObj ) {
  114. if( state )
  115. tempIMGNode.src = 'common/oMinus_root.gif';
  116. else
  117. tempIMGNode.src = 'common/oPlus_root.gif';
  118. }
  119. else {
  120. if( myFindLastChildElement( parentTreeLiElement.parentNode ) == parentTreeLiElement ) {
  121. if( state )
  122. tempIMGNode.src = 'common/oLminus.gif';
  123. else
  124. tempIMGNode.src = 'common/oLplus.gif';
  125. }
  126. else {
  127. if( state )
  128. tempIMGNode.src = 'common/oTminus.gif';
  129. else
  130. tempIMGNode.src = 'common/oTplus.gif';
  131. }
  132. }
  133. }
  134. if( state ) objNested[i].style.display = 'block';
  135. else objNested[i].style.display = 'none';
  136. }
  137. }
  138. function cState(objMenuitem, objEvent, justOpen)
  139. {
  140. var iKeyCode;
  141. if (objEvent && objEvent.type == 'keypress')
  142. {
  143. if (objEvent.keyCode)
  144. iKeyCode = objEvent.keyCode;
  145. else if (objEvent.which)
  146. iKeyCode = objEvent.which;
  147. if (iKeyCode != 13 && iKeyCode != 32)
  148. return true;
  149. }
  150. if( globalLastSyncNode ) {
  151. globalLastSyncNode.style.background='#FFFFFF';
  152. globalLastSyncNode = null;
  153. }
  154. var tempIMGNode = myFindFirstChildElementOfType( myFindFirstChildElementOfType( objMenuitem.parentNode, 'a'), 'img' );
  155. updateAllChildElementsOf( myFindFirstChildElementOfType( objMenuitem.parentNode, 'ul' ) );
  156. var tempUlNode = myFindFirstChildElementOfType( objMenuitem.parentNode, 'ul' );
  157. if (tempUlNode.style.display == 'block') {
  158. if( ! justOpen ) {
  159. tempUlNode.style.display = 'none';
  160. if( objMenuitem.parentNode.parentNode == globalMenuObj )
  161. tempIMGNode.src = 'common/oPlus_root.gif';
  162. else {
  163. if( myFindLastChildElement( objMenuitem.parentNode.parentNode ) == objMenuitem.parentNode )
  164. tempIMGNode.src = 'common/oLplus.gif';
  165. else
  166. tempIMGNode.src = 'common/oTplus.gif';
  167. }
  168. }
  169. }
  170. else {
  171. if( objMenuitem.parentNode.parentNode == globalMenuObj )
  172. tempIMGNode.src = 'common/oMinus_root.gif';
  173. else {
  174. if( myFindLastChildElement( objMenuitem.parentNode.parentNode ) == objMenuitem.parentNode )
  175. tempIMGNode.src = 'common/oLminus.gif';
  176. else
  177. tempIMGNode.src = 'common/oTminus.gif';
  178. }
  179. tempUlNode.style.display = 'block';
  180. }
  181. savestate();
  182. if( ! objMenuitem.target ) return false;
  183. }
  184. function SetUp()
  185. {
  186. if (document.getElementById && document.createElement)
  187. {
  188. globalMenuObj = document.getElementById('maintocnav');
  189. var tempObjBody = document.getElementsByTagName('body');
  190. globalBookName = tempObjBody.id;
  191. var ldtocImg = document.getElementById('ldtocimg');
  192. if( globalMenuObj ) globalMenuObj.style.display = 'block';
  193. if( ldtocImg ) ldtocImg.style.display = 'none';
  194. updateAllChildElementsOf( globalMenuObj );
  195. }
  196. findSync();
  197. }
  198. function updateAllChildElementsOf( obj ) {
  199. if( obj ) {
  200. var isRoot = ( (obj == globalMenuObj) ? true : false );
  201. var liChildNodes = obj.childNodes;
  202. for (var i=0; i<liChildNodes.length; i++)
  203. {
  204. if( liChildNodes[i].nodeType == 1 ) {
  205. if( liChildNodes[i].tagName.toLowerCase() == 'li' ) {
  206. var childULnode = myFindFirstChildElementOfType( liChildNodes[i], 'ul' );
  207. if( ! childULnode && ! myFindFirstChildElementOfType( liChildNodes[i], 'img' ) ) {
  208. var imgLinkTopic = document.createElement('img');
  209. if( myFindLastChildElement( liChildNodes[i].parentNode, 'First' ) == liChildNodes[i] )
  210. imgLinkTopic.src = isRoot ? 'common/spacer.gif' : 'common/oL.gif';
  211. else
  212. imgLinkTopic.src = isRoot ? 'common/spacer.gif' : 'common/oT.gif';
  213. imgLinkTopic.height = '20';
  214. imgLinkTopic.width = '16';
  215. imgLinkTopic.border = '0';
  216. var initialAnchorElement = myFindFirstChildElementOfType( liChildNodes[i], 'a' );
  217. initialAnchorElement.onmouseover = function(event){return oMover(this);}
  218. initialAnchorElement.onmouseout = function(event){return oMout(this);}
  219. initialAnchorElement.onclick = function(event){ if( globalLastSyncNode ) { globalLastSyncNode.style.background='#FFFFFF'; globalLastSyncNode = null; }; return true; }
  220. if( ! initialAnchorElement.target ) initialAnchorElement.target = 'content';
  221. liChildNodes[i].insertBefore( imgLinkTopic, initialAnchorElement );
  222. }
  223. else if ( childULnode && ! myFindFirstChildElementOfType( myFindFirstChildElementOfType( liChildNodes[i], 'a' ), 'img' ) ) {
  224. childULnode.style.display = 'none';
  225. var imgLinkAction = document.createElement('img');
  226. if( myFindLastChildElement( liChildNodes[i].parentNode, 'Second' ) == liChildNodes[i] )
  227. imgLinkAction.src = isRoot ? 'common/oPlus_root.gif' : 'common/oLplus.gif';
  228. else
  229. imgLinkAction.src = isRoot ? 'common/oPlus_root.gif' : 'common/oTplus.gif';
  230. imgLinkAction.height = '20';
  231. imgLinkAction.width = '26';
  232. imgLinkAction.border = '0';
  233. var objAnchor = document.createElement('a');
  234. objAnchor.href = '#';
  235. objAnchor.onclick = function(event){return cState(this, event);}
  236. objAnchor.onkeypress = function(event){return cState(this, event);}
  237. objAnchor.onmouseover = function(event){return oMover(this.nextSibling);}
  238. objAnchor.onmouseout = function(event){return oMout(this.nextSibling);}
  239. objAnchor.appendChild(imgLinkAction);
  240. var initialAnchorElement = myFindFirstChildElementOfType( liChildNodes[i], 'a' );
  241. initialAnchorElement.onclick = function(event){return cState(this, event, true);}
  242. initialAnchorElement.onkeypress = function(event){return cState(this, event, true);}
  243. initialAnchorElement.onmouseover = function(event){return oMover(this);}
  244. initialAnchorElement.onmouseout = function(event){return oMout(this);}
  245. if( ! initialAnchorElement.target ) initialAnchorElement.target = 'content';
  246. liChildNodes[i].insertBefore( objAnchor, myFindFirstChildElementOfType( liChildNodes[i], 'a' ) );
  247. }
  248. }
  249. }
  250. }
  251. }
  252. }
  253. function myFindFirstChildElementOfType( obj, type ) {
  254. if( obj ) {
  255. var ulChildNodes = obj.childNodes;
  256. var ulChildNode = ulChildNodes[0];
  257. while( ulChildNode ) {
  258. if( ulChildNode.nodeType == 1 ) {
  259. if( type && ulChildNode.tagName.toLowerCase() == type ) {
  260. return ulChildNode;
  261. }
  262. else if( !type ) {
  263. return ulChildNode;
  264. }
  265. }
  266. ulChildNode = ulChildNode.nextSibling;
  267. }
  268. return null;
  269. }
  270. else return null;
  271. }
  272. function myFindLastChildElement( obj, str ) {
  273. if( obj ) {
  274. var gotMatch = false;
  275. var ulChildNodes = obj.childNodes;
  276. var ulChildNode = obj.lastChild; // Select last node in list.
  277. while( ulChildNode ) {
  278. if( ulChildNode.nodeType == 1 ) {
  279. return ulChildNode;
  280. }
  281. ulChildNode = ulChildNode.previousSibling;
  282. }
  283. return null;
  284. }
  285. else return null;
  286. }
  287. function findPosY( obj )
  288. {
  289. var curtop = 0;
  290. if ( obj.offsetParent )
  291. {
  292. while ( obj.offsetParent )
  293. {
  294. curtop += obj.offsetTop
  295. obj = obj.offsetParent;
  296. }
  297. }
  298. else if (obj.y)
  299. curtop += obj.y;
  300. return curtop;
  301. }
  302. function findMiddle() {
  303. var myHeight = 0;
  304. if( typeof( window.innerHeight ) == 'number' ) {
  305. myWidth = window.innerWidth;
  306. }
  307. else if( document.documentElement && document.documentElement.clientHeight ) {
  308. myHeight = document.documentElement.clientHeight;
  309. }
  310. else if( document.body && document.body.clientHeight ) {
  311. myHeight = document.body.clientHeight;
  312. }
  313. else if( window.height ) {
  314. myHeight = window.height;
  315. }
  316. if( myHeight ) return ( myHeight/2 );
  317. else return 100;
  318. }
  319. function oMout( objHighlight )
  320. {
  321. if( objHighlight && objHighlight != globalLastSyncNode ) objHighlight.style.background='#FFFFFF';
  322. return true;
  323. }
  324. function oMover( objHighlight )
  325. {
  326. window.status='';
  327. if( objHighlight && objHighlight != globalLastSyncNode ) objHighlight.style.background='#DEEEFF';
  328. return true;
  329. }
  330. function savestate()
  331. {
  332. var statestr = '';
  333. var currentID = '';
  334. var allULs = globalMenuObj.getElementsByTagName('ul');
  335. for( var i=0; i<allULs.length; i++ )
  336. if( allULs[i].style.display == 'block' ) {
  337. var firstAnchorObj = myFindFirstChildElementOfType( myFindFirstChildElementOfType( allULs[i], 'li' ), 'a' );
  338. if( firstAnchorObj.id )
  339. currentID = firstAnchorObj.id;
  340. else if( firstAnchorObj.nextSibling.id )
  341. currentID = firstAnchorObj.nextSibling.id;
  342. statestr = statestr + currentID + '+';
  343. }
  344. if( statestr.charAt(statestr.length-1) == '+' )
  345. statestr = statestr.substring(0,(statestr.length-1));
  346. }