/WebVox/res/raw/mgws.user.js

http://eyes-free.googlecode.com/ · JavaScript · 193 lines · 160 code · 24 blank · 9 comment · 29 complexity · 69ff6d7eaf27fc31cd8fe9a0fc96fd65 MD5 · raw file

  1. // ==UserScript==
  2. // @name GWS (Mobile)
  3. // @description Mobile GWS Script
  4. // @author Charles L. Chen
  5. // @include http://www.google.com/m?*
  6. // ==/UserScript==
  7. var inputFocused = false;
  8. var resultElems = new Array();
  9. var resultsIdx = -1;
  10. function buildResultElems(){
  11. resultElems = new Array();
  12. var resNode = document.getElementById("universal");
  13. var medNodes = resNode.getElementsByClassName("med");
  14. if (medNodes.length > 0){
  15. // resultElems.push(medNodes[0]);
  16. }
  17. var gNodes = resNode.getElementsByClassName("result");
  18. for (var i=0, gNode; gNode = gNodes[i]; i++){
  19. resultElems.push(gNode);
  20. }
  21. }
  22. function getNextResult(){
  23. if (resultElems.length < 1){
  24. return null;
  25. }
  26. resultsIdx++;
  27. if (resultsIdx > resultElems.length - 1){
  28. resultsIdx = 0;
  29. return null;
  30. }
  31. var elem = resultElems[resultsIdx];
  32. return elem;
  33. }
  34. function getPrevResult(){
  35. if (resultElems.length < 1){
  36. return null;
  37. }
  38. resultsIdx--;
  39. if (resultsIdx < 0){
  40. resultsIdx = resultElems.length - 1;
  41. return null;
  42. }
  43. var elem = resultElems[resultsIdx];
  44. return elem;
  45. }
  46. function scrollToElem(targetNode){
  47. while (!targetNode.offsetParent){
  48. targetNode = targetNode.parentNode;
  49. }
  50. var left = 0;
  51. var top = 0;
  52. while (targetNode.offsetParent) {
  53. left += targetNode.offsetLeft;
  54. top += targetNode.offsetTop;
  55. targetNode = targetNode.offsetParent;
  56. }
  57. left += targetNode.offsetLeft;
  58. top += targetNode.offsetTop;
  59. window.scrollTo(left, top);
  60. }
  61. function applyLens(targetNode){
  62. var lensNode = document.getElementById("CVOX_LENS");
  63. if (!lensNode){
  64. lensNode = document.createElement('span');
  65. lensNode.id = "CVOX_LENS";
  66. lensNode.style.backgroundColor = '#CCE6FF';
  67. lensNode.style.borderColor = '#0000CC';
  68. lensNode.style.borderWidth = 'medium';
  69. lensNode.style.borderStyle = 'groove';
  70. lensNode.style.position = 'absolute';
  71. lensNode.style.display = 'none';
  72. document.body.appendChild(lensNode);
  73. }
  74. while (lensNode.firstChild){
  75. lensNode.removeChild(lensNode.firstChild);
  76. }
  77. if (targetNode === null) {
  78. lensNode.style.display = 'none';
  79. return;
  80. }
  81. var left = 0;
  82. var top = 0;
  83. var obj = targetNode;
  84. if (obj.offsetParent) {
  85. left = obj.offsetLeft;
  86. top = obj.offsetTop;
  87. obj = obj.offsetParent;
  88. while (obj !== null) {
  89. left += obj.offsetLeft;
  90. top += obj.offsetTop;
  91. obj = obj.offsetParent;
  92. }
  93. }
  94. lensNode.appendChild(targetNode.cloneNode(true));
  95. lensNode.style.top = top + 'px';
  96. lensNode.style.left = left + 'px';
  97. lensNode.style.zIndex = 999;
  98. lensNode.style.display = 'block';
  99. var adjustment = (1.3 * 100) + '%';
  100. lensNode.style.setProperty('font-size', adjustment, 'important');
  101. var subnodes = lensNode.getElementsByTagName('*');
  102. for (var i = 0, node; node = subnodes[i]; i++){
  103. node.style.setProperty('line-height', 'normal', 'important');
  104. node.style.setProperty('font-size', '100%', 'important');
  105. }
  106. scrollToElem(lensNode);
  107. }
  108. function speak(textStr, queueMode, paramsArray){
  109. window.ttsHelper.speak(textStr, queueMode);
  110. //alert(textStr);
  111. }
  112. //TODO: Come up with a working escape sequence!
  113. function keyPressHandler(evt){
  114. var keyCode = evt.keyCode;
  115. if (inputFocused){
  116. return true;
  117. }
  118. if (keyCode == 106) { // j
  119. readNextResult();
  120. return false;
  121. }
  122. if (keyCode == 107) { // k
  123. var resultNode = getPrevResult();
  124. if (resultNode){
  125. speak(resultNode.textContent,0,null);
  126. applyLens(resultNode);
  127. }
  128. return false;
  129. }
  130. return true;
  131. }
  132. function keyDownHandler(evt){
  133. window.ttsHelper.stop();
  134. var keyCode = evt.keyCode;
  135. if (inputFocused){
  136. return true;
  137. }
  138. if ((keyCode == 32) || (keyCode == 13)) { // space or Enter (G1 enter key does not work)
  139. var elem = resultElems[resultsIdx];
  140. var links = elem.getElementsByTagName('A');
  141. document.location = links[0].href;
  142. return false;
  143. }
  144. return true;
  145. }
  146. function focusHandler(evt){
  147. if (evt.target.tagName &&
  148. evt.target.tagName == 'INPUT'){
  149. inputFocused = true;
  150. }
  151. return true;
  152. }
  153. function blurHandler(evt){
  154. inputFocused = false;
  155. return true;
  156. }
  157. function readNextResult(){
  158. var resultNode = getNextResult();
  159. if (resultNode){
  160. speak(resultNode.textContent,0,null);
  161. applyLens(resultNode);
  162. }
  163. }
  164. document.addEventListener('keypress', keyPressHandler, true);
  165. document.addEventListener('keydown', keyDownHandler, true);
  166. document.addEventListener('focus', focusHandler, true);
  167. document.addEventListener('blur', blurHandler, true);
  168. buildResultElems();
  169. readNextResult();