home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2005 August / PCpro_2005_08.ISO / files / firefox / ScrapBook.xpi / chrome / scrapbook.jar / content / trade.js < prev    next >
Encoding:
JavaScript  |  2005-06-04  |  12.5 KB  |  440 lines

  1. /**************************************************
  2. // trade.js
  3. // Implementation file for trade.xul
  4. // 
  5. // Description: 
  6. // Author: Gomita
  7. // Contributors: 
  8. // 
  9. // Version: 
  10. // License: see LICENSE.txt
  11. **************************************************/
  12.  
  13.  
  14.  
  15. var SBlog;
  16. var SBlist;
  17. var SBstring;
  18. var STstring;
  19. var SBprogress;
  20.  
  21. var SBtradeDir;
  22.  
  23. var STdropObserver = {};
  24.  
  25.  
  26.  
  27. function SB_trace(aStr, aKey)
  28. {
  29.     SBstatus.trace(aStr, 2000);
  30.     var listItem = SBlog.appendItem(aStr);
  31.     SBlog.ensureIndexIsVisible(SBlog.getRowCount() - 1);
  32.     switch ( aKey )
  33.     {
  34.         case "R" : col = "#FF0000"; break;
  35.         case "G" : col = "#00AA33"; break;
  36.         case "B" : col = "#0000FF"; break;
  37.     }
  38.     if ( aKey ) listItem.setAttribute("style", "color:" + col + ";");
  39. }
  40.  
  41.  
  42. function SB_initTrade()
  43. {
  44.     SBlog      = document.getElementById("ScrapBookTradeLog");
  45.     SBlist     = document.getElementById("ScrapBookTradeList");
  46.     SBstring   = document.getElementById("ScrapBookString");
  47.     STstring   = document.getElementById("ScrapBookTradeString");
  48.     SBprogress = document.getElementById("ScrapBookTradeProgress");
  49.     SBRDF.init();
  50.     SBtreeUtil.init("ScrapBookTree", false);
  51.     SB_initObservers();
  52.     SBstatus.init();
  53.     SBtrade.init();
  54.     SBtrade.refresh();
  55.     STdragObserver = 
  56.     {
  57.         onDragStart : function(event, transferData, action)
  58.         {
  59.             var curID = SBlist.currentItem.id;
  60.             transferData.data = new TransferData();
  61.             transferData.data.addDataForFlavour("sb/tradeitem", curID);
  62.         },
  63.         onDrop     : function(event, transferData, session) {},
  64.         onDragExit : function(event, session) {}
  65.     };
  66.     STdropObserver = 
  67.     {
  68.         getSupportedFlavours : function()
  69.         {
  70.             var flavours = new FlavourSet();
  71.             flavours.appendFlavour("moz/rdfitem");
  72.             return flavours;
  73.         },
  74.         onDrop : function(event, transferData, session)
  75.         {
  76.             SBexport.exec();
  77.         },
  78.         onDragOver : function(event, flavour, session) {},
  79.         onDragExit : function(event, session) {}
  80.     };
  81.     SBdropObserver.getSupportedFlavours = function()
  82.     {
  83.         var flavours = new FlavourSet();
  84.         flavours.appendFlavour("moz/rdfitem");
  85.         flavours.appendFlavour("sb/tradeitem");
  86.         return flavours;
  87.     };
  88.     SBbuilderObserver.onDrop = function(row, orient)
  89.     {
  90.         try {
  91.             var XferDataSet  = nsTransferable.get(SBdropObserver.getSupportedFlavours(), nsDragAndDrop.getDragData, true);
  92.             var XferData     = XferDataSet.first.first;
  93.             var XferDataType = XferData.flavour.contentType;
  94.         } catch(ex) {
  95.             alert("ScrapBook Exception: Failed to get contentType of XferData.");
  96.         }
  97.         switch ( XferDataType )
  98.         {
  99.             case "moz/rdfitem"  : SBdropUtil.move(row, orient); break;
  100.             case "sb/tradeitem" : SBimport.exec(row, orient); break;
  101.         }
  102.         SB_rebuildAllTree();
  103.     };
  104. }
  105.  
  106.  
  107.  
  108.  
  109. var SBexport = {
  110.  
  111.     resList : [],
  112.     number  : 0,
  113.  
  114.     exec : function()
  115.     {
  116.         if ( SBtree.view.isContainer(SBtree.currentIndex) && SBtree.view.selection.count == 1 )
  117.         {
  118.             var curRes = SBtree.builderView.getResourceAtIndex(SBtree.currentIndex);
  119.             this.resList = [];
  120.             this.getChildResourcesRecursively(curRes);
  121.         }
  122.         else
  123.         {
  124.             this.resList = SBtreeUtil.getSelection(true, 2);
  125.         }
  126.         if ( this.resList.length < 1 ) return;
  127.         SB_trace(STstring.getString("EXPORT"));
  128.         SBprogress.hidden = false;
  129.         for ( this.number = 0; this.number < this.resList.length; this.number++ )
  130.         {
  131.             this.copyFromDataDir(this.resList[this.number]);
  132.         }
  133.         SB_trace(STstring.getString("EXPORT_COMPLETE"));
  134.         SBprogress.hidden = true;
  135.         SBtrade.refresh();
  136.     },
  137.  
  138.     copyFromDataDir : function(aRes)
  139.     {
  140.         var SBitem = new ScrapBookItem();
  141.         for ( var prop in SBitem )
  142.         {
  143.             SBitem[prop] = SBRDF.getProperty(prop, aRes);
  144.         }
  145.         SBitem.icon = SBitem.icon.match(/\d{14}\/([^\/]+)$/) ? RegExp.$1 : "";
  146.         SBcommon.writeIndexDat(SBitem);
  147.         var progRate = " (" + (this.number + 1) + "/" + this.resList.length + ") ";
  148.         try {
  149.             var myContDir = SBcommon.getContentDir(SBitem.id).clone();
  150.             myContDir.copyTo(SBtradeDir, SBitem.id);
  151.         } catch(ex) {
  152.             SB_trace(STstring.getString("EXPORT_FAILURE") + progRate + SBitem.title + STstring.getString("SAME_ID"), "R");
  153.             return;
  154.         }
  155.         SB_trace(STstring.getString("EXPORT_SUCCESS") + progRate + SBitem.title, "B");
  156.         SBprogress.value = Math.round( this.number / this.resList.length * 100);
  157.     },
  158.  
  159.     getChildResourcesRecursively : function(aContRes)
  160.     {
  161.         var aRDFCont = SBRDF.getContainer(aContRes.Value, false);
  162.         var ResSet = aRDFCont.GetElements();
  163.         while ( ResSet.hasMoreElements() )
  164.         {
  165.             var myRes = ResSet.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  166.             if ( SBservice.RDFCU.IsContainer(SBRDF.data, myRes) ) {
  167.                 this.getChildResourcesRecursively(myRes);
  168.             } else {
  169.                 this.resList.push(myRes);
  170.             }
  171.         }
  172.     },
  173.  
  174. };
  175.  
  176.  
  177.  
  178.  
  179. var SBimport = {
  180.  
  181.     selItems : [],
  182.     number   : 0,
  183.  
  184.     exec : function(aRow, aOrient)
  185.     {
  186.         if ( SBlist.selectedCount < 1 ) return;
  187.         SBdropUtil.init(aRow, aOrient);
  188.         var contResArray = ( aRow == -1 ) ? [SBtree.ref, 0] : SBdropUtil.getTarget();
  189.         SB_trace(STstring.getString("IMPORT"));
  190.         SBprogress.hidden = false;
  191.         this.selItems = SBlist.selectedItems;
  192.         if ( SBdropUtil.orient == SBdropUtil.DROP_ON )
  193.         {
  194.             for ( this.number = 0; this.number < this.selItems.length; this.number++ )
  195.             {
  196.                 this.copyToDataDir(this.selItems[this.number].id, contResArray);
  197.             }
  198.         }
  199.         else
  200.         {
  201.             for ( this.number = this.selItems.length - 1; this.number >= 0; this.number-- )
  202.             {
  203.                 this.copyToDataDir(this.selItems[this.number].id, contResArray);
  204.             }
  205.         }
  206.         SB_trace(STstring.getString("IMPORT_COMPLETE"));
  207.         SBprogress.hidden = true;
  208.     },
  209.  
  210.     copyToDataDir : function(aID, contResArray)
  211.     {
  212.         var myContDir = SBtradeDir.clone();
  213.         myContDir.append(aID);
  214.         var myDATFile = myContDir.clone();
  215.         myDATFile.append("index.dat");
  216.         if ( !myDATFile.exists() )
  217.         {
  218.             alert("ScrapBook ERROR: cannot find 'index.dat'.");
  219.             return;
  220.         }
  221.         var myDAT = SBcommon.readFile(myDATFile, myDAT, "UTF-8");
  222.         var SBitem = SB_parseIndexDat(myDAT);
  223.         if ( !SBitem["id"] || SBitem["id"].length != 14 ) return;
  224.         var dataDir = SBcommon.getScrapBookDir().clone();
  225.         dataDir.append("data");
  226.         if  ( SBitem.icon ) {
  227.             SBitem.icon = SBcommon.convertFilePathToURL(dataDir.path) + SBitem.id + "/" + SBitem.icon;
  228.         } else {
  229.             SBitem.icon = SBcommon.getDefaultIcon(SBitem.type);
  230.         }
  231.         SBitem.title   = SBcommon.convertStringToUTF8(SBitem.title);
  232.         SBitem.comment = SBcommon.convertStringToUTF8(SBitem.comment);
  233.         var progNum = SBdropUtil.orient == SBdropUtil.DROP_ON ? this.number + 1 : this.selItems.length - this.number;
  234.         var progRate = " (" + progNum + "/" + this.selItems.length + ") ";
  235.         try {
  236.             myContDir.copyTo(dataDir, SBitem.id);
  237.         } catch(ex) {
  238.             SB_trace(STstring.getString("IMPORT_FAILURE") + progRate + SBitem.title + STstring.getString("SAME_ID"), "R");
  239.             return;
  240.         }
  241.         SBRDF.addItem(SBitem, contResArray[0], contResArray[1]);
  242.         SB_trace(STstring.getString("IMPORT_SUCCESS") + progRate + SBitem.title, "B");
  243.         SBprogress.value = Math.round( progNum / this.selItems.length * 100);
  244.     },
  245.  
  246. };
  247.  
  248.  
  249.  
  250.  
  251. var SBtrade = {
  252.  
  253.     init : function()
  254.     {
  255.         var dirPath = nsPreferences.copyUnicharPref("scrapbook.trade.path", "");
  256.         SBtradeDir = this.validateDirectory(dirPath);
  257.         this.initPath(dirPath);
  258.     },
  259.  
  260.     initPath : function(aPath)
  261.     {
  262.         document.getElementById("ScrapBookTradePath").value = aPath;
  263.         document.getElementById("ScrapBookTradeIcon").src = "moz-icon://" + SBcommon.convertFilePathToURL(aPath) + "?size=16";
  264.     },
  265.  
  266.     selectPath : function()
  267.     {
  268.         var FP = Components.classes['@mozilla.org/filepicker;1'].createInstance(Components.interfaces.nsIFilePicker);
  269.         FP.init(window, STstring.getString("SELECT_PATH"), FP.modeGetFolder);
  270.         if ( SBtradeDir ) FP.displayDirectory = SBtradeDir;
  271.         var answer = FP.show();
  272.         if ( answer == FP.returnOK )
  273.         {
  274.             var theFile = FP.file;
  275.             if ( theFile.leafName == "data" ) { alert(STstring.getString("SELECT_PATH_ALERT")); return; }
  276.             this.initPath(theFile.path);
  277.             nsPreferences.setUnicharPref("scrapbook.trade.path", theFile.path);
  278.             window.location.reload();
  279.         }
  280.         return false;
  281.     },
  282.  
  283.     refresh : function()
  284.     {
  285.         var IDList = [], ID2Msec = {}, ID2SBitem = {};
  286.         var contDirList = SBtradeDir.directoryEntries;
  287.         while ( contDirList.hasMoreElements() )
  288.         {
  289.             var aDATFile, aID, aMsec = 0;
  290.             aDATFile = contDirList.getNext().QueryInterface(Components.interfaces.nsIFile);
  291.             var aID = aDATFile.leafName;
  292.             if ( !aID.match(/^\d{14}$/) ) continue;
  293.             aDATFile.append("index.dat");
  294.             if ( !aDATFile.exists() ) continue;
  295.             try {
  296.                 aMsec = aDATFile.lastModifiedTime;
  297.             } catch(ex) {
  298.             }
  299.             IDList.push(aID);
  300.             ID2Msec[aID] = aMsec;
  301.             ID2SBitem[aID] = SB_parseIndexDat(SBcommon.readFile(aDATFile));
  302.             SBstatus.trace(SBstring.getString("SCANNING") + "... " + aID, 1000);
  303.         }
  304.         IDList.sort( function(a,b){ return(ID2Msec[a] - ID2Msec[b]); });
  305.         var oldListItems = SBlist.childNodes;
  306.         for ( var i = oldListItems.length - 1; i > 1 ; i-- )
  307.         {
  308.             SBlist.removeChild(oldListItems[i]);
  309.         }
  310.         for ( var i = 0; i < IDList.length; i++ )
  311.         {
  312.             var myID = IDList[i];
  313.             var myIcon = ID2SBitem[myID].icon;
  314.             myIcon = myIcon ? SBcommon.convertFilePathToURL(SBtradeDir.path) + myID + "/" + myIcon : SBcommon.getDefaultIcon(ID2SBitem[myID].type);
  315.             dump(myIcon + "\n");
  316.             var listItem  = document.createElement("listitem");
  317.             var listCell1 = document.createElement("listcell");
  318.             var listCell2 = document.createElement("listcell");
  319.             listItem.setAttribute("id", myID);
  320.             listCell1.setAttribute("class", "listcell-iconic");
  321.             listCell1.setAttribute("label", SBcommon.convertStringToUTF8(ID2SBitem[myID].title));
  322.             listCell1.setAttribute("image", myIcon);
  323.             listCell2.setAttribute("label", this.formateMilliSeconds(ID2Msec[myID]));
  324.             listItem.appendChild(listCell1);
  325.             listItem.appendChild(listCell2);
  326.             SBlist.appendChild(listItem);
  327.         }
  328.         SB_trace(STstring.getFormattedString("DETECT", [IDList.length, SBtradeDir.path]), "G");
  329.     },
  330.  
  331.     validateDirectory : function(aPath)
  332.     {
  333.         if ( !aPath ) return false;
  334.         var aFileObj = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  335.         try {
  336.             aFileObj.initWithPath(aPath);
  337.         } catch(ex) {
  338.             alert("ScrapBook ERROR: Unrecognized path:\n" + aPath);
  339.             return false;
  340.         }
  341.         if ( !aFileObj.exists() || !aFileObj.isDirectory() ) {
  342.             alert("ScrapBook ERROR: Directory doesn't exist:\n" + aPath);
  343.             return false;
  344.         }
  345.         return aFileObj;
  346.     },
  347.  
  348.     formateMilliSeconds : function(msec)
  349.     {
  350.         var dd = new Date(msec);
  351.         var y = dd.getFullYear();
  352.         var m = dd.getMonth() + 1; if ( m < 10 ) m = "0" + m;
  353.         var d = dd.getDate();      if ( d < 10 ) d = "0" + d;
  354.         var h = dd.getHours();     if ( h < 10 ) h = "0" + h;
  355.         var i = dd.getMinutes();   if ( i < 10 ) i = "0" + i;
  356.         return [y.toString(),m.toString(),d.toString()].join("/") + " " + [h.toString(),i.toString()].join(":");
  357.     },
  358.  
  359.     showFolder : function()
  360.     {
  361.         SBcommon.launchDirectory(SBtradeDir);
  362.     },
  363.  
  364. };
  365.  
  366.  
  367. function SB_parseIndexDat(aDAT)
  368. {
  369.     var SBitem = new ScrapBookItem();
  370.     try {
  371.         var lines = aDAT.split("\n");
  372.         for ( var i = 0; i < lines.length; i++ )
  373.         {
  374.             if ( !lines[i].match(/\t/) ) continue;
  375.             var keyVal = lines[i].split("\t");
  376.             SBitem[keyVal[0]] = keyVal[1];
  377.         }
  378.     } catch(ex) {
  379.     }
  380.     return SBitem;
  381. }
  382.  
  383.  
  384.  
  385.  
  386. var SBtradeContext = {
  387.  
  388.     open : function(tabbed)
  389.     {
  390.         var myID   = SBlist.currentItem.id;
  391.         var myType = SBlist.currentItem.getAttribute("type");
  392.         var myURL  = SBservice.IO.newFileURI(SBtradeDir).spec + myID + "/index.html";
  393.         SBcommon.loadURL(myURL, tabbed);
  394.     },
  395.  
  396.     showFiles : function()
  397.     {
  398.         var myContDir = SBtradeDir.clone();
  399.         myContDir.append(SBlist.currentItem.id);
  400.         SBcommon.launchDirectory(myContDir);
  401.     },
  402.  
  403.     deleteDir : function()
  404.     {
  405.         if ( SBlist.selectedCount < 1 ) return;
  406.         if ( !SBcommon.getBoolPref("scrapbook.tree.quickdelete", false) )
  407.         {
  408.             if ( !window.confirm( SBstring.getString("CONFIRM_DELETE") ) ) return;
  409.         }
  410.         var selItems = SBlist.selectedItems;
  411.         for ( var i = selItems.length - 1; i >= 0; i-- )
  412.         {
  413.             var myID = selItems[i].id;
  414.             var myContDir = SBtradeDir.clone();
  415.             myContDir.append(myID);
  416.             if ( !myContDir.exists() ) continue;
  417.             if ( myID.length == 14 ) SBcommon.removeDirSafety(myContDir);
  418.             SBlist.removeItemAt( SBlist.getIndexOfItem(selItems[i]) + 2 );
  419.         }
  420.     },
  421.  
  422.     showIndexDat : function()
  423.     {
  424.         var myDAT = SBtradeDir.clone();
  425.         myDAT.append(SBlist.currentItem.id);
  426.         myDAT.append("index.dat");
  427.         if ( !myDAT.exists() ) return;
  428.         var SBitem = SB_parseIndexDat(SBcommon.readFile(myDAT));
  429.         var content = "";
  430.         for ( var prop in SBitem )
  431.         {
  432.             content += prop + " : " + SBcommon.convertStringToUTF8(SBitem[prop]) + "\n";
  433.         }
  434.         alert(content);
  435.     },
  436.  
  437. };
  438.  
  439.  
  440.