// ==UserScript==
// @name          Smart Firefox
// @namespace     http://www.slightlyremarkable.com/
// @description	  Replaces certain typed character literals in a string with their character entity equivalents. Characters inside HTML tags are not affected.
// @include       *
// ==/UserScript==
window.addEventListener ("load", function (e){
 var filterChars = function(formatted) {
 // Author of this function: David Lindquist (http://www.gazingus.org)
 // Converted to Greasemonkey user script and modified heavily by: Jonathan Fenocchi (http://www.slightlyremarkable.com)
 // Bulgarian adaptation: Peio Popov <peio@peio.org> (http://blog.peio.org/)
	var temp      = new Array();
  var count     = 0;
  var DELIM_CHAR = '\u00A4';
  var BASE_CHAR  = '\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4-\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7-\u04C8\u04CB-\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8-\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5-\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0E01-\u0E2E\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EAE\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102-\u1103\u1105-\u1107\u1109\u110B-\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154-\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D-\u116E\u1172-\u1173\u1175\u119E\u11A8\u11AB\u11AE-\u11AF\u11B7-\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u212A-\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3';
  var DIGIT      = '\u0030-\u0039'; // 0-9
  var HTML_TAG      = new RegExp( '(<[^>]+>)' );
  var TAG_REPLACE   = new RegExp( DELIM_CHAR + '(\\d+)' + DELIM_CHAR );
  var SINGLE_QUOTES = new RegExp( '^\'|([^' + BASE_CHAR + DIGIT + '])\'\\b', 'g' );
  var APOSTROPHE    = new RegExp( '\'', 'g' );
  var DOUBLE_QUOTES = new RegExp( '"([^"]*)"', 'g' );
  var EM_DASH       = new RegExp( ' - ', 'g' );
//  var EM_DASH       = new RegExp( '--', 'g' );
  var EN_DASH       = new RegExp( ' +- +', 'g' );
  
  while ( HTML_TAG.test( formatted ) ) {
    temp[ count ] = RegExp.$1;
    formatted = formatted.replace( RegExp.$1, DELIM_CHAR + count + DELIM_CHAR );
    count++;
  }
  formatted = formatted.replace( SINGLE_QUOTES, '$1&#8216;' );
  formatted = formatted.replace( APOSTROPHE,    '&#8217;' );
  formatted = formatted.replace( DOUBLE_QUOTES, '&#132;$1&#147;' );
  formatted = formatted.replace( EM_DASH,       '&nbsp;&#8212;&nbsp;' );
  formatted = formatted.replace( EN_DASH,       '&#8211;' );

  while ( TAG_REPLACE.test( formatted ) ) {
    formatted = formatted.replace(
      DELIM_CHAR + RegExp.$1 + DELIM_CHAR, temp[ RegExp.$1 ]
    );
  }
  formatted = formatted.replace(/(\[(code|html|php)\])([\w\W\s]+?)(\[\/\2\])/gi, function(s){
      s = s.replace(/&#8216;/g, "'");
      s = s.replace(/&#8217;/g, "'");
      s = s.replace(/&#8220;/g, '"');
      s = s.replace(/&#8221;/g, '"');
      s = s.replace(/&#8212;/g, "--");
      s = s.replace(/&#8211;/g, "-");
    return s;
   }
  );
  return formatted;
};
 var i = 0, f;
  while(f = document.forms[i++]){
    f.addEventListener("submit", function (e){
     var j = 0, e;
      while(e = this.elements[j++]){
        if (e.type == "textarea"){
            e.value = filterChars(e.value);
        }
      }
    }, false);
  }
}, false);
