﻿// JScript File

if(window["CheckDefs"])
    window.AddDef(Array ("Cookies"));
    
Cookie = {
    DeliterizeGenerator : function(key, value) { return key + "^" + value; },
    Deliterizers : new Object(),
    AddDeliterizer : function(key, pointer) {
        this.Deliterizers[key] = pointer;
    },
    LoadLiteral : function(name) { 
        var temp = this.Read(name);
        if(temp != null && temp.length > 0)
        {
            Debug.Write("Reading Literal Cookie", temp);
            
            var litObj = eval ( Text.Format("litObj = {0}", temp) );
            return this.Deliterize(litObj);
        } else {
            return null;
        }
    },
    CreateLiteral : function(name, obj, days) {
        //object must implement toObjectLiteralString();
        if(!obj.toObjectLiteralString)
            info = this.ToObjectLiteralString(obj);
        else
            info = Text.Format("({0})", obj.toObjectLiteralString());
        Debug.Write("Creating Generated Literal Cookie", info);
        
        this.Create(name, info, days);
    },
    Deliterize : function(tObj) {
       var obj = tObj;
       
       for(field in obj)
       {
        if(typeof(obj[field]) == "object") //nested literal
        {
            obj[field] = this.Deliterize(obj[field]);
        }
        else //otherwise it is a string of format 'typekey^value'
        {
            var cpos = obj[field].indexOf('^');
            var key = obj[field].substring(0, cpos);
            var val = obj[field].substring(cpos + 1);
            var u = this.Deliterizers[key](val);
            obj[field] = u;
        }
       }
       
       return obj;
    },
    ToObjectLiteralString : function(obj) {
        if(typeof(obj) != "object")
            return Text.Format("{ value : '{0}' }", obj);
            
        var lit = new Text.StringBuilder("");
        for(field in obj)
        {
            if(lit.length == 0)
                lit.Append("{");
            else
                lit.Append(", ");
                
            if(typeof(obj[field]) == "object")
            {
                if(obj[field] == null)
                    lit.AppendFormat("{0}: 'null^null'", field);
                else if(!obj[field].literalHandler)
                    lit.AppendFormat("{0}: {1}", field, this.ToObjectLiteralString(obj[field]));
                else
                {
                    var u = obj[field].literalHandler()
                    lit.AppendFormat("{0}: '{1}^{2}'", field, obj[field].getLiteralKey(), u);
                }
            }
            else if(typeof(obj[field]) != "function")
                lit.AppendFormat("{0}: '{1}^{2}'", field, typeof(obj[field]), obj[field]);
        }
        return lit.Append(" }");
    },
    Create : function(name,value,days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }
        else var expires = "";
        document.cookie = name+"="+value+expires+"; path=/";
    },
    Read : function(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
    },
    Erase : function(name) {
        this.Create(name,"",-1);
    }
}

/* Standard Type Deliterizers */
Cookie.AddDeliterizer("string", function(v) { return v; });
Cookie.AddDeliterizer("number", function(v) { return eval(v); });
Cookie.AddDeliterizer("boolean", function(v) { return eval(v); });
Cookie.AddDeliterizer("undefined", function(v) { return undefined; });
Cookie.AddDeliterizer("function", function(v) { return eval(v); });
Cookie.AddDeliterizer("null", function(v) { return null; });

