﻿if ( !window.Utils )
    window.Utils = {};
    
Utils.Serialization = function() {}
Utils.Serialization.prototype.serialize = function( o )
{
    switch ( Object.getTypeName(o) )
    {
        case "Array":
            return this.serializeArray(o);
            break;
        case "String":
        case "Number":
            return ""+o;
            break;
        case "Object":
            return this.serializeObject(o);
            break;
    }
}

Utils.Serialization.prototype.serializeArray = function(arr)
{
    var items = [];
    for (var i=0; i<arr.length; i++)
    {
        switch ( Object.getTypeName( arr[i] ) )
        {
            case "Array":
                items.push( this.serializeArray( arr[i] ) );
                break;
            case "String":
            case "Number":
                items.push( "'" + this.fixSerStr( arr[i] ) + "'" );
                break;
            case "Object":
                items.push( this.serializeObject( arr[i] ) );
                break;
        }
    }
    return "["+items.join(",")+"]";
}

Utils.Serialization.prototype.serializeObject = function(o)
{
    var items = [];
    for (var key in o)
    {
        switch ( Object.getTypeName( o[key] ) )
        {
            case "Array":
                items.push( key + ":" + this.serializeArray( o[key] ) );
                break;
            case "String":
            case "Number":
                items.push( key + ":'" + this.fixSerStr( o[key] ) + "'" );
                break;
            case "Object":
                items.push( key + ":" + this.serializeObject( o[key] ) );
                break;
        }
    }
    return "{"+items.join(",")+"}";
}
Utils.Serialization.prototype.fixSerStr = function( str )
{
    if ( Object.getTypeName( str ) == "Number" )
        return str+"";
    var _str = str.replace(/'/g,"\'");
    return _str;
}

Utils.Serialization.prototype.deserialize = function( str )
{
    return eval( "("+str+")" );
}