function urlencode(url) {
	if (url) {
		var SAFECHARS = "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
				+ "abcdefghijklmnopqrstuvwxyz" + "-_.!~*'()";
		var HEX = "0123456789ABCDEF";
		var plaintext = url;
		var encoded = "";
		for ( var i = 0; i < plaintext.length; i++) {
			var ch = plaintext.charAt(i);
			if (ch == " ") {
				encoded += "+"
			} else if (SAFECHARS.indexOf(ch) != -1) {
				encoded += ch
			} else {
				var charCode = ch.charCodeAt(0);
				if (charCode > 255) {
					alert("Unicode Character '"
							+ ch
							+ "' cannot be encoded using standard URL encoding.\n"
							+ "(URL encoding only supports 8-bit characters.)\n"
							+ "A space (+) will be substituted.");
					encoded += "+"
				} else {
					encoded += "%";
					encoded += HEX.charAt((charCode >> 4) & 0xF);
					encoded += HEX.charAt(charCode & 0xF)
				}
			}
		}
		return encoded
	}
}
function urldecode(url) {
	var HEXCHARS = "0123456789ABCDEFabcdef";
	var encoded = url;
	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) {
				plaintext += unescape(encoded.substr(i, 3));
				i += 3
			} else {
				alert('Bad escape combination near ...' + encoded.substr(i));
				plaintext += "%[ERROR]";
				i++
			}
		} else {
			plaintext += ch;
			i++
		}
	}
	return plaintext
};
function trim(str, charlist) {
	charlist = !charlist ? ' \s\xA0' : charlist.replace(
			/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
	var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');
	return str.replace(re, '')
}
function defined(constant_name) {
	return (typeof window[constant_name] !== 'undefined')
}
function isObject(o) {
	return (typeof (o) == "object")
}
function isArray(o) {
	return (isObject(o) && (o.length) && (!isString(o)))
}
function isFunction(o) {
	return (typeof (o) == "function")
}
function isString(o) {
	return (typeof (o) == "string")
}
function ucfirst(str) {
	var f = str.charAt(0).toUpperCase();
	return f + str.substr(1, str.length - 1)
}
function ucwords(str) {
	return str.replace(/^(.)|\s(.)/g, function($1) {
		return $1.toUpperCase()
	})
}
