/**
* ScrollFix
*
* Latest version on Github: https://github.com/Deesen/modxEvo_scrollFix/
*
* @category plugin
* @version 0.44
* @date 06.04.2016
* @author dh@fuseit.de
* @internal @description Offers several features to optimize workflow within Manager
* @internal @properties &scrollFix=ScrollFix;list;Enabled,Disabled;Disabled &fixTabHeader=Fix Tab-Header;list;Enabled,Disabled;Disabled &addToTopButton=Add ToTop-Button;list;Enabled,Disabled;Disabled &addToTopCustom=ToTop-Button Custom-CSS (replace semicolon by |);textarea;bottom:55px|right:40px|width:40px|height:40px|line-height:40px|font-size:20px|background-color:#89AD4A|color:#fff|border:1px solid #658F1A|border-radius:5px|border-bottom-left-radius:0px|border-bottom-right-radius:0px &addToTopLabel=ToTop-Button Custom-Label;text; &addToBottomButton=Add ToBottom-Button;list;Enabled,Disabled;Disabled &addToBottomCustom=ToBottom-Button Custom-CSS (replace semicolon by |);textarea;bottom:15px|right:40px|width:40px|height:40px|line-height:40px|font-size:20px|background-color:#89AD4A|color:#fff|border:1px solid #658F1A|border-radius:5px|border-top-left-radius:0px|border-top-right-radius:0px &addToBottomLabel=ToBottom-Button Custom-Label;text &extSaveButtons=Extend Save-Button;list;Enabled,Disabled;Disabled &alwaysStay=AlwaysStay;list;Enabled,Disabled;Disabled &rememberLastElements=Remember last Elements;list;Enabled,Disabled;Disabled &lastElementLinkColor=Last elements link-color;text;#66901B &jQueryCdn=Load jQuery from CDN (code.jquery.com);list;Enabled,Disabled;Disabled
* @internal @events OnManagerMainFrameHeaderHTMLBlock
* @internal @legacy_names ScrollFix
**/
$scrollFix = isset( $scrollFix ) ? $scrollFix : 'Disabled';
$fixTabHeader = isset( $fixTabHeader ) ? $fixTabHeader : 'Disabled';
$addToTopButton = isset( $addToTopButton ) ? $addToTopButton : 'Disabled';
$addToBottomButton = isset( $addToBottomButton ) ? $addToBottomButton : 'Disabled';
$addToTopCustom = isset( $addToTopCustom ) ? $addToTopCustom : 'bottom:55px|right:40px|width:40px|height:40px|line-height:40px|font-size:20px|background-color:#89AD4A|color:#fff|border:1px solid #658F1A|border-radius:5px';
$addToBottomCustom = isset( $addToBottomCustom ) ? $addToBottomCustom : 'bottom:15px|right:40px|width:40px|height:40px|line-height:40px|font-size:20px|background-color:#89AD4A|color:#fff|border:1px solid #658F1A|border-radius:5px';
$addToTopLabel = !empty( $addToTopLabel ) ? $addToTopLabel : '▲';
$addToBottomLabel = !empty( $addToBottomLabel ) ? $addToBottomLabel : '▼';
$extSaveButtons = isset( $extSaveButtons ) ? $extSaveButtons : 'Disabled';
$alwaysStay = isset( $alwaysStay ) ? $alwaysStay : 'Disabled';
$rememberLastElements= isset( $rememberLastElements ) ? $rememberLastElements : 'Disabled';
$lastElementLinkColor= isset( $lastElementLinkColor ) ? $lastElementLinkColor : '#66901B';
$jQueryCdn = isset( $jQueryCdn ) ? $jQueryCdn : 'Disabled';
$e = & $modx->Event;
if ( $e->name == "OnManagerMainFrameHeaderHTMLBlock" ) {
$jDocReady = array();
$jWinLoad = array();
$jWinUnLoad = array();
$jWinResize = array();
// DETERMINE MODX v1.1
$version = $modx->getVersionData();
$modx11 = substr($version['version'],0,3) == '1.1';
// PREPARE HTML-OUTPUT
$html = "\n";
// TAKE CARE OF JQUERY
if( $jQueryCdn != 'Disabled' ) $scr_url = 'https://code.jquery.com/jquery.min.js'; // ADD JQUERY FROM CDN
else $scr_url = $modx->config['base_url'] . 'assets/js/jquery.min.js'; // ADD JQUERY FROM LOCAL
$script_tag = rawurlencode(sprintf('', $scr_url));
$html .= sprintf(" ", $script_tag);
// ADD ERROR-MSG & NO-CONFLICT
$html .= '
';
// PREPARE SCROLLFIX
$scrollFixFunctions = '';
if( $scrollFix != 'Disabled' ) {
// PREPARE GET- / SET-SCROLL FUNCTIONS
if ($fixTabHeader != 'Disabled') {
// GET POSITION OF TAB-CONTAINER
$getSetScrollFunctions = '
function getScrollXY() {
var x = 0, y = 0;
var t = $j(".tab-pane").find(".tab-page:visible:first");
x = t.scrollLeft();
y = t.scrollTop();
return [x, y];
}
function setScrollXY(pos) {
if( $j(".tab-pane").length > 0 ) {
var t = $j(".tab-pane").find(".tab-page:visible:first");
t.scrollLeft(pos[0]);
t.scrollTop(pos[1]);
} else {
window.scrollTo(pos[0], pos[1]);
};
}';
} else {
// GET POSITION OF WINDOW
$getSetScrollFunctions = '
function getScrollXY() {
var x = 0, y = 0;
if( typeof( window.pageYOffset ) == "number" ) {
// Netscape
x = window.pageXOffset;
y = window.pageYOffset;
} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
// DOM
x = document.body.scrollLeft;
y = document.body.scrollTop;
} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
// IE6 standards compliant mode
x = document.documentElement.scrollLeft;
y = document.documentElement.scrollTop;
}
return [x, y];
}
function setScrollXY(x, y) {
window.scrollTo(x, y);
}';
};
if (!$modx11 || $fixTabHeader != 'Disabled') {
$scrollFixFunctions = $getSetScrollFunctions . '
function writeStorage(pageref,pos) { localStorage.setItem(pageref, JSON.stringify(pos)); }
function readStorage(pageref) { return JSON.parse(localStorage.getItem(pageref)); }
function loadPosition(pageref){
pos = readStorage(pageref);
pos = pos == null ? [0,0] : pos;
setScrollXY(pos);
}
function savePosition(pageref){
pos=getScrollXY();
writeStorage(pageref,pos);
}
// GENERATE PAGEREF-ID
var params=[];
window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(str,key,value){params[key] = value;});
var pageref = "ScrollFix_a"+params["a"];
if(params["id"] != undefined) { pageref += "_id"+params["id"]; }
';
$jWinLoad[] = 'loadPosition(pageref);';
$jWinUnLoad[] = 'savePosition(pageref);';
};
};
// PREPARE ALWAYS-STAY
if( $alwaysStay != 'Disabled' && $extSaveButtons == 'Disabled' ) {
$jDocReady[] = 'if($j("#stay")) { if(!$j("#stay").val()) { $j("#stay").val(2); }};';
};
// PREPARE FIX TAB-HEADER AND DISABLE FOR SPECIFIC ACTIONS
$tabHeightFunctions = '';
if( $fixTabHeader != 'Disabled' ) {
$tabHeightFunctions = '
function setTabPageHeight() {
if ($j(".tab-page").length > 0) {
$j(".tab-page").css("box-sizing","content-box");
$j(".sectionBody > p:first").html("");
var winHeight = $j(window).height();
var tabsHeight = $j("h2.tab:first").height();
var tabOffset = $j(".tab-pane:first").offset();
if (typeof tabOffset.top != "undefined") { var tabOffsetTop = tabOffset.top * 2; } else { var tabOffsetTop = 0; };
var height = winHeight - tabsHeight - tabOffsetTop;
$j(".tab-page").css("overflow","auto").css("max-height",height+"px");
};
};
';
$jDocReady[] = '$j(".sectionBody").css("margin-bottom","0");';
$jDocReady[] = 'setTabPageHeight();';
$jDocReady[] = 'setTimeout(setTabPageHeight, 100);';
$jWinResize[] = 'setTabPageHeight();';
};
// PREPARE ScrollTo-BUTTONS
$buttonDefaultStyle = 'position:fixed;z-index:99999;display:block;text-align:center;cursor:pointer;text-decoration:none;';
if( $addToTopButton != 'Disabled' ) {
$toTopFunc = ( $modx11 && $fixTabHeader == 'Disabled') ? 'window.scrollTo([0,0])' : 'setScrollXY([0,0])';
$addToTopCustom = str_replace('|',';',$addToTopCustom);
$jWinLoad[] = '$j("body").append("'. $addToTopLabel .'");';
};
if( $addToBottomButton != 'Disabled' ) {
$toBottomFunc = ( $modx11 && $fixTabHeader == 'Disabled') ? 'window.scrollTo([0,document.body.scrollHeight])' : 'setScrollXY([0,1e10])';
$addToBottomCustom = str_replace('|',';',$addToBottomCustom);
$jWinLoad[] = '$j("body").append("'. $addToBottomLabel .'");';
};
// PREPARE EXTENDED SAVE-BUTTON AND DISABLE FOR SPECIFIC ACTIONS
if( $extSaveButtons != 'Disabled' ) {
global $_style, $_lang;
switch( $_GET['a'] ) {
case 11:
case 12:
case 87:
case 88:
$jsFunc = 'document.userform.save.click();';
break;
default:
$jsFunc = 'document.mutate.save.click();saveWait(\'mutate\');';
};
$jDocReady[] =
'if( $j("#stay").length > 0 ) {
$j("#stay").hide();
$j("#stay").val(2);
$j("#Button1 a").attr("title","'. $_lang["save"] .' + '. $_lang["stay"] .'");
$j("#Button1").append("");
$j("#Button1").append("");
};';
};
// FIX JUMP TO TOP
if( $scrollFix != 'Disabled' || $modx11 ) {
$jWinLoad[] = '$j("#Button1 > a").removeAttr("href").css("cursor","pointer");';
};
// REMEMBER LAST IDs
$rememberIdFunctions = '';
if( $rememberLastElements != 'Disabled') {
$rememberIdFunctions = '
var params=[];
var actions=["16","301","78","22","102"];
window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(str,key,value){params[key] = value;});
function saveThisId() {
var pageref = "ScrollFix_remember_" + params["a"];
var id = params["id"] != undefined ? params["id"] : 0;
sessionStorage.setItem(pageref, id);
};
function rememberIds() {
for (i = 0; i < actions.length; i++) {
id = sessionStorage.getItem("ScrollFix_remember_" + actions[i]);
if( id != null ) {
switch(actions[i]) {
case "16": tab = "tabTemplates"; break;
case "301": tab = "tabVariables"; break;
case "78": tab = "tabChunks"; break;
case "22": tab = "tabSnippets"; break;
case "102": tab = "tabPlugins"; break;
}
str = "("+id+")";
$j("#"+tab).find("small:contains("+str+")").closest("a").css("font-weight","bold").css("color","'.$lastElementLinkColor.'");
}
}
};';
$jDocReady[] = '
if(params["a"] == 76) {
rememberIds();
} else if($j.inArray(params["a"], actions) > -1) {
saveThisId();
};
';
};
$html .= '
';
$html .= '
';
$e->output($html);
}