home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / plugins / twitter / res / timeline2.js < prev    next >
Encoding:
JavaScript  |  2010-03-11  |  4.1 KB  |  147 lines

  1.  
  2. function FeedView(container, objToNode, objId, nodeKey, itemKey)
  3. {
  4.     this.container = container;
  5.     this.createDOMNode = objToNode;
  6.     this.getObjId = objId;
  7.     this.getVisualKey = nodeKey;
  8.     this.getItemKey = itemKey;
  9.  
  10.     this.resetStats();
  11. }
  12.  
  13. FeedView.prototype = {
  14.  
  15.     resetStats: function() {
  16.         this.stats = {
  17.             inserts: 0,
  18.             deletes: 0
  19.         };
  20.     },
  21.     
  22.     /**
  23.      * syncs this visual list with the model given in "items"
  24.      */
  25.     sync: function(items) {
  26.         var self = this;
  27.  
  28.         // find spans to delete
  29.         var node = this.container.firstChild;
  30.         var index = 0;
  31.         var deleteSpan = [];
  32.         var toDelete;
  33.  
  34.         function getId(node) { return node.id; }
  35.  
  36.         var lastDeletedNode = undefined;
  37.  
  38.         var insertFragment, beforeNode;
  39.  
  40.         function deleteNode(node) {
  41.             if (beforeNode === node)
  42.                 beforeNode = beforeNode.nextSibling;
  43.             node.parentNode.removeChild(node);
  44.             ++self.stats.deletes;
  45.         }
  46.  
  47.         function insertNodes(items) {
  48.             if (insertFragment === undefined) {
  49.                 insertFragment = document.createDocumentFragment();
  50.                 beforeNode = node;
  51.             }
  52.  
  53.             for (var i = 0; i < items.length; ++i) {
  54.                 var newNode = self.createDOMNode(items[i]);
  55.                 assert(newNode);
  56.                 insertFragment.appendChild(newNode);
  57.             }
  58.         }
  59.  
  60.         function finish() {
  61.             if (insertFragment !== undefined) {
  62.                 insertOrAppend(self.container, insertFragment, beforeNode);
  63.                 ++self.stats.inserts;
  64.             }
  65.             insertFragment = undefined;
  66.         }
  67.  
  68.         while (index < items.length) {
  69.             var item = items[index];
  70.  
  71.             if (!node) {
  72.                 // hit the end of the visual list--just add the rest
  73.                 insertNodes(items.slice(index));
  74.                 break;
  75.             } 
  76.             
  77.             var val = getId(node).toString() === this.getObjId(item).toString();
  78.             if (val) {
  79.                 // nodes are the same, advance both pointers
  80.                 feedSwitch(node);
  81.                 finish();
  82.                 node = node.nextSibling;
  83.                 ++index;
  84.                 continue;
  85.             } else if (this.getVisualKey(node) < this.getItemKey(item)) {
  86.                 // the input list got ahead of us, delete a visual node
  87.                 finish();
  88.                 toDelete = node;
  89.                 node = node.nextSibling;
  90.                 deleteNode(toDelete);
  91.                 continue;
  92.             } else {
  93.                 // insert a node
  94.                 insertNodes([item]);
  95.                 ++index;
  96.             }
  97.         }
  98.  
  99.         // delete any extra nodes that are left
  100.         while (node) {
  101.             toDelete = node;
  102.             node = node.nextSibling;
  103.             deleteNode(toDelete);
  104.         }
  105.  
  106.         finish();
  107.     }
  108. }
  109.  
  110. function insertOrAppend(container, node, beforeNode) {
  111.     assert(node);
  112.     if (beforeNode)
  113.         try {
  114.             container.insertBefore(node, beforeNode);
  115.         } catch (err) {
  116.             console.warn('node: ' + node);
  117.             console.warn('beforeNode: ' + beforeNode);
  118.             console.warn('beforeNode.parentNode: ' + beforeNode.parentNode);
  119.             console.warn(' -> ' + (beforeNode.parentNode === container));
  120.  
  121.             throw err;
  122.         }
  123.     else
  124.         container.appendChild(node);
  125. }
  126.  
  127. function feedSwitch(node) {
  128.     guard(function() {
  129.         // modify and tweets that are showing indented as "replies" 
  130.         // to be back to normal
  131.         var c = node.className.replace('reply', '');
  132.         if (c === node.className)
  133.             return;
  134.  
  135.         node.className = c;
  136.         var replyTo = node.getElementsByClassName('in_reply_to');
  137.         if (!(replyTo && replyTo.length))
  138.             return;
  139.  
  140.         var as = replyTo[0].getElementsByTagName('a');
  141.         if (as && as.length)
  142.             as[0].style.display = 'inline';
  143.  
  144.     });
  145. }
  146.  
  147.