nc-sideMenu.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. function SDMenu(id) {
  2. if (!document.getElementById || !document.getElementsByTagName)
  3. return false;
  4. this.menu = document.getElementById(id);
  5. this.submenus = this.menu.getElementsByTagName("dl");
  6. this.remember = true;
  7. this.speed = 3;
  8. this.markCurrent = true;
  9. this.oneSmOnly = false;
  10. }
  11. SDMenu.prototype.init = function() {
  12. var mainInstance = this;
  13. for (var i = 0; i < this.submenus.length; i++)
  14. this.submenus[i].getElementsByTagName("dt")[0].onclick = function() {
  15. mainInstance.toggleMenu(this.parentNode);
  16. };
  17. //if (this.markCurrent) {
  18. // var links = this.menu.getElementsByTagName("a");
  19. // for (var i = 0; i < links.length; i++)
  20. // if (links[i].href == document.location.href) {
  21. // links[i].className = "current";
  22. // break;
  23. // }
  24. // }
  25. if (this.remember) {
  26. var regex = new RegExp(COOKIE_PRE+"sdmenu_" + encodeURIComponent(this.menu.id) + "=([01]+)");
  27. var match = regex.exec(document.cookie);
  28. if (match) {
  29. var states = match[1].split("");
  30. for (var i = 0; i < states.length; i++)
  31. this.submenus[i].className = (states[i] == 0 ? "collapsed" : "");
  32. }
  33. }
  34. };
  35. SDMenu.prototype.toggleMenu = function(submenu) {
  36. if (submenu.className == "collapsed")
  37. this.expandMenu(submenu);
  38. else
  39. this.collapseMenu(submenu);
  40. };
  41. SDMenu.prototype.expandMenu = function(submenu) {
  42. var fullHeight = submenu.getElementsByTagName("dt")[0].offsetHeight;
  43. var links = submenu.getElementsByTagName("a");
  44. for (var i = 0; i < links.length; i++)
  45. fullHeight += links[i].offsetHeight;
  46. var moveBy = Math.round(this.speed * links.length);
  47. var mainInstance = this;
  48. var intId = setInterval(function() {
  49. var curHeight = submenu.offsetHeight;
  50. var newHeight = curHeight + moveBy;
  51. if (newHeight < fullHeight)
  52. submenu.style.height = newHeight + "px";
  53. else {
  54. clearInterval(intId);
  55. submenu.style.height = "";
  56. submenu.className = "";
  57. mainInstance.memorize();
  58. }
  59. }, 30);
  60. this.collapseOthers(submenu);
  61. };
  62. SDMenu.prototype.collapseMenu = function(submenu) {
  63. var minHeight = submenu.getElementsByTagName("dt")[0].offsetHeight;
  64. var moveBy = Math.round(this.speed * submenu.getElementsByTagName("a").length);
  65. var mainInstance = this;
  66. var intId = setInterval(function() {
  67. var curHeight = submenu.offsetHeight;
  68. var newHeight = curHeight - moveBy;
  69. if (newHeight > minHeight)
  70. submenu.style.height = newHeight + "px";
  71. else {
  72. clearInterval(intId);
  73. submenu.style.height = "";
  74. submenu.className = "collapsed";
  75. mainInstance.memorize();
  76. }
  77. }, 30);
  78. };
  79. SDMenu.prototype.collapseOthers = function(submenu) {
  80. if (this.oneSmOnly) {
  81. for (var i = 0; i < this.submenus.length; i++)
  82. if (this.submenus[i] != submenu && this.submenus[i].className != "collapsed")
  83. this.collapseMenu(this.submenus[i]);
  84. }
  85. };
  86. SDMenu.prototype.expandAll = function() {
  87. var oldOneSmOnly = this.oneSmOnly;
  88. this.oneSmOnly = false;
  89. for (var i = 0; i < this.submenus.length; i++)
  90. if (this.submenus[i].className == "collapsed")
  91. this.expandMenu(this.submenus[i]);
  92. this.oneSmOnly = oldOneSmOnly;
  93. };
  94. SDMenu.prototype.collapseAll = function() {
  95. for (var i = 0; i < this.submenus.length; i++)
  96. if (this.submenus[i].className != "collapsed")
  97. this.collapseMenu(this.submenus[i]);
  98. };
  99. SDMenu.prototype.memorize = function() {
  100. if (this.remember) {
  101. var states = new Array();
  102. for (var i = 0; i < this.submenus.length; i++)
  103. states.push(this.submenus[i].className == "collapsed" ? 0 : 1);
  104. var d = new Date();
  105. d.setTime(d.getTime() + (30 * 24 * 60 * 60 * 1000));
  106. document.cookie = COOKIE_PRE+"sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
  107. }
  108. };