home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / komunikace / kmeleon / K-Meleon1.1.3en-US.exe / chrome / newsfox.jar / content / newsfox / groupOptions.js < prev    next >
Text File  |  2007-08-07  |  14KB  |  415 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is NewsFox.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Ron Pruitt <wa84it@gmail.com>.
  18.  * Portions created by the Initial Developer are Copyright (C) 2006-2007
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the LGPL or the GPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. const TIMEVAL = new Array();
  38. TIMEVAL[0] = 3600000;  // msec per hour
  39. TIMEVAL[1] = 24*TIMEVAL[0];  // msec per day
  40. TIMEVAL[2] = 7*TIMEVAL[1];   // msec per week
  41. TIMEVAL[4] = 365*TIMEVAL[1];  // msec per year
  42. TIMEVAL[3] = TIMEVAL[4]/12;   // msec per month
  43.  
  44. var grp;
  45. var feeds = new Array();
  46. var titlelist = new Array();
  47. var lists = new Array();
  48. var isEmpty = false;
  49. var addhere;
  50. var fdGp = new Array();
  51. var startTime;
  52. var endTime;
  53.  
  54. function goinit()
  55. {
  56.     const NF_SB = document.getElementById("newsfox-string-bundle");
  57.     fdGp = window.arguments[0].fdGp;
  58.     if (window.arguments[0].isSearch)
  59.     {
  60.         var textflags = window.arguments[0].textflags;
  61.         document.getElementById("radioFlagged").selectedIndex = window.arguments[0].flagged;
  62.         document.getElementById("radioUnread").selectedIndex = window.arguments[0].unread;
  63.         document.getElementById("Srchtxt").value = window.arguments[0].text;
  64.  
  65.         document.getElementById("radioCase").selectedIndex = (textflags & 0x04)/4;
  66.         document.getElementById("radioMatch").selectedIndex = textflags & 0x03;
  67.         startTime = window.arguments[0].startTime;
  68.         endTime = window.arguments[0].endTime;
  69.  
  70.         startEven = new Array();
  71.         endEven = new Array();
  72.         for (var i=0; i<TIMEVAL.length; i++)
  73.         {
  74.             startEven[i] = (startTime < 0) || (startTime/TIMEVAL[i] == Math.round(startTime/TIMEVAL[i]));
  75.             endEven[i] = (endTime/TIMEVAL[i] == Math.round(endTime/TIMEVAL[i]));
  76.         }
  77.         var index = 0;
  78.         for (i=0; i<TIMEVAL.length; i++)
  79.             if (startEven[i] && endEven[i]) index = i;
  80.  
  81.         if (startTime < 0)
  82.         {
  83.             document.getElementById("datemenuStart").selectedIndex = TIMEVAL.length;
  84.             document.getElementById("startT").disabled = true;
  85.         }
  86.         else
  87.         {
  88.             document.getElementById("datemenuStart").selectedIndex = index;
  89.             document.getElementById("startT").value = roundIt(startTime / TIMEVAL[index]);
  90.         }
  91.         document.getElementById("datemenuEnd").selectedIndex = index;
  92.         document.getElementById("endT").value = roundIt(window.arguments[0].endTime / TIMEVAL[index]);
  93.         document.getElementById("part3").hidden = true;
  94.         document.getElementById("part4").hidden = true;
  95.     }
  96.     else
  97.         document.getElementById("part2").hidden = true;
  98.  
  99.   addhere = NF_SB.getString('addhere');
  100.   grp = window.arguments[0].grp;
  101.   titlelist = window.arguments[0].titlelist;
  102.   lists = window.arguments[0].lists;
  103.   feeds = window.arguments[0].feeds;
  104.   var grpmovemenu = document.getElementById("grpmove");
  105.   while (grpmovemenu.firstItem != null) 
  106.         grpmovemenu.removeItem(grpmovemenu.firstItem);
  107.   for (var i=1; i<titlelist.length; i++)
  108.     if (i != grp)
  109.       grpmovemenu.appendItem(titlelist[i],i);
  110.   var LASTname = NF_SB.getString('LASTname');
  111.   grpmovemenu.appendItem(LASTname,titlelist.length);
  112.   grpmovemenu.selectedIndex = grp - 1;
  113.  
  114.     if (window.arguments[0].isSearch)
  115.     {
  116.       var grpMenu = document.getElementById("grpmenu");
  117.       while (grpMenu.firstItem != null) 
  118.             grpMenu.removeItem(grpMenu.firstItem);
  119.         var namelength = titlelist.length;
  120.         if (window.arguments[0].isNew) namelength--;
  121.       for (var i=0; i<namelength; i++)
  122.             grpMenu.appendItem(titlelist[i],i);
  123.       grpMenu.selectedIndex = findSimilarIndex(grp);
  124.     }
  125.  
  126.   if (grp == 0)
  127.   {
  128.     grpmovemenu.value = 1;
  129.     grpmovemenu.hidden = true;
  130.     var grpmovespacer = document.getElementById("grpmovespacer");
  131.     grpmovespacer.hidden = true;
  132.     var grpmovelabel = document.getElementById("grpmovelabel");
  133.     grpmovelabel.hidden = true;
  134.     var grpfeeds = document.getElementById("group.feeds");
  135.     grpfeeds.hidden = true;
  136.     var grpfeedsspacer = document.getElementById("group.feedsspacer");
  137.     grpfeedsspacer.hidden = true;
  138.     var dragrtl = document.getElementById("dragrtl");
  139.     dragrtl.hidden = true;
  140.     var dragltr = document.getElementById("dragltr");
  141.     dragltr.hidden = true;
  142.   }
  143.   document.getElementById("Name").value = titlelist[grp];
  144.   var grpTitle = NF_SB.getString('grpName');
  145.   var leftname = document.getElementById("feedsLeft");
  146.   leftname.setAttribute("label",grpTitle + titlelist[grp]);
  147.   var rightname = document.getElementById("feedsRight");
  148.   rightname.setAttribute("label",grpTitle + titlelist[0]);
  149.   var lefttree = document.getElementById("group.edit");
  150.   lefttree.view = new GrpEditTreeModel(1);
  151.   var righttree = document.getElementById("group.feeds");
  152.   righttree.view = new GrpEditTreeModel(0);
  153. }
  154.  
  155. function doAccept()
  156. {
  157.     if (window.arguments[0].isSearch)
  158.     {
  159.         window.arguments[0].flagged = document.getElementById("radioFlagged").selectedIndex;
  160.         window.arguments[0].unread = document.getElementById("radioUnread").selectedIndex;
  161.         window.arguments[0].text = document.getElementById("Srchtxt").value;
  162.         window.arguments[0].textflags = document.getElementById("radioMatch").selectedIndex + 4*document.getElementById("radioCase").selectedIndex; // + 8*(document.getElementById("notMatch").checked == true);
  163.  
  164.         var index = document.getElementById("datemenuEnd").selectedIndex;
  165.         var endBox = document.getElementById("endT");
  166.         endTime = endBox.value * TIMEVAL[index];
  167.         var index = document.getElementById("datemenuStart").selectedIndex;
  168.         if (index != TIMEVAL.length)
  169.         {
  170.             var startBox = document.getElementById("startT");
  171.             startTime = startBox.value * TIMEVAL[index];
  172.             if (startTime < endTime)
  173.             {
  174.                 var i = startTime;
  175.                 startTime = endTime;
  176.                 endTime = i;
  177.             }
  178.         }
  179.         window.arguments[0].startTime = startTime;
  180.         window.arguments[0].endTime = endTime;
  181.  
  182.     var grpMenu = document.getElementById("grpmenu");
  183.     var grpC = grpMenu.selectedIndex;
  184.     lists[1] = new Array();
  185.   for (var i=0; i<fdGp[grpC].list.length; i++)
  186.     lists[1].push(fdGp[grpC].list[i]);
  187.     }
  188.  
  189.   window.arguments[0].ok = true;
  190.   titlelist[grp] = document.getElementById("Name").value;
  191.   window.arguments[0].newGrp = parseInt(document.getElementById("grpmove").value);
  192.   if (lists[1][0] == -1) lists[1].splice(0,1);
  193.   if (lists[0][0] == -1) lists[0].splice(0,1);
  194.   window.arguments[0].titlelist = titlelist;
  195.   window.arguments[0].lists = lists;
  196.   return true;
  197. }
  198.  
  199. function startChg()
  200. {
  201.     var index = document.getElementById("datemenuStart").selectedIndex;
  202.     var startBox = document.getElementById("startT");
  203.     if (index == TIMEVAL.length)
  204.     {
  205.         startTime = -1;
  206.         startBox.value = "";
  207.         startBox.disabled = true;
  208.     }
  209.     else
  210.     {
  211.         if (startTime < 0) startTime = 10 * TIMEVAL[TIMEVAL.length-1];
  212.         startBox.value = roundIt(startTime / TIMEVAL[index]);
  213.         startBox.disabled = false;
  214.     }
  215. }
  216.  
  217. function endChg()
  218. {
  219.     var index = document.getElementById("datemenuEnd").selectedIndex;
  220.     document.getElementById("endT").value = roundIt(endTime / TIMEVAL[index]);
  221. }
  222.  
  223. function startBox()
  224. {
  225.     var index = document.getElementById("datemenuStart").selectedIndex;
  226.     var startBox = document.getElementById("startT");
  227.     startTime = startBox.value * TIMEVAL[index];
  228.     startBox.value = roundIt(startBox.value);
  229. }
  230.  
  231. function endBox()
  232. {
  233.     var index = document.getElementById("datemenuEnd").selectedIndex;
  234.     var endBox = document.getElementById("endT");
  235.     endTime = endBox.value * TIMEVAL[index];
  236.     endBox.value = roundIt(endBox.value);
  237. }
  238.  
  239. function roundIt(x)
  240. {
  241.     return Math.round(x*1000)/1000;
  242. }
  243.  
  244. function findSimilarIndex(grp)
  245. {
  246.     if (fdGp[grp].list.length == 0) return 0;
  247.     var toMatch = "," + fdGp[grp].list.sort().join() + ",";
  248.     var toMatchLen = fdGp[grp].list.length;
  249.     var minVal = diffVal(toMatch,toMatchLen,0);
  250.     var minIndex = 0;
  251.     var i = 1;
  252.     var tmp;
  253.     while (minVal > 0 && i < fdGp.length)
  254.     {
  255.         if (!fdGp[i].search && fdGp[i].list.length > 0)
  256.         {
  257.             tmp = diffVal(toMatch,toMatchLen,i);
  258.             if (tmp < minVal)
  259.             {
  260.                 minVal = tmp;
  261.                 minIndex = i;
  262.             }
  263.         }
  264.         i++;
  265.     }
  266.     return minIndex;
  267. }
  268.  
  269. function diffVal(toMatch,toMatchLen,index)
  270. {
  271.     var numnew = 0;
  272.     for (i=0; i<fdGp[index].list.length; i++)
  273.         numnew += 1*(toMatch.indexOf(","+fdGp[index].list[i]+",") == -1)
  274.     numold = toMatchLen - (fdGp[index].list.length - numnew);
  275.     retval = numnew + 2*numold;
  276.     return retval;
  277. }
  278.  
  279. function delFd(evt) { delRow(getRow(evt)); }
  280.  
  281. function delRow(row)
  282. {
  283.     lists[1].splice(row,1);
  284.     lefttree = document.getElementById("group.edit");
  285.     lefttree.view = new GrpEditTreeModel(1);
  286. }
  287.  
  288. function addFd(evt) { addRow(1,lists[1].length,0,getRow(evt)); }
  289.  
  290. function addRow(newGrp, newrow, oldGrp, oldrow)
  291. {
  292.     if (isEmpty)
  293.     {
  294.         lists[newGrp].splice(0,1,lists[oldGrp][oldrow]);
  295.         isEmpty = false;
  296.     }
  297.     else
  298.     {
  299.         var totdel = 0;
  300.         var numdel = 0;  // should always be 1 or 0, but check
  301.         var feedtoadd = lists[oldGrp][oldrow];
  302.         var i=lists[newGrp].length;
  303.         while (--i >= 0)
  304.             if (feedtoadd == lists[newGrp][i])
  305.             {
  306.                 totdel++;
  307.                 if (i < newrow) numdel++;
  308.                 lists[newGrp].splice(i,1);
  309.             }
  310.         lists[newGrp].splice(newrow-numdel,0,lists[oldGrp][oldrow]);
  311.     }
  312. //    this.treebox.rowCountChanged(newrow,1);
  313. //    this.treebox.invalidate();
  314. //    this.treebox.rowCountChanged(0,lists[newGrp].length);
  315. //TODO    this.treebox.parentNode.view = new GrpEditTreeModel(newGrp);
  316.     lefttree = document.getElementById("group.edit");
  317.     lefttree.view = new GrpEditTreeModel(1);
  318. }
  319.  
  320. function getRow(evt)
  321. {
  322.     var row = {}, col = {}, type = {};
  323.     var tree = evt.target.parentNode;
  324.     tree.treeBoxObject.getCellAt(evt.clientX, evt.clientY, row, col, type);
  325.     return row.value;
  326. }
  327.  
  328. var grpedtreeObserver = {
  329.  
  330.   onDragStart: function (evt,transferData,action){
  331.         var row = {}, col = {}, type = {};
  332.         var tree = evt.target.parentNode;
  333.         tree.treeBoxObject.getCellAt(evt.clientX, evt.clientY, row, col, type); 
  334.     transferData.data=new TransferData();
  335.     var trdata = new Array();
  336.     trdata.push(1*(tree.id == "group.edit"));
  337.     trdata.push(row.value); 
  338.     transferData.data.addDataForFlavour("grpedtreerow",trdata.join());
  339.     },
  340.  
  341.     getSupportedFlavours : function () { 
  342.         var flavours = new FlavourSet(); 
  343.         flavours.appendFlavour("grpedtreerow"); 
  344.         return flavours; 
  345.     }, 
  346.  
  347.     onDragOver: function (evt,flavour,session){}, 
  348.  
  349.     onDrop: function (evt,dropdata,session){} 
  350. };
  351.  
  352. ////////////////////////////////////////////////////////////////
  353. // EditorTreeModel
  354. ////////////////////////////////////////////////////////////////
  355.  
  356. function GrpEditTreeModel(index)
  357. {
  358.   if (lists[index].length == 0)
  359.   {
  360.     isEmpty = true;
  361.     lists[index].push(-1);
  362.   }
  363.   this.rowCount = lists[index].length,
  364.   this.getCellText = function(row,col)
  365.   {
  366.     if (lists[index][row] == -1) return addhere  
  367.     else return feeds[lists[index][row]].getDisplayName(); 
  368.   },
  369.   this.getCellValue = function(row,col) {},
  370.   this.getImageSrc = function(row,col)
  371.   { 
  372.     if (lists[index][row] == -1) return null
  373.     else return feeds[lists[index][row]].icon.src; 
  374.   },
  375.   this.setTree = function(treebox){ this.treebox = treebox; },
  376.   this.isContainer = function(row){ return false; },
  377.   this.isSeparator = function(row){ return false; },
  378.   this.isSorted = function(){ return false; },
  379.   this.getLevel = function(row){ return 0; },
  380.   this.cycleHeader = function(col){},
  381.   this.getRowProperties = function(row,props){},
  382.   this.getCellProperties = function(row,col,props)
  383.   {
  384.     var aserv = Components.classes["@mozilla.org/atom-service;1"].
  385.       getService(Components.interfaces.nsIAtomService);
  386.     props.AppendElement(aserv.getAtom("faviconcol"));
  387.   },
  388.   this.getColumnProperties = function(colid,col,props){},
  389.   this.canDrop = function(evt,session) { return true; },
  390.   this.getParentIndex = function(rowindex) { return -1; },
  391.   this.drop = function(row,orientation)
  392.   {
  393.     var flavourSet = grpedtreeObserver.getSupportedFlavours();
  394.     var transferData = nsTransferable.get(flavourSet, nsDragAndDrop.getDragData, true);
  395.     var dropdata = transferData.first.first.data;
  396.     var tmp = dropdata.split(",");
  397.     var oldGrp = tmp[0];
  398.     var oldrow = tmp[1];
  399.     var newGrp = index;
  400.     var newrow = row + (orientation == 1);
  401.     if (oldGrp == newGrp)  // move position
  402.     {
  403.       var up = 1*(newrow > oldrow);
  404.       tmp = lists[oldGrp].splice(oldrow,1);
  405.       lists[oldGrp].splice(newrow-up,0,tmp);
  406.       (up == 1) ? this.treebox.invalidateRange(oldrow,newrow)
  407.         : this.treebox.invalidateRange(newrow,oldrow);
  408.     }
  409.     else if (newGrp == 0)  // delete from group
  410.             delRow(oldrow);
  411.     else // oldGrp == 0, add to group
  412.             addRow(newGrp, newrow, oldGrp, oldrow);
  413.   } 
  414. }
  415.