There's a Babelfish in My Browser!

By Britt Selvitelle Last update Jul 10, 2005 — Installed 2,022 times.
/*
There's a Babelfish in My Browser!
http://life.lukewarmtapioca.com/articles/2005/05/19/there-s-a-babelfish-in-my-browser

Version 0.2
(c) 2005 Britt Selvitelle
Released under the GPL license
http://www.gnu.org/copyleft/gpl.html
*/

// ==UserScript==
// @name          There's a Babelfish in My Browser!
// @namespace     http://lukearmtapioca.com.com/userscripts/
// @description   Translate textboxes/textareas in webpages.
// @include       *
// @exclude       
// ==/UserScript==

var spinner_img = "data:image/gif;base64,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"; 


var fish_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAOCAYAAAA8E3wEAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QUUDyoqJjAqRwAAAN1JREFUOMu1lMkVwyAMBYe0JGpCNUFNVk3k4AUwxPGS+ILxkzX8jyTH/Sfu9nrmJ3cXlnMASyWRPwd2d5XlHCBZn1BthcbRAdxTZQDI8k3mQzg11rhF+QZ9jdNOcQib6GFQYJYgCFucSRf6GsLU6wEY5yubTFqF2yq1vRwr3INXdQUWG+je1pELX4ED1wDyRAR0WfuAA9gloITyvsFMIMgYInYRqF6rO9Sqz9qkO5ilyo0o3YBwJ+6vrdQonxWUQllhXeHcb/wabMPkP2n81ocAIoLZrMqn/4y2RwP8DcQ+d6rT9ATiAAAAAElFTkSuQmCC";

window.get_set_tr_text = function(iter)  {
  text = all_text[iter].value;

  // if there is no text, return
  if( rightTrim(text).length == 0 ) return;

  var img = document.getElementById('babel_img' + iter);
  img.setAttribute('src', spinner_img);
  img.style.display = 'inline';
  working = true;

  var pre_text = '';
  var post_text = '';

  if( all_text[iter].selectionStart != all_text[iter].selectionEnd ) {
    var pre_text = text.substring(0, all_text[iter].selectionStart);
    var post_text = text.substring(all_text[iter].selectionEnd, all_text[iter].value.length);
    var text = text.substring(all_text[iter].selectionStart, all_text[iter].selectionEnd);

    // get leading and trailing whitespaces that may be nuked in translation
    var tail_ws_reg = /\s*$/;
    if( tail_ws_reg.test(text) ) {
      var tail_ws_cnt = text.match(tail_ws_reg)[0].length;
    }
    var leading_ws_reg = /^\s*/;
    if( leading_ws_reg.test(text) ) {
      var leading_ws_cnt = text.match(leading_ws_reg)[0].length;
    }
  }

  GM_xmlhttpRequest({
    method: 'POST',
    url: 'http://babelfish.altavista.com/tr?lp=en_es&text=' + text,
    onload: function(responseDetails) {
      // Nasty screen scraping here! Wish babelfish had an exposed api!
      all_text[iter].value = pre_text;
      for( var i=0; i < leading_ws_cnt; i++ ) { all_text[iter].value += ' ' }
      //all_text[iter].value += responseDetails.responseText.match("px..(.*)..div")[1];
      t = responseDetails.responseText;
      all_text[iter].value += t.substring(t.search("10px;>") + 6, t.search('</div>'));
      for( var i=0; i < tail_ws_cnt; i++ ) { all_text[iter].value += ' ' }
      all_text[iter].value += post_text;

      img.setAttribute('src', fish_img);
      img.style.display = 'none';
      working = false;
    }
  });
}

window.show_fish = function(iter) {
  document.getElementById('babel_img' + iter).style.display = 'inline';
}

window.hide_fish = function(iter) {
  if( !working) document.getElementById('babel_img' + iter).style.display = 'none';
}

window.rightTrim = function( strValue ) {
  var objRegExp = /^([\w\W]*)(\b\s*)$/;
  if(objRegExp.test(strValue)) {
  //remove trailing a whitespace characters
    strValue = strValue.replace(objRegExp, '$1');
  }
  return strValue;
}

var working = false; // don't kill spinner if this is true
var tbs = document.getElementsByTagName('input');
var tas = document.getElementsByTagName('textarea');
var all_text = new Array();
for(var i=0; i < tbs.length; i++) { if(tbs[i].type == 'text') all_text.push(tbs[i]) }
for(var i=0; i < tas.length; i++) { all_text.push(tas[i]) }

for( var i=0; i < all_text.length; i++ ) {
  var babel_img = document.createElement("img");
  babel_img.setAttribute("style", "position:absolute;");
  babel_img.setAttribute("src", fish_img);
  babel_img.setAttribute("onclick", "get_set_tr_text('" + i + "')");
  babel_img.setAttribute("id", "babel_img" + i);
  babel_img.style.display = "none";

  all_text[i].parentNode.insertBefore(babel_img, all_text[i].nextSibling);
  all_text[i].setAttribute("onfocus", "show_fish(" + i + ")");
  all_text[i].setAttribute("onblur", "setTimeout('hide_fish(" + i + ")', 400)");
}