﻿var OFSYS_Tracker = new Object(
{
    Version: function() { return "0.95"; },
    Data: new Array(),
    DataKeys: new Array(),

    Track: function()
    {
        if (typeof (this.Data["ClientCode"]) == "undefined")
            return;
        if (document.body == null)
        {
            var newbody = document.createElement("body");
            document.body = newbody;
        }
        var NewImage = document.createElement("img");
        document.cookie = "OFSYS_TestCookie=1; path=/";
        if (document.cookie.indexOf("OFSYS_TestCookie") != -1)
        {
            if (document.cookie.indexOf("OFSYS_Detect_" + this.Data["ClientCode"]) == -1)
            {
                this.Set("OFSYS_ScreenHeight", screen.height.toString());
                this.Set("OFSYS_ScreenWidth", screen.width.toString());
                document.cookie = "OFSYS_Detect_" + this.Data["ClientCode"] + "=1; path=/";
            }
            var URLParams = document.location.search.replace("?", "&");
            if ((typeof (this.Data["RequirePostClick"]) != "undefined") && (this.Data["RequirePostClick"] == "1"))
            {
                if (document.cookie.indexOf("OFSYS_PostClick_" + this.Data["ClientCode"]) == -1)
                {
                    if ((URLParams.indexOf("&oft_cl=") >= 0) && (URLParams.indexOf("&oft_lk=") >= 0))
                        document.cookie = "OFSYS_PostClick_" + this.Data["ClientCode"] + "=1; path=/";
                    else
                        return;
                }
            }
            this.Set("OFSYS_Referrer", document.referrer.substr(0, 256));
            for (i = 0; i < arguments.length; i++)
                this.Set("OFSYS_E" + i, arguments[i].toString());
            NewImage.src = OFSYS_Tracker.GetTrackingURL();
            if (typeof (this.Data["Debug"]) == "undefined")
            {
                NewImage.height = 1;
                NewImage.width = 1;
                NewImage.style.display = "none";
            }
            document.body.appendChild(NewImage);
        }
    },

    GetTrackingURL: function()
    {
        if (typeof (this.Data["ClientCode"]) == "undefined")
            return "";
        var EncodedString = "", Counter = 0;
        for (i = 0; i < this.DataKeys.length; i++)
        {
            if (this.DataKeys[i] != "ClientCode")
            {
                if (Counter > 0)
                    EncodedString += "(";
                EncodedString += this.Base64_Encode(this.DataKeys[i]) + ")" + this.Base64_Encode(this.Data[this.DataKeys[i]]);
                Counter++;
            }
        }
        var Protocol = "http:";
        if (document.location.protocol == "https:")
            Protocol = "https:";
        var ImageSource = Protocol + "//ofsys.com/T/SiteTracker/" + this.Data["ClientCode"] + "/" + this.Version() + "/" + this.CRC32(EncodedString) + "/tracker.gif";
        if (EncodedString.length > 0)
            ImageSource += "?d=" + EncodedString;
        return ImageSource;
    },

    Set: function(DataName, DataValue)
    {
        if (typeof (DataName) == "undefined")
            return;
        if (typeof (DataValue) == "undefined")
            DataValue = "";
        if ((DataName.length > 0) & (DataName[0] != "_"))
        {
            if (typeof (this.Data[DataName]) == "undefined")
                this.DataKeys.push(DataName);
            if (typeof (Datavalue) == "string")
                this.Data[DataName] = DataValue;
            else
                this.Data[DataName] = DataValue.toString(); ;
        }
    },

    Base64_Encode: function(input)
    {
        var output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;
        var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        input = this.UTF8_Encode(input);
        while (i < input.length)
        {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2);
            if (!isNaN(chr2))
                output += keyStr.charAt(enc3);
            if (!isNaN(chr3))
                output += keyStr.charAt(enc4);
        }
        return output;
    },

    UTF8_Encode: function(input)
    {
        var utftext = "";
        var source = new String(input);
        source = source.replace(/\r\n/g, "\n");
        for (var n = 0; n < input.length; n++)
        {
            var c = input.charCodeAt(n);
            if (c < 128)
                utftext += String.fromCharCode(c);
            else if ((c > 127) && (c < 2048))
            {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else
            {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    },

    CRC32: function(str)
    {
        var x = 0, y = 0, table = this.CRC32_Table(), crc = 0xFFFFFFFF, max = str.length;
        for (var i = 0; i < max; i++)
        {
            crc = (crc >>> 8) ^ table[(crc & 0xff) ^ str.charCodeAt(i)];
            if (crc < 0)
                crc += Math.pow(2, 32);
        }
        crc = crc ^ 0xFFFFFFFF;
        if (crc < 0)
            crc += Math.pow(2, 32);
        return crc;
    },

    CRC32_Table: function()
    {
        var term, table = [];
        for (var i = 0; i < 256; i++)
        {
            term = i;
            for (var j = 0; j < 8; j++)
            {
                if (term & 1)
                    term = (term >>> 1) ^ 0xEDB88320;
                else
                    term = term >>> 1;
            }
            table[i] = term;
        }
        return table;
    },

    RequireID: function()
    {
        this.Set("RequireID", "1");
    },

    RequirePostClick: function()
    {
        this.Set("RequirePostClick", "1");
    },

    SetClientCode: function(ClientCode)
    {
        this.Set("ClientCode", ClientCode);
    }
});