/** * 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); }