var ninemsn = window.ninemsn || {};
ninemsn.tracking = ninemsn.tracking || {};
ninemsn.tracking.udc = ninemsn.tracking.udc || {};

ninemsn.tracking.udc = function () {
    //private static attribute
    var _instance;

    //class constructor
    function constructor() {

        //private attributes
        var cURL = location.protocol + "//c.ninemsn.com.au/c.gif?";
        var udcURL = location.protocol + "//udc.msn.com/c.gif?";
        var udcQueryString = {};
        var cQueryString = {};
        var uuid;
        var clid;

        //private methods
        function getSilverlightVersion() {

            var silverlightDefaults = {
                silverlightVersions: ["5.0", "4.0", "3.0", "2.0"],
                silverlightMimeType: "application/x-silverlight-2"
            };
            var win = window;
            var silverlightPlugin;
            var opts = silverlightDefaults;
            var installedVersion = 0;
            try {
                var nav = win.navigator,
                plugins = nav.plugins;
                if (plugins && plugins.length) {
                    silverlightPlugin = plugins["Silverlight Plug-In"];
                    if (silverlightPlugin) installedVersion = /^\d+\.\d+/.exec(silverlightPlugin.description)[0];
                    //set to 0 for garbage collection
                    silverlightPlugin = 0;
                } else if (win.ActiveXObject) {
                    var control = new ActiveXObject("AgControl.AgControl");
                    if (control) {
                        installedVersion = 1;

                        //var obj = $("<OBJECT/>")[0];
                        var obj = document.createElement('object');
                        obj.codeType = opts.silverlightMimeType;
                        if (typeof obj.IsVersionSupported != "undefined") {
                            for (var version, idx = 0; version = opts.silverlightVersions[idx]; ++idx) {
                                if (obj.IsVersionSupported(version)) {
                                    installedVersion = version;
                                    break;
                                }
                            }
                        }
                        //set to 0 for garbage collection
                        obj = 0;
                    }
                }
            } catch (e) { }
            return installedVersion;
        };
        function isSilverlightEnabled(silverlightVersion) {
            return Number(silverlightVersion > 0);
        };
        function fireAndForget(url) {
            if (url) {
                var img = new Image;
                img.onload = img.onerror = function () {
                    img.onload = img.onerror = null;
                };
                img.src = url.replace(/&amp;/gi, "&");
            }
        };
        function isHomePage() {
            var documentElement = document.documentElement, retVal = 0;
            if (typeof documentElement.addBehavior != "undefined" && documentElement.addBehavior("#default#homePage")) try {
                retVal = documentElement.isHomePage(window.location.href) ? "Y" : "N";
            } catch (e) { }
            return retVal;
        };
        function getBrowserHeight() {
            if (typeof (window.innerHeight) === "number") {
                return window.innerHeight;
            }
            else {
                var documentElement = document.documentElement;
                if (documentElement && documentElement.clientHeight) {
                    return documentElement.clientHeight;
                } else if (documentElement.offsetHeight) {
                    return documentElement.offsetHeight;
                }
                else {
                    return 0;
                }
            }
        };
        function getBrowserWidth() {
            if (typeof (window.innerWidth) === "number") {
                return window.innerWidth;
            } else {
                var documentElement = document.documentElement;
                if (documentElement && documentElement.clientWidth) {
                    return documentElement.clientWidth;
                }
                else if (documentElement.offsetWidth) {
                    return documentElement.offsetWidth;
                }
                else {
                    return 0;
                }
            }
        };
        function generateUuid() {
            var s = [], hexDigits = "0123456789ABCDEF";
            for (var i = 0; i < 32; i++) s[i] = hexDigits.substr(Math.floor(Math.random() * 16), 1);
            s[12] = "4";
            s[16] = hexDigits.substr(s[16] & 3 | 8, 1);
            var result = s.join("");
            return result;
        };
        function getClid() {
            var re = new RegExp("\\b" + "MUID" + "\\s*=\\s*([^;]*)", "i"),
            match = re.exec(document.cookie);
            var MUIDCookieValue = match && match.length > 1 ? match[1] : "";
            return MUIDCookieValue;
        };
        function detectMarket() {
            if (window.location.hostname.indexOf(".co.nz") > 0) {
                return "en-nz";
            } else {
                return "en-au";
            }
        };
        function buildQueryString(queryString) {
            var qs = "";
            for (var key in queryString) {
                if (queryString[key])
                    qs += key + "=" + queryString[key] + "&";
            }
            if (qs[qs.length - 1] === "&") qs = qs.substr(0, qs.length - 1);
            return qs;
        };

        //public methods
        this.trackPage = function (di, pi, ps, pn) {
            var browserHeight = getBrowserHeight();
            var browserWidth = getBrowserWidth();
            var hp = isHomePage();
            var slv = getSilverlightVersion();
            var sl = isSilverlightEnabled(slv);
            var mk = detectMarket();
            clid = getClid();
            uuid = generateUuid();

            udcQueryString["mk"] = mk;
            udcQueryString["di"] = di;
            udcQueryString["pi"] = pi;
            udcQueryString["ps"] = ps;
            udcQueryString["pn"] = escape(pn);
            udcQueryString["pp"] = "false";
            udcQueryString["clid"] = clid ? clid : uuid;
            udcQueryString["cu"] = document.location.href;
            udcQueryString["bh"] = browserHeight;
            udcQueryString["bw"] = browserWidth;
            udcQueryString["sl"] = sl;
            udcQueryString["slv"] = slv;
            udcQueryString["scr"] = screen.width + "x" + screen.height;
            udcQueryString["sd"] = screen.colorDepth;
            udcQueryString["rid"] = uuid;
            udcQueryString["cts"] = +new Date;
            udcQueryString["hp"] = hp;
            udcQueryString["evt"] = "impr";

            fireAndForget(udcURL + buildQueryString(udcQueryString));

            cQueryString["rid"] = uuid;
            cQueryString["cts"] = +new Date;
            cQueryString["di"] = di;
            cQueryString["pi"] = pi;
            cQueryString["ps"] = ps;
            cQueryString["tp"] = document.location.href;
            cQueryString["udc"] = "true";

            fireAndForget(cURL + buildQueryString(cQueryString));

        };

        function handleUnload() {
            udcQueryString = {};
            udcQueryString["clid"] = clid ? clid : uuid;
            udcQueryString["rid"] = uuid;
            udcQueryString["cts"] = +new Date;
            udcQueryString["evt"] = "unload";
            fireAndForget(udcURL + buildQueryString(udcQueryString));
        };
        if (window.addEventListener) {
            window.addEventListener("unload", handleUnload, false);
        }
        else if (window.attachEvent) {
            window.attachEvent("onunload", handleUnload);
        }
    };
    return {
        //public static method
        getInstance: function () {
            return _instance || (_instance = new constructor());
        }
    };
} ();

