
function URLEncode( plain ) 
{
        var SAFECHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.!~*'()";
        var HEX = "0123456789ABCDEF";
        var ii = 0;
	var encoded = "";

        for (var ii = 0; ii < plain.length; ii++ ) {
                var ch = plain.charAt(ii);
                if (SAFECHARS.indexOf(ch) != -1) {
                        encoded += ch;
                } else {
                        var charCode = ch.charCodeAt(0);
                        if( charCode <= 255 ) {
                                encoded += "%";
                                encoded += HEX.charAt((charCode >> 4) & 0xF);
                                encoded += HEX.charAt(charCode & 0xF);
                        }
                }
        }
	plain = encoded;
        return plain;
}


function URLDecode( encoded ) 
{
	var HEXCHARS = "0123456789ABCDEFabcdef";
	var ii = 0;
	var plain = "";

	while (ii < encoded.length) {
		var ch = encoded.charAt(ii);
		if (ch == "%") {
			if (ii < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(ii+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(ii+2)) != -1 ) {
				plain += unescape( encoded.substr(ii,3) );
				ii += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(ii) );
				plain += "%[ERROR]";
				ii++;
			}
		} else {
		   plain += ch;
		   ii++;
		}
	}
	encoded = plain;
	return encoded;
}

