/*
 * CONFIDENTIAL AND PROPRIETARY
 * Copyright 2010 Silverpop Systems, Inc.  All rights reserved.
 * The contents of this material are confidential and proprietary to
 * Silverpop Systems, Inc. Unauthorized use, disclosure, or reproduction
 * is strictly prohibited.
 */

(function() {
    var version = 1.01,page = {},cookiespace = 'com.silverpop.iMA',metaspace = 'com.silverpop.',websyncTTL = 1000/*days*/,
            api = {path:'/WTS/'},d = document,l = location,n = navigator,w = window,onloadcallstack = [];

    w.ewt = w.ewt || {
        track : function() {
            http(endpoint() + $tx({
                session : session(false),
                eventName:arguments[0].name || 'n/a'
                },arguments[0].type));
            top.location = top.location + '#';
            return false;
        }
    };

    function pageview() {
        websyncBridge();
        page.args = pageargs();
        page.metas = metatags();
        page.websync = websync();
        page.pageName = pagename();
        http(endpoint() + $tx({
            session : session(true),
            webSync : page.websync
        },'pageview'));
    }

    function endpoint() {
        return port() + host() + api.path + 'event.jpeg?accesskey=' + pagekey() + '&v=' + version;
    }

    function port() {
        return (l.protocol && l.protocol.toString().toLowerCase() == 'https:') ? 'https://' : 'http://';
    }

    function host() {
        if (!w.ewt_host) {
            var js = d.getElementsByTagName('script');
            for (var i = 0; i < js.length; i++) {
                if ((js[i].src) && js[i].src.match(/iMAWebCookie\.js(\?.*)$/i)) {
                    w.ewt_host = js[i].src.split('&')[1].substr(2);
                    break;
                }
            }
        }

        return w.ewt_host;
    }

    function $tx(tx, type) {
        var _tx = {},
                query = (tx.session.isNew ? '&isNewSession=1' : '&isNewSession=0')+'&type='+type,
                isNewVisitor = (tx.webSync) ? (tx.webSync.isNew ? '1' : '0') : '';

        _tx.isNewVisitor = isNewVisitor;
        _tx.eventName = tx.eventName || '';
        _tx.sessionGUID = tx.session.uid;
        _tx.webSyncID = page.websync.uid;
        _tx.associatedWebSyncID = page.websync.associatedUID;
        _tx.url = d.URL;
        _tx.referringURL = d.referrer; //(d.referrer!='') ? d.referrer : 'n/a';
        _tx.gclid = page.args['gclid'] || '';
        _tx.hostname = l.hostname;
        _tx.pathname = l.pathname;
        _tx.pagename = page.pageName;
        _tx.gwkey = page.args['gwkey'] || '';
        _tx.spMailingID=page.args['spmailingid'] || '';
        _tx.spUserID=page.args['spuserid'] || '';
        _tx.spJobID=page.args['spjobid'] || '';
        _tx.spReportId=page.args['spreportid'] || '';
        query += querystring(_tx);
        return query;
    }

    function querystring(obj, prefix) {
        var q = '', _prefix = prefix ? prefix.toString() + '.' : '';
        for (var key in obj) {
            if (typeof obj[key] == 'string' && obj[key] != '') q += '&' + _prefix + key + '=' + encodeURIComponent(obj[key]);
        }
        return q;
    }

    function createCookie(c) {
        if (n && n.cookieEnabled) {
            var batter = c.name + "=" + c.uid + _ttl(c.ttl) +"; path=/";
            d.cookie = batter;
        }
    }

    function updateCookie(_name, _value, _expiry) {
        if (n && n.cookieEnabled) {
            var batter = cookiespace + _name + '=' + _value + _ttl(_expiry) +'; path=/';
            d.cookie = batter;
        }
    }

    function readCookie(_name) {
        var cookies = d.cookie ? d.cookie.split('; ') : [];
        var cookiename = cookiespace + _name;
        for (var i = 0; i < cookies.length; i++) {
            if (cookies[i].indexOf(cookiename) == 0) return cookies[i].split('=')[1];
        }
        return '';
    }

    function deleteCookie(_name) {
        var batter = {name:_name,uid:'',ttl:-1};
        createCookie(batter);
    }

    function _guid() {
        var g = '';//this.isNew=1;
        for (var i = 0; i < 32; i++) {
            g += Math.floor(Math.random() * 0xF).toString(0xF) + (i == 7 || i == 11 || i == 15 || i == 19 ? "-" : "")
        }
        return g;
    }

    function _ttl(ttl) {
        if (ttl) {
            var date = new Date();
            date.setTime(date.getTime() + (ttl * 24 * 60 * 60 * 1000));
            return "; expires=" + date.toGMTString();
        }
        else {
            return '';
        }
    }

    function http(uri) {
        var b = d.createElement('img');
        b.style.display = 'none';
        d.body.appendChild(b);
        b.src = uri;
    }

    function pagekey() {
        if (!w.ewt_page_key) {
            var js = d.getElementsByTagName('script');
            for (var i = 0; i < js.length; i++) {
                if ((js[i].src) && js[i].src.match(/iMAWebCookie\.js(\?.*)$/i)) {
                    var pagekey = js[i].src.split('?')[1];
                    w.ewt_page_key = pagekey.substr(0, pagekey.indexOf('&'));
                    break;
                }
            }
        }

        return (w.ewt_page_key) ? w.ewt_page_key : 'no-key';
    }

    function pageargs() {
        var h, args = {}, q = location.search.substring(1).split('&');
        for (var i = 0; i < q.length; i++) {
            h = q[i].split("=");
            args[h[0].toLowerCase()] = unescape(h[1]);
        }

        return args;
    }

    function pagename() {
        return page.args['vpagename'] || w.ewt_pagename || page.metas[metaspace + 'pagename'] || '';
    }

    function metatags() {
        var tags = {}, m = d.getElementsByTagName('meta');
        for (var i = 0; i < m.length; i++) {
            tags[m[i].name.toLowerCase()] = m[i].content;
        }
        return tags;
    }


    function websync() {
        var w = {
            uid:readCookie('WebCookie'),
            ttl:websyncTTL,
            name:cookiespace + 'WebCookie',
            isNew:false,
            associatedUID:''
        };

        var webSyncId = page.args['websyncid'];
        if (webSyncId != null) {
            if (w.uid != '')
                w.associatedUID = w.uid;
            w.uid = webSyncId;
        }

        if (w.uid == '') {
            //create websync guid & cookie:
            w.uid = _guid();
            createCookie(w);
            w.isNew = true;
        }
        else {
            //[just] extend cookie expiry:
            updateCookie('WebCookie', w.uid, w.ttl);
        }
        return w;
    }

    function websyncBridge() {
        var oVal = readCookie('WebCookie'), nVal = readCookie('.webSyncID');

        if (oVal != '' && nVal != '')//both exist, delete new
            deleteCookie(cookiespace + '.webSyncID');

        if (oVal == '' && nVal != '') {//only new exists, so rename (via create/delete)
            createCookie({uid:nVal,ttl:websyncTTL,name:cookiespace + 'WebCookie'});
            deleteCookie(cookiespace + '.webSyncID');
        }
    }

    function session(checkReferrer) {
        var s = {
            uid:readCookie('.session'),
            name:cookiespace + '.session',
            isNew:false
        };

        var sessionId = page.args['sessionguid'];
        if (sessionId != null) {
            s.uid = sessionId;
        }

        if (checkReferrer && s.uid != '' && d.referrer && d.referrer.length > 0) {
            var domains = getBrandedDomains();

            var startIndex = -1;
            var keepExistingSession = false;
            if (domains.length > 0 && (startIndex = d.referrer.indexOf("://")) > -1) {
                var href = d.referrer.toLowerCase();
                for (var i = 0; i < domains.length; i++) {
                    if (href.indexOf(domains[i].toLowerCase()) > 0) {
                        keepExistingSession = true;
                        break;
                    }
                }
            }

            if (!keepExistingSession) {
                s.uid = '';
            }
        }


        if (s.uid == '') {
            //create session guid & cookie:
            s.uid = _guid();
            createCookie(s);
            s.isNew = true;
        }
        else {
            //[just] extend cookie expiry:
            updateCookie('.session', s.uid);
        }
        return s;
    }

    function getBrandedDomains() {
        var metatags = document.getElementsByTagName("meta");
        for (var i = 0; i < metatags.length; i++) {
            if (! metatags[i].name.match(/^com\.silverpop\.(brandeddomains)$/i))
                continue;
            if (metatags[i].name.match(/^com\.silverpop\.brandeddomains$/i)) {
                var brandeddomains = metatags[i].content;
            }
        }

        // look for domains separated by comma
        var domainarray = [];
        if (brandeddomains)
            domainarray = brandeddomains.split(',');

        return domainarray;
    }

    function appendCookieToLinks() {
        var linkarray = document.getElementsByTagName("A");
        var param = 'webSyncID=' + page.websync.uid + "&sessionGUID=" + session(false).uid;
        var value = null;
        var keys = ["spMailingID", "spUserID",  "spJobID", "spReportId"];
        for (var i =0; i < keys.length; i++) {
            if ((value = page.args[keys[i].toLowerCase()]) != null) {
                param += "&" + keys[i] + "=" + value;
            }
        }

        var domainarray = getBrandedDomains();

        for (var i = 0; i < linkarray.length; i++) {
            var href = linkarray[i].href;
            var appendWebSyncID = false;

            if (href.indexOf("://" + w.ewt_host) > 0)
                appendWebSyncID = true;
            else {
                for (var x = 0; x < domainarray.length; x++) {
                    if (href.indexOf(domainarray[x]) > 0) {
                        appendWebSyncID = true;
                        break;
                    }
                }
            }

            if (appendWebSyncID) {
                if (href.indexOf("?") > 0)
                    linkarray[i].href += '&' + param;
                else
                    linkarray[i].href += '?' + param;
            }
        }
    }

    if (typeof w.onload == 'function') {
        onloadcallstack.push(w.onload);
    }

    onloadcallstack.push(pageview);
    onloadcallstack.push(appendCookieToLinks);
    w.onload = function() {
        for (var i = 0; i < onloadcallstack.length; i++) {
            onloadcallstack[i]();
        }
    };
})();
