#include "precompiled.h"

#include "SynchedJSObject.h"
#include "ps/Parser.h"
#include "ScriptCustomTypes.h"

template <>
CStrW ToNetString(const uint &val)
{
    return CStrW(val);
}

template <>
void SetFromNetString(uint &val, const CStrW& string)
{
    val=string.ToUInt();
}

template <>
CStrW ToNetString(const int &val)
{
    return CStrW(val);
}

template <>
void SetFromNetString(int &val, const CStrW& string)
{
    val=string.ToInt();
}

template <>
CStrW ToNetString(const bool &val)
{
    return val ? CStrW("true") : CStrW("false");
}

template <>
void SetFromNetString(bool &val, const CStrW& string)
{
    val = (string == CStrW("true"));
}

template <>
CStrW ToNetString(const CStrW& data)
{   
    return data; 
}

template <> void SetFromNetString(CStrW& data, const CStrW& string)
{   
    data=string; 
}

template <>
CStrW ToNetString(const SColour &data)
{
    wchar_t buf[256];
    swprintf(buf, 256, L"%f %f %f %f", data.r, data.g, data.b, data.a);
    buf[255]=0;
    
    return CStrW(buf);
}

template <>
void SetFromNetString(SColour &data, const CStrW& wstring)
{
    CParser &parser(CParserCache::Get("$value_$value_$value_$value"));
    CParserLine line;
    
    line.ParseString(parser, CStr(wstring));
    
    float values[4];
    if (line.GetArgCount() != 4) return;
    for (uint i=0; i<4; ++i)
    {
        if (!line.GetArgFloat(i, values[i]))
        {
            return;
        }
    }

    data.r = values[0];
    data.g = values[1];
    data.b = values[2];
    data.a = values[3];
}

void CSynchedJSObjectBase::IterateSynchedProperties(IterateCB *cb, void *userdata)
{
    SynchedPropertyIterator it=m_SynchedProperties.begin();
    while (it != m_SynchedProperties.end())
    {
        cb(it->first, it->second, userdata);
        ++it;
    }
}

ISynchedJSProperty *CSynchedJSObjectBase::GetSynchedProperty(const CStrW& name)
{
    SynchedPropertyIterator prop=m_SynchedProperties.find(name);
    if (prop != m_SynchedProperties.end())
        return prop->second;
    else
        return NULL;
}