
// common javascript functions

// serialize function
function serialize(obj) {
	if (obj == undefined)
		return '';
	else if (obj === null)
		return 'N;';

	var serialized = '';
	switch (obj.constructor) {
		case Array:
			serialized = 'a:';
		case Object:
			if (serialized == '') serialized = 'o:';
			var item, count = 0, value, content = '';
			for (item in obj)
			{
				if ((value = serialize(obj[item])) != '')
				{
					content += serialize(isNaN(item)?item:parseInt(item,10)) + value;
					count++;
				}
			}
			serialized += count + ':{' + content + '}';
			break;
		case String:
			obj = obj.replace(/\r\n|\r|\n/g, '\r\n');
			serialized = 's:' + obj.length + ':"' + obj + '";';
			break;
		case Number:
			serialized = (Math.floor(obj) == obj ? 'i' : 'd') + ':' + obj + ';';
			break;
		case Boolean:
			serialized = 'b:' + (obj == true ? 1 : 0) + ';';
			break;
	}

	return serialized;
}

// unserialize
function unserialize(data)
{
	var re = /(\w):([\d.]+)[:;]/g;
	re.lastIndex = 0;
	return unserialize_do(re, data);
}

function unserialize_do(re, data)
{
	var cur, ret = '', i, key;
	if ((cur = re.exec(data)) !== null)
	{
		switch (cur[1])
		{
			case 'a':
			case 'o':
				ret = cur[1] == 'a' ? [] : {};
				i = cur[2];
				while (i--)
				{
					key = unserialize_do(re, data);
					ret[key] = unserialize_do(re, data);
				}
				break;
			case 's':
				ret = data.substr(re.lastIndex+1, cur[2]);
				re.lastIndex += cur[2] - 1;
				break;
			case 'i':
			case 'd':
				ret = cur[2] / 1;
				break;
			case 'b':
				ret = cur[2] ? true : false;
				break;
		}
	}

	return ret;
}