﻿Math.uuid = (function() {
    var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
    return function(len, radix) {
        var chars = CHARS, uuid = [], rnd = Math.random;
        radix = radix || chars.length;
        if (len) {
            for (var i = 0; i < len; i++) uuid[i] = chars[0 | rnd() * radix];
        } else {
            var r;
            uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
            uuid[14] = '4';
            for (var i = 0; i < 36; i++) {
                if (!uuid[i]) {
                    r = 0 | rnd() * 16;
                    uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
                }
            }
        }
        return uuid.join('');
    };
})();

var _lat = new Object({
    encode: function(stringToEncode, notForQueryString) {
        var c = encodeURIComponent;
        return c instanceof Function ? (notForQueryString ? encodeURI(stringToEncode) : c(stringToEncode)) : escape(stringToEncode);
    },
    cookie: function() {
        var name = 'la_' + location.hostname;
        var sIndex = document.cookie.indexOf(name);
        if (sIndex > -1) {
            sIndex = sIndex + name.length + 1;
            var eIndex = document.cookie.indexOf(";", sIndex);
            if (eIndex == -1) eIndex = document.cookie.length;
            return unescape(document.cookie.substring(sIndex, eIndex));
        }
        return null;
    },
    setCookie: function() {
        var today = new Date();
        var oneYearFromToday = new Date(today.getTime() + 31536000000);
        var expiryDate = oneYearFromToday.toGMTString();
        document.cookie = 'la_' + location.hostname + '=' + Math.uuid() + ';expires=' + expiryDate;
    }
});

_lat.flashDetect = new function() {
    var self = this;
    var raw = '';
    var major = -1;
    var minor = -1;
    var revision = -1;
    var revisionStr = '';
    self.installed = false;
    self.version = '';

    var activeXDetectRules = [
        {
            'name': 'ShockwaveFlash.ShockwaveFlash.7',
            'version': function(obj) {
                return getActiveXVersion(obj);
            }
        },
        {
            'name': 'ShockwaveFlash.ShockwaveFlash.6',
            'version': function(obj) {
                var version = '6,0,21';
                try {
                    obj.AllowScriptAccess = 'always';
                    version = getActiveXVersion(obj);
                } catch (err) { }
                return version;
            }
        },
        {
            'name': 'ShockwaveFlash.ShockwaveFlash',
            'version': function(obj) {
                return getActiveXVersion(obj);
            }
        }
    ];

    var getActiveXVersion = function(activeXObj) {
        var version = -1;
        try {
            version = activeXObj.GetVariable('$version');
        } catch (err) { }
        return version;
    };

    var getActiveXObject = function(name) {
        var obj = -1;
        try {
            obj = new ActiveXObject(name);
        } catch (err) {
            obj = { activeXError: true };
        }
        return obj;
    };

    var parseActiveXVersion = function(str) {
        var versionArray = str.split(','); //replace with regex
        return {
            'raw': str,
            'major': parseInt(versionArray[0].split(' ')[1], 10),
            'minor': parseInt(versionArray[1], 10),
            'revision': parseInt(versionArray[2], 10),
            'revisionStr': versionArray[2]
        };
    };

    var parseStandardVersion = function(str) {
        var descParts = str.split(/ +/);
        var majorMinor = descParts[2].split(/\./);
        var revisionStr = descParts[3];
        return {
            'raw': str,
            'major': parseInt(majorMinor[0], 10),
            'minor': parseInt(majorMinor[1], 10),
            'revisionStr': revisionStr,
            'revision': parseRevisionStrToInt(revisionStr)
        };
    };

    var parseRevisionStrToInt = function(str) {
        return parseInt(str.replace(/[a-zA-Z]/g, ''), 10) || self.revision;
    };

    self.FlashDetect = function() {
        if (navigator.plugins && navigator.plugins.length > 0) {
            var type = 'application/x-shockwave-flash';
            var mimeTypes = navigator.mimeTypes;
            if (mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin && mimeTypes[type].enabledPlugin.description) {
                var version = mimeTypes[type].enabledPlugin.description;
                var versionObj = parseStandardVersion(version);
                raw = versionObj.raw;
                major = versionObj.major;
                minor = versionObj.minor;
                revisionStr = versionObj.revisionStr;
                revision = versionObj.revision;
                self.installed = true;
            }
        } else if (navigator.appVersion.indexOf('Mac') == -1 && window.execScript) {
            var version = -1;
            for (var i = 0; i < activeXDetectRules.length && version == -1; i++) {
                var obj = getActiveXObject(activeXDetectRules[i].name);
                if (!obj.activeXError) {
                    self.installed = true;
                    version = activeXDetectRules[i].version(obj);
                    if (version != -1) {
                        var versionObj = parseActiveXVersion(version);
                        raw = versionObj.raw;
                        major = versionObj.major;
                        minor = versionObj.minor;
                        revision = versionObj.revision;
                        revisionStr = versionObj.revisionStr;
                    }
                }
            }
        }
        if (major > -1 && minor > -1)
            self.version = major + '.' + minor + ' ' + revisionStr;
    } ();
};

_lat._getTracker = function(url) {
    var tracker = this;
    tracker._trackPageview = function(page) {
        if (tracker.cookie() == null || tracker.cookie().length == 0)
            tracker.setCookie();

        var qs = '?l=' + tracker.encode(location.href);
        qs += '&r=' + tracker.encode(document.referrer);

        if (page != undefined && page.length > 0)
            qs += '&ct=' + tracker.encode(page);

        if (navigator.userAgent != undefined && navigator.userAgent.length > 0)
            qs += '&ua=' + tracker.encode(navigator.userAgent);
        if (navigator.appVersion != undefined && navigator.appVersion.length > 0)
            qs += '&av=' + tracker.encode(navigator.appVersion);
        if (navigator.platform != undefined && navigator.platform.length > 0)
            qs += '&p=' + tracker.encode(navigator.platform);
        if (navigator.vendor != undefined && navigator.vendor.length > 0)
            qs += '&v=' + tracker.encode(navigator.vendor);
        if (window.opera != undefined && window.opera.length > 0)
            qs += '&o=' + tracker.encode(window.opera);

        qs += '&t=' + tracker.encode(document.title);
        qs += '&ln=' + (navigator.language ? navigator.language : navigator.browserLanguage);
        qs += '&je=' + navigator.javaEnabled();

        if (window.screen) {
            qs += '&cd=' + window.screen.colorDepth;
            qs += '&sw=' + window.screen.width;
            qs += '&sh=' + window.screen.height;
        }

        qs += '&fi=' + tracker.flashDetect.installed;
        if (tracker.flashDetect.installed)
            qs += '&fv=' + tracker.encode(tracker.flashDetect.version);

        qs += '&id=' + tracker.encode(tracker.cookie());

        var img = new Image();
        img.src = url + qs;
    };
    return tracker;
};