home *** CD-ROM | disk | FTP | other *** search
/ Freelog 117 / FreelogNo117-OctobreNovembre2013.iso / Theme / 8GadgetPack / 8GadgetPackSetup.msi / Gadgets.7z / Gadgets / AppLauncher.gadget / js / flyout_fav.js < prev    next >
Text File  |  2010-04-18  |  32KB  |  922 lines

  1. // favorites code by Matt Palermo. modified by Dean Laforet for Opera, folder view, validation and XML DOM
  2. // copyright 2007 Dean Laforet, Matt Palermo
  3. // do not use or modify code without permission.
  4.  
  5. var popularFileTypes = ["bat","lnk","url","exe","txt","html","htm","pdf","mp3","aac","ape","wav","flac","shn","wma","m3u","pls","asx","doc","ppt","xls","mov","avi","mpg","mpeg","mp4","ogg","jpg","jpeg","png","bmp","tif","gif","psd"];
  6. var mediaFileTypes = ["mp3","wav","flac","wma","ogg","shn","aac","ape"];
  7. var notepadExclude = ["lnk","url","exe","pdf","mp3","aac","ape","wav","flac","shn","wma","mov","avi","mpg","mpeg","mp4","ogg","jpg","jpeg","png","bmp","tif","gif","psd","dll","rar","cab","msi","sys","wim"];
  8.  
  9. var favType = "ff";
  10. var oFSO = new ActiveXObject("Scripting.FileSystemObject");
  11. var oShell = new ActiveXObject("WScript.Shell");
  12. var ie_favDir = oShell.SpecialFolders("Favorites");
  13. var ff_favDir = oShell.SpecialFolders("Appdata")+"\\Mozilla\\Firefox";
  14. var opera_favDir = oShell.SpecialFolders("Appdata")+"\\Opera\\Opera\\profile";
  15. var desktop = oShell.SpecialFolders("Desktop")+"\\";
  16.  
  17. var winPath = System.Environment.getEnvironmentVariable("windir");
  18. var pfPath = System.Environment.getEnvironmentVariable("PROGRAMFILES");
  19. if (oFSO.FolderExists(pfPath+" (x86)")) {pfPath = pfPath+" (x86)";}
  20. var ffPath = pfPath + "\\Mozilla Firefox\\firefox.exe";
  21. var iePath = pfPath + "\\Internet Explorer\\iexplore.exe";
  22. var operaPath = pfPath + "\\Opera\\Opera.exe";
  23. var gadgetPath = System.Gadget.path;
  24. var validateURL = /^(ht|f)tp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
  25.  
  26. var ff_ProfileDir;
  27. var ff_bookmarkFile;
  28. var ffItemsArray;
  29. var favListArea;
  30. var dirCount = 0;
  31. var idCount = 0;
  32. var delConfirmOpen = "no";
  33. var targetLink = null;
  34. var copyLink = null;
  35.  
  36. var showOnlyPopular = 1; // 1 = yes 0 = no. overwritten from settings page.
  37.  
  38. var bDebug = oFSO.FileExists(gadgetPath+"\\debugfav.txt");
  39. try{
  40.     if (bDebug)
  41.         var debugLogFile = oFSO.OpenTextFile(gadgetPath+"\\debugfav.txt", 2);
  42. } catch(err) {bDebug = false;}
  43.  
  44. function debugLog(outStr, errName, errMessage){
  45. try{
  46.         System.Debug.outputString(outStr+" - "+errName+" - "+errMessage);
  47.         if (bDebug)
  48.             debugLogFile.WriteLine(outStr+" - "+errName+" - "+errMessage);
  49. } catch(err) {}
  50. }
  51.  
  52. onerror = function(msg, url, l){
  53.    //debugLog("Javascript error: " + msg + " - on line: " + l);
  54.    favListArea.innerHTML += "ERROR: " + msg + " - on line: " + l;
  55. }
  56.  
  57. function $(v) { return(document.getElementById(v)); }
  58.  
  59. function read(name){
  60.   value = System.Gadget.Settings.read(name);
  61.   return value;
  62. }
  63.  
  64. function write(name,value){
  65.   System.Gadget.Settings.write(name, value);
  66. }
  67.  
  68. // Get the favorites type
  69. var favMeth = read("FavMeth");
  70. if(favMeth != "none" && favMeth != "" && favMeth != null) favType = favMeth;
  71. var folderLocation = read("folderLocation");
  72. var showOnlyPopular = read("FilterExtSetting");
  73. var FdeleteSetting = read("FDeleteSetting");
  74.  
  75. if (favMeth == "folder"){
  76.   ie_favDir = folderLocation;
  77. }
  78.  
  79. // Setup trim
  80. String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };
  81.  
  82. window.onload = function(){
  83. try{
  84.     favListArea = $('favListArea');
  85.   if (favMeth == "ff") { titleArea.innerText = "Firefox Bookmarks"; browserPath = ffPath;}
  86.   else if (favMeth == "op") { titleArea.innerText = "Opera Bookmarks"; browserPath = operaPath;}
  87.   else if (favMeth == "ie") { titleArea.innerText = "IE Favorites"; }
  88.   else{
  89.     folderName = oFSO.GetFileName(folderLocation);
  90.     if (folderName == ""){
  91.       folderName = "Drive: "+folderLocation;
  92.       titleArea.innerText = folderName;
  93.     }
  94.     else{
  95.       titleArea.innerText = "Folder: "+folderName;
  96.     } 
  97.   }
  98.  
  99.     if(favType == "ie" || favType == "folder") displayLinksAndDirs(ie_favDir, "favListArea", 0);
  100.     else if (favType == "ff"){
  101.         // We need to get the profile to use for FF
  102.         var profilesFile = ff_favDir+"\\profiles.ini";
  103.         if(oFSO.FileExists(profilesFile)){
  104.             // Get the directory to the FireFox profile to use
  105.             ts = oFSO.OpenTextFile(profilesFile, 1);
  106.             line = ts.ReadLine();
  107.             while(line != null)    {
  108.                 if(line.substr(0, 5) == "Path="){
  109.                     chunks = line.split("=");
  110.                     profileDir = chunks[chunks.length - 1];
  111.                     ff_ProfileDir = ff_favDir+"\\"+profileDir.replace(/\//g, '\\');
  112.                     ff_bookmarkFile = ff_ProfileDir+"\\bookmarks.html";
  113.                     break;
  114.                 }
  115.                 line = ts.ReadLine();
  116.             }
  117.             ts.close();
  118.  
  119.             if(oFSO.FileExists(ff_bookmarkFile)){
  120.                 // Go through the bookmarks file and get all files/folders
  121.                 bookFile = oFSO.OpenTextFile(ff_bookmarkFile, 1);
  122.                 ffItemsArray = new Array();
  123.                 var ff_dirCount = -1;
  124.                 while(!bookFile.AtendOfStream){
  125.                     bookLine = bookFile.ReadLine();
  126.                     lnTmp = bookLine.trim();
  127.  
  128.                     if(lnTmp.substr(0, 5) == "</DL>")  ff_dirCount--;
  129.                     else if(lnTmp.substr(0, 4) == "<DL>")  ff_dirCount++;
  130.                     if(lnTmp.substr(0, 4) == "<DT>"){
  131.                         // This is a file/folder element
  132.                         lnTmp = lnTmp.substr(4);
  133.  
  134.                         itemInfo = new Array();
  135.                         if(lnTmp.substr(0, 3) == "<H3"){
  136.                             // We got a "folder" here
  137.                             tmpTitle = lnTmp.split(/\>/)[1].split(/\</)[0];
  138.  
  139.                             itemInfo['type'] = "dir";
  140.                             itemInfo['title'] = tmpTitle;
  141.                             itemInfo['dir_level'] = ff_dirCount;
  142.                             ffItemsArray[ffItemsArray.length] = itemInfo;
  143.                         }
  144.                         else if(lnTmp.substr(0, 2) == "<A"){
  145.                             // We got a "link" here
  146.                             testTheUrl = lnTmp.split(/\"/)[1];
  147.                             tmpTitle = lnTmp.split(/\>/)[1].split(/\</)[0];
  148.  
  149.               if (validateURL.exec(testTheUrl)){
  150.                 itemInfo['type'] = "file";
  151.                 itemInfo['title'] = tmpTitle;
  152.                 itemInfo['dir_level'] = ff_dirCount;
  153.                 itemInfo['url'] = testTheUrl;
  154.                 ffItemsArray[ffItemsArray.length] = itemInfo;
  155.                             }
  156.                         }
  157.                         else{}
  158.                     }
  159.                     else{}
  160.                 }
  161.                 bookFile.close();
  162.  
  163.                 // Iterate through items and set their parent id's
  164.                 for(var i = 0; i < ffItemsArray.length; i++){
  165.                     ffItemsArray[i]['parent_id'] = getFFitemParentId(i);
  166.                 }
  167.                 // Display initial folder levels
  168.                 displayFFbookmarks("favListArea", -1);
  169.             }
  170.         }
  171.         else{
  172.       favListArea.innerText = "Firefox Bookmarks file not found.";
  173.         }
  174.     }
  175.     else if (favType == "op"){
  176.         var operaAdr6File = opera_favDir+"\\opera6.adr";
  177.         if(oFSO.FileExists(operaAdr6File)){
  178.                 // Go through the bookmarks file and get all files/folders
  179.                 bookFile = oFSO.OpenTextFile(operaAdr6File, 1);
  180.                 ffItemsArray = new Array();
  181.                 var opera_dirCount = 0;
  182.                 while(!bookFile.AtendOfStream){
  183.                     lnTmp = bookFile.ReadLine();
  184.                     itemInfo = new Array();
  185.  
  186.                     if(lnTmp.substr(0) == "#FOLDER"){
  187.             bookFile.SkipLine();
  188.             lnTmp = bookFile.ReadLine();
  189.                         lnTmp = lnTmp.substr(6);
  190.  
  191.                         itemInfo['type'] = "dir";
  192.                         itemInfo['title'] = lnTmp;
  193.                         itemInfo['dir_level'] = opera_dirCount;
  194.                         ffItemsArray[ffItemsArray.length] = itemInfo;
  195.                         opera_dirCount++;
  196.                     }
  197.                     else if (lnTmp.substr(0) == "#URL"){
  198.             bookFile.SkipLine();
  199.             lnName = bookFile.ReadLine();
  200.             lnName = lnName.substr(6);
  201.             lnUrl = bookFile.ReadLine();
  202.             lnUrl = lnUrl.substr(5);
  203.  
  204.             testTheUrl = lnUrl;
  205.  
  206.             if (validateURL.exec(testTheUrl)){
  207.               itemInfo['type'] = "file";
  208.               itemInfo['title'] = lnName;
  209.               itemInfo['dir_level'] = opera_dirCount;
  210.               itemInfo['url'] = testTheUrl;
  211.               ffItemsArray[ffItemsArray.length] = itemInfo;
  212.             }
  213.                             
  214.                     }
  215.                     else{
  216.             if(lnTmp.substr(0) == "-")  opera_dirCount--;
  217.                     }
  218.                 }
  219.         bookFile.close();
  220.  
  221.         for(var i = 0; i < ffItemsArray.length; i++){
  222.           ffItemsArray[i]['parent_id'] = getFFitemParentId(i);
  223.         }
  224.         displayFFbookmarks("favListArea", -1);
  225.      }
  226.      else{
  227.         favListArea.innerText = "Opera bookmarks file not found.";
  228.      }
  229.    }
  230.    else{}
  231. } catch(err) {debugLog("window onload: ", err.name, err.message);}
  232. }
  233.  
  234. // Get the parent folder for an item
  235. function getFFitemParentId(itemId){
  236.     // The first folder with a lower id num is the parent folder
  237.     var parentId = -1;
  238.     for(var z = itemId - 1; z > -1; z--){
  239.         if(ffItemsArray[z]['dir_level'] < ffItemsArray[itemId]['dir_level']){
  240.             parentId = z;
  241.             break;
  242.         }
  243.     }
  244.     return parentId;
  245. }
  246.  
  247. // Hide or show the sub links for a folder in FF and Opera
  248. function toggleFFlinkDisplay(displayElementId, parentIdNum){
  249. try{
  250.     var displayObj = $(displayElementId);
  251.     if(displayObj.style.display == "none"){
  252.         displayFFbookmarks(displayElementId, parentIdNum);
  253.     }
  254.     else{
  255.         displayObj.style.display = "none";
  256.     }
  257. } catch(err) {debugLog("toggleFFlinkDisplay: ", err.name, err.message);}
  258. }
  259.  
  260. // Display FF ond Opera bookmarks
  261. function displayFFbookmarks(displayElementId, parentIdNum){
  262. try{
  263.     var displayObj = $(displayElementId);
  264.     displayObj.style.display = "";
  265.     displayObj.innerText = "";
  266.     // Go through the line array extract info
  267.     for(var i = 1; i < ffItemsArray.length; i++){
  268.         currItem = ffItemsArray[i];
  269.         if(currItem['parent_id'] != parentIdNum) continue;
  270.  
  271.         if(currItem['type'] == "dir"){ 
  272.       var oDiv = createFolder(i, currItem['dir_level'], "", currItem['title']);
  273.       oDiv.firstChild.className = "favIcon";
  274.       oDiv.lastChild.onclick = new Function("toggleFFlinkDisplay('dir_"+i+"', '"+i+"')");
  275.       displayObj.appendChild(oDiv);
  276.  
  277.       var oDiv = document.createElement("div");
  278.       oDiv.id = "dir_"+i;
  279.       oDiv.style.display = "none";
  280.       displayObj.appendChild(oDiv);
  281.     }
  282.     }
  283.   for(var i = 1; i < ffItemsArray.length; i++){ // second pass add links that are not in folders. This is an Opera workaround.
  284.     currItem = ffItemsArray[i];
  285.     if(currItem['parent_id'] != parentIdNum) continue;
  286.  
  287.     if (currItem['type'] == "file"){
  288.       var oDiv = createFile(i, currItem['dir_level'], "", currItem['title']);
  289.       if (favMeth == "ff") oDiv.firstChild.src = "/images/urlFF.png";
  290.       else oDiv.firstChild.src = "/images/urlOP.png";
  291.       oDiv.firstChild.className = "favIcon";
  292.       oDiv.lastChild.onclick = new Function("System.Shell.execute(browserPath, '"+currItem['url']+"')");
  293.       displayObj.appendChild(oDiv);
  294.  
  295.       ffItemsArray[i]['id'] = i;
  296.     }
  297.   }
  298. } catch(err) {debugLog("displayFFBookmarks: ", err.name, err.message);}
  299. }
  300.  
  301. // Hide or show the sub links for a folder
  302. function toggleLinkDisplay(dp, displayElement, level){
  303. try{
  304.     displayObj = $(displayElement);
  305.     if(displayObj.style.display == "none"){
  306.         displayLinksAndDirs(dp, displayElement, level);
  307.     }
  308.     else{
  309.         displayObj.style.display = "none";
  310.     }
  311. } catch(err) {debugLog("toggleLinkDisplay: ", err.name, err.message);}
  312. }
  313.  
  314. // Display links and folders inside a given folder
  315. function displayLinksAndDirs(dp, displayElement, level){
  316. try{
  317.     displayObj = $(displayElement);
  318.     displayObj.style.display = "";
  319.     displayObj.innerText = "";
  320.  
  321.     if(level == 0 && favMeth == "folder"){
  322.         oDiv = createFolder(idCount, level, "", "This folder ("+folderName+")");
  323.     oDiv.className = "folderHeader";
  324.     oDiv.firstChild.className = "folderIcon";
  325.     oDiv.firstChild.setAttribute("link",folderLocation);
  326.     oDiv.firstChild.onclick = function(){showMenu('parentFolder')};
  327.     oDiv.lastChild.style.cursor = "default";
  328.     displayObj.appendChild(oDiv);
  329.  
  330.     idCount++;
  331.   }
  332.  
  333.     // Get folders
  334.     favDirs = getSubDirs(dp);
  335.     for(favItem in favDirs)    { 
  336.         dirCount++;
  337.         dname = favDirs[favItem];
  338.  
  339.         d = oFSO.GetFolder(dname);
  340.         if(d.attributes == 18 || d.attributes == 22 || d.attributes == 1046) continue;
  341.         dirPath = d.Path; 
  342.  
  343.         arFileName = dirPath.split("\\");
  344.         label = arFileName[arFileName.length - 1];
  345.         if (favMeth == "ie") label = label.split(".")[0];
  346.  
  347.         dirPath = dirPath.replace(/\\/g, '\\\\');
  348.         dirPath = dirPath.replace(/\'/g, '\\\'');
  349.         levelUp = parseInt(level) + 1;
  350.  
  351.         var oDiv = createFolder(idCount, level, dirPath, label);
  352.         if (favMeth == "ie"){
  353.       oDiv.firstChild.className = "favIcon"
  354.     }
  355.     else{
  356.       oDiv.firstChild.className = "folderIcon"
  357.       oDiv.firstChild.onclick = function(){showMenu('folder')};
  358.     }
  359.     oDiv.lastChild.onclick = new Function("toggleLinkDisplay(\""+dirPath+"\", \"dir_"+dirCount+"\", \""+levelUp+"\")");
  360.     displayObj.appendChild(oDiv);
  361.  
  362.     var oDiv = document.createElement("div");
  363.     oDiv.id = "dir_"+dirCount;
  364.     oDiv.style.display = "none";
  365.     displayObj.appendChild(oDiv);
  366.  
  367.     idCount++;
  368.     }
  369.  
  370.     // Get files
  371.     favFiles = getSubFiles(dp);
  372.     for(favItem in favFiles){ 
  373.         fname = favFiles[favItem];
  374.  
  375.         f = oFSO.GetFile(fname);
  376.         if (f.attributes == 37 || f.attributes == 38 || f.attributes == 39 || f.attributes == 4 || f.attributes == 5 || f.attributes == 6 || f.attributes == 7) continue;
  377.  
  378.     fext = oFSO.GetExtensionName(fname).toLowerCase();
  379.  
  380.     if (favMeth == "ie"){
  381.     try{
  382.       oLink = oShell.CreateShortcut(fname);
  383.       tmpPath = oLink.TargetPath;
  384.       if (!validateURL.exec(tmpPath)) continue;
  385.     }catch(err){continue;}
  386.     }
  387.     else if (showOnlyPopular == 1){
  388.       if (!checkExtension(fext)) continue;
  389.     }
  390.     else{}
  391.  
  392.         filePath = f.Path; 
  393.         arFileName = filePath.split("\\");
  394.         label = arFileName[arFileName.length - 1];
  395.         if (favMeth == "ie") label = label.split(".")[0];
  396.  
  397.         filePath = filePath.replace(/\\/g, '\\\\');
  398.         filePath = filePath.replace(/\'/g, '\\\'');
  399.  
  400.         if (favMeth == "ie" && fext == "url"){
  401.       var oDiv = createFile(idCount, level, filePath, label);
  402.       oDiv.firstChild.src = "/images/urlIE.png";
  403.       oDiv.firstChild.className = "favIcon";
  404.       oDiv.lastChild.onclick = new Function("System.Shell.execute(iePath, \""+filePath+"\")");
  405.       displayObj.appendChild(oDiv);
  406.     }
  407.     else if (favMeth == "folder"){
  408.       var oDiv = createFile(idCount, level, filePath, label);
  409.       oDiv.firstChild.src = "gimage:///"+f.Path+"?width=16&height=16";
  410.       oDiv.firstChild.className = "folderIcon";
  411.       oDiv.firstChild.onclick = function(){showMenu('file')};
  412.       oDiv.lastChild.onclick = function(){executeFile()};
  413.       displayObj.appendChild(oDiv);
  414.     }
  415.     else{}
  416.     idCount++;
  417.     }
  418.     if (favFiles == "" && favDirs == ""){
  419.       var oEmpty = document.createElement("div");
  420.       oEmpty.id = "empty"+idCount;
  421.       oEmpty.style.cssText = "color:teal;margin-left:"+(level*20)+"px;height:18px;";
  422.       oEmpty.innerText = "empty folder";
  423.       displayObj.appendChild(oEmpty);
  424.     }
  425.  
  426.     if (favMeth == "folder"){
  427.     openArea.style.display = "";
  428.         openArea.innerHTML = "<span onclick=\"System.Shell.execute(folderLocation);\" style=\"cursor:pointer;width:100%;text-align:center;color:blue;\">Click here to open the folder.</span>"; 
  429.   }
  430. } catch(err) {debugLog("displayLinksandDirs: ", err.name, err.message);}
  431. }
  432.  
  433. function createFolder(idCount, level, dirPath, label){
  434. try{
  435.   var oDiv = document.createElement("div");
  436.   oDiv.id = "folder"+idCount;
  437.   oDiv.style.cssText = "margin-left:"+(level*20)+"px;";
  438.   var oImg = document.createElement("img");
  439.   oImg.src = "/images/folder.png";
  440.   oImg.setAttribute("align","absmiddle");
  441.   oImg.setAttribute("link",dirPath);
  442.   oDiv.appendChild(oImg);
  443.   var oSpan = document.createElement("span");
  444.   oSpan.className = "folderLink";
  445.   oSpan.innerText = label;
  446.   oSpan.id = "span"+idCount;
  447.   oDiv.appendChild(oSpan);
  448.  
  449.   return oDiv;
  450. } catch(err) {debugLog("createFolder: ", err.name, err.message);}
  451. }
  452.  
  453. function createFile(idCount, level, filePath, label){
  454. try{
  455.   var oDiv = document.createElement("div");
  456.   oDiv.id = "item"+idCount;
  457.   oDiv.style.cssText = "margin-left:"+(level*20)+"px;";
  458.   var oImg = document.createElement("img");
  459.   oImg.src = "";
  460.   oImg.setAttribute("link",filePath);
  461.   oImg.setAttribute("align","absmiddle");
  462.   oDiv.appendChild(oImg);
  463.   var oSpan = document.createElement("span");
  464.   oSpan.setAttribute("link",filePath);
  465.   oSpan.innerText = label;
  466.   oSpan.className = "folderLink";
  467.   oDiv.appendChild(oSpan);
  468.  
  469.   return oDiv;
  470. } catch(err) {debugLog("createFile: ", err.name, err.message);}
  471. }
  472.  
  473. function getSubDirs(s){ 
  474.     var e, f, i, r = [];
  475.     if(oFSO.FolderExists(s)){
  476.         f = oFSO.GetFolder(s);
  477.         e = new Enumerator(f.SubFolders);
  478.         for(; !e.atEnd(); e.moveNext()){
  479.             if((i = e.item())) r.push(i); 
  480.         }
  481.     }
  482.     return r;
  483. }
  484.  
  485. function getSubFiles(s){ 
  486.     var e, f, i, r = [];
  487.     if(oFSO.FolderExists(s)){
  488.         f = oFSO.GetFolder(s);
  489.         e = new Enumerator(f.files);
  490.         for(; !e.atEnd(); e.moveNext()){
  491.             if((i = e.item())) r.push(i); 
  492.         }
  493.     }
  494.     return r;
  495. }
  496.  
  497. function checkExtension(fext){
  498.   var foundEXT = false;
  499.   for (var i=0;i<popularFileTypes.length;i++){
  500.     if (fext == popularFileTypes[i]){
  501.       foundEXT = true;
  502.       break;
  503.     }
  504.   }
  505.   return foundEXT;
  506. }
  507.  
  508. function checkMediaExtension(fext){
  509.   var foundEXT = false;
  510.   for (var i=0;i<mediaFileTypes.length;i++){
  511.     if (fext == mediaFileTypes[i]){
  512.       foundEXT = true;
  513.       break;
  514.     }
  515.   }
  516.   return foundEXT;
  517. }
  518.  
  519. function checkNotepadExtensions(fext){
  520.   var foundEXT = false;
  521.   for (var i=0;i<notepadExclude.length;i++){
  522.     if (fext == notepadExclude[i]){
  523.       foundEXT = true;
  524.       break;
  525.     }
  526.   }
  527.   return foundEXT;
  528. }
  529.  
  530. // context menu
  531. function showMenu(type){
  532. try{
  533.   if (delConfirmOpen == "no"){  // I don't want the menu accessible if rename or confirm delete is open
  534.     targetFile = event.srcElement;
  535.     targetLink = event.srcElement.link.replace(/\\\'/g, '\'');  // handle names with apostrophes
  536.     targetLinkId = $(event.srcElement.parentNode.id);
  537.     theLayout = "";
  538.     menuDivider = "<img src=\"/images/divLong.png\" class=\"menuDiv\" />";
  539.     menuItem = "<div class=\"menuitems\" onclick=\"";
  540.     fext = oFSO.GetExtensionName(targetLink);
  541.  
  542.     if (type == "file"){
  543.       if (!checkNotepadExtensions(fext)){
  544.         theLayout += menuItem+"openWithNotepad();\">Open with notepad</div>";
  545.         theLayout += menuDivider;
  546.       }
  547.       if (checkMediaExtension(fext)){
  548.         theLayout += menuItem+"createPlaylist();\">Create a playlist</div>";
  549.         theLayout += menuDivider;
  550.       }
  551.       theLayout += menuItem+"deleteIt('file');\">Delete this file</div>";
  552.       theLayout += menuDivider;
  553.       theLayout += menuItem+"moveToDesktop('file','move');\">Move to desktop</div>";
  554.       theLayout += menuDivider;
  555.       theLayout += menuItem+"moveToDesktop('file','copy');\">Copy to desktop</div>";
  556.       theLayout += menuDivider;
  557.       theLayout += menuItem+"moveThis('move');\">Move this file...</div>";
  558.       theLayout += menuDivider;
  559.       theLayout += menuItem+"moveThis('copy');\">Copy this file...</div>";
  560.       theLayout += menuDivider;
  561.       theLayout += menuItem+"renameIt();\">Rename this file</div>";
  562.       theLayout += menuDivider;
  563.       theLayout += menuItem+"hideMenu();\">Close Menu</div>";
  564.     }
  565.     else if (type == "folder"){
  566.       theLayout += menuItem+"openFolder();\">Open this folder</div>";
  567.       theLayout += menuDivider;
  568.       theLayout += menuItem+"deleteIt('folder');\">Delete this folder</div>";
  569.       theLayout += menuDivider;
  570.       theLayout += menuItem+"moveToDesktop('folder','move');\">Move to desktop</div>";
  571.       theLayout += menuDivider;
  572.       theLayout += menuItem+"moveToDesktop('folder','copy');\">Copy to desktop</div>";
  573.       theLayout += menuDivider;
  574.       theLayout += menuItem+"moveThis('move');\">Move this folder...</div>";
  575.       theLayout += menuDivider;
  576.       theLayout += menuItem+"toThisFolder();\">...to this folder</div>";
  577.       theLayout += menuDivider;
  578.       theLayout += menuItem+"hideMenu();\">Close Menu</div>";
  579.     }
  580.     else if (type == "parentFolder"){
  581.       theLayout += menuItem+"openFolder();\">Open this folder</div>";
  582.       theLayout += menuDivider;
  583.       theLayout += menuItem+"toThisFolder();\">...to this folder</div>";
  584.       theLayout += menuDivider;
  585.       theLayout += menuItem+"hideMenu();\">Close Menu</div>";
  586.     }
  587.     else {}
  588.  
  589.     contxtMenu.innerHTML = theLayout;
  590.  
  591.     // make sure it's not off screen
  592.     var rightedge = document.body.clientWidth-event.clientX;
  593.     var bottomedge = document.body.clientHeight-event.clientY;
  594.     if (rightedge < contxtMenu.offsetWidth) contxtMenu.style.left = document.body.scrollLeft + event.clientX - contxtMenu.offsetWidth;
  595.     else contxtMenu.style.left = document.body.scrollLeft + event.clientX;
  596.     if (bottomedge < contxtMenu.offsetHeight) contxtMenu.style.top = document.body.scrollTop + event.clientY - contxtMenu.offsetHeight;
  597.     else contxtMenu.style.top = document.body.scrollTop + event.clientY;
  598.     contxtMenu.style.visibility = "visible";
  599.   }
  600. } catch(err) {debugLog("showMenu: ", err.name, err.message)}
  601. }
  602.  
  603. function hideMenu(){
  604.   contxtMenu.style.visibility = "hidden";
  605. }
  606.  
  607. function highLight(){
  608.   if (event.srcElement.className == "menuitems"){
  609.     event.srcElement.style.backgroundColor = "highlight";
  610.     event.srcElement.style.color = "white";
  611.   }
  612. }
  613.  
  614. function lowLight(){
  615.   if (event.srcElement.className == "menuitems"){
  616.     event.srcElement.style.backgroundColor = "";
  617.     event.srcElement.style.color = "black";
  618.   }
  619. }
  620.  
  621. function moveToDesktop(type,method){
  622. try{
  623.   hideMenu();
  624.   if (method == "copy"){
  625.     if (type == "file") oFSO.CopyFile(targetLink, desktop, false);
  626.     else if (type == "folder") oFSO.CopyFolder(targetLink, desktop, false);
  627.     else {}
  628.   }
  629.   else{
  630.     if (type == "file"){
  631.       oFSO.MoveFile(targetLink, desktop);
  632.       thisFile = targetFile;
  633.       addEmptyDialog(1);
  634.       thisFile.parentNode.parentNode.removeChild(thisFile.parentNode);
  635.     }
  636.     else if (type == "folder"){
  637.       oFSO.MoveFolder(targetLink, desktop);
  638.       thisFile = targetFile;
  639.       addEmptyDialog(2);
  640.       thisFile.parentNode.parentNode.removeChild(thisFile.parentNode.nextSibling); // remove the html for the moved folders sub files
  641.       thisFile.parentNode.parentNode.removeChild(thisFile.parentNode); // remove the html for the moved folder
  642.     }
  643.     else {}
  644.   }
  645.   targetLink = null;
  646.   copyLink = null;
  647. } catch(err) {displayError("moveToDesktop: ", err.name, err.message); targetLink = null; copyLink = null;}
  648. }
  649.  
  650. function openWithNotepad(){
  651. try{
  652.   System.Shell.execute("notepad.exe", "\""+targetLink+"\"", null, "open");
  653.   targetLink = null;
  654.   copyLink = null;
  655. } catch(err) {displayError("openWithNotepad: ", err.name, err.message); targetLink = null; copyLink = null;}
  656. }
  657.  
  658. function deleteIt(type){
  659.   hideMenu();
  660.   delConfirmOpen = "yes";
  661.   delConfirm.style.display = "block";
  662.   theOutput = "<h5 style=\"margin-bottom:5px;\">Are you sure?</h5>";
  663.   theOutput += "<button class=\"btn\" onClick=\"delConfirmed('"+type+"');\" onFocus=\"blur();\" style=\"margin-right:10px;\">Delete</button>";
  664.   theOutput += "<button class=\"btn\" onClick=\"cancelDel();\" onFocus=\"blur();\">Cancel</button>";
  665.   delConfirm.innerHTML = theOutput;
  666. }
  667.  
  668. function delConfirmed(type){
  669. try{
  670.   delConfirm.style.display = "none";
  671.  
  672.   if (type == "file"){
  673.     if (FdeleteSetting == 0) System.Shell.RecycleBin.deleteItem(targetLink);
  674.     else oFSO.DeleteFile(targetLink);
  675.  
  676.     thisFile = targetFile;
  677.     addEmptyDialog(1);
  678.     thisFile.parentNode.parentNode.removeChild(thisFile.parentNode);
  679.   }
  680.   else if (type == "folder"){
  681.     if (FdeleteSetting == 0) System.Shell.RecycleBin.deleteItem(targetLink);
  682.     else oFSO.DeleteFolder(targetLink);
  683.  
  684.     thisFile = targetFile;
  685.     addEmptyDialog(2);
  686.     thisFile.parentNode.parentNode.removeChild(thisFile.parentNode.nextSibling); // remove the html for the deleted folders sub files
  687.     thisFile.parentNode.parentNode.removeChild(thisFile.parentNode); // remove the html for the deleted folder
  688.   }
  689.   else{}
  690.   delConfirmOpen = "no";
  691.   targetLink = null;
  692.   copyLink = null;
  693. } catch(err) {displayError("delConfirmed: ", err.name, err.message); targetLink = null; copyLink = null; delConfirmOpen = "no";}
  694. }
  695.  
  696. function cancelDel(){
  697.   delConfirm.style.display = "none";
  698.   renameFile.style.display = "none";
  699.   delConfirmOpen = "no";
  700. }
  701.  
  702. function openFolder(){
  703. try{
  704.   System.Shell.execute(targetLink);
  705.   targetLink = null;
  706.   copyLink = null;
  707. } catch(err) {displayError("openFolder: ", err.name, err.message); targetLink = null; copyLink = null;}
  708. }
  709.  
  710. function moveThis(method){
  711. try{
  712.   copyLink = targetLink;
  713.   copyTheFile = targetFile;
  714.   toFolderMethod = method;
  715.   targetLinkIdOld = targetLinkId;
  716.   hideMenu();
  717. } catch(err) {debugLog("moveThis: ", err.name, err.message);}
  718. }
  719.  
  720. function toThisFolder(){
  721. try{
  722.   hideMenu();
  723.   if (copyLink != null){
  724.     if (oFSO.FileExists(copyLink)){
  725.       if (toFolderMethod == "move"){
  726.         oFSO.MoveFile(copyLink, targetLink+"\\");
  727.       }
  728.       else if (toFolderMethod == "copy"){
  729.         oFSO.CopyFile(copyLink, targetLink+"\\", false);
  730.       }
  731.       else{}
  732.  
  733.       moveFileHtml(); // call function to move the Html. moved to separate function for better error management
  734.  
  735.       if (toFolderMethod == "move"){
  736.         thisFile = copyTheFile;
  737.         addEmptyDialog(1);
  738.         thisFile.parentNode.parentNode.removeChild(thisFile.parentNode);
  739.       }
  740.     }
  741.     else if (oFSO.FolderExists(copyLink)){
  742.       oFSO.MoveFolder(copyLink, targetLink+"\\");
  743.       displayLinksAndDirs(ie_favDir, "favListArea", 0);  // moving the folder html is too complex so just refresh the flyout :-(
  744.     }
  745.     else {}
  746.     targetLink = null;
  747.     copyLink = null;
  748.   }
  749. } catch(err) {displayError("toThisFolder: ", err.name, err.message); targetLink = null; copyLink = null;}
  750. }
  751.  
  752. function renameThis(){
  753. try{
  754.   hideMenu();
  755.   renameFile.style.display = "none";
  756.   tempName = nameInput.value.replace(/\/|:|\*|\?|\"|<|>|\|/g, '');  // remove invalid characters to prevent error
  757.   if (tempName != ""){
  758.     var newName = targetFolder+"\\"+tempName+"."+targetExtension;
  759.     oFSO.MoveFile(targetLink, newName);
  760.     newName = newName.replace(/'/g, '\'');  // handle names with apostrophes
  761.     targetFile.link = newName;
  762.     targetFile.nextSibling.link = newName;
  763.     targetFile.nextSibling.innerText = tempName+"."+targetExtension;
  764.   }
  765.   delConfirmOpen = "no";
  766.   targetLink = null; targetName = null; targetExtension = null;
  767. } catch(err) {displayError("renameThis: ", err.name, err.message); targetLink = null; targetName = null; targetExtension = null; delConfirmOpen = "no";}
  768. }
  769.  
  770. function renameIt(){
  771. try{
  772.   hideMenu();
  773.   delConfirmOpen = "yes";
  774.   renameFile.style.display = "block";
  775.   targetFolder = oFSO.GetParentFolderName(targetLink); 
  776.   targetName = oFSO.GetBaseName(targetLink);
  777.   targetExtension = oFSO.GetExtensionName(targetLink);
  778.   nameInput.focus();
  779.   nameInput.value = targetName;
  780. } catch(err) {debugLog("renameIt: ", err.name, err.message);}
  781. }
  782.  
  783. function executeFile(){
  784. try{
  785.   var execLink = event.srcElement.link.replace(/\\\'/g, '\'');
  786.   System.Shell.execute(execLink);
  787. } catch(err) {displayError("executeFile: ", err.name, err.message);}
  788. }
  789.  
  790. function displayError(funct, errName, errMessage){
  791. try{
  792.   errDisplay.style.display = "block";
  793.   hideMenu();
  794.   errorHere.innerText = errMessage;
  795.   debugLog(funct, errName, errMessage);
  796. } catch(err) {debugLog("displayError: ", err.name, err.message);}
  797. }
  798.  
  799. function createPlaylist(){
  800. try{
  801.   hideMenu();
  802.   targetFolder = oFSO.GetParentFolderName(targetLink); 
  803.   targetFolderName = oFSO.GetBaseName(targetFolder); 
  804.   targetParent = targetFile.parentNode.parentNode;
  805.   var m3uFileExists = "no";
  806.  
  807.     itemPlaylist = new Array();
  808.     for (var i = 0; i < targetParent.childNodes.length ; i++){
  809.     if (targetParent.childNodes[i].id.substr(0,6) == "folder"){
  810.       i++;
  811.       continue;
  812.     }
  813.     fext = targetParent.childNodes[i].lastChild.innerText.split(".");
  814.     fext2 = fext[fext.length-1].toLowerCase();
  815.     if(checkMediaExtension(fext2)){
  816.       itemPlaylist[itemPlaylist.length] = targetParent.childNodes[i].lastChild.innerText;
  817.     }
  818.     }
  819.  
  820.     itemPlaylist.sort(sortList); // sort the playlist if not numbered properly
  821.  
  822.     var sFilename = targetFolder + "\\"+targetFolderName+".m3u";
  823.     if (oFSO.FileExists(sFilename)){
  824.         oFSO.DeleteFile(sFilename, true);
  825.         m3uFileExists = "yes";
  826.     }
  827.  
  828.     var oFile = oFSO.CreateTextFile(sFilename, true);
  829.     for (var z = 0; z < itemPlaylist.length; z++){
  830.     oFile.WriteLine(itemPlaylist[z]);
  831.     }
  832.     oFile.Close();
  833.  
  834.     if (m3uFileExists == "yes") return; // if the file exist and we are just replacing it. don't add new html
  835.  
  836.     // create the html to add it to the flyout list
  837.   var oDiv = document.createElement("div");
  838.   oDiv.id = "play"+idCount; idCount++;
  839.   oDiv.style.marginLeft = targetParent.firstChild.style.marginLeft;
  840.   var oImg = document.createElement("img");
  841.   oImg.src = "/images/m3u.png";
  842.   oImg.setAttribute("link",sFilename);
  843.   oImg.className = "folderIcon";
  844.   oImg.setAttribute("align","absmiddle");
  845.   oImg.onclick = function(){showMenu('file')};
  846.   oDiv.appendChild(oImg);
  847.   var oSpan = document.createElement("span");
  848.   oSpan.className = "folderLink";
  849.   oSpan.setAttribute("link",sFilename);
  850.   oSpan.onclick = function(){executeFile()};
  851.   oSpan.innerText = targetFolderName+".m3u";
  852.   oDiv.appendChild(oSpan);
  853.   targetParent.appendChild(oDiv);
  854.  
  855. } catch(err) {displayError("createPlaylist: ", err.name, err.message);}
  856. }
  857.  
  858. // sort the playlist for items that are numbered poorly
  859. function sortList(a, b){
  860. try{
  861.   var ValidChars = "0123456789.";
  862.   var Char; var num = 0;
  863.   for (var i = 0; i < a.length; i++){
  864.     Char = a.charAt(i); 
  865.     if (ValidChars.indexOf(Char) == -1){
  866.       break;
  867.     }
  868.     num++;
  869.   }
  870.   var Char; var num2 = 0;
  871.   for (var i = 0; i < b.length; i++){
  872.     Char = b.charAt(i); 
  873.     if (ValidChars.indexOf(Char) == -1){
  874.       break;
  875.     }
  876.     num2++;
  877.   }
  878.   var xa = a.substr(0, num)*1;
  879.   var xb = b.substr(0, num2)*1;
  880.   if (xa < xb) return -1;
  881.   else if (xa > xb) return 1;
  882.   else return 0;
  883. } catch(err) {debugLog("sortList: ", err.name, err.message); return 0;}
  884. }
  885.  
  886. function addEmptyDialog(num){
  887. try{
  888.     // num will be 1 for a file and 2 for a folder. 2 because of the sub div with the folder contents
  889.   if (thisFile.parentNode.parentNode.childNodes.length == num){
  890.     var oEmpty = document.createElement("div");
  891.     oEmpty.id = "empty"+idCount; idCount++;
  892.     oEmpty.style.cssText = "color:teal;height:18px;";
  893.     oEmpty.style.marginLeft = thisFile.parentNode.style.marginLeft;
  894.     oEmpty.innerText = "empty folder";
  895.     thisFile.parentNode.parentNode.appendChild(oEmpty);
  896.   }
  897. } catch(err) {debugLog("addEmptyDialog: ", err.name, err.message);}
  898. }
  899.  
  900. function moveFileHtml(){
  901. try{
  902.   // this code moves the html in the flyout so the folders can remain open :-)
  903.   var newChild = copyTheFile.parentNode.cloneNode(true);
  904. //  newChild.id = "newID"+idCount; idCount++;
  905.   newChild.firstChild.link = targetLink+"\\"+oFSO.GetFileName(copyLink);
  906.   newChild.firstChild.onclick = function(){showMenu('file')};
  907.   newChild.lastChild.link = targetLink+"\\"+oFSO.GetFileName(copyLink);
  908.   newChild.lastChild.onclick = function(){executeFile()};
  909.   if (targetLink != folderLocation){
  910.     var copyHere = targetFile.parentNode.nextSibling;
  911.     newChild.style.marginLeft = copyHere.firstChild.style.marginLeft;
  912.     if (copyHere.firstChild.innerText == "empty folder") copyHere.removeChild(copyHere.firstChild); // remove the empty folder text then moving to an empty folder
  913.     copyHere.appendChild(newChild);
  914.   }
  915.   else{
  916.     favListArea.appendChild(newChild);
  917.     newChild.style.marginLeft = 0;
  918.   }
  919. } catch(err) {debugLog("moveFileHtml: ", err.name, err.message);}
  920. }
  921.  
  922.