/*! * Piwik - free/libre analytics platform * * @link http://piwik.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ var Piwik_Overlay = (function () { var $body, $iframe, $sidebar, $main, $location, $loading, $errorNotLoading; var $rowEvolutionLink, $transitionsLink, $fullScreenLink, $visitorLogLink; var idSite, period, date, segment; var iframeSrcBase; var iframeDomain = ''; var iframeCurrentPage = ''; var iframeCurrentPageNormalized = ''; var iframeCurrentActionLabel = ''; var updateComesFromInsideFrame = false; /** Load the sidebar for a url */ function loadSidebar(currentUrl) { showLoading(); $location.html(' ').unbind('mouseenter').unbind('mouseleave'); iframeCurrentPage = currentUrl; iframeDomain = currentUrl.match(/http(s)?:\/\/(www\.)?([^\/]*)/i)[3]; var params = { module: 'Overlay', action: 'renderSidebar', currentUrl: currentUrl }; if (segment) { params.segment = segment; } globalAjaxQueue.abort(); var ajaxRequest = new ajaxHelper(); ajaxRequest.addParams(params, 'get'); ajaxRequest.setCallback( function (response) { hideLoading(); var $response = $(response); var $responseLocation = $response.find('.overlayLocation'); var $url = $responseLocation.find('span'); iframeCurrentPageNormalized = $url.data('normalizedUrl'); iframeCurrentActionLabel = $url.data('label'); $url.html(piwikHelper.addBreakpointsToUrl($url.text())); $location.html($responseLocation.html()).show(); $responseLocation.remove(); var $locationSpan = $location.find('span'); $locationSpan.html(piwikHelper.addBreakpointsToUrl($locationSpan.text())); if (iframeDomain) { // use addBreakpointsToUrl because it also encoded html entities $locationSpan.tooltip({ track: true, items: '*', tooltipClass: 'overlayTooltip', content: '' + Piwik_Overlay_Translations.domain + ': ' + piwikHelper.addBreakpointsToUrl(iframeDomain), show: false, hide: false }); } $sidebar.empty().append($response).show(); if ($sidebar.find('.overlayNoData').size() == 0) { $rowEvolutionLink.show(); $transitionsLink.show(); if ($('#segment').val()) { $visitorLogLink.show(); } } } ); ajaxRequest.setErrorCallback(function () { hideLoading(); $errorNotLoading.show(); }); ajaxRequest.setFormat('html'); ajaxRequest.send(false); } /** Adjust the dimensions of the iframe */ function adjustDimensions() { $iframe.height($(window).height()); $iframe.width($body.width() - $iframe.offset().left - 2); // -2 because of 2px border } /** Display the loading message and hide other containers */ function showLoading() { $loading.show(); $sidebar.hide(); $location.hide(); $fullScreenLink.hide(); $rowEvolutionLink.hide(); $transitionsLink.hide(); $visitorLogLink.hide(); $errorNotLoading.hide(); } /** Hide the loading message */ function hideLoading() { $loading.hide(); $fullScreenLink.show(); } function getOverlaySegment(url) { var location = broadcast.getParamValue('segment', url); // angular will encode the value again since it is added as the fragment path, not the fragment query parameter, // so we have to decode it again after getParamValue location = decodeURIComponent(location); return location; } function getOverlayLocationFromHash(urlHash) { var location = broadcast.getParamValue('l', urlHash); // angular will encode the value again since it is added as the fragment path, not the fragment query parameter, // so we have to decode it again after getParamValue location = decodeURIComponent(location); return location; } /** $.history callback for hash change */ function hashChangeCallback(urlHash) { var location = getOverlayLocationFromHash(urlHash); location = Overlay_Helper.decodeFrameUrl(location); if (!updateComesFromInsideFrame) { var iframeUrl = iframeSrcBase; if (location) { iframeUrl += '#' + location; } $iframe.attr('src', iframeUrl); showLoading(); } else { loadSidebar(location); } updateComesFromInsideFrame = false; } return { /** This method is called when Overlay loads */ init: function (iframeSrc, pIdSite, pPeriod, pDate, pSegment) { iframeSrcBase = iframeSrc; idSite = pIdSite; period = pPeriod; date = pDate; segment = pSegment; $body = $('body'); $iframe = $('#overlayIframe'); $sidebar = $('#overlaySidebar'); $location = $('#overlayLocation'); $main = $('#overlayMain'); $loading = $('#overlayLoading'); $errorNotLoading = $('#overlayErrorNotLoading'); $rowEvolutionLink = $('#overlayRowEvolution'); $transitionsLink = $('#overlayTransitions'); $fullScreenLink = $('#overlayFullScreen'); $visitorLogLink = $('#overlaySegmentedVisitorLog'); adjustDimensions(); showLoading(); // apply initial dimensions window.setTimeout(function () { adjustDimensions(); }, 50); // handle window resize // we manipulate broadcast.pageload because it unbinds all resize events on window var originalPageload = broadcast.pageload; broadcast.pageload = function (hash) { originalPageload(hash); $(window).resize(function () { adjustDimensions(); }); }; $(window).resize(function () { adjustDimensions(); }); // handle hash change broadcast.loadAjaxContent = hashChangeCallback; broadcast._isInit = false; broadcast.init(); if (window.location.href.split('#').length == 1) { // if there's no hash, broadcast won't trigger the callback - we have to do it here hashChangeCallback(''); } // handle date selection var $select = $('select#overlayDateRangeSelect').change(function () { var parts = $(this).val().split(';'); if (parts.length == 2) { period = parts[0]; date = parts[1]; window.location.href = Overlay_Helper.getOverlayLink(idSite, period, date, segment, iframeCurrentPage); } }); var optionMatchFound = false; $select.find('option').each(function () { if ($(this).val() == period + ';' + date) { $(this).prop('selected', true); optionMatchFound = true; } }); if (!optionMatchFound) { $select.prepend('