/*
 * Dealer.com Tracker - Page view tracking for CMS Classic and v8
 * Refactored Nov.2007
 */
(function () {

window.DDC = window.DDC || {};
window.views = window.views || [];
window.randomVideo = window.randomVideo || false;

/* scoped variables */
var notSupported = '0';
var supported = '1';
var kvJavascriptEnabled = '4';
var kvCookiesEnabled = '5';
var kvReferrer = '10';
var kvSessionReferrer = '11';
var kvHostName = '20';
var kvPathName = '21';
var kvSearch = '22';
var kvHash = '23';
var kvHeight = '30';
var kvWidth = '31';
var kvAvailHeight = '32';
var kvAvailWidth = '33';
var kvColorDepth = '34';
var kvLanguage = '35';
var kvFlashVersion = '40';
var kvSessionId = '50';
var kvContactId = '51';
var kvPortalId = '52';
var kvSemId = '53';
var kvLocale = '54';
var kvRemoteHost = '55';
var semReachLocalCookie = '57';
var semRegionId = '58';
var semKeywordId = '59';
var kvViewType = '62';
var kvExtraMappingId = '63';
var kvEnabledAttributes = '70';
var kvTcdkwid = '56';
var kvTcdcmpid = '60';
var kvTcdadid = '61';
var kvPlatform = '80';
var kvVersion = '81';
var kvSkin = '82';
var kvTemplateExtra = '83';
var roundDownToNearest = 25;
var allowsCookies = '';
var randomVideoEnabledId = '1';

/* singleton class */
DDC.Tracker = {
	VEHICLE_VIEW: 5,
	QF4_VIEW: 6,
	FORM_VIEW: 7,
	FORM_SUBMIT: 8,
	QF3_VIEW: 9,
	PAGE_VIEW: 10,
	EDMUNDS_CONFIGURATOR_VIEW: 12,
	EVENT_VIEW: 13,

	deployed: false,

	deploy: function () { DDC.Tracker.deployed = true; },

	checkIfSupportsCookies: function () {
        var cookieEnabled = (navigator.cookieEnabled ? supported : notSupported);
        if ((typeof navigator.cookieEnabled == 'undefined') && !cookieEnabled) {
            var tempCookieName = 'testcookie';
            document.cookie = 'name=' + tempCookieName;
            if (document.cookie.indexOf('testcookie') != -1) {
                cookieEnabled = supported;
                document.cookie = 'name=' + tempCookieName + '; expires=' + new Date().getTime() - 1;
            } else {
                cookieEnabled = notSupported;
            }
        }
		return cookieEnabled;
    },

	performFlashEvaluation: function () {
        var version = notSupported;
        if (navigator.plugins && (navigator.plugins.length > 0)) {
            if (navigator.plugins['Shockwave Flash']) {
                version = navigator.plugins['Shockwave Flash'].description.replace(/Shockwave Flash(\s*)/, '');
			}
		} else {
            var currentMaxFlashVersion = 10;
            var found = false;
            for (var i = currentMaxFlashVersion; i > 0 && !found; i--) {
                try {
                    var flash = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i);
                    if (flash) {
                        found = true;
                        version = i + '.0';
                    }
                } catch(e) {}
            }
        }
        return version;
    },

	availableHeightWidthRounding: function (roundTo) {
        var str = '';
        var availHeight;
        var availWidth;

        if (window.top != window.self) {
            availHeight = window.top.screen.availHeight;
            availWidth = window.top.screen.availWidth;
        } else {
            availHeight = screen.availHeight;
            availWidth = screen.availWidth;
		}

        var heightRemainder = availHeight % roundTo;
        var widthRemainder = availWidth % roundTo;

        if (heightRemainder == 0) {
            str += DDC.Tracker.getKeyValueString(kvAvailHeight, availHeight);
		} else {
            str += DDC.Tracker.getKeyValueString(kvAvailHeight, (availHeight - heightRemainder));
		}

		if (widthRemainder == 0) {
            str += DDC.Tracker.getKeyValueString(kvAvailWidth, availWidth);
		} else {
            str += DDC.Tracker.getKeyValueString(kvAvailWidth, (availWidth - widthRemainder));
		}

		return str;
    },

    getEnabledAttributes: function () {
        var enabledAttributesString = '';
        if( randomVideo == 'true') {
			enabledAttributesString += randomVideoEnabledId;
		}
		return enabledAttributesString;
    },

	getKeyValueString: function (key, value) { return '&' + key + '=' + value; },

    getViewTypeAndId: function (type, id, i) {
		var kvt = kvViewType + '-' + i;
		return DDC.Tracker.getKeyValueString(kvt, type) + DDC.Tracker.getKeyValueString(kvExtraMappingId + '-' + i, escape(id));
	},

	requestImage: function (str) {
		var rImg = new Image();
		rImg.src = "http://hits.dealer.com/clear.gif?" + str;
		return rImg;
	},

	track: function (viewType, viewExtra, callback) {
        var str = '';
        str += DDC.Tracker.getKeyValueString(kvJavascriptEnabled, supported);
        str += DDC.Tracker.getKeyValueString(kvCookiesEnabled, DDC.Tracker.checkIfSupportsCookies());

        var referrer = document.referrer;
        var hostName = location.hostname;
        var pathName = location.pathname;
        var search = location.search;
        var hash = location.hash;

		if (typeof callback != 'function') {
			callback = function () {};
		}

		try {
            if ((top.document.location == document.referrer) || ((document.referrer == '') && (top.document.location != ''))) {
                referrer = top.document.referrer;
                hostName = top.document.location.hostname;
                pathName = top.document.location.pathname;
                search = top.document.location.search;
                hash = top.document.location.hash;
            }
        } catch(e) {}

        str += DDC.Tracker.getKeyValueString(kvReferrer, escape(referrer));
        str += DDC.Tracker.getKeyValueString(kvHostName, hostName);
        str += DDC.Tracker.getKeyValueString(kvPathName, escape(pathName));
        str += DDC.Tracker.getKeyValueString(kvSearch, escape(search));
        str += DDC.Tracker.getKeyValueString(kvHash, escape(hash));

        if (parseInt(navigator.appVersion.charAt(0)) > 3) {
            var height;
            var width;
            var colorDepth;
            try {
                if (window.top != window.self) {
                    height = window.top.screen.height;
                    width = window.top.screen.width;
                    colorDepth = window.top.screen.colorDepth;
                } else {
                    height = screen.height;
                    width = screen.width;
                    colorDepth = screen.colorDepth;
                }
                str += DDC.Tracker.getKeyValueString(kvHeight, height);
                str += DDC.Tracker.getKeyValueString(kvWidth, width);
                str += DDC.Tracker.availableHeightWidthRounding(roundDownToNearest);
                str += DDC.Tracker.getKeyValueString(kvColorDepth, colorDepth);
            } catch(e) {}//catch for framed in sites
        }

        if (navigator.language) {
            str += DDC.Tracker.getKeyValueString(kvLanguage, escape(navigator.language));
		} else {
            str += DDC.Tracker.getKeyValueString(kvLanguage, escape(navigator.userLanguage));
		}

		str += DDC.Tracker.getKeyValueString(kvFlashVersion, escape(DDC.Tracker.performFlashEvaluation()));

		if (views.length > 0) {
	        str += DDC.Tracker.getKeyValueString(kvSessionId, views[0].session);
	        str += DDC.Tracker.getKeyValueString(kvContactId, views[0].contact);
	        str += DDC.Tracker.getKeyValueString(kvPortalId, views[0].portal);
	        str += DDC.Tracker.getKeyValueString(kvSemId, views[0].sem);
	        str += DDC.Tracker.getKeyValueString(kvLocale, views[0].locality);
	        str += DDC.Tracker.getKeyValueString(kvRemoteHost, views[0].host);
	        str += DDC.Tracker.getKeyValueString(semReachLocalCookie, escape(views[0].rlCookie));
	        str += DDC.Tracker.getKeyValueString(semRegionId, views[0].region);
	        str += DDC.Tracker.getKeyValueString(semKeywordId, views[0].keyword);
	        str += DDC.Tracker.getKeyValueString(kvSessionReferrer, escape(views[0].sessionReferrer));
			str += DDC.Tracker.getKeyValueString(kvTcdkwid, escape(views[0].tcdkwid));
			str += DDC.Tracker.getKeyValueString(kvTcdcmpid, escape(views[0].tcdcmpid));
			str += DDC.Tracker.getKeyValueString(kvTcdadid, escape(views[0].tcdadid));
			str += DDC.Tracker.getKeyValueString(kvPlatform, escape(views[0].platform));
			str += DDC.Tracker.getKeyValueString(kvVersion, escape(views[0].version));
			str += DDC.Tracker.getKeyValueString(kvSkin, escape(views[0].skin));
			str += DDC.Tracker.getKeyValueString(kvTemplateExtra, escape(views[0].templateExtra));
		}

        if (viewType != null && viewExtra != null) {
            str += DDC.Tracker.getViewTypeAndId(viewType, viewExtra, 0);
		} else {
            for (var i = 0; i < views.length; i++) {
                str += DDC.Tracker.getViewTypeAndId(views[i].type, views[i].extra, i);
			}
		}

		str += DDC.Tracker.getKeyValueString(kvEnabledAttributes, DDC.Tracker.getEnabledAttributes());

		if (DDC.Tracker.deployed) {
			var finished = false;
	        var trackerImage = DDC.Tracker.requestImage(str);

			trackerImage.onload = trackerImage.onreadystatechange = function () {
				if (!finished && (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete')) {
					finished = true;
					callback();
				}
			};
		}
    }
};

})();