home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 August / Chip_2004-08_cd1.bin / zkuste / fototools / download / looky / LookyLooky-Ver1_0-Beta.exe / _SETUP.1 / mtmcode.js < prev    next >
Text File  |  2000-03-30  |  18KB  |  511 lines

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