/*
  Class Serializer (linearisation sous la forme d'une chaine de caracteres)
  NB : Cette classe interoperable avec la classe serveur
*/
// Imports : tool.js
//
// --- Constructor
function Serializer()
{}
// --- Serialiser une valeur
function Serializer_serialize(anyValue)
{return Serializer_serializeLevel(anyValue, 0);}
//
function Serializer_serializeLevel(anyValue, serLevel)
{
 var varRtnObj = '';
 var varValTyp = 'undefined';
 var varDlmLvl = '#';
 var varDlmBeg = '(';
 var varDlmEnd = ')';
 //
 var varSerLvl=serLevel;
 var varSerTyp='';
 var varSerVal='';
 if(varSerLvl<1)
 {varSerLvl=1;}
 if(!isUndefined(anyValue)&&!isNull(anyValue))
 {varValTyp=getClassNameOf(anyValue).toLowerCase();}
 if(varValTyp=='number')
 {
  if(getDecPartLength(anyValue,2)<=0){varValTyp='integer';}
  else{varValTyp='float';}
 }
 switch(varValTyp)
 {
 case 'boolean':
  varSerTyp='boolean';
  varSerVal='false';
  if(anyValue)
  {varSerVal = 'true';}
  break;
 case 'integer':
  varSerTyp='integer';
  varSerVal=''+anyValue;
  break;
 case 'double':
 case 'float':
  varSerTyp='float';
  varSerVal=''+anyValue;
  break;
 case 'string':
  varSerTyp='string';
  varSerVal=''+anyValue;
  break;
 case 'array':
  varSerTyp='array';
  for(var i=0;i<anyValue.length;i++)
  {varSerVal+=Serializer_serializeLevel(anyValue[i],(varSerLvl+1));}
  break;
 default:
  varSerTyp='Exception';
  varSerVal='UnsupportedType '+varValTyp+'.';
  break;
 }
 if(varSerTyp!='array')
 {varSerVal=Serializer_urlencode(varSerVal);}
 varRtnObj=varSerTyp+varDlmLvl+varSerLvl+varDlmBeg+varSerVal+varDlmEnd+varSerLvl+varDlmLvl;
 return varRtnObj;
}
// --- D�serialiser une valeur
function Serializer_unserialize(anyValue)
{
 varRtnObj=Serializer_unserializeLevel(anyValue);
 if(varRtnObj.length>0)
 {varRtnObj=varRtnObj[0];}
 else
 {varRtnObj=null;}
 return varRtnObj;
}
//
function Serializer_unserializeLevel(anySerialized)
{
 var varRtnObj=new Array();
 if(isString(anySerialized))
 {
  var varDlmLvl='#';
  var varDlmBeg='(';
  var varDlmEnd=')';
  var varSerStr=anySerialized;
  while(varSerStr.length>0)
  {
   var varPosBeg = 0;
   var varSerLvl = '';
   var varSerTyp = '';
   var varSerVal = '';
   // --- Type
   varSerSch=varDlmLvl;
   varPosEnd=varSerStr.indexOf(varSerSch,varPosBeg);
   if(varPosEnd>0)
   {
    varSerTyp= varSerStr.substring(varPosBeg,varPosEnd);
    varPosBeg=varPosEnd+varSerSch.length;
   }
   // --- Level
   varSerSch=varDlmBeg;
   varPosEnd=varSerStr.indexOf(varSerSch,varPosBeg);
   if(varPosEnd>0)
   {
    varSerLvl=varSerStr.substring(varPosBeg,varPosEnd);
    varPosBeg=varPosEnd+varSerSch.length;
   }
   // --- Value
   varSerSch=varDlmEnd+varSerLvl+varDlmLvl;
   varPosEnd=varSerStr.indexOf(varSerSch,varPosBeg);
   if(varPosEnd>0)
   {
    varSerVal=varSerStr.substring(varPosBeg,varPosEnd);
    varPosBeg=varPosEnd+varSerSch.length;
   }
   // --- Next
   if(varPosBeg>0)
   {
    varPosEnd=varSerStr.length;
    if(varPosBeg<varPosEnd)
    {varSerStr=varSerStr.substring(varPosBeg,varPosEnd);}
    else{varSerStr='';}
   }
   // --- Current
   if((varSerTyp.length<=0)||(varSerLvl.length<=0))
   {
    varSerStr='';
    varSerLvl='';
    varSerTyp='';
    varSerVal='';
   }
   if(varSerTyp!='array')
   {varSerVal=Serializer_urldecode(varSerVal);}
   switch(varSerTyp)
   {
   case 'boolean':
    if(varSerVal=='true')
    {varRtnObj[varRtnObj.length]=true;}
    else
    {varRtnObj[varRtnObj.length]=false;}
    break;
   case 'integer':
     varRtnObj[varRtnObj.length]=parseInt(varSerVal);
     break;
    case 'float':
     varRtnObj[varRtnObj.length]=parseFloat(varSerVal);
     break;
    case 'string':
     varRtnObj[varRtnObj.length]=varSerVal;
     break;
    case 'array':
     varRtnObj[varRtnObj.length]=Serializer_unserializeLevel(varSerVal);
     break;
    default:
     varRtnObj[varRtnObj.length]=null;
     break;
   }
  }
 }
 return varRtnObj;
}
//
function Serializer_urlencode(anyString)
{
 var varRtnObj=anyString;
 varRtnObj=escape(varRtnObj);
 varRtnObj=varRtnObj.replace(new RegExp('\\+','g'),'%2B');
 varRtnObj=varRtnObj.replace(new RegExp('%20','g'),'+');
 return varRtnObj;
}
//
function Serializer_urldecode(anyString)
{
 var varRtnObj=anyString;
 varRtnObj=varRtnObj.replace(new RegExp('\\+','g'),'%20');
 varRtnObj=varRtnObj.replace(new RegExp('%2B','g'),'+');
 varRtnObj=unescape(varRtnObj);
 return varRtnObj;
}
//--- Methodes - Public
Serializer.prototype.unserialize=Serializer_unserialize;
Serializer.prototype.serialize=Serializer_serialize;
