/*
-----------------------------------------------
Daniel Bulli
http://www.nuff-respec.com/technology/cross-browser-cookies-with-flash
----------------------------------------------- */

//set this to name of your flash object/embed
var cookie_id  = 'CBCookie';

var CB_Cookie =
{
	init: function(cookie_id)
	{
		this.cookie_id  		= cookie_id;
		this.flash_cookie_ready = false;
		this.flash_cookie_able  = false;
		this.flash_cookie  		= null;
		this.flash_alert  		= false;

		return this.flash_is_ready();
	},

	flash_is_ready: function()
	{
		if(!document.getElementById || !document.getElementById(this.cookie_id)) return;
		if(!this.get_movie(this.cookie_id)) return false;

		if( this.flash_cookie && this.flash_cookie.f_cookie_able )
		{
			this.flash_cookie_ready = true;
			this.flash_cookie_able  = this.flash_cookie.f_cookie_able();
			return true;
		}
		else
		{
			return false;
		}
		
	},


	is_able: function()
	{
		if(!this.flash_alert && !(this.flash_cookie_ready && this.flash_cookie_able))
		{
			// alert("CB_Cookie not initialized correctly.");
			this.flash_alert = true;
		}
		return (this.flash_cookie_ready && this.flash_cookie_able);
	},

	del: function(key)
	{
		if(!this.is_able()) return;
		this.flash_cookie.f_delete_cookie(key);
	},

	get: function(key)
	{
		if(!this.is_able()) return;
		var ret = this.flash_cookie.f_get_cookie(key);
		return ((ret == 'null') ? '' : ret);
	},

	set: function(key,val)
	{
		if(!this.is_able()) return;
		this.flash_cookie.f_set_cookie(key,val);
	},

	get_movie: function()
	{
    	if (navigator.appName.indexOf("Microsoft") != -1)
    	{
    		this.flash_cookie = window[this.cookie_id];
    	}
    	else
    	{
    		this.flash_cookie =  document[this.cookie_id];
    	}

    	return ((this.flash_cookie) ? true : false);
	}

};

function flash_ready()
{
	
	return CB_Cookie.init(cookie_id);
}

function serialize( mixed_value ) {
    // Returns a string representation of variable (which can later be unserialized)  
    // 
    // version: 905.1001
    // discuss at: http://phpjs.org/functions/serialize
    // +   original by: Arpad Ray (mailto:arpad@php.net)
    // +   improved by: Dino
    // +   bugfixed by: Andrej Pavlovic
    // +   bugfixed by: Garagoth
    // %          note: We feel the main purpose of this function should be to ease the transport of data between php & js
    // %          note: Aiming for PHP-compatibility, we have to translate objects to arrays
    // *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
    // *     example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});
    // *     returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'
    var _getType = function( inp ) {
        var type = typeof inp, match;
        var key;
        if (type == 'object' && !inp) {
            return 'null';
        }
        if (type == "object") {
            if (!inp.constructor) {
                return 'object';
            }
            var cons = inp.constructor.toString();
            match = cons.match(/(\w+)\(/);
            if (match) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };
    var type = _getType(mixed_value);
    var val, ktype = '';
    
    switch (type) {
        case "function": 
            val = ""; 
            break;
        case "undefined":
            val = "N";
            break;
        case "boolean":
            val = "b:" + (mixed_value ? "1" : "0");
            break;
        case "number":
            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
            break;
        case "string":
            val = "s:" + mixed_value.length + ":\"" + mixed_value + "\"";
            break;
        case "array":
        case "object":
            val = "a";
            /*
            if (type == "object") {
                var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
                if (objname == undefined) {
                    return;
                }
                objname[1] = serialize(objname[1]);
                val = "O" + objname[1].substring(1, objname[1].length - 1);
            }
            */
            var count = 0;
            var vals = "";
            var okey;
            var key;
            for (key in mixed_value) {
                ktype = _getType(mixed_value[key]);
                if (ktype == "function") { 
                    continue; 
                }
                
                okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
                vals += serialize(okey) +
                        serialize(mixed_value[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
    }
    if (type != "object" && type != "array") {
	    val += ";";
	}
    return val;
}

