| @@ -26,28 +26,107 @@ | ||
| 26 | 26 | |
| 27 | 27 | |
| 28 | 28 | function pagelayer_live_body(){ |
| 29 | 29 | |
| 30 | -global $post; | |
| 30 | +global $post, $pagelayer; | |
| 31 | 31 | |
| 32 | -echo ' | |
| 33 | -<html> | |
| 34 | -<head> | |
| 35 | - <link rel="stylesheet" href="'.PAGELAYER_CSS.'/givecss.php?give=pagelayer-editor.css,trumbowyg.min.css,pagelayer-icons.css&ver='.PAGELAYER_VERSION.'">'; | |
| 32 | + // XSS BLOCK (defense at the source): If the post contains XSS injected | |
| 33 | + if(pagelayer_should_show_xss_warning()){ | |
| 34 | + pagelayer_render_xss_warning_block(); | |
| 35 | + } | |
| 36 | 36 | |
| 37 | 37 | $icons = pagelayer_enabled_icons(); |
| 38 | + $icons_list = array(); | |
| 38 | 39 | |
| 39 | 40 | // Load all icons |
| 40 | 41 | foreach($icons as $icon){ |
| 41 | - echo '<link rel="stylesheet" href="'.PAGELAYER_CSS.'/givecss.php?give='.$icon.'.min.css&ver='.PAGELAYER_VERSION.'">'; | |
| 42 | + $icons_list[] = $icon.'.min.css'; | |
| 42 | 43 | } |
| 43 | 44 | |
| 45 | + $css_url = admin_url('admin-ajax.php?action=pagelayer_givecss&pagelayer_nonce=1&'); | |
| 46 | + if(pagelayer_enable_giver()){ | |
| 47 | + $css_url = PAGELAYER_CSS.'/givecss.php?'; | |
| 48 | + } | |
| 49 | + | |
| 50 | + $dark_mode = get_option('pagelayer_enable_dark_mode'); | |
| 51 | + $body_class = ''; | |
| 52 | + if(!empty($dark_mode)){ | |
| 53 | + $body_class = 'pagelayer-dark'; | |
| 54 | + }; | |
| 55 | + | |
| 56 | + if(defined('SITEPAD')){ | |
| 57 | + $body_class .= ' sitepad-body'; | |
| 58 | + } | |
| 59 | + | |
| 60 | + $shortcut_groups = [ | |
| 61 | + 'general_shortcuts' => [ | |
| 62 | + 'undo' => 'Ctrl+Z', | |
| 63 | + 'redo' => 'Ctrl+Y', | |
| 64 | + 'save_post' => 'Ctrl+S', | |
| 65 | + 'copy_widget' => 'Ctrl+C', | |
| 66 | + 'paste_widget' => 'Ctrl+V', | |
| 67 | + 'duplicate_widget' => 'Ctrl+D', | |
| 68 | + 'delete_widget' => 'Delete' | |
| 69 | + ] | |
| 70 | + ]; | |
| 71 | + | |
| 72 | + echo ' | |
| 73 | +<html> | |
| 74 | +<head> | |
| 75 | + <link href="https://fonts.googleapis.com/css?family=Roboto&display=swap" rel="stylesheet"> | |
| 76 | + <link rel="stylesheet" href="'.$css_url.'give=pagelayer-editor.css,trumbowyg.min.css,pagelayer-icons.css,pagelayer-ai.css,'.implode(',' ,$icons_list).'&ver='.PAGELAYER_VERSION.'">'; | |
| 77 | + | |
| 44 | 78 | do_action('pagelayer_live_body_head'); |
| 79 | + | |
| 80 | + // Brand Name | |
| 81 | + $brand = strtoupper($pagelayer->BRAND_TEXT); | |
| 82 | + $brand = str_split($brand); | |
| 83 | + | |
| 84 | + echo ' | |
| 85 | +<style> | |
| 86 | +/*Set responsive variables*/ | |
| 87 | +.pagelayer-screen-tablet{ | |
| 88 | +width: '. $pagelayer->settings['tablet_breakpoint'] .'px; | |
| 89 | +} | |
| 90 | +.pagelayer-screen-mobile{ | |
| 91 | +width: '. $pagelayer->settings['mobile_breakpoint'] .'px; | |
| 92 | +} | |
| 93 | +.pagelayer-errorBox-support{ | |
| 94 | +text-decoration:none; | |
| 95 | +} | |
| 96 | +</style> | |
| 97 | +</head> | |
| 45 | 98 | |
| 46 | -echo ' | |
| 47 | -</head> | |
| 99 | + <body class="pagelayer-normalize pagelayer-body '.$body_class.'"> | |
| 100 | +<div class="pagelayer-errorBox"> | |
| 101 | + <div class="pagelayer-errorBox-close"><i class="fas fa-times"></i></div> | |
| 102 | + <div class="pagelayer-errorBox-main"> | |
| 103 | + <h2><i class="fas fa-times"></i>'.__pl('error').'</h2> | |
| 104 | + <div class="pagelayer-errorBox-content"></div> | |
| 105 | + </div> | |
| 106 | + <div class="pagelayer-errorBox-resolve"> | |
| 107 | + <p>'.__pl('error_submitting').'</p> | |
| 108 | + <button type="button" class="pagelayer-errorBox-copy" onclick="pagelayer_copy_error(event)">'.__pl('copy').'</button> | |
| 109 | + <a type="button" class="pagelayer-errorBox-support" href="'. $pagelayer->support .'" target="_bank">'.__pl('support').'</a> | |
| 110 | + </div> | |
| 111 | +</div> | |
| 112 | +<div id="pagelayer-loader-wrapper"> | |
| 113 | + <div class="pagelayer-animation-section"> | |
| 114 | + <div class="pagelayer-loader"> | |
| 115 | + <div class="pagelayer-percent-parent"> | |
| 116 | + <div class="pagelayer-percent">10<sup>%</sup></div> | |
| 117 | + </div> | |
| 118 | + </div> | |
| 119 | + <div class="pagelayer-txt-loading">'; | |
| 120 | + | |
| 121 | + foreach($brand as $k => $v){ | |
| 122 | + echo '<span data-text-preloader="'.$v.'" class="letters-loading">'.$v.'</span>'; | |
| 123 | + } | |
| 124 | + | |
| 125 | + echo '</div> | |
| 126 | + </div> | |
| 127 | +</div> | |
| 48 | 128 | |
| 49 | -<body class="pagelayer-normalize pagelayer-body"> | |
| 50 | 129 | <table class="pagelayer-normalize pagelayer-body-table" cellpadding="0" cellspacing="0"> |
| 51 | 130 | <tr> |
| 52 | 131 | <td valign="top" width="270" class="pagelayer-leftbar-table"> |
| 53 | 132 | <table class="pagelayer-normalize" cellpadding="0" cellspacing="0"> |
| @@ -60,15 +139,15 @@ | ||
| 60 | 139 | </td> |
| 61 | 140 | </tr> |
| 62 | 141 | <tr height="45"> |
| 63 | 142 | <td class="pagelayer-topbar-holder" valign="middle" align="center"> |
| 143 | + <span class="pagelayer-options-icon pli pli-menu"></span> | |
| 64 | 144 | <div class="pagelayer-elpd-header" style="display:none"> |
| 65 | 145 | <div class="pagelayer-elpd-close"><i class="pli pli-cross" aria-hidden="true"></i></div> |
| 66 | - <div class="pagelayer-elpd-title">Edit</div> | |
| 146 | + <div class="pagelayer-elpd-title pagelayer-topbar-mover">Edit</div> | |
| 67 | 147 | </div> |
| 68 | 148 | <div class="pagelayer-logo"> |
| 69 | - <span class="pagelayer-options-icon pli pli-menu" style="display:none"></span> | |
| 70 | - <img src="'.PAGELAYER_LOGO.'" width="32" /><span class="pagelayer-logo-text">'.PAGELAYER_BRAND_TEXT.'</span> | |
| 149 | + <img src="'.$pagelayer->LOGO.'" width="28" /><span class="pagelayer-logo-text pagelayer-topbar-mover">'.$pagelayer->BRAND_TEXT.(defined('PAGELAYER_PREMIUM') && strtolower($pagelayer->BRAND_TEXT) == 'pagelayer' ? '<sup style="margin: 3px; font-size: 12px; letter-spacing: 1px; font-family: "Roboto";">Pro</sup>' : '').'</span> | |
| 71 | 150 | <span class="pagelayer-settings-icon pli pli-service" aria-hidden="true"></span> |
| 72 | 151 | </div> |
| 73 | 152 | </td> |
| 74 | 153 | </tr> |
| @@ -80,25 +159,130 @@ | ||
| 80 | 159 | </tr> |
| 81 | 160 | </table> |
| 82 | 161 | <div class="pagelayer-leftbar-toggle">‹</div> |
| 83 | 162 | </td> |
| 84 | - <td class="pagelayer-iframe"> | |
| 163 | + <td class="pagelayer-iframe" valign="top"> | |
| 85 | 164 | <div class="pagelayer-iframe-top-bar">'; |
| 86 | 165 | do_action('pagelayer_iframe_top_bar'); |
| 87 | 166 | echo ' |
| 88 | 167 | </div> |
| 89 | 168 | <div class="pagelayer-iframe-holder"> |
| 90 | - <iframe src="'.(pagelayer_shortlink(0).'&pagelayer-iframe=1&'.$_SERVER['QUERY_STRING']).'" class="pagelayer-normalize" id="pagelayer-iframe"></iframe> | |
| 169 | + <iframe src="'.(pagelayer_shortlink(0).'&pagelayer-iframe=1&'.$_SERVER['QUERY_STRING']).'" class="pagelayer-normalize skip-lazy" id="pagelayer-iframe"></iframe> | |
| 91 | 170 | </div> |
| 92 | 171 | </td> |
| 93 | 172 | </tr> |
| 94 | 173 | </table> |
| 95 | 174 | |
| 175 | +<div class="pagelayer-pro-notice">'; | |
| 176 | + pagelayer_show_pro_div('Premium Feature<span class="pli pli-cross pagelayer-pro-x"></span>', '', 0); | |
| 177 | +echo '</div> | |
| 178 | +<div class="pagelayer-editor-notice"></div> | |
| 179 | +<div class="pagelayer-props-modal"> | |
| 180 | + <div class="pagelayer-props-holder"> | |
| 181 | + <div class="pagelayer-props-wrap"> | |
| 182 | + <div class="pagelayer-props-loading-screen"></div> | |
| 183 | + <i class="pagelayer-props-modal-close pli pli-cross" aria-hidden="true"></i> | |
| 184 | + </div> | |
| 185 | + </div> | |
| 186 | +</div> | |
| 96 | 187 | <script> |
| 97 | 188 | var pagelayer_iframe_cw = document.getElementById("pagelayer-iframe").contentWindow; |
| 189 | +var start_time = new Date().getTime(); | |
| 190 | + | |
| 191 | +// Show loading progress | |
| 192 | +function loader(ran) { | |
| 193 | + var inner = document.getElementsByClassName("pagelayer-percent")[0]; | |
| 194 | + var w = 0; | |
| 195 | + var t = setInterval(function() { | |
| 196 | + w = w + 1; | |
| 197 | + inner.innerHTML = (w+"<sup>%</sup>"); | |
| 198 | + if (w === ran || inner.getAttribute("loaded") == "1"){ | |
| 199 | + clearInterval(t); | |
| 200 | + w = 0; | |
| 201 | + } | |
| 202 | + }, 50); | |
| 203 | +} | |
| 204 | +loader(90); | |
| 205 | + | |
| 206 | +function $p(sel){ | |
| 207 | + return pagelayer_iframe_cw.pagelayer.$$(sel); | |
| 208 | +} | |
| 209 | + | |
| 210 | +// Load the window if necessary i.e. an error in the JS of the iframe | |
| 211 | +function onIframeLoad(){ | |
| 212 | + setTimeout(function(){ | |
| 213 | + force_pagelayer_start(); | |
| 214 | + }, 5000); | |
| 215 | +} | |
| 216 | + | |
| 217 | +function force_pagelayer_start(){ | |
| 218 | +try{ | |
| 219 | + if(pagelayer_iframe_cw.pagelayer.loaded == 1){ | |
| 220 | + return; | |
| 221 | + } | |
| 222 | + pagelayer_iframe_cw.pagelayer_start(); | |
| 223 | + var end_time = new Date().getTime(); | |
| 224 | + var diff = (end_time - start_time) / 1000; | |
| 225 | + console.log("['.$pagelayer->BRAND_TEXT.'] Live Body had to load after : "+diff+" seconds"); | |
| 226 | + | |
| 227 | +// If this fails, lets just hide the loader | |
| 228 | +}catch(e){ | |
| 229 | + alert("Fatal error within the '.$pagelayer->BRAND_TEXT.' iFrame as pagelayer object not found ! Please contact '.$pagelayer->BRAND_TEXT.' support"); | |
| 230 | + document.getElementById("pagelayer-loader-wrapper").remove(); | |
| 231 | +} | |
| 232 | +} | |
| 233 | + | |
| 234 | +document.getElementById("pagelayer-iframe").onload = onIframeLoad; | |
| 235 | + | |
| 236 | +// ErrorBox content copy function | |
| 237 | +function pagelayer_copy_error(){ | |
| 238 | + var tempInput = document.createElement("textarea"); | |
| 239 | + tempInput.value = document.querySelector(".pagelayer-errorBox-content").innerText; | |
| 240 | + document.body.appendChild(tempInput); | |
| 241 | + tempInput.select(); | |
| 242 | + document.execCommand("copy"); | |
| 243 | + document.body.removeChild(tempInput); | |
| 244 | + alert("'.__pl('copy_success').'"); | |
| 245 | +} | |
| 246 | + | |
| 98 | 247 | </script> |
| 99 | 248 | |
| 249 | +<div class="pagelayer-editor-modal pagelayer-shortcuts-modal"> | |
| 250 | + <div class="pagelayer-editor-modal-wrap"> | |
| 251 | + <div class="pagelayer-editor-modal-header"> | |
| 252 | + <h2>'.__pl('keyboard_shortcuts').'</h2> | |
| 253 | + <span class="pagelayer-editor-modal-close-icon"><i class="fas fa-times"></i></span> | |
| 254 | + </div> | |
| 255 | + <div class="pagelayer-editor-modal-body">'; | |
| 256 | + foreach($shortcut_groups as $grp_name => $group){ | |
| 257 | + | |
| 258 | + if(empty($group)) { | |
| 259 | + return; | |
| 260 | + } | |
| 261 | + | |
| 262 | + echo '<div class="pagelayer-edt-modal-block">'. (!empty($grp_name) ? '<h3>'.__pl($grp_name).'</h3>' :'' ) .'<ul>'; | |
| 263 | + | |
| 264 | + foreach($group as $desc => $shortcut) { | |
| 265 | + echo '<li><span class="pagelayer-keyboard-shortcut-desc">'.__pl($desc).'</span> | |
| 266 | + <span class="pagelayer-keyboard-shortcut-keys">'; | |
| 267 | + | |
| 268 | + //Considering the whole shortcut as a single key | |
| 269 | + $key = '<span>'.$shortcut.'</span>'; | |
| 270 | + | |
| 271 | + //replacing "+" and "," from the string to put it inside <span> | |
| 272 | + $key = preg_replace('/\+/', '</span> + <span>', $key); | |
| 273 | + $key = preg_replace('/\,/', '</span><span style="display:block; margin-top:10px;">', $key); | |
| 274 | + | |
| 275 | + echo $key.'</span></li>'; | |
| 276 | + } | |
| 277 | + | |
| 278 | + echo '</ul></div>'; | |
| 279 | + } | |
| 280 | + | |
| 281 | + echo '</div> | |
| 282 | + </div> | |
| 283 | +</div> | |
| 100 | 284 | </body>'; |
| 101 | 285 | |
| 102 | 286 | die(); |
| 103 | 287 | |
| 104 | 288 | } |