function URLEncode(plaintext)
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
				switch(charCode) {
					case 0x20AC: encoded += "%80"; break;
					case 0x201A: encoded += "%82"; break;
					case 0x0192: encoded += "%83"; break;
					case 0x201E: encoded += "%84"; break;
					case 0x2026: encoded += "%85"; break;
					case 0x2020: encoded += "%86"; break;
					case 0x2021: encoded += "%87"; break;
					case 0x02C6: encoded += "%88"; break;
					case 0x2030: encoded += "%89"; break;
					case 0x0160: encoded += "%8A"; break;
					case 0x2039: encoded += "%8B"; break;
					case 0x0152: encoded += "%8C"; break;
					case 0x017D: encoded += "%8E"; break;
					case 0x2018: encoded += "%91"; break;
					case 0x2019: encoded += "%92"; break;
					case 0x201C: encoded += "%93"; break;
					case 0x201D: encoded += "%94"; break;
					case 0x2022: encoded += "%95"; break;
					case 0x2013: encoded += "%96"; break;
					case 0x2014: encoded += "%97"; break;
					case 0x02DC: encoded += "%98"; break;
					case 0x2122: encoded += "%99"; break;
					case 0x0161: encoded += "%9A"; break;
					case 0x203A: encoded += "%9B"; break;
					case 0x0153: encoded += "%9C"; break;
					case 0x017E: encoded += "%9E"; break;
					case 0x0178: encoded += "%9F"; break;
					default: encoded += "%26%23"+charCode+"%3B";
				}
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
};

function URLDecode(encoded)
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef"; 
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
						//Be careful with special cases
						if(encoded.substr(i,3)=='%80')
						{
							plaintext += '€';
						}
						else
						{
							plaintext += unescape( encoded.substr(i,3) );
						}
				i += 3;
			} else {
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
   return plaintext;
};