home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 December / Chip_2000-12_cd1.bin / tema / 602 / Sab / sablony / mtmcode.js < prev    next >
Encoding:
JavaScript  |  2000-10-27  |  17.6 KB  |  509 lines

  1. // Morten's JavaScript Tree Menu
  2. // written by Morten Wang <warnckew@online.no> (c) 1998-2000
  3. // This is version 2.2.4, dated 2000-01-30
  4.  
  5. // The script is freely distributable
  6. // It may be used (and modified) as you wish, but retain this message
  7. // For more information about the menu visit its home page
  8. // http://home.sol.no/~warnckew/tree_menu/
  9.  
  10. /******************************************************************************
  11. * Define the MenuItem object.                                                 *
  12. ******************************************************************************/
  13. function MTMenuItem(text, url, target, icon) {
  14.   this.text = text;
  15.   this.url = url ? url : "";
  16.   this.target =  target ? target : "";
  17.   this.icon = icon ? icon : "";
  18.  
  19.   this.number = MTMSubNumber++;
  20.  
  21.   this.submenu     = null;
  22.   this.expanded    = false;
  23.   this.MTMakeSubmenu = MTMakeSubmenu;
  24. }
  25.  
  26. function MTMakeSubmenu(menu) {
  27.   this.submenu = menu;
  28. }
  29.  
  30. /******************************************************************************
  31. * Define the Menu object.                                                     *
  32. ******************************************************************************/
  33.  
  34. function MTMenu() {
  35.   this.items   = new Array();
  36.   this.MTMAddItem = MTMAddItem;
  37. }
  38.  
  39. function MTMAddItem(item) {
  40.   this.items[this.items.length] = item;
  41. }
  42.  
  43. /******************************************************************************
  44. * Define the icon list, addIcon function and MTMIcon item.                    *
  45. ******************************************************************************/
  46.  
  47. function IconList() {
  48.   this.items = new Array();
  49.   this.addIcon = addIcon;
  50. }
  51.  
  52. function addIcon(item) {
  53.   this.items[this.items.length] = item;
  54. }
  55.  
  56. function MTMIcon(iconfile, match, type) {
  57.   this.file = iconfile;
  58.   this.match = match;
  59.   this.type = type;
  60. }
  61.  
  62. /******************************************************************************
  63. * Global variables.  Not to be altered unless you know what you're doing.     *
  64. * User-configurable options are at the end of this document.                  *
  65. ******************************************************************************/
  66.  
  67. var MTMLevel;
  68. var MTMBar = new Array();
  69. var MTMIndices = new Array();
  70. var MTMBrowser = null;
  71. var MTMNN3 = false;
  72. var MTMNN4 = false;
  73. var MTMIE4 = false;
  74. var MTMUseStyle = true;
  75.  
  76. if(navigator.appName == "Netscape") {
  77.   if(parseInt(navigator.appVersion) == 3 && (navigator.userAgent.indexOf("Opera") == -1)) {
  78.     MTMBrowser = true;
  79.     MTMNN3 = true;
  80.     MTMUseStyle = false;
  81.   } else if(parseInt(navigator.appVersion) >= 4) {
  82.     MTMBrowser = true;
  83.     MTMNN4 = true;
  84.   }
  85. } else if (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) >= 4) {
  86.   MTMBrowser = true;
  87.   MTMIE4 = true;
  88. }
  89.  
  90. var MTMClickedItem = false;
  91. var MTMExpansion = false;
  92.  
  93. var MTMSubNumber = 1;
  94. var MTMTrackedItem = false;
  95. var MTMTrack = false;
  96.  
  97. var MTMPreHREF = "";
  98. if(MTMIE4 || MTMNN3) {
  99.   MTMPreHREF += document.location.href.substring(0, document.location.href.lastIndexOf("/") +1);
  100. }
  101.  
  102. var MTMFirstRun = true;
  103. var MTMCurrentTime = 0; // for checking timeout.
  104. var MTMUpdating = false;
  105. var MTMWinSize, MTMyval;
  106. var MTMOutputString = "";
  107.  
  108. /******************************************************************************
  109. * Code that picks up frame names of frames in the parent frameset.            *
  110. ******************************************************************************/
  111.  
  112. if(MTMBrowser) {
  113.   var MTMFrameNames = new Array();
  114.   for(i = 0; i < parent.frames.length; i++)
  115.     MTMFrameNames[i] = parent.frames[i].name;
  116. }
  117.  
  118. /******************************************************************************
  119. * Dummy function for sub-menus without URLs                                   *
  120. * Thanks to Michel Plungjan for the advice. :)                                *
  121. ******************************************************************************/
  122.  
  123. function myVoid() { ; }
  124.  
  125. /******************************************************************************
  126. * Functions to draw the menu.                                                 *
  127. ******************************************************************************/
  128.  
  129. function MTMSubAction(SubItem, ReturnValue) {
  130.  
  131.   SubItem.expanded = (SubItem.expanded) ? false : true;
  132.   if(SubItem.expanded) {
  133.     MTMExpansion = true;
  134.   }
  135.  
  136.   MTMClickedItem = SubItem.number;
  137.  
  138.   if(MTMTrackedItem && MTMTrackedItem != SubItem.number) {
  139.     MTMTrackedItem = false;
  140.   }
  141.  
  142.   if(!ReturnValue) {
  143.     setTimeout("MTMDisplayMenu()", 10);
  144.   }
  145.  
  146.   return ReturnValue;
  147. }
  148.  
  149. function MTMStartMenu() {
  150.   if(MTMFirstRun) {
  151.     MTMCurrentTime++;
  152.     if(MTMCurrentTime == MTMTimeOut) { // call MTMDisplayMenu
  153.       setTimeout("MTMDisplayMenu()",10);
  154.     } else {
  155.       setTimeout("MTMStartMenu()",100);
  156.     }
  157.   } 
  158. }
  159.  
  160. function MTMDisplayMenu() {
  161.   if(MTMBrowser && !MTMUpdating) {
  162.     MTMUpdating = true;
  163.     MTMFirstRun = false;
  164.  
  165.     if(MTMTrack) { MTMTrackedItem = MTMTrackExpand(menu); }
  166.  
  167.     if(MTMExpansion && MTMSubsAutoClose) { MTMCloseSubs(menu); }
  168.  
  169.     MTMLevel = 0;
  170.     MTMDoc = parent.frames[MTMenuFrame].document
  171.     MTMDoc.open("text/html", "replace");
  172.     MTMOutputString = '<html><head>';
  173.     if(MTMLinkedSS) {
  174.       MTMOutputString += '<link rel="stylesheet" type="text/css" href="' + MTMPreHREF + MTMSSHREF + '">';
  175.     } else if(MTMUseStyle) {
  176.       MTMOutputString += '<style type="text/css">body {color:' + MTMTextColor + ';background:';
  177.       MTMOutputString += (MTMBackground == "") ? MTMBGColor : MTMakeBackImage(MTMBackground);
  178.       MTMOutputString += ';} .root {color:' + MTMRootColor + ';background:' + ((MTMBackground == "") ? MTMBGColor : 'transparent') + ';font-family:' + MTMRootFont + ';font-size:' + MTMRootCSSize + ';} ';
  179.       MTMOutputString += 'a {font-family:' + MTMenuFont + ';font-size:' + MTMenuCSSize + ';text-decoration:none;color:' + MTMLinkColor + ';background:' + MTMakeBackground() + ';} ';
  180.        MTMOutputString += MTMakeA('pseudo', 'hover', MTMAhoverColor);
  181.       MTMOutputString += MTMakeA('class', 'tracked', MTMTrackColor);
  182.       MTMOutputString += MTMakeA('class', 'subexpanded', MTMSubExpandColor);
  183.       MTMOutputString += '.small {font-family : arial CE, helvetica CE, arial, helvetica, sans-serif;font-size:8pt} ';
  184.       MTMOutputString += MTMakeA('class', 'subclosed', MTMSubClosedColor) + '</style>';
  185.     }
  186.  
  187.     MTMOutputString += '</head><body ';
  188.     if(MTMBackground != "") {
  189.       MTMOutputString += 'background="' + MTMPreHREF + MTMenuImageDirectory + MTMBackground + '" ';
  190.     }
  191.     MTMOutputString += 'bgcolor="' + MTMBGColor + '" text="' + MTMTextColor + '" link="' + MTMLinkColor + '" vlink="' + MTMLinkColor + '" alink="' + MTMLinkColor + '">';
  192.     MTMOutputString += '<table border="0" cellpadding="0" cellspacing="0" width="' + MTMTableWidth + '">';
  193.     MTMOutputString += '<tr valign="top"><td nowrap><img src="' + MTMPreHREF + MTMenuImageDirectory + MTMRootIcon + '" align="left" border="0" vspace="0" hspace="0">';
  194.     if(MTMUseStyle) {
  195.       MTMOutputString += '<a class="root" href="main.html" target="text">'+ MTMenuText +'</a>';
  196.     } else {
  197.       MTMOutputString += '<font size="' + MTMRootFontSize + '" face="' + MTMRootFont + '" color="' + MTMRootColor + '">' + MTMenuText + '</font>';
  198.     }
  199.     MTMDoc.writeln(MTMOutputString + '</td></tr>');
  200.  
  201.     MTMListItems(menu);
  202.  
  203.     MTMDoc.writeln('<tr><td>  </td></tr></table></body></html>');
  204.     MTMDoc.close();
  205.  
  206.     if((MTMClickedItem || MTMTrackedItem) && (MTMNN4 || MTMIE4) && !MTMFirstRun) {
  207.       MTMItemName = "sub" + (MTMClickedItem ? MTMClickedItem : MTMTrackedItem);
  208.       if(document.layers && parent.frames[MTMenuFrame].scrollbars) {    
  209.         MTMyval = parent.frames[MTMenuFrame].document.anchors[MTMItemName].y;
  210.         MTMWinSize = parent.frames[MTMenuFrame].innerHeight;
  211.       } else {
  212.         MTMyval = MTMGetPos(parent.frames[MTMenuFrame].document.all[MTMItemName]);
  213.         MTMWinSize = parent.frames[MTMenuFrame].document.body.offsetHeight;
  214.       }
  215.       if(MTMyval > (MTMWinSize - 60)) {
  216.         parent.frames[MTMenuFrame].scrollBy(0, parseInt(MTMyval - (MTMWinSize * 1/3)));
  217.       }
  218.     }
  219.  
  220.     MTMClickedItem = false;
  221.     MTMExpansion = false;
  222.     MTMTrack = false;
  223.   }
  224. MTMUpdating = false;
  225. }
  226.  
  227. function MTMListItems(menu) {
  228.   var i, isLast;
  229.   for (i = 0; i < menu.items.length; i++) {
  230.     MTMIndices[MTMLevel] = i;
  231.     isLast = (i == menu.items.length -1);
  232.     MTMDisplayItem(menu.items[i], isLast);
  233.  
  234.     if (menu.items[i].submenu && menu.items[i].expanded) {
  235.       MTMBar[MTMLevel] = (isLast) ? false : true;
  236.       MTMLevel++;
  237.       MTMListItems(menu.items[i].submenu);
  238.       MTMLevel--;
  239.     } else {
  240.       MTMBar[MTMLevel] = false;
  241.     } 
  242.   }
  243. }
  244.  
  245. function MTMDisplayItem(item, last) {
  246.   var i, img, more;
  247.  
  248.   if(item.submenu) {
  249.     var MTMouseOverText;
  250.  
  251.     var MTMClickCmd;
  252.     var MTMDblClickCmd = false;
  253.     var MTMfrm = "parent.frames['code']";
  254.     var MTMref = '.menu.items[' + MTMIndices[0] + ']';
  255.  
  256.     if(MTMLevel > 0) {
  257.       for(i = 1; i <= MTMLevel; i++) {
  258.         MTMref += ".submenu.items[" + MTMIndices[i] + "]";
  259.       }
  260.     }
  261.  
  262.     if(!MTMEmulateWE && !item.expanded && (item.url != "")) {
  263.       MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",true);";
  264.     } else {
  265.       MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",false);";
  266.     }
  267.  
  268.     if(item.url == "") {
  269.       MTMouseOverText = (item.text.indexOf("'") != -1) ? MTMEscapeQuotes(item.text) : item.text;
  270.     } else {
  271.       MTMouseOverText = "Expand/Collapse";
  272.     }
  273.   }
  274.  
  275.   MTMOutputString = '<tr valign="top"><td nowrap>';
  276.   if(MTMLevel > 0) {
  277.     for (i = 0; i < MTMLevel; i++) {
  278.       MTMOutputString += (MTMBar[i]) ? MTMakeImage("menu_bar.gif") : MTMakeImage("menu_pixel.gif");
  279.     }
  280.   }
  281.  
  282.   more = false;
  283.   if(item.submenu) {
  284.     if(MTMSubsGetPlus || MTMEmulateWE) {
  285.       more = true;
  286.     } else {
  287.       for (i = 0; i < item.submenu.items.length; i++) {
  288.         if (item.submenu.items[i].submenu) {
  289.           more = true;
  290.         }
  291.       }
  292.     }
  293.   }
  294.   if(!more) {
  295.     img = (last) ? "menu_corner.gif" : "menu_tee.gif";
  296.   } else {
  297.     if(item.expanded) {
  298.       img = (last) ? "menu_corner_minus.gif" : "menu_tee_minus.gif";
  299.     } else {
  300.       img = (last) ? "menu_corner_plus.gif" : "menu_tee_plus.gif";
  301.     }
  302.     if(item.url == "" || item.expanded || MTMEmulateWE) {
  303.       MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText);
  304.     } else {
  305.       MTMOutputString += MTMakeLink(item, true)  + ' onclick="' + MTMClickCmd + '">';
  306.     }
  307.   }
  308.   MTMOutputString += MTMakeImage(img);
  309.  
  310.   if(item.submenu) {
  311.     if(MTMEmulateWE && item.url != "") {
  312.       MTMOutputString += '</a>' + MTMakeLink(item, false) + '>';
  313.     }
  314.  
  315.     img = (item.expanded) ? "menu_folder_open.gif" : "menu_folder_closed.gif";
  316.  
  317.     if(!more) {
  318.       if(item.url == "" || item.expanded) {
  319.         MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText);
  320.       } else {
  321.         MTMOutputString += MTMakeLink(item, true) + ' onclick="' + MTMClickCmd + '">';
  322.       }
  323.     }
  324.     MTMOutputString += MTMakeImage(img);
  325.  
  326.   } else {
  327.     MTMOutputString += MTMakeLink(item, true) + '>';
  328.     img = (item.icon != "") ? item.icon : MTMFetchIcon(item.url);
  329.     MTMOutputString += MTMakeImage(img);
  330.   }
  331.  
  332.   if(item.submenu && (item.url != "") && (item.expanded && !MTMEmulateWE)) {
  333.     MTMOutputString += '</a>' + MTMakeLink(item, false) + '>';
  334.   }
  335.  
  336.   if(MTMNN3 && !MTMLinkedSS) {
  337.     var stringColor;
  338.     if(item.submenu && (item.url == "") && (item.number == MTMClickedItem)) {
  339.       stringColor = (item.expanded) ? MTMSubExpandColor : MTMSubClosedColor;
  340.     } else if(MTMTrackedItem && MTMTrackedItem == item.number) {
  341.       stringColor = MTMTrackColor;
  342.     } else {
  343.       stringColor = MTMLinkColor;
  344.     }
  345.     MTMOutputString += '<font color="' + stringColor + '" size="' + MTMenuFontSize + '" face="' + MTMenuFont + '">';
  346.   }
  347.   MTMOutputString += ' ' + item.text + ((MTMNN3 && !MTMLinkedSS) ? '</font>' : '') + '</a>' ;
  348.   MTMDoc.writeln(MTMOutputString + '</td></tr>');
  349. }
  350.  
  351. function MTMEscapeQuotes(myString) {
  352.   var newString = "";
  353.   var cur_pos = myString.indexOf("'");
  354.   var prev_pos = 0;
  355.   while (cur_pos != -1) {
  356.     if(cur_pos == 0) {
  357.       newString += "\\";
  358.     } else if(myString.charAt(cur_pos-1) != "\\") {
  359.       newString += myString.substring(prev_pos, cur_pos) + "\\";
  360.     } else if(myString.charAt(cur_pos-1) == "\\") {
  361.       newString += myString.substring(prev_pos, cur_pos);
  362.     }
  363.     prev_pos = cur_pos++;
  364.     cur_pos = myString.indexOf("'", cur_pos);
  365.   }
  366.   return(newString + myString.substring(prev_pos, myString.length));
  367. }
  368.  
  369. function MTMTrackExpand(thisMenu) {
  370.   var i, targetPath;
  371.   var foundNumber = false;
  372.   for(i = 0; i < thisMenu.items.length; i++) {
  373.     if(thisMenu.items[i].url != "" && MTMTrackTarget(thisMenu.items[i].target)) {
  374.       targetPath = parent.frames[thisMenu.items[i].target].location.pathname;
  375.       if(targetPath.lastIndexOf(thisMenu.items[i].url) != -1 && (targetPath.lastIndexOf(thisMenu.items[i].url) + thisMenu.items[i].url.length) == targetPath.length) {
  376.         return(thisMenu.items[i].number);
  377.       }
  378.     }
  379.     if(thisMenu.items[i].submenu) {
  380.       foundNumber = MTMTrackExpand(thisMenu.items[i].submenu);
  381.       if(foundNumber) {
  382.         if(!thisMenu.items[i].expanded) {
  383.           thisMenu.items[i].expanded = true;
  384.           if(!MTMClickedItem) { MTMClickedItem = thisMenu.items[i].number; }
  385.           MTMExpansion = true;
  386.         }
  387.         return(foundNumber);
  388.       }
  389.     }
  390.   }
  391. return(foundNumber);
  392. }
  393.  
  394. function MTMCloseSubs(thisMenu) {
  395.   var i, j;
  396.   var foundMatch = false;
  397.   for(i = 0; i < thisMenu.items.length; i++) {
  398.     if(thisMenu.items[i].submenu && thisMenu.items[i].expanded) {
  399.       if(thisMenu.items[i].number == MTMClickedItem) {
  400.         foundMatch = true;
  401.         for(j = 0; j < thisMenu.items[i].submenu.items.length; j++) {
  402.           if(thisMenu.items[i].submenu.items[j].expanded) {
  403.             thisMenu.items[i].submenu.items[j].expanded = false;
  404.           }
  405.         }
  406.       } else {
  407.         if(foundMatch) {
  408.           thisMenu.items[i].expanded = false; 
  409.         } else {
  410.           foundMatch = MTMCloseSubs(thisMenu.items[i].submenu);
  411.           if(!foundMatch) {
  412.             thisMenu.items[i].expanded = false;
  413.           }
  414.         }
  415.       }
  416.     }
  417.   }
  418. return(foundMatch);
  419. }
  420.  
  421. function MTMFetchIcon(testString) {
  422.   var i;
  423.   for(i = 0; i < MTMIconList.items.length; i++) {
  424.     if((MTMIconList.items[i].type == 'any') && (testString.indexOf(MTMIconList.items[i].match) != -1)) {
  425.       return(MTMIconList.items[i].file);
  426.     } else if((MTMIconList.items[i].type == 'pre') && (testString.indexOf(MTMIconList.items[i].match) == 0)) {
  427.       return(MTMIconList.items[i].file);
  428.     } else if((MTMIconList.items[i].type == 'post') && (testString.indexOf(MTMIconList.items[i].match) != -1)) {
  429.       if((testString.lastIndexOf(MTMIconList.items[i].match) + MTMIconList.items[i].match.length) == testString.length) {
  430.         return(MTMIconList.items[i].file);
  431.       }
  432.     }
  433.   }
  434. return("menu_link_default.gif");
  435. }
  436.  
  437. function MTMGetPos(myObj) {
  438.   return(myObj.offsetTop + ((myObj.offsetParent) ? MTMGetPos(myObj.offsetParent) : 0));
  439. }
  440.  
  441. function MTMCheckURL(myURL) {
  442.   var tempString = "";
  443.   if((myURL.indexOf("http://") == 0) || (myURL.indexOf("https://") == 0) || (myURL.indexOf("mailto:") == 0) || (myURL.indexOf("ftp://") == 0) || (myURL.indexOf("telnet:") == 0) || (myURL.indexOf("news:") == 0) || (myURL.indexOf("gopher:") == 0) || (myURL.indexOf("nntp:") == 0) || (myURL.indexOf("javascript:") == 0)) {
  444.     tempString += myURL;
  445.   } else {
  446.     tempString += MTMPreHREF + myURL;
  447.   }
  448. return(tempString);
  449. }
  450.  
  451. function MTMakeVoid(thisItem, thisCmd, thisText) {
  452.   var tempString = "";
  453.   tempString +=  '<a name="sub' + thisItem.number + '" href="javascript:parent.frames[\'code\'].myVoid();" onclick="' + thisCmd + '" onmouseover="window.status=\'' + thisText + '\';return true;" onmouseout="window.status=\'' + window.defaultStatus + '\';return true;"';
  454.   if(thisItem.number == MTMClickedItem) {
  455.     var tempClass;
  456.     tempClass = thisItem.expanded ? "subexpanded" : "subclosed";
  457.     tempString += ' class="' + tempClass + '"';
  458.   }
  459.   return(tempString + '>');
  460. }
  461.  
  462. function MTMakeLink(thisItem, addName) {
  463.   var tempString = '<a';
  464.  
  465.   if(MTMTrackedItem && MTMTrackedItem == thisItem.number) {
  466.     tempString += ' class="tracked"'
  467.   }
  468.   if(addName) {
  469.     tempString += ' name="sub' + thisItem.number + '"';
  470.   }
  471.   tempString += ' href="' + MTMCheckURL(thisItem.url) + '"';
  472.   if(thisItem.target != "") {
  473.     tempString += ' target="' + thisItem.target + '"';
  474.   }
  475. return tempString;
  476. }
  477.  
  478. function MTMakeImage(thisImage) {
  479.   return('<img src="' + MTMPreHREF + MTMenuImageDirectory + thisImage + '" align="left" border="0" vspace="0" hspace="0" width="18" height="18">');
  480. }
  481.  
  482. function MTMakeBackImage(thisImage) {
  483.   var tempString = 'transparent url("' + ((MTMPreHREF == "") ? "" : MTMPreHREF);
  484.   tempString += MTMenuImageDirectory + thisImage + '")'
  485.   return(tempString);
  486. }
  487.  
  488. function MTMakeA(thisType, thisText, thisColor) {
  489.   var tempString = "";
  490.   tempString += 'a' + ((thisType == "pseudo") ? ':' : '.');
  491.   return(tempString + thisText + '{color:' + thisColor + ';background:' + MTMakeBackground() + ';}');
  492. }
  493.  
  494. function MTMakeBackground() {
  495.   return((MTMBackground == "") ? MTMBGColor : 'transparent');
  496. }
  497.  
  498. function MTMTrackTarget(thisTarget) {
  499.   if(thisTarget.charAt(0) == "_") {
  500.     return false;
  501.   } else {
  502.     for(i = 0; i < MTMFrameNames.length; i++) {
  503.       if(thisTarget == MTMFrameNames[i]) {
  504.         return true;
  505.       }
  506.     }
  507.   }
  508.   return false;
  509. }