/******************************************************************************
    json.js
    Copyright (c) 2006-2008 Motorola, Inc.
    All rights reserved
******************************************************************************/
$package("netopia/json.html");

netopia.create("json").add(function ()
{
    var kDateRegEx  = /^(\d+)\-(\d+)\-(\d+)[ ](\d+)\:(\d+)\:(\d+)$/;
    var kValueRegEx = /^("(\\.|[^"\\\n\r])*?"|[$A-Za-z_][$A-Z0-9a-z_]*|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;

    return $literal(
    {
        defFilter : function (name, value)
        {
            var m = kDateRegEx.exec(value);
            if (!m)
                return value;

            var d = new Date();

            d.setFullYear(parseInt(m[1]), parseInt(m[2]) - 1, parseInt(m[3]));
            d.setHours(parseInt(m[4]), parseInt(m[5]), parseInt(m[6]));

            return d;
        },

        parse : function (s, filter)
        {
            //alert("json:" + s);
            if (!netopia.json.valid(s))
                throw new Error("netopia.json.parse: syntax error");

            try
            {
                var val = eval('(' + s + ')');

                if (!filter)
                    filter = netopia.json.defFilter;

                function walk(k, v)
                {
                    if (v && typeof v === 'object')
                    {
                        for (var i in v)
                            if (netopia.core.hasOwnProp(v, i))
                                v[i] = walk(i, v[i]);
                    }
                    return filter(k, v);
                }

                return walk('', val);
            }
            catch (e)
            {
                throw new Error("netopia.json.parse: " + e.message);
            }
        },

        valid : function (s)
        {
            return kValueRegEx.test(s);
        }
    });
}()); // netopia.json

