var unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.~";
var reserved = "!*'();:@&=+$,/?%#[]";
var allowed = unreserved + reserved;
var hexchars = "0123456789ABCDEFabcdef";

function gethex(decimal) 
{
  return "%" + hexchars.charAt(decimal >> 4) + hexchars.charAt(decimal & 0xF);
}

function encode(decoded) 
{
	var encoded = "";
	
	for (var i = 0; i < decoded.length; i++ ) {
	  var ch = decoded.charAt(i);
	  if (unreserved.indexOf(ch) != -1) {
		encoded = encoded + ch;
	  } else {
		  
		var charcode = decoded.charCodeAt(i);
		
		if (charcode < 128) {
		  encoded = encoded + gethex(charcode);
		}
		
		if (charcode > 127 && charcode < 2048) {
		  encoded = encoded + gethex((charcode >> 6) | 0xC0);
		  encoded = encoded + gethex((charcode & 0x3F) | 0x80);
		}
		
		if (charcode > 2047 && charcode < 65536) {
		  encoded = encoded + gethex((charcode >> 12) | 0xE0);
		  encoded = encoded + gethex(((charcode >> 6) & 0x3F) | 0x80);
		  encoded = encoded + gethex((charcode & 0x3F) | 0x80);
		}
		
		if (charcode > 65535) {
		  encoded = encoded + gethex((charcode >> 18) | 0xF0);
		  encoded = encoded + gethex(((charcode >> 12) & 0x3F) | 0x80);
		  encoded = encoded + gethex(((charcode >> 6) & 0x3F) | 0x80);
		  encoded = encoded + gethex((charcode & 0x3F) | 0x80);
		}
	  }
	}
	window.open('http://twitter.com/home?status=' + encoded);
}

