Rewrote sidebar compilation code, caching is more stable now and things were cleaned up/separated into more functions/made plugin-expandable. In theory, plugins can add new sidebar block types now. I'd personally like to see a fully plugin-based sidebar editor that completely overhauls what Enano has now sometime now that this framework is in place.
/*
json.js
2007-03-20
All of the code contained within this file is released into
the public domain. Optionally, you may distribute this code
under the terms of the GNU General Public License as well
(public domain licensing allows this).
*/
function toJSONString(input)
{
var m = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
};
var t = typeof(input);
switch(t)
{
case 'string':
if (/["\\\x00-\x1f]/.test(input))
{
return '"' + input.replace(/([\x00-\x1f\\"])/g, function(a, b)
{
var c = m[b];
if (c) {
return c;
}
c = b.charCodeAt();
return '\\u00' +
Math.floor(c / 16).toString(16) +
(c % 16).toString(16);
}) + '"';
}
return '"' + input + '"';
break;
case 'array':
var a = ['['],
b,
i,
l = input.length,
v;
var p = function (s) {
if (b) {
a.push(',');
}
a.push(s);
b = true;
}
for (i = 0; i < l; i += 1) {
v = input[i];
switch (typeof v) {
case 'object':
if (v) {
p(toJSONString(v));
} else {
p("null");
}
break;
case 'array':
case 'string':
case 'number':
case 'boolean':
p(toJSONString(v));
}
}
a.push(']');
return a.join('');
break;
case 'date':
var f = function (n)
{
return n < 10 ? '0' + n : n;
}
return '"' + input.getFullYear() + '-' +
f(input.getMonth() + 1) + '-' +
f(input.getDate()) + 'T' +
f(input.getHours()) + ':' +
f(input.getMinutes()) + ':' +
f(input.getSeconds()) + '"';
case 'boolean':
return String(input);
break;
case 'number':
return isFinite(input) ? String(input) : "null";
break;
case 'object':
var a = ['{'],
b,
k,
v;
var p = function (s)
{
if (b)
{
a.push(',');
}
a.push(toJSONString(k), ':', s);
b = true;
}
for (k in input)
{
if (input.hasOwnProperty(k))
{
v = input[k];
switch (typeof v) {
case 'object':
if (v) {
p(toJSONString(v));
} else {
p("null");
}
break;
case 'string':
case 'number':
case 'boolean':
p(toJSONString(v));
break;
}
}
}
a.push('}');
return a.join('');
break;
}
}
function parseJSON(string, filter)
{
try {
if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.
test(string))
{
var j = eval('(' + string + ')');
if (typeof filter === 'function') {
function walk(k, v)
{
if (v && typeof v === 'object') {
for (var i in v) {
if (v.hasOwnProperty(i)) {
v[i] = walk(i, v[i]);
}
}
}
return filter(k, v);
}
j = walk('', j);
}
return j;
}
} catch (e) {
}
throw new SyntaxError("parseJSON");
}