if (typeof String.prototype.match2 === 'undefined') {
    String.prototype.match2 = function(re) {
        return this.match(re) || [];
    };
}
function TagTracker() {
    this.AddProvider = function(name) {
        this.Providers[name] = eval('new tt' + name + 'Provider()');
        this.Providers[name].TagTracker = this;
        var forms = document.getElementsByTagName("form");
        for (var f = 0; f < forms.length; f++) {
            if (forms[f].addEventListener) {
                forms[f].addEventListener("change", this.Providers[name].FormChangeHandler, false);
            } else if (forms[f].attachEvent) {
                var eltags = ["input", "select"];
                for (var t = 0; t < eltags.length; t++) {
                    var els = forms[f].getElementsByTagName(eltags[t]);
                    for (var e = 0; e < els.length; e++) {
                        els[e].attachEvent("onchange", this.Providers[name].FormChangeHandler);
                    }
                }
            }
        }
        return this.Providers[name];
    };
    this.pageGenericName = '';
    this.siteSection = '';
    this.Country = '';
    this.Language = '';
    this.Template = '';
    this.Flags = eval("new Object({" + (flags = (document.cookie + document.location.search).match2(/crm([a-z]*)=(on|off)/ig)).join(",").replace(/=on/ig, ":true").replace(/=off/ig, ":false") + "})");
    for (var flag in flags) {
        if (typeof(flags[flag]) != 'function') {
            document.cookie = flags[flag];
        }
    }
    this.DebugBuffer = "";
    this.TrackingCode = document.location.host.split(".").slice(1).join("");
    if (this.TrackingCode.substr(0, 2) == '93' || this.TrackingCode.indexOf('ristechnet') != -1) {
        this.TrackingCode = 'infinitirudev';
    }
    if (this.TrackingCode.indexOf('ticalma') != -1) {
        this.TrackingCode = 'infiniti-mecomdev';
    }
    switch (this.TrackingCode) {
    case "infiniticomes":
        this.TrackingCode = "infiniticarses";
        break;
    case "infinitieuropecom":
        this.TrackingCode = "infinitieu";
        break;
    case "infinitibulgariacom":
        this.TrackingCode = "infinitibgbg";
        break;
    case "infiniticentrumpl":
        this.TrackingCode = "infiniticarspl";
        break;
    }
    this.getSearchQuery = function() {
        return document.getElementById("q") ? document.getElementById("q").innerHTML: "";
    };
    this.DocumentLocation = '';
    this.Providers = new Object();
    this.AddProvider("CookiePush");
    this.model = '';
    this.pageSelectors = new Array();
    this.pageEvents = new Array();
    this.parseToolType = function(barepage, heirarchy, selectors, sectionSuffix) {
        switch (this.ToolType) {
        case 'RequestBrochure':
            switch (selectors[0]) {
            case 'submitform':
                this.pageGenericName = "2_" + this.pageName;
                this.pageName = this.pageGenericName.replace("brochure", selectors[2].replace("both", "bothbrochure"));
                break;
            case 'thankyou':
                this.pageGenericName = "3_" + this.pageName;
                this.pageName = this.pageGenericName.replace("brochure", selectors[2].replace("both", "bothbrochure"));
                break;
            default:
                this.pageGenericName = '1_' + this.pageName;
                this.pageName = this.pageGenericName;
                break;
            }
            break;
        case 'Handraiser':
        case 'ContactUs':
            switch (selectors[0]) {
            case 'thankyou':
            case 'submitform':
            case 'confirm':
                this.pageGenericName = '2_' + this.pageName;
                this.pageName = this.pageGenericName;
                break;
            default:
                this.pageGenericName = '1_' + this.pageName;
                this.pageName = this.pageGenericName;
            }
            break;
        case 'Quote':
            switch (selectors[0]) {
            case 'model':
            case 'selecttrim':
                this.pageGenericName = '2_' + this.pageName;
                this.pageName = this.pageGenericName + "_" + this.model;
                break;
            case 'colors':
            case 'selectcolor':
                this.pageGenericName = '3_' + this.pageName;
                this.pageName = this.pageGenericName + "_" + this.model;
                break;
            case 'options':
            case 'selectoptions':
            case 'selectpaos':
                this.pageGenericName = '4_' + this.pageName;
                this.pageName = this.pageGenericName + "_" + this.model;
                break;
            case 'summary':
                this.pageGenericName = '4b_' + this.pageName;
                this.pageName = this.pageGenericName + "_" + this.model;
                break;
            case 'submitform':
                this.pageGenericName = '5_' + this.pageName;
                this.pageName = this.pageGenericName + "_" + this.model;
                this.siteSection = (this.ToolType).toLowerCase() + "_form";
                break;
            case 'confirm':
            case 'thankyou':
                this.pageGenericName = '6_' + this.pageName;
                this.pageName = this.pageGenericName + "_" + this.model;
                this.siteSection = (this.ToolType).toLowerCase() + "_" + selectors[0];
                break;
            default:
                if (selectors.length == 0) {
                    this.siteSection = this.pageName;
                    this.pageName = '1_' + this.pageName + "_vehicle";
                } else {
                    this.siteSection = heirarchy[heirarchy.length - 1];
                }
                break;
            }
            break;
        default:
            this.pageName = (heirarchy.length > 1 ? heirarchy.slice(1).join("_") + "_": "") + barepage;
            if (this.pageName == "home") {
                this.pageName = heirarchy[0] + sectionSuffix + "_home";
            }
            this.pageGenericName = this.pageName;
            this.siteSection = heirarchy[0] + sectionSuffix;
            break;
        }
    };
    this.Parse = function(url) {
        this.pageName = "";
        this.pageGenericName = "";
        this.siteSection = "";
        this.model = "";
        url = url.toLowerCase();
        this.DocumentLocation = url;
        var fullpage = url;
        var heirarchy = fullpage.split('/');
        if (heirarchy.length > 1) {
            heirarchy.shift();
        }
        if (heirarchy[0] == 'author') {
            this.author = true;
            heirarchy.shift();
        }
        if (heirarchy[0] == 'secure') {
            this.secure = true;
            heirarchy.shift();
        }
        if (heirarchy[0] == 'publish') {
            this.publish = true;
            heirarchy.shift();
        }
        // mod
        if (heirarchy[0] == this.Country && !this.author) {
            this.publish = true;
        }
        // mod
        if ((this.author || this.publish) && heirarchy[0] == 'content') {
            heirarchy.shift();
        }
        if (this.author || this.publish) {
            this.Country = heirarchy[0];
            heirarchy.shift();
            this.Language = heirarchy[0];
            heirarchy.shift();
        }
        if (this.Language == heirarchy[0]) {
            heirarchy.shift();
        }
        if (heirarchy[0] == 'homepage') {
            heirarchy.shift();
        }
        var page = "homepage";
        if (heirarchy.length > 0) {
            if (heirarchy[heirarchy.length - 1] == 'index.html') {
                heirarchy.pop();
            }
            if (heirarchy[heirarchy.length - 1].indexOf(".") != -1) {
                page = heirarchy.pop();
            }
            if (heirarchy.length == 0) {
                heirarchy.push("");
            }
        }
        this.ShortDocumentLocation = heirarchy.join("/") + "/" + page.split(".")[0];
        var selectors = page.split('.');
        if (selectors[selectors.length - 1] == 'html' || selectors[selectors.length - 1] == '') {
            selectors.pop();
        }
        barepage = selectors.shift();
        if (this.barepageName) {
            barepage = this.barepageName;
        }
        if ((heirarchy.length == 0 || heirarchy[0].length == 0) && this.Template == "Model") {
            if (heirarchy.length == 0) {
                heirarchy.push(barepage);
            } else {
                heirarchy[0] = barepage;
            }
            barepage = "home";
        }
        switch (heirarchy[0]) {
        case 'home':
            barepage = 'homepage';
        case '':
            this.pageName = barepage;
            this.pageGenericName = barepage;
            this.siteSection = barepage;
            break;
        case 'global':
        case 'error':
        case 'about':
        case 'aboutinfiniti':
        case 'current_offers':
        case 'Finance':
        case 'finance':
        case 'financing':
        case 'finance_glossary':
        case 'meetinfiniti':
        case 'meetinfinitigeneric':
        case 'owners':
        case 'ownership':
        case 'infiniti_centres':
        case 'dealer':
        case 'dealers':
        case 'service_program':
        case 'pricing':
            this.pageName = (heirarchy.length > 1 ? heirarchy.slice(1).join("_") + "_": "") + barepage;
            
            if (heirarchy[0] == "pricing" || heirarchy[0] == "service_program") {
                this.pageName = page.split(".")[0] + "_" + barepage;
            }
            
            if (this.pageName == "home") {
                this.pageName = heirarchy[0] + "_home";
            }
            this.pageGenericName = this.pageName;
            this.siteSection = heirarchy[0];
            this.parseToolType(barepage, heirarchy, selectors, "");
            break;
        case 'flash':
        case 'css':
        case 'js':
        case 'img':
            this.pageName = '';
            this.pageGenericName = '';
            this.siteSection = 'DISALLOWED';
            break;
        case 'shopping_tools':
            if (selectors.length > 1) {
                this.model = selectors[1].toLowerCase();
                if ("brochure,secondbrochure".indexOf(this.model) != -1) {
                    this.model = selectors.length > 2 ? selectors[2] : "";
                }
                if ("requesttype".indexOf(this.model) != -1) {
                    this.model = "";
                }
                if (this.model.length == 1) {
                    this.model += "_sedan";
                }
            }
            this.siteSection = barepage;
            this.pageName = barepage + (selectors.length > 0 ? "_" + selectors[0] : "");
            this.pageGenericName = barepage + (selectors.length > 0 ? "_" + selectors[0] : "");
            this.parseToolType(barepage, heirarchy, selectors, "");
            break;
        default:
            switch (this.Template) {
            case 'Model':
                this.siteSection = heirarchy[0];
                this.siteSection = this.siteSection.replace(/[0-9]*/ig, "");
                if (this.siteSection.length < 2) {
                    this.siteSection += '_sedan';
                }
                this.pageName = (heirarchy.length > 0 ? heirarchy.join("_") + "_": "") + barepage;
                this.pageGenericName = 'mdl' + '_' + (heirarchy.length > 1 ? heirarchy.slice(1).join("_") + "_": "") + barepage;
                this.model = this.siteSection;
                break;
            default:
                this.parseToolType(barepage, heirarchy, selectors, "_micro");
                break;
            }
            break;
        }
        this.siteSection = this.siteSection.replace(/-/ig, "_");
        this.model = this.model.replace(/-/ig, "_");
    };
    this.Collect = function() {
        for (var provider in this.Providers) {
            if (typeof(this.Providers[provider]) != 'function') {
                if (typeof(this.Providers[provider].Collect) == 'function') {
                    this.Providers[provider].Collect();
                }
            }
        }
        return true;
    };
    this.Push = function() {
        for (var provider in this.Providers) {
            if (typeof(this.Providers[provider]) != 'function') {
                if (typeof(this.Providers[provider].Push) == 'function') {
                    this.Providers[provider].Push();
                }
            }
        }
        if (this.Flags && this.Flags.crmdebug) {
            alert(document.location.href + "\n" + this.DebugBuffer);
        }
        if (this.Flags && this.Flags.crmaudit) {
            var audits = document.createElement("audits");
            var audit = document.createElement("audit");
            audit.innerHTML = new Date().toString() + "|" + document.location.href + "|" + this.AuditBuffer;
            audits.appendChild(audit);
            document.body.appendChild(audits);
        }
        this.DebugBuffer = "";
        return true;
    };
    this.FlashTag = function(opt) {
        if (typeof(opt) == "string") {
            opt = {
                pageName: opt
            };
        }
        var pageName = this.pageName;
        if (opt["addToPageName"]) {
            opt.pageName = pageName + opt.pageName;
            opt.addToPageName = null;
        }
        for (var o in opt) {
            if (opt[o] != null) tt[o] = opt[o];
        }
        this.Collect();
        this.Push();
        this.pageName = pageName;
    };
    this.FormError = function(formName, error) {
        for (var provider in this.Providers) {
            if (typeof(this.Providers[provider]) != 'function') {
                if (typeof(this.Providers[provider].FormError) == 'function') {
                    this.Providers[provider].FormError(formName, error);
                }
            }
        }
    };
    this.FormSubmit = function(formName) {
        for (var provider in this.Providers) {
            if (typeof(this.Providers[provider]) != 'function') {
                if (typeof(this.Providers[provider].FormSubmit) == 'function') {
                    this.Providers[provider].FormSubmit(formName);
                }
            }
        }
    };
};
function ttProvider(name) {
    this.providerName = name;
    this.Elements = new Array();
}
function ttCookiePushProvider(provider) {
    this.providerName = 'CookiePush';
    this.formName = '';
    this.mediacodes = {};
    this.Collect = function() {
        var qs = document.location.search;
        var qsa = qs.split("&");
        for (var i = 0; i < qsa.length; i++) {
            var kv = qsa[i].split("=");
            switch (kv[0]) {
            case 'site':
            case 'area':
            case 'creative':
                this.mediacodes[kv[0]] = kv[1];
                break;
            }
        }
    };
    this.Push = function() {
        if (this.mediacodes != {}) {
            var mcodes = new Array();
            for (var mc in this.mediacodes) {
                mcodes.push(mc + "=" + this.mediacodes[mc]);
            }
            if (mcodes.length > 0) {
                document.cookie = "mediacodes=" + mcodes.join("&") + ";path=/";
            }
        }
    };
    this.FormChangeHandler = function() {};
}
CRMInitialize();