function serialize (data){
	var _thisObject = this;         
	var f = function(data)
	{
		var str_data;        
		if (data == null || 
			(typeof(data) == 'string' && data == ''))
			{
				str_data = 'N;';                       
			}

				else switch(typeof(data))
				{
					case 'object':                                        
					var arrayCount = 0;

					str_data = '';

					for (i in data)                                        {
						if (i == 'length')
						{
							continue;
						}                                                
						arrayCount++;
						switch (typeof(i))
						{
							case 'number':                                                                str_data += 'i:' + i + ';' + f(data[i]);
							break;

							case 'string':
							str_data += 's:' + i.length + ':"' + i + '";' + f(data[i]);                                                                break;

							default:
							showMessage(Element('cc_msg_err_serialize_data_unknown').value);
							break;                                                }
						}

						if (!arrayCount)
						{                                                str_data = 'N;';        
					}
					else
					{
						str_data = 'a:' + arrayCount + ':{' + str_data + '}';                                        }

						break;

						case 'string':                                        str_data = 's:' + data.length + ':"' + data + '";';
						break;

						case 'number':
						str_data = 'i:' + data + ';';                                        break;

						case 'boolean':
						str_data = 'b:' + (data ? '1' : '0') + ';';
						break;        
						default:
						showMessage(Element('cc_msg_err_serialize_data_unknown').value);
						return null;
					} 
			return str_data;
		}

	return f(data);        
}
	

function unserialize (str)
{
	_thisObject = this;                
	var matchB = function (str, iniPos)
	{
		var nOpen, nClose = iniPos;
		do{                                
			nOpen = str.indexOf('{', nClose+1);
			nClose = str.indexOf('}', nClose+1);

			if (nOpen == -1)
			{
				return nClose;
			}
			if (nOpen < nClose )
			{
				nClose = matchB(str, nOpen);
			}
		} while (nOpen < nClose);
		
		return nClose;
	} 
	var f = function (str)
	{
		switch (str.charAt(0))
		{
			case 'a':
				var data = new Array();
				var n = parseInt( str.substring(str.indexOf(':')+1, str.indexOf(':',2) ) );
				var arrayContent = str.substring(str.indexOf('{')+1, str.lastIndexOf('}'));
				for (var i = 0; i < n; i++) {
					var pos = 0;
					/* Process Index */
					var indexStr = arrayContent.substr(pos, arrayContent.indexOf(';')+1);
					var index = f(indexStr);
					pos = arrayContent.indexOf(';', pos)+1;

					/* Process Content */
					var part = null;                                                
					switch (arrayContent.charAt(pos))
					{
						case 'a':
							var pos_ = matchB(arrayContent, arrayContent.indexOf('{', pos))+1;
							part = arrayContent.substring(pos, pos_);                 
							pos = pos_;
							data[index] = f(part);
						break;

						case 's':                                                                var pval = arrayContent.indexOf(':', pos+2);
						var val  = parseInt(arrayContent.substring(pos+2, pval));
						pos = pval + val + 4;
						data[index] = arrayContent.substr(pval+2, val);
						break;        
						default:
						part = arrayContent.substring(pos, arrayContent.indexOf(';', pos)+1);
						pos = arrayContent.indexOf(';', pos)+1;
						data[index] = f(part);                                                                break;
				}
				arrayContent = arrayContent.substr(pos);
			}
			break;                                        
			case 's':
			var pos = str.indexOf(':', 2);
			var val = parseInt(str.substring(2,pos));
			var data = str.substr(pos+2, val);                                        str = str.substr(pos + 4 + val);
			break;

			case 'i':
			case 'd':                                        var pos = str.indexOf(';');
			var data = parseInt(str.substring(2,pos));
			str = str.substr(pos + 1);
			break;
			case 'N':
			var data = null;
			str = str.substr(str.indexOf(';') + 1);
			break;
			case 'b':
			var data = str.charAt(2) == '1' ? true : false;
			break;
		}
		return data;                
		}

		return f(str);
	}