BrowserMap.forwardRequest = function()

in src/main/js/bmap.js [358:486]


    BrowserMap.forwardRequest = function () {
        var currentURL = window.location.href,
            deviceOverride = BrowserMapUtil.Url.getValueForParameter(currentURL, deviceOverrideParameter),
            detectedDeviceGroups = [],
            urlSelectors = [],
            oCookie = BrowserMapUtil.CookieManager.getCookie('o_' + cookiePrefix + deviceGroupCookieName),
            cookie = BrowserMapUtil.CookieManager.getCookie(cookiePrefix + deviceGroupCookieName),
            dgs = [],
            i,
            g,
            registeredDeviceGroups,
            dgName,
            domain,
            aTags,
            url,
            parameters,
            newURL,
            canonicalURL = BrowserMapUtil.Url.getCanonicalURL();
        if (BrowserMap.isEnabled()) {
            languageOverride = BrowserMapUtil.Url.getValueForParameter(currentURL, languageOverrideParameter);
            if (deviceOverride) {
                // override detected
                detectedDeviceGroups = deviceOverride.split(',');
                if (detectedDeviceGroups.length > 0) {
                    if (BrowserMapUtil.CookieManager.cookiesEnabled()) {
                        if (!oCookie && !cookie) {
                            // tried to access resource directly with override parameter without passing through detection
                            // run detection code to detect the original device groups
                            oCookie = new Cookie();
                            oCookie.name = 'o_' + cookiePrefix + deviceGroupCookieName;
                            oCookie.path = '/';
                            BrowserMap.matchDeviceGroups();
                            for (g in matchedDeviceGroups) {
                                if (matchedDeviceGroups.hasOwnProperty(g)) {
                                    dgs.push(matchedDeviceGroups[g].name);
                                }
                            }
                            if (deviceOverride !== dgs.join(',')) {
                                oCookie.value = dgs.join(',');
                                BrowserMapUtil.CookieManager.setCookie(oCookie);
                            }
                        }
                        else if (!oCookie) {
                            // detection has been performed; override detected; store original values
                            if (cookie.value !== detectedDeviceGroups.join(',')) {
                                cookie.name = 'o_' + cookie.name;
                                cookie.path = '/';
                                BrowserMapUtil.CookieManager.setCookie(cookie);
                            }
                        }
                        // store the override
                        cookie = new Cookie();
                        cookie.name = cookiePrefix + deviceGroupCookieName;
                        cookie.value = detectedDeviceGroups.join(',');
                        cookie.path = '/';
                        BrowserMapUtil.CookieManager.setCookie(cookie);
                        if (oCookie) {
                            if (oCookie.value == cookie.value) {
                                BrowserMapUtil.CookieManager.removeCookie(oCookie.name);
                            }
                        }
                    }
                }
            }
            if (cookie !== null || deviceOverride) {
                /**
                 * cookie was either set by the detection code before, or we have an override;
                 *
                 * in either case, the matchDeviceGroups must match the detectedDeviceGroups which can come from the cookie or from the
                 * override parameter
                 */
                registeredDeviceGroups = BrowserMap.getDeviceGroups();
                if (detectedDeviceGroups.length === 0) {
                    detectedDeviceGroups = cookie.value.split(',');
                }
                matchedDeviceGroups = { };
                for (i = 0 ; i < detectedDeviceGroups.length; i++) {
                    dgName = detectedDeviceGroups[i].trim();
                    if (registeredDeviceGroups.hasOwnProperty(dgName)) {
                        if (registeredDeviceGroups[dgName].isSelector) {
                            urlSelectors.push(dgName);
                        }
                        matchedDeviceGroups[dgName] = registeredDeviceGroups[dgName];
                    }
                }
                // add the device override parameter to links using the same domain if a device override was detected
                if (deviceOverride && cookie === null && enableForwardingWhenCookiesDisabled) {
                    domain = BrowserMapUtil.Url.getDomainFromURL(window.location.href);
                    aTags = document.getElementsByTagName('a');
                    for (i = 0; i < aTags.length; i++) {
                        url = aTags[i].href;
                        if (url && url.indexOf(domain) !== -1) {
                            parameters = BrowserMapUtil.Url.getURLParametersString(url);
                            if (parameters) {
                                if (parameters.indexOf(languageOverrideParameter + '=' + deviceOverride) == -1) {
                                    aTags[i].href = url + '&' + deviceOverrideParameter + '=' + deviceOverride;
                                }
                            }
                            else {
                                aTags[i].href = url + '?' + deviceOverrideParameter + '=' + deviceOverride;
                            }
                        }
                    }
                }
            }
            else {
                // no override has been detected, nor a cookie has been set previous to this call
                // perform the match and then set the cookie
                BrowserMap.matchDeviceGroups();
                for (g in matchedDeviceGroups) {
                    if (matchedDeviceGroups.hasOwnProperty(g)) {
                        if (matchedDeviceGroups[g].isSelector) {
                            urlSelectors.push(matchedDeviceGroups[g].name);
                        }
                        detectedDeviceGroups.push(matchedDeviceGroups[g].name);
                    }
                }
                cookie = new Cookie();
                cookie.name = cookiePrefix + deviceGroupCookieName;
                cookie.value = detectedDeviceGroups.join(',');
                cookie.path = '/';
                BrowserMapUtil.CookieManager.setCookie(cookie);
            }
            newURL = BrowserMap.getNewURL(currentURL, detectedDeviceGroups, urlSelectors);
            if (currentURL !== newURL && canonicalURL !== newURL) {
                window.location = newURL;
            }
        }
    };