(function () {
    var taxtag_di = '12678';
    var taxtag_ps = '';
    var taxtag_pi = '33480';
    var JS_NETNAV_TAB_GROUP = window.JS_NETNAV_TAB_GROUP || '';
    var JS_SITE = window.JS_SITE || '';

    if (JS_NETNAV_TAB_GROUP != '') {
        if (JS_NETNAV_TAB_GROUP.toLowerCase() == 'finance') {
            taxtag_di = '4749';
            taxtag_ps = '10437';
        } else if (JS_NETNAV_TAB_GROUP.toLowerCase() == 'lifestyle') {
            taxtag_di = '4751';
            taxtag_ps = '10513';
        } else if (JS_NETNAV_TAB_GROUP.toLowerCase() == 'news') {
            taxtag_di = '4754';
            taxtag_ps = '10321';
        } else if (JS_NETNAV_TAB_GROUP.toLowerCase() == 'sports') {
            taxtag_di = '4753';
            taxtag_ps = '10300';
        } else if (JS_NETNAV_TAB_GROUP.toLowerCase() == 'travel') {
            taxtag_di = '4756';
            taxtag_ps = '10324';
        } else if (JS_NETNAV_TAB_GROUP.toLowerCase() == 'entertainment') {
            taxtag_di = '4748';
            taxtag_ps = '10128';
        }
    }
    if (JS_SITE.indexOf('portal') == 0) {
        taxtag_di = '812';
        taxtag_ps = '10274';
    }

    var diLookup = {
        'msn.co.nz': '239',
        'news.msn.co.nz': '13564',
        'sport.msn.co.nz': '13565',
        'lifestyle.msn.co.nz': '13566',
        'travel.msn.co.nz': '13567',
        'entertainment.msn.co.nz': '13568',
        'money.msn.co.nz': '13569',
        'recipefinder.msn.co.nz': '16451',
        'health.msn.co.nz': '16453',
        'msn.seek.co.nz': '16454',
        'www.hoyts.co.nz': '16456',
        'restaurantfinder.msn.co.nz': '16972',
        'premier.ticketek.co.nz': '16457',
        'msn.ticketek.co.nz': '16457'
    };

    //mostly used by NZ MSN
    if (diLookup[window.location.hostname])
        taxtag_di = diLookup[window.location.hostname];

    ninemsn.tracking.udc.getInstance().trackPage(taxtag_di, taxtag_pi, taxtag_ps, document.title);
})();
