

// See: http://www.cresc.co.jp/tech/java/URLencoding/JavaScript_URLEncoding.htm


if (typeof(tora) == "undefined")
	tora = new Object;

if (typeof(tora.asio) == "undefined")
	tora.asio = new Object;


// namespace tora { namespace asio {


tora.asio.encodeURL = function(str)
{
	var s0 = ""; // encoded str

	for (var i = 0; i < str.length; i++)
	{
		var s = str.charAt(i);
		var u = str.charCodeAt(i);

		if (s == " ")
			s0 += "+";
		else if (u == 0x2a || u == 0x2d || u == 0x2e || u == 0x5f || (u >= 0x30 && u <= 0x39) || (u >= 0x41 && u <= 0x5a) || (u >= 0x61 && u <= 0x7a))
			s0 += s; // don't escape
		else if (u >= 0x0 && u <= 0x7f) // single byte format
		{
			s = "0" + u.toString(16);
			s0 += "%" + s.substr(s.length - 2);
		}
		else if (u > 0x1fffff) // quaternary bytes format (extended)
		{
			s0 += "%" + (oxf0 + ((u & 0x1c0000) >> 18)).toString(16);
			s0 += "%" + (0x80 + ((u & 0x3f000) >> 12)).toString(16);
			s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
			s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
		}
		else if (u > 0x7ff) // triple bytes format
		{
			s0 += "%" + (0xe0 + ((u & 0xf000) >> 12)).toString(16);	
			s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
			s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
		}
		else // double bytes format
		{
			s0 += "%" + (0xc0 + ((u & 0x7c0) >> 6)).toString(16);
			s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
		}
	}

	return s0;
}


// } } // tora.asio

