GGRD util for starred item

By umezo Last update Dec 8, 2007 — Installed 85 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0
// ==UserScript==
// @name           GGRD util for starred item
// @namespace      http://cocoromi.s57.xrea.com/
// @include        http://www.google.com/reader*
// @include        https://www.google.com/reader*
// @include        http://reader.google.com/*
// @include        http://google.com/reader*
// add shortcut key in Google Reader
//   'z' : mark as read except starred item in loaded entries
//   'x' : mark stared and toggle reading state (maybe unread)
//   'c' : mark stared, toggle reading state (maybe unread) and open next entry
//   'w' : toggle display starred entry
// ==/UserScript==


var StarredItemHider = {
  isStarVisible : true
  ,toggle : function (){
    if(document.location.href.indexOf("starred") >= 0){return;}
    
    StarredItemHider.isStarVisible = !(StarredItemHider.isStarVisible);
    var display = StarredItemHider.isStarVisible ? "block" : "none";
    console.log(StarredItemHider.isStarVisible);
    
    StarredItemHider.setAllVisible(display);
  }
  ,hide : function (){
    if(document.location.href.indexOf("starred") >= 0){return;}
    StarredItemHider.setAllVisible("none");
  }
  ,setAllVisible : function(state){
    if(document.location.href.indexOf("starred") >= 0){return;}

    var elem = document.getElementById("entries");
    for(var n = elem.firstChild ; n != undefined ; n = n.nextSibling){
      StarredItemHider.setVisible(n , state);
    }
  }
  ,setVisible : function(elem , state){
    if(!StarredItemHider.isStarred(elem))return;
    elem.style.display = state;
  }
  
  ,hideEntry : function(elem){
    StarredItemHider.setVisible(elem , "none");
  }
  ,isStarred : function (elem){
    return !(elem.className == undefined || elem.className.indexOf("entry")  < 0 || elem.innerHTML.indexOf("item-star-active") < 0);
  }
}

function decorate_new_elements(e) {
  if(document.location.href.indexOf("starred") >= 0){return;}
  if(StarredItemHider.isStarVisible){return;}
  
  StarredItemHider.hideEntry(e.target);
}


var EventUtil = {
  simulateClick : function ( node ){
    //http://userscripts.org/scripts/show/2113
    var event = node.ownerDocument.createEvent( 'MouseEvents' );
    event.initMouseEvent( 'click',
  			true, // can bubble
  			true, // cancellable
  			node.ownerDocument.defaultView,
  			1, // clicks
  			50, 50, // screen coordinates
  			50, 50, // client coordinates
  			false, false, false, false, // control/alt/shift/meta
  			0, // button
  			node );
    node.dispatchEvent( event );
  },
  simulateKeyPress : function ( node , keyChar){
    //http://www.ac.cyberhome.ne.jp/~mattn/cgi-bin/blosxom.cgi/software/firefox/greasemonkey/20071123012638.htm
    var event = node.ownerDocument.createEvent( 'KeyboardEvent' );
    event.initKeyEvent('keypress', true, true, window, false, false, false, false, 0,keyChar.charCodeAt(0));
    node.dispatchEvent( event );
  }
}

function keypress( event ){
  //http://userscripts.org/scripts/show/2113
  event = event || window.event;
  element = event.target;
  
  var elementName = element.nodeName.toLowerCase(), typing;
  if( elementName == 'input' ){
    typing = element.type == 'text' || element.type == 'password';
  } else {
    typing = elementName == 'textarea';
  }
  if( typing ) return true;
  
  var key = String.fromCharCode( event.which || event.keyCode );
  switch(key){
    case 'X' : // mark stared, toggle reading state
      var div = document.getElementById("current-entry");
      if(div != undefined){
        EventUtil.simulateKeyPress(div , 's');
        EventUtil.simulateKeyPress(div , 'm');
      }
    break;

    case 'C': // mark stared, toggle reading state (maybe unread) and open next entry
      var div = document.getElementById("current-entry");
      if(div != undefined){
        EventUtil.simulateKeyPress(div , 'm');
        EventUtil.simulateKeyPress(div , 's');
        EventUtil.simulateKeyPress(div , 'j');
      }
    break;

    case 'Z': // mark as read except starred item in loaded entries
      if(document.location.href.indexOf("starred") >= 0){break;}
      var elem = document.getElementById("entries");
      var list = new Array();
      for(var n = elem.firstChild ; n != undefined ; n = n.nextSibling){
        if(n.className.indexOf("entry") < 0){continue;}
        list.push(n);
      }
      
      EventUtil.simulateClick(list[0].childNodes[0]);
      for(var i = 0 ; i < list.length ; i++){
        var e = list[i];
        if(e.className.indexOf("read") < 0 && !StarredItemHider.isStarred(e)){
          EventUtil.simulateKeyPress(e.childNodes[0] , 'm');
        }
        EventUtil.simulateKeyPress(e.childNodes[0] , 'n');
      }
      EventUtil.simulateKeyPress(e.childNodes[0] , 'o');
      EventUtil.simulateKeyPress(e.childNodes[0] , 'o');
      EventUtil.simulateKeyPress(e.childNodes[0] , 'm');
    break;
    
    case 'W': //toggle display starred entry
     StarredItemHider.toggle();
    break;
  }
  
  event.preventDefault && event.preventDefault();
  event.cancelBubble && event.cancelBubble();
}

document.body.addEventListener('DOMNodeInserted', decorate_new_elements, false);
document.addEventListener( 'keydown', keypress, false );

//setInterval(StarredItemHider.hide , 1000);