Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. <style type="text/css">
  2. .top-commenter-line img {
  3. -webkit-border-radius: 100px;
  4. -moz-border-radius: 100px;
  5. border-radius: 100px;
  6. -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .4);
  7. -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .4);
  8. box-shadow: 0 1px 3px rgba(0, 0, 0, .4);
  9. }
  10. .top-commenter-line {margin: 3px 0;}
  11. .top-commenter-line .profile-name-link {padding-left:0;}
  12. .top-commenter-avatar {vertical-align:middle;}
  13. </style>
  14. <script type="text/javascript">
  15. //
  16. // Top Commentators gadget with avatars, by MS-potilas 2012.
  17. // Gets a list of top commentators from all comments, or specified number of days in the past.
  18. // See http://yabtb.blogspot.com/2012/05/top-commenters-gadget-with-avatars.html
  19. //
  20. // CONFIG:
  21. var maxTopCommenters = 5;   // how big a list of top commentators
  22. var minComments = 1;        // how many comments must top commentator have at least
  23. var numDays = 0;            // from how many days (ex. 30), or 0 from "all the time"
  24. var excludeMe = true;       // true: exclude my own comments
  25. var excludeUsers = ["Anonymous", "someotherusertoexclude"];     // exclude these usernames
  26. var maxUserNameLength = 42; // 0: don't cut, >4: cut usernames
  27. //
  28. var txtTopLine = '<b>[#].</b> [image] [user] ([count])';
  29. var txtNoTopCommenters = 'No top commentators at this time.';
  30. var txtAnonymous = '';      // empty, or Anonymous user name localized if you want to localize
  31. //
  32. var sizeAvatar = 56;
  33. var cropAvatar = true;
  34. //
  35. var urlNoAvatar = "https://lh4.googleusercontent.com/-0TUBbq5-9v4/UKyypZwyTcI/AAAAAAAADes/nklDeZzM3e8/s96/avatar_blue_m_96.png"+sizeAvatar+"/avatar_blue_m_96.png";
  36. var urlAnoAvatar = 'https://lh3.googleusercontent.com/-7eHaeeNgCA4/UKyzMpJMoBI/AAAAAAAADe0/T1-0tSIAiDI/s80/0.jpg' + sizeAvatar;
  37. var urlMyProfile = ''; // set if you have no profile gadget on page
  38. var urlMyAvatar = '';  // can be empty (then it is fetched) or url to image
  39. // config end
  40. // for old IEs & IE modes:
  41. if(!Array.indexOf) {
  42.  Array.prototype.indexOf=function(obj) {
  43.   for(var i=0;i<this.length;i++) if(this[i]==obj) return i;
  44.   return -1;
  45. }}
  46. function replaceTopCmtVars(text, item, position)
  47. {
  48.   if(!item || !item.author) return text;
  49.   var author = item.author;
  50.  
  51.   var authorUri = "";
  52.   if(author.uri && author.uri.$t != "")
  53.     authorUri = author.uri.$t;
  54.  
  55.   var avaimg = urlAnoAvatar;
  56.   var bloggerprofile = "http://www.blogger.com/profile/";
  57.   if(author.gd$image && author.gd$image.src && authorUri.substr(0,bloggerprofile.length) == bloggerprofile)
  58.     avaimg = author.gd$image.src;
  59.   else {
  60.     var parseurl = document.createElement('a');
  61.     if(authorUri != "") {
  62.       parseurl.href = authorUri;
  63.       avaimg = 'http://www.google.com/s2/favicons?domain=' + parseurl.hostname;
  64.     }
  65.   }
  66.   if(urlMyProfile != "" && authorUri == urlMyProfile && urlMyAvatar != "")
  67.     avaimg = urlMyAvatar;
  68.   if(avaimg == "https://lh5.googleusercontent.com/-hqxQN8Ae3sQ/UKyzo2-57iI/AAAAAAAADe8/frzWMUvV_h4/s16/b16-rounded.gif" && urlNoAvatar != "")
  69.     avaimg = urlNoAvatar;
  70.   var newsize="s"+sizeAvatar;
  71.   avaimg = avaimg.replace(/\/s\d\d+-c\//, "/"+newsize+"-c/");
  72.   if(cropAvatar) newsize+="-c";
  73.   avaimg = avaimg.replace(/\/s\d\d+(-c){0,1}\//, "/"+newsize+"/");
  74.  
  75.   var authorName = author.name.$t;
  76.   if(authorName == 'Anonymous' && txtAnonymous != '' && avaimg == urlAnoAvatar)
  77.     authorName = txtAnonymous;
  78.   var imgcode = '<img class="top-commenter-avatar" height="'+sizeAvatar+'" width="'+sizeAvatar+'" title="'+authorName+'" src="'+avaimg+'" />';
  79.   if(authorUri!="") imgcode = '<a href="'+authorUri+'">'+imgcode+'</a>';
  80.  
  81.   if(maxUserNameLength > 3 && authorName.length > maxUserNameLength)
  82.     authorName = authorName.substr(0, maxUserNameLength-3) + "...";
  83.   var authorcode = authorName;
  84.   if(authorUri!="") authorcode = '<a class="profile-name-link" href="'+authorUri+'">'+authorcode+'</a>';
  85.  
  86.   text = text.replace('[user]', authorcode);
  87.   text = text.replace('[image]', imgcode);
  88.   text = text.replace('[#]', position);
  89.   text = text.replace('[count]', item.count);
  90.   return text;
  91. }
  92.  
  93. var topcommenters = {};
  94. var ndxbase = 1;
  95. function showTopCommenters(json) {
  96.   var one_day=1000*60*60*24;
  97.   var today = new Date();
  98.  
  99.   if(urlMyProfile == "") {
  100.     var elements = document.getElementsByTagName("*");
  101.     var expr = /(^| )profile-link( |$)/;
  102.     for(var i=0 ; i<elements.length ; i++)
  103.       if(expr.test(elements[i].className)) {
  104.         urlMyProfile = elements[i].href;
  105.         break;
  106.       }
  107.   }
  108.  
  109.   for(var i = 0 ; i < json.feed.entry.length ; i++ ) {
  110.     var entry = json.feed.entry[i];
  111.     if(numDays > 0) {
  112.       var datePart = entry.published.$t.match(/\d+/g); // assume ISO 8601
  113.       var cmtDate = new Date(datePart[0],datePart[1]-1,datePart[2],datePart[3],datePart[4],datePart[5]);
  114.  
  115.       //Calculate difference btw the two dates, and convert to days
  116.       var days = Math.ceil((today.getTime()-cmtDate.getTime())/(one_day));
  117.       if(days > numDays) break;
  118.     }
  119.     var authorUri = "";
  120.     if(entry.author[0].uri && entry.author[0].uri.$t != "")
  121.       authorUri = entry.author[0].uri.$t;
  122.  
  123.     if(excludeMe && authorUri != "" && authorUri == urlMyProfile)
  124.       continue;
  125.     var authorName = entry.author[0].name.$t;
  126.     if(excludeUsers.indexOf(authorName) != -1)
  127.       continue;
  128.  
  129.     var hash=entry.author[0].name.$t + "-" + authorUri;
  130.     if(topcommenters[hash])
  131.       topcommenters[hash].count++;
  132.     else {
  133.       var commenter = new Object();
  134.       commenter.author = entry.author[0];
  135.       commenter.count = 1;
  136.       topcommenters[hash] = commenter;
  137.     }
  138.   }
  139.   if(json.feed.entry.length == 200) {
  140.     ndxbase += 200;
  141.     document.write('<script type="text/javascript" src="http://'+window.location.hostname+'/feeds/comments/default?redirect=false&max-results=200&start-index='+ndxbase+'&alt=json-in-script&callback=showTopCommenters"></'+'script>');
  142.     return;
  143.   }
  144.  
  145.   // convert object to array of tuples
  146.   var tuplear = [];
  147.   for(var key in topcommenters) tuplear.push([key, topcommenters[key]]);
  148.  
  149.   tuplear.sort(function(a, b) {
  150.     if(b[1].count-a[1].count)
  151.         return b[1].count-a[1].count;
  152.     return (a[1].author.name.$t.toLowerCase() < b[1].author.name.$t.toLowerCase()) ? -1 : 1;
  153.   });
  154.  
  155.   // list top topcommenters:
  156.   var realcount = 0;
  157.   for(var i = 0; i < maxTopCommenters && i < tuplear.length ; i++) {
  158.     var item = tuplear[i][1];
  159.     if(item.count < minComments)
  160.         break;
  161.     document.write('<di'+'v class="top-commenter-line">');
  162.     document.write(replaceTopCmtVars(txtTopLine, item, realcount+1));
  163.     document.write('</d'+'iv>');
  164.     realcount++;
  165.   }
  166.   if(!realcount)
  167.     document.write(txtNoTopCommenters);
  168. }  
  169. document.write('<script type="text/javascript" src="http://'+window.location.hostname+'/feeds/comments/default?redirect=false&max-results=200&alt=json-in-script&callback=showTopCommenters"></'+'script>');
  170. </script>