function dec2radix(value,radix) {
    var retval = '';
    var ConvArray = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F');
    var intnum;
    var tmpnum;
    var i = 0;

    intnum = parseInt(value,10);
    if (isNaN(intnum)){
        retval = 'NaN';
    }else{
        while (intnum > 0.9){
            i++;
            tmpnum = intnum;
            // cancatinate return string with new digit:
            retval = ConvArray[tmpnum % radix] + retval;  
            intnum = Math.floor(tmpnum / radix);
            if (i > 100){
                // break infinite loops
                retval = 'NaN';
                break;
            }
        }
    }
    return retval;
}

function dec2hex(value) {
	return dec2radix(value, 16);
}

function urlEncode(str) {
	var values = new Array('+', '%', '&', '#');
	var newstr = str;
	for (var i = 0; i < newstr.length; i++) {
		var c = newstr.charAt(i);
		var code = newstr.charCodeAt(i);
		var found = false;
		for (var j = 0; j < values.length; j++) {
			if (values[j]==c) {
				var hexstr = '%' + dec2hex(code);
				newstr = newstr.substring(0, i) + hexstr + newstr.substring(i+1);
				i += hexstr.length;
				break;
			}
		}
	}
	return newstr;
}

function specialchars(str) {
	return str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/\'/g, '&#039;').replace(/\</g, '&lt;').replace(/\>/g, '&gt;');
}

function unspecialchars(str) {
	return str.replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&#039;/g, '\'').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
}

function nl2br(str) {
	return str.replace(/\r\n/g, '<BR>').replace(/\r/g, '<BR>').replace(/\n/g, '<BR>');
}