/**
 * 
 * Copyright Squace AB
 * @author gustav.weslien@squace.com
 * Encode a string that can be decoded using URLDecoder.decode(str, "utf-8") in java.
 * This is sometimes necessary since Tomcat 5.x defaults to latin1 even though caracter-encoding headers
 * are set to utf-8.
 * 
 */

var JSEncoder = {

	hexchars : "0123456789ABCDEF",
	okURIchars : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-",
	utf8 : function(wide){
		wide = new String(wide)
		var c, s;
		var enc = "";
		var i = 0;
		while (i < wide.length) {
			c = wide.charCodeAt(i++);
			// handle UTF-16 surrogates
			if (c >= 0xDC00 && c < 0xE000) 
				continue;
			if (c >= 0xD800 && c < 0xDC00) {
				if (i >= wide.length) 
					continue;
				s = wide.charCodeAt(i++);
				if (s < 0xDC00 || c >= 0xDE00) 
					continue;
				c = ((c - 0xD800) << 10) + (s - 0xDC00) + 0x10000;
			}
			// output value
			if (c < 0x80) 
				enc += String.fromCharCode(c);
			else 
				if (c < 0x800) 
					enc += String.fromCharCode(0xC0 + (c >> 6), 0x80 + (c & 0x3F));
				else 
					if (c < 0x10000) 
						enc += String.fromCharCode(0xE0 + (c >> 12), 0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
					else 
						enc += String.fromCharCode(0xF0 + (c >> 18), 0x80 + (c >> 12 & 0x3F), 0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
		}
		return enc;
	},
	
	
	
	toHex : function(n){
		return this.hexchars.charAt(n >> 4) + this.hexchars.charAt(n & 0xF);
	},
	
	encode : function(s){
		var s = this.utf8(s);
		var c;
		var enc = "";
		for (var i = 0; i < s.length; i++) {
			if (this.okURIchars.indexOf(s.charAt(i)) == -1) 
				enc += "%" + this.toHex(s.charCodeAt(i));
			else 
				enc += s.charAt(i);
		}
		return enc;
	}
}