/*
* PHP Serialize
* Morten Amundsen
* mor10am@gmail.com
* Modified by Ben Birney, bbirney@tilsontech.com, to solve scoping issues on count var
*
* Serializes JavaScript objects and primitives for reading by PHP, including multi-dimensional arrays
*/
var counts = new Array();
var next_count_slot = 0;

function php_serialize(obj)
{
    var string = '';
    var slot;
    
    if (typeof(obj) == 'object') {
        if (obj instanceof Array) {
            string = 'a:';
            tmpstring = '';
            slot = next_count_slot++;
//            Logger.info("Starting array with count slot" + slot);
            counts[slot] = 0;
            for (var key in obj) {        
            	if(typeof obj[key] == "function") continue; //Added by Ben 09/20/07    
//            	Logger.info("Serializing key " + key + ", value " + obj);
                tmpstring += php_serialize(key);
                tmpstring += php_serialize(obj[key]);
                counts[slot]++;
//				Logger.info("The count for this array is now " + counts[slot]);
            }
            string += counts[slot] + ':{';
            string += tmpstring;
            string += '}';
        } else if (obj instanceof Object) {
            classname = obj.toString();

            if (classname == '[object Object]') {
                classname = 'StdClass';
            }

            string = 'O:' + classname.length + ':"' + classname + '":';
            tmpstring = '';
            slot = next_count_slot++;
            counts[slot] = 0;
            for (var key in obj) {            
            	if(typeof obj[key] == "function") continue; //Added by Ben 09/20/07
                tmpstring += php_serialize(key);
                if (obj[key]) {
                    tmpstring += php_serialize(obj[key]);
                } else {
                    tmpstring += php_serialize('');
                }
                counts[slot]++;
            }
            string += counts[slot] + ':{' + tmpstring + '}';
        }
    } else {
        switch (typeof(obj)) {
            case 'number':
                if (obj - Math.floor(obj) != 0) {
                    string += 'd:' + obj + ';';
                } else {
                    string += 'i:' + obj + ';';
                }
                break;
            case 'string':
                string += 's:' + obj.length + ':"' + obj + '";';
                break;
            case 'boolean':
                if (obj) {
                    string += 'b:1;';
                } else {
                    string += 'b:0;';
                }
                break;
        }
    }

    return string;
}
