questlab/www/analytics/plugins/Overlay/javascripts/Piwik_Overlay.js
coderkun 046a724272 merge
2015-04-27 16:42:05 +02:00

252 lines
No EOL
8.5 KiB
JavaScript

/*!
* Piwik - Web Analytics
*
* @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;
var idSite, period, date;
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];
globalAjaxQueue.abort();
var ajaxRequest = new ajaxHelper();
ajaxRequest.addParams({
module: 'Overlay',
action: 'renderSidebar',
currentUrl: currentUrl
}, 'get');
ajaxRequest.setCallback(
function (response) {
hideLoading();
var $response = $(response);
var $responseLocation = $response.find('.Overlay_Location');
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: 'Overlay_Tooltip',
content: '<strong>' + Piwik_Overlay_Translations.domain + ':</strong> ' +
piwikHelper.addBreakpointsToUrl(iframeDomain),
show: false,
hide: false
});
}
$sidebar.empty().append($response).show();
if ($sidebar.find('.Overlay_NoData').size() == 0) {
$rowEvolutionLink.show();
$transitionsLink.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();
$errorNotLoading.hide();
}
/** Hide the loading message */
function hideLoading() {
$loading.hide();
$fullScreenLink.show();
}
/** $.history callback for hash change */
function hashChangeCallback(urlHash) {
var location = broadcast.getParamValue('l', 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) {
iframeSrcBase = iframeSrc;
idSite = pIdSite;
period = pPeriod;
date = pDate;
$body = $('body');
$iframe = $('#Overlay_Iframe');
$sidebar = $('#Overlay_Sidebar');
$location = $('#Overlay_Location');
$main = $('#Overlay_Main');
$loading = $('#Overlay_Loading');
$errorNotLoading = $('#Overlay_Error_NotLoading');
$rowEvolutionLink = $('#Overlay_RowEvolution');
$transitionsLink = $('#Overlay_Transitions');
$fullScreenLink = $('#Overlay_FullScreen');
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.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#Overlay_DateRangeSelect').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, iframeCurrentPage);
}
});
var optionMatchFound = false;
$select.find('option').each(function () {
if ($(this).val() == period + ';' + date) {
$(this).prop('selected', true);
optionMatchFound = true;
}
});
if (!optionMatchFound) {
$select.prepend('<option selected="selected">');
}
// handle transitions link
$transitionsLink.click(function () {
DataTable_RowActions_Transitions.launchForUrl(iframeCurrentPageNormalized);
return false;
});
// handle row evolution link
$rowEvolutionLink.click(function () {
DataTable_RowActions_RowEvolution.launch('Actions.getPageUrls', iframeCurrentActionLabel);
return false;
});
// handle full screen link
$fullScreenLink.click(function () {
var href = iframeSrcBase;
if (iframeCurrentPage) {
href += '#' + iframeCurrentPage.replace(/#/g, '%23');
}
window.location.href = href;
return false;
});
},
/** This callback is used from within the iframe */
setCurrentUrl: function (currentUrl) {
showLoading();
var locationParts = location.href.split('#');
var currentLocation = '';
if (locationParts.length > 1) {
currentLocation = broadcast.getParamValue('l', locationParts[1]);
}
var newLocation = Overlay_Helper.encodeFrameUrl(currentUrl);
if (newLocation != currentLocation) {
updateComesFromInsideFrame = true;
// put the current iframe url in the main url to enable refresh and deep linking.
// use disableHistory=true to make sure that the back and forward buttons can be
// used on the iframe (which in turn notifies the parent about the location change)
broadcast.propagateAjax('l=' + newLocation, true);
} else {
// happens when the url is changed by hand or when the l parameter is there on page load
loadSidebar(currentUrl);
}
}
};
})();