/*

This is the unpacked source code of the "fix encoding" bookmarklet,
available at <http://domnit.org/bookmarklets/>.

Version 1.1

2007 Lenny Domnitser, copyright waived

*/

(function() {

var win2byte = {
  '\u20AC': '\x80', '\u201A': '\x82', '\u0192': '\x83', '\u201E': '\x84',
  '\u2026': '\x85', '\u2020': '\x86', '\u2021': '\x87', '\u02C6': '\x88',
  '\u2030': '\x89', '\u0160': '\x8A', '\u2039': '\x8B', '\u0152': '\x8C',
  '\u017D': '\x8E', '\u2018': '\x91', '\u2019': '\x92', '\u201C': '\x93',
  '\u201D': '\x94', '\u2022': '\x95', '\u2013': '\x96', '\u2014': '\x97',
  '\u02DC': '\x98', '\u2122': '\x99', '\u0161': '\x9A', '\u203A': '\x9B',
  '\u0153': '\x9C', '\u017E': '\x9E', '\u0178': '\x9F'
};

function getbyte(s) {
  var b = win2byte[s];
  return b || s;
}

var codes = '(?:[\\x80-\\xBF]|' + [code for (code in win2byte)].join('|') + ')';
var pat = new RegExp('[\\xC2-\\xDF]' + codes +
                    '|[\\xE0-\\xEF]' + codes + '{2}' +
                    '|[\\xF0-\\xF4]' + codes + '{3}', 'g');

function sub(s) {
  s = s[0] + [getbyte(s[1 + parseInt(code)]) for (code in s.substring(1))].join('');
  return decodeURIComponent(escape(s));
}

function fix(s) {
  s = s.replace(pat, sub);
  return s;
}

document.title = fix(document.title);
var result = document.evaluate('.//text()|.//@abbr|.//@alt|.//@title|.//@value', document.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for(var c = 0, node; node = result.snapshotItem(c); c++)
  node.nodeValue = fix(node.nodeValue);

})();

