From d852cada2221c656af737ff5350543dfe8480c6d Mon Sep 17 00:00:00 2001 From: Diego Najar Date: Tue, 17 Jul 2018 19:13:01 +0200 Subject: [PATCH] Title in database, improves on Page Object, Perfomance improvements, TinyMCE and Bootstrap updated --- bl-kernel/abstract/plugin.class.php | 4 +- bl-kernel/admin/controllers/content.php | 4 +- bl-kernel/admin/controllers/dashboard.php | 8 +- bl-kernel/admin/controllers/edit-content.php | 9 +- bl-kernel/admin/controllers/install-theme.php | 2 +- bl-kernel/admin/controllers/login.php | 14 +- bl-kernel/admin/controllers/users.php | 2 +- bl-kernel/admin/themes/booty/html/media.php | 2 +- bl-kernel/admin/views/categories.php | 2 +- bl-kernel/admin/views/configure-plugin.php | 2 +- bl-kernel/admin/views/content.php | 8 +- bl-kernel/admin/views/developers.php | 2 +- bl-kernel/admin/views/edit-category.php | 2 +- bl-kernel/admin/views/edit-content.php | 76 +-- bl-kernel/admin/views/edit-user.php | 2 +- bl-kernel/admin/views/login.php | 2 +- bl-kernel/admin/views/new-category.php | 2 +- bl-kernel/admin/views/new-content.php | 58 +- bl-kernel/admin/views/new-user.php | 2 +- bl-kernel/admin/views/plugins-position.php | 2 +- bl-kernel/admin/views/settings.php | 72 +-- bl-kernel/admin/views/themes.php | 4 +- bl-kernel/admin/views/user-password.php | 2 +- bl-kernel/boot/admin.php | 18 +- bl-kernel/boot/init.php | 50 +- bl-kernel/boot/rules/60.plugins.php | 4 +- bl-kernel/boot/rules/69.pages.php | 102 +--- bl-kernel/boot/rules/99.header.php | 2 +- bl-kernel/boot/rules/99.paginator.php | 18 +- bl-kernel/boot/rules/99.security.php | 2 +- bl-kernel/boot/rules/99.themes.php | 6 +- bl-kernel/boot/site.php | 8 +- bl-kernel/css/bootstrap.min.css | 4 +- bl-kernel/dbpages.class.php | 221 +++----- bl-kernel/dbsite.class.php | 5 +- bl-kernel/functions.php | 141 ++--- bl-kernel/helpers/paginator.class.php | 8 +- bl-kernel/helpers/theme.class.php | 26 +- bl-kernel/js/bludit-tags.js | 65 --- bl-kernel/js/bootstrap-bundle.min.js | 6 - bl-kernel/js/bootstrap.bundle.min.js | 6 + bl-kernel/js/functions.php | 70 --- bl-kernel/js/variables.php | 8 +- bl-kernel/pagex.class.php | 526 ++++++++++++++++++ bl-plugins/api/plugin.php | 13 +- bl-plugins/disqus/plugin.php | 14 +- bl-plugins/navigation/plugin.php | 6 +- bl-plugins/opengraph/plugin.php | 28 +- bl-plugins/rss/plugin.php | 14 +- bl-plugins/simple-stats/js/chartist.min.js | 3 +- bl-plugins/sitemap/plugin.php | 8 +- bl-plugins/static-pages/plugin.php | 6 +- bl-plugins/tags/plugin.php | 4 +- bl-plugins/tinymce/metadata.json | 4 +- .../tinymce/plugins/help/plugin.min.js | 2 +- .../tinymce/plugins/image/plugin.min.js | 2 +- .../tinymce/plugins/imagetools/plugin.min.js | 2 +- .../tinymce/plugins/lists/plugin.min.js | 2 +- .../tinymce/plugins/paste/plugin.min.js | 2 +- .../tinymce/plugins/table/plugin.min.js | 2 +- .../tinymce/plugins/template/plugin.min.js | 2 +- .../tinymce/plugins/visualchars/plugin.min.js | 2 +- .../tinymce/themes/modern/theme.min.js | 2 +- bl-plugins/tinymce/tinymce/tinymce.min.js | 4 +- bl-plugins/twitter-cards/plugin.php | 22 +- bl-themes/blogx/php/page.php | 2 +- index.php | 2 +- install.php | 33 +- 68 files changed, 1017 insertions(+), 743 deletions(-) delete mode 100644 bl-kernel/js/bludit-tags.js delete mode 100644 bl-kernel/js/bootstrap-bundle.min.js create mode 100644 bl-kernel/js/bootstrap.bundle.min.js create mode 100644 bl-kernel/pagex.class.php diff --git a/bl-kernel/abstract/plugin.class.php b/bl-kernel/abstract/plugin.class.php index dac11102..54332283 100644 --- a/bl-kernel/abstract/plugin.class.php +++ b/bl-kernel/abstract/plugin.class.php @@ -313,7 +313,7 @@ class Plugin { // Example: https://www.mybludit.com/api/foo/bar public function webhook($URI=false, $returnsAfterURI=false, $fixed=true) { - global $Url; + global $url; if (empty($URI)) { return false; @@ -321,7 +321,7 @@ class Plugin { // Check URI start with the webhook $startString = HTML_PATH_ROOT.$URI; - $URI = $Url->uri(); + $URI = $url->uri(); $length = mb_strlen($startString, CHARSET); if (mb_substr($URI, 0, $length)!=$startString) { return false; diff --git a/bl-kernel/admin/controllers/content.php b/bl-kernel/admin/controllers/content.php index 1853b404..7044229a 100644 --- a/bl-kernel/admin/controllers/content.php +++ b/bl-kernel/admin/controllers/content.php @@ -25,11 +25,11 @@ checkRole(array('admin', 'moderator')); // List of published pages $onlyPublished = true; $amountOfItems = ITEMS_PER_PAGE_ADMIN; -$pageNumber = $Url->pageNumber(); +$pageNumber = $url->pageNumber(); $published = $dbPages->getList($pageNumber, $amountOfItems, $onlyPublished); // Check if out of range the pageNumber -if (empty($published) && $Url->pageNumber()>1) { +if (empty($published) && $url->pageNumber()>1) { Redirect::page('content'); } diff --git a/bl-kernel/admin/controllers/dashboard.php b/bl-kernel/admin/controllers/dashboard.php index 02b2edcc..75ed0e68 100644 --- a/bl-kernel/admin/controllers/dashboard.php +++ b/bl-kernel/admin/controllers/dashboard.php @@ -4,18 +4,18 @@ // Functions // ============================================================================ function updateBludit() { - global $Site; + global $site; // Check if Bludit need to be update. - if( ($Site->currentBuild() < BLUDIT_BUILD) || isset($_GET['update']) ) { + if( ($site->currentBuild() < BLUDIT_BUILD) || isset($_GET['update']) ) { Log::set('UPDATE SYSTEM - Starting.'); // From Bludit v2.0.x to v2.1.x - if ($Site->currentBuild() < '20171102') { + if ($site->currentBuild() < '20171102') { // Nothing to do } // Set the current build number - $Site->set(array('currentBuild'=>BLUDIT_BUILD)); + $site->set(array('currentBuild'=>BLUDIT_BUILD)); Log::set('UPDATE SYSTEM - Finished.'); } } diff --git a/bl-kernel/admin/controllers/edit-content.php b/bl-kernel/admin/controllers/edit-content.php index dd693033..d442ba8a 100644 --- a/bl-kernel/admin/controllers/edit-content.php +++ b/bl-kernel/admin/controllers/edit-content.php @@ -53,10 +53,11 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') { // ============================================================================ // Main after POST // ============================================================================ -$pageKey = $layout['parameters']; -$page = buildPage($pageKey); -if ($page===false) { - Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to get the page: '.$pageKey); +try { + $pageKey = $layout['parameters']; + $page = new PageX($pageKey); +} catch (Exception $e) { + Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to get the page: '.$pageKey, LOG_TYPE_ERROR); Redirect::page('content'); } diff --git a/bl-kernel/admin/controllers/install-theme.php b/bl-kernel/admin/controllers/install-theme.php index 8eed22e8..856ed1de 100644 --- a/bl-kernel/admin/controllers/install-theme.php +++ b/bl-kernel/admin/controllers/install-theme.php @@ -25,7 +25,7 @@ $themeDirname = $layout['parameters']; if( Sanitize::pathFile(PATH_THEMES.$themeDirname) ) { // Set the theme - $Site->set(array('theme'=>$themeDirname)); + $site->set(array('theme'=>$themeDirname)); // Add to syslog $syslog->add(array( diff --git a/bl-kernel/admin/controllers/login.php b/bl-kernel/admin/controllers/login.php index 493280b7..356ce365 100644 --- a/bl-kernel/admin/controllers/login.php +++ b/bl-kernel/admin/controllers/login.php @@ -10,11 +10,11 @@ function checkLogin($args) { - global $Security; + global $security; global $login; global $Language; - if ($Security->isBlocked()) { + if ($security->isBlocked()) { Alert::set($Language->g('IP address has been blocked').'
'.$Language->g('Try again in a few minutes'), ALERT_STATUS_FAIL); return false; } @@ -24,13 +24,13 @@ function checkLogin($args) $login->setRememberMe($_POST['username']); } // Renew the token. This token will be the same inside the session for multiple forms. - $Security->generateTokenCSRF(); + $security->generateTokenCSRF(); Redirect::page('dashboard'); return true; } // Bruteforce protection, add IP to the blacklist - $Security->addToBlacklist(); + $security->addToBlacklist(); // Create alert Alert::set($Language->g('Username or password incorrect'), ALERT_STATUS_FAIL); @@ -40,15 +40,15 @@ function checkLogin($args) function checkRememberMe() { - global $Security; + global $security; global $login; - if ($Security->isBlocked()) { + if ($security->isBlocked()) { return false; } if ($login->verifyUserByRemember()) { - $Security->generateTokenCSRF(); + $security->generateTokenCSRF(); Redirect::page('dashboard'); return true; } diff --git a/bl-kernel/admin/controllers/users.php b/bl-kernel/admin/controllers/users.php index fd49ba5c..7ebb9a25 100644 --- a/bl-kernel/admin/controllers/users.php +++ b/bl-kernel/admin/controllers/users.php @@ -20,7 +20,7 @@ checkRole(array('admin')); if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { - $Site->set($_POST); + $site->set($_POST); } // ============================================================================ diff --git a/bl-kernel/admin/themes/booty/html/media.php b/bl-kernel/admin/themes/booty/html/media.php index 7251f892..5d21ebac 100644 --- a/bl-kernel/admin/themes/booty/html/media.php +++ b/bl-kernel/admin/themes/booty/html/media.php @@ -26,7 +26,7 @@ $amountOfPages = count($listOfFilesByPage);
- +
diff --git a/bl-kernel/admin/views/categories.php b/bl-kernel/admin/views/categories.php index caf14e6c..03eee457 100644 --- a/bl-kernel/admin/views/categories.php +++ b/bl-kernel/admin/views/categories.php @@ -23,7 +23,7 @@ $categories = $dbCategories->getKeyNameArray(); foreach ($categories as $categoryKey=>$category) { echo ''; echo ''.$category.''; - echo ''.$Url->filters('category', false).$categoryKey.''; + echo ''.$url->filters('category', false).$categoryKey.''; echo ''; } diff --git a/bl-kernel/admin/views/configure-plugin.php b/bl-kernel/admin/views/configure-plugin.php index 58fc0f9a..36c1e70b 100644 --- a/bl-kernel/admin/views/configure-plugin.php +++ b/bl-kernel/admin/views/configure-plugin.php @@ -6,7 +6,7 @@ echo Bootstrap::formOpen(array('class'=>'plugin-form')); echo Bootstrap::formInputHidden(array( 'name'=>'tokenCSRF', - 'value'=>$Security->getTokenCSRF() + 'value'=>$security->getTokenCSRF() )); // Print the plugin form diff --git a/bl-kernel/admin/views/content.php b/bl-kernel/admin/views/content.php index e6ae9063..7dcf0955 100644 --- a/bl-kernel/admin/views/content.php +++ b/bl-kernel/admin/views/content.php @@ -3,7 +3,7 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Content'), 'icon'=>'cog')); function table($status) { - global $Url; + global $url; global $Language; global $published; global $drafts; @@ -77,7 +77,7 @@ function table($status) { .' '; - $friendlyURL = Text::isEmpty($Url->filters('page')) ? '/'.$page->key() : '/'.$Url->filters('page').'/'.$page->key(); + $friendlyURL = Text::isEmpty($url->filters('page')) ? '/'.$page->key() : '/'.$url->filters('page').'/'.$page->key(); echo ''.$friendlyURL.''; echo ''.$page->position().''; @@ -93,7 +93,7 @@ function table($status) { .' '; - $friendlyURL = Text::isEmpty($Url->filters('page')) ? '/'.$child->key() : '/'.$Url->filters('page').'/'.$child->key(); + $friendlyURL = Text::isEmpty($url->filters('page')) ? '/'.$child->key() : '/'.$url->filters('page').'/'.$child->key(); echo ''.$friendlyURL.''; echo ''.$child->position().''; @@ -115,7 +115,7 @@ function table($status) { .' '; - $friendlyURL = Text::isEmpty($Url->filters('page')) ? '/'.$page->key() : '/'.$Url->filters('page').'/'.$page->key(); + $friendlyURL = Text::isEmpty($url->filters('page')) ? '/'.$page->key() : '/'.$url->filters('page').'/'.$page->key(); echo ''.$friendlyURL.''; echo ''.( ((ORDER_BY=='position') || ($status!='published'))?$page->position():$page->dateRaw(ADMIN_PANEL_DATE_FORMAT) ).''; diff --git a/bl-kernel/admin/views/developers.php b/bl-kernel/admin/views/developers.php index b11f7d83..4001a0ff 100644 --- a/bl-kernel/admin/views/developers.php +++ b/bl-kernel/admin/views/developers.php @@ -34,5 +34,5 @@ $constants = get_defined_constants(true); printTable('Bludit Constants', $constants['user']); // Site object -printTable('$Site object database',$Site->db); +printTable('$Site object database',$site->db); diff --git a/bl-kernel/admin/views/edit-category.php b/bl-kernel/admin/views/edit-category.php index 03725c91..79674895 100644 --- a/bl-kernel/admin/views/edit-category.php +++ b/bl-kernel/admin/views/edit-category.php @@ -6,7 +6,7 @@ echo Bootstrap::formOpen(array()); echo Bootstrap::formInputHidden(array( 'name'=>'tokenCSRF', - 'value'=>$Security->getTokenCSRF() + 'value'=>$security->getTokenCSRF() )); echo Bootstrap::formInputHidden(array( diff --git a/bl-kernel/admin/views/edit-content.php b/bl-kernel/admin/views/edit-content.php index 7c5e9aab..71b74ec6 100644 --- a/bl-kernel/admin/views/edit-content.php +++ b/bl-kernel/admin/views/edit-content.php @@ -21,7 +21,7 @@ // Token CSRF echo Bootstrap::formInputHidden(array( 'name'=>'tokenCSRF', - 'value'=>$Security->getTokenCSRF() + 'value'=>$security->getTokenCSRF() )); // Parent @@ -38,8 +38,8 @@ // Status = published, draft, sticky, static echo Bootstrap::formInputHidden(array( - 'name'=>'status', - 'value'=>$page->status() + 'name'=>'type', + 'value'=>$page->type() )); // Page current key @@ -82,14 +82,31 @@
The content is saved as a draft. To publish it click on the button Publish or if you still working on it click on Save as draft.
+
+ + + g('Cancel') ?> + children())===0) { + echo ''; + } + ?> +
+
- 'Cover image')); +
+
+ + +
+

Cover Image

+
+ coverImage(false); $externalCoverImage = ''; if (filter_var($coverImage, FILTER_VALIDATE_URL)) { @@ -115,26 +132,32 @@
+ +
+
+ + +
+

Cover Image

+
+ 'Advanced')); - // Date echo Bootstrap::formInputText(array( 'name'=>'date', 'label'=>'Date', 'placeholder'=>'', - 'value'=>$page->date(), + 'value'=>$page->dateRaw(), 'tip'=>'Date format: YYYY-MM-DD Hours:Minutes:Seconds' )); // Type echo Bootstrap::formSelect(array( - 'name'=>'type', + 'name'=>'typeTMP', 'label'=>'Type', 'selected'=>$page->type(), 'options'=>array( - ''=>'- Default -', + 'published'=>'- Default -', 'sticky'=>'Sticky', 'static'=>'Static' ), @@ -219,18 +242,6 @@ ?>
-
-
- - - g('Cancel') ?> - children())===0) { - echo ''; - } - ?> -
-
- 'Cover image')); - ?> +
+
+ + +
+

Cover Image

+
coverImagePreview @@ -98,10 +108,16 @@
+ +
+
+ + +
+

Advanced

+
+ 'Advanced')); - // Date echo Bootstrap::formInputText(array( 'name'=>'date', @@ -113,11 +129,11 @@ // Type echo Bootstrap::formSelect(array( - 'name'=>'type', + 'name'=>'typeTMP', 'label'=>'Type', 'selected'=>'', 'options'=>array( - ''=>'- Default -', + 'published'=>'- Default -', 'sticky'=>'Sticky', 'static'=>'Static' ), @@ -199,13 +215,6 @@ ?>
-
-
- - - g('Cancel') ?> -
- "},postRender:function(){var e,t=this;return t.items().exec("postRender"),t._super(),t._layout.postRender(t),t.state.set("rendered",!0),t.settings.style&&t.$el.css(t.settings.style),t.settings.border&&(e=t.borderBox,t.$el.css({"border-top-width":e.top,"border-right-width":e.right,"border-bottom-width":e.bottom,"border-left-width":e.left})),t.parent()||(t.keyboardNav=lt({root:t})),t},initLayoutRect:function(){var e=this._super();return this._layout.recalc(this),e},recalc:function(){var e=this,t=e._layoutRect,n=e._lastRect;if(!n||n.w!==t.w||n.h!==t.h)return e._layout.recalc(e),t=e.layoutRect(),e._lastRect={x:t.x,y:t.y,w:t.w,h:t.h},!0},reflow:function(){var e;if(Qe.remove(this),this.visible()){for(st.repaintControls=[],st.repaintControls.map={},this.recalc(),e=st.repaintControls.length;e--;)st.repaintControls[e].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),st.repaintControls=[]}return this}});function dt(e){var t,n;if(e.changedTouches)for(t="screenX screenY pageX pageY clientX clientY".split(" "),n=0;n
").css({position:"absolute",top:0,left:0,width:f.width,height:f.height,zIndex:2147483647,opacity:1e-4,cursor:d}).appendTo(x.body),we(x).on("mousemove touchmove",v).on("mouseup touchend",p),h.start(e)},v=function(e){if(dt(e),e.button!==g)return p(e);e.deltaX=e.screenX-b,e.deltaY=e.screenY-y,e.preventDefault(),h.drag(e)},p=function(e){dt(e),we(x).off("mousemove touchmove",v).off("mouseup touchend",p),m.remove(),h.stop&&h.stop(e)},this.destroy=function(){we(w).off()},we(w).on("mousedown touchstart",t)}var ht,mt,gt,pt,vt={init:function(){this.on("repaint",this.renderScroll)},renderScroll:function(){var p=this,v=2;function n(){var m,g,e;function t(e,t,n,i,r,o){var s,a,l,u,c,d,f,h;if(a=p.getEl("scroll"+e)){if(f=t.toLowerCase(),h=n.toLowerCase(),we(p.getEl("absend")).css(f,p.layoutRect()[i]-1),!r)return void we(a).css("display","none");we(a).css("display","block"),s=p.getEl("body"),l=p.getEl("scroll"+e+"t"),u=s["client"+n]-2*v,c=(u-=m&&g?a["client"+o]:0)/s["scroll"+n],(d={})[f]=s["offset"+t]+v,d[h]=u,we(a).css(d),(d={})[f]=s["scroll"+t]*c,d[h]=u*c,we(l).css(d)}}e=p.getEl("body"),m=e.scrollWidth>e.clientWidth,g=e.scrollHeight>e.clientHeight,t("h","Left","Width","contentW",m,"Height"),t("v","Top","Height","contentH",g,"Width")}p.settings.autoScroll&&(p._hasScroll||(p._hasScroll=!0,function(){function e(s,a,l,u,c){var d,e=p._id+"-scroll"+s,t=p.classPrefix;we(p.getEl()).append('
'),p.draghelper=new ft(e+"t",{start:function(){d=p.getEl("body")["scroll"+a],we("#"+e).addClass(t+"active")},drag:function(e){var t,n,i,r,o=p.layoutRect();n=o.contentW>o.innerW,i=o.contentH>o.innerH,r=p.getEl("body")["client"+l]-2*v,t=(r-=n&&i?p.getEl("scroll"+s)["client"+c]:0)/p.getEl("body")["scroll"+l],p.getEl("body")["scroll"+a]=d+e["delta"+u]/t},stop:function(){we("#"+e).removeClass(t+"active")}})}p.classes.add("scroll"),e("v","Top","Height","Y","Width"),e("h","Left","Width","X","Height")}(),p.on("wheel",function(e){var t=p.getEl("body");t.scrollLeft+=10*(e.deltaX||0),t.scrollTop+=10*e.deltaY,n()}),we(p.getEl("body")).on("scroll",n)),n())}},bt=ct.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[vt],renderHtml:function(){var e=this,t=e._layout,n=e.settings.html;return e.preRender(),t.preRender(e),void 0===n?n='
'+t.renderHtml(e)+"
":("function"==typeof n&&(n=n.call(e)),e._hasBody=!1),'
'+(e._preBodyHtml||"")+n+"
"}}),yt={resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(e,t){if(e<=1||t<=1){var n=Ce.getWindowSize();e=e<=1?e*n.w:e,t=t<=1?t*n.h:t}return this._layoutRect.autoResize=!1,this.layoutRect({minW:e,minH:t,w:e,h:t}).reflow()},resizeBy:function(e,t){var n=this.layoutRect();return this.resizeTo(n.w+e,n.h+t)}},xt=[],wt=[];function _t(e,t){for(;e;){if(e===t)return!0;e=e.parent()}}function Ct(){ht||(ht=function(e){2!==e.button&&function(e){for(var t=xt.length;t--;){var n=xt[t],i=n.getParentCtrl(e.target);if(n.settings.autohide){if(i&&(_t(i,n)||n.parent()===i))continue;(e=n.fire("autohide",{target:e.target})).isDefaultPrevented()||n.hide()}}}(e)},we(document).on("click touchstart",ht))}function Rt(r){var e=Ce.getViewPort().y;function t(e,t){for(var n,i=0;ie&&(r.fixed(!1).layoutRect({y:r._autoFixY}).repaint(),t(!1,r._autoFixY-e)):(r._autoFixY=r.layoutRect().y,r._autoFixY
').appendTo(i.getContainerElm())),u.setTimeout(function(){t.addClass(n+"in"),we(i.getEl()).addClass(n+"in")}),pt=!0),Et(!0,i)}}),i.on("show",function(){i.parents().each(function(e){if(e.state.get("fixed"))return i.fixed(!0),!1})}),e.popover&&(i._preBodyHtml='
',i.classes.add("popover").add("bottom").add(i.isRtl()?"end":"start")),i.aria("label",e.ariaLabel),i.aria("labelledby",i._id),i.aria("describedby",i.describedBy||i._id+"-none")},fixed:function(e){var t=this;if(t.state.get("fixed")!==e){if(t.state.get("rendered")){var n=Ce.getViewPort();e?t.layoutRect().y-=n.y:t.layoutRect().y+=n.y}t.classes.toggle("fixed",e),t.state.set("fixed",e)}return t},show:function(){var e,t=this._super();for(e=xt.length;e--&&xt[e]!==this;);return-1===e&&xt.push(this),t},hide:function(){return Tt(this),Et(!1,this),this._super()},hideAll:function(){kt.hideAll()},close:function(){return this.fire("close").isDefaultPrevented()||(this.remove(),Et(!1,this)),this},remove:function(){Tt(this),this._super()},postRender:function(){return this.settings.bodyRole&&this.getEl("body").setAttribute("role",this.settings.bodyRole),this._super()}});function Tt(e){var t;for(t=xt.length;t--;)xt[t]===e&&xt.splice(t,1);for(t=wt.length;t--;)wt[t]===e&&wt.splice(t,1)}kt.hideAll=function(){for(var e=xt.length;e--;){var t=xt[e];t&&t.settings.autohide&&(t.hide(),xt.splice(e,1))}};var Ht=function(e,t){return!(!e||t.settings.ui_container)},St=function(s,e,t){var a,n,l=v.DOM,i=s.getParam("fixed_toolbar_container");i&&(n=l.select(i)[0]);var r=function(){if(a&&a.moveRel&&a.visible()&&!a._fixed){var e=s.selection.getScrollContainer(),t=s.getBody(),n=0,i=0;if(e){var r=l.getPos(t),o=l.getPos(e);n=Math.max(0,o.x-r.x),i=Math.max(0,o.y-r.y)}a.fixed(!1).moveRel(t,s.rtl?["tr-br","br-tr"]:["tl-bl","bl-tl","tr-br"]).moveBy(n,i)}},o=function(){a&&(a.show(),r(),l.addClass(s.getBody(),"mce-edit-focus"))},u=function(){a&&(a.hide(),kt.hideAll(),l.removeClass(s.getBody(),"mce-edit-focus"))},c=function(){a?a.visible()||o():(a=e.panel=b.create({type:n?"panel":"floatpanel",role:"application",classes:"tinymce tinymce-inline",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:Ht(n,s),fixed:Ht(n,s),border:1,items:[!1===d(s)?null:{type:"menubar",border:"0 0 1 0",items:se(s)},L(s,f(s))]}),O.setUiContainer(s,a),_(s),n?a.renderTo(n).reflow():a.renderTo().reflow(),C(s,a),o(),V(s),s.on("nodeChange",r),s.on("ResizeWindow",r),s.on("activate",o),s.on("deactivate",u),s.nodeChanged())};return s.settings.content_editable=!0,s.on("focus",function(){!1===g(s)&&t.skinUiCss?l.styleSheetLoader.load(t.skinUiCss,c,c):c()}),s.on("blur hide",u),s.on("remove",function(){a&&(a.remove(),a=null)}),!1===g(s)&&t.skinUiCss?l.styleSheetLoader.load(t.skinUiCss,ve(s)):ve(s)(),{}};function Mt(i,r){var o,s,a=this,l=st.classPrefix;a.show=function(e,t){function n(){o&&(we(i).append('
'),t&&t())}return a.hide(),o=!0,e?s=u.setTimeout(n,e):n(),a},a.hide=function(){var e=i.lastChild;return u.clearTimeout(s),e&&-1!==e.className.indexOf("throbber")&&e.parentNode.removeChild(e),o=!1,a}}var Nt=function(e,t){var n;e.on("ProgressState",function(e){n=n||new Mt(t.panel.getEl("body")),e.state?n.show(e.time):n.hide()})},Pt=function(e,t,n){var i=function(e){var t=e.settings,n=t.skin,i=t.skin_url;if(!1!==n){var r=n||"lightgray";i=i?e.documentBaseURI.toAbsolute(i):h.baseURL+"/skins/"+r}return i}(e);return i&&(n.skinUiCss=i+"/skin.min.css",e.contentCSS.push(i+"/content"+(e.inline?".inline":"")+".min.css")),Nt(e,t),e.getParam("inline",!1,"boolean")?St(e,t,n):xe(e,t,n)},Dt=st.extend({Mixins:[Se],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var e=this,t=e.classPrefix;return'"},bindStates:function(){var t=this;return t.state.on("change:text",function(e){t.getEl().lastChild.innerHTML=t.encode(e.value)}),t._super()},repaint:function(){var e,t;e=this.getEl().style,t=this._layoutRect,e.left=t.x+"px",e.top=t.y+"px",e.zIndex=131070}}),Wt=st.extend({init:function(i){var r=this;r._super(i),i=r.settings,r.canFocus=!0,i.tooltip&&!1!==Wt.tooltips&&(r.on("mouseenter",function(e){var t=r.tooltip().moveTo(-65535);if(e.control===r){var n=t.text(i.tooltip).show().testMoveRel(r.getEl(),["bc-tc","bc-tl","bc-tr"]);t.classes.toggle("tooltip-n","bc-tc"===n),t.classes.toggle("tooltip-nw","bc-tl"===n),t.classes.toggle("tooltip-ne","bc-tr"===n),t.moveRel(r.getEl(),n)}else t.hide()}),r.on("mouseleave mousedown click",function(){r.tooltip().remove(),r._tooltip=null})),r.aria("label",i.ariaLabel||i.tooltip)},tooltip:function(){return this._tooltip||(this._tooltip=new Dt({type:"tooltip"}),O.inheritUiContainer(this,this._tooltip),this._tooltip.renderTo()),this._tooltip},postRender:function(){var e=this,t=e.settings;e._super(),e.parent()||!t.width&&!t.height||(e.initLayoutRect(),e.repaint()),t.autofocus&&e.focus()},bindStates:function(){var t=this;function n(e){t.aria("disabled",e),t.classes.toggle("disabled",e)}function i(e){t.aria("pressed",e),t.classes.toggle("active",e)}return t.state.on("change:disabled",function(e){n(e.value)}),t.state.on("change:active",function(e){i(e.value)}),t.state.get("disabled")&&n(!0),t.state.get("active")&&i(!0),t._super()},remove:function(){this._super(),this._tooltip&&(this._tooltip.remove(),this._tooltip=null)}}),Ot=Wt.extend({Defaults:{value:0},init:function(e){this._super(e),this.classes.add("progress"),this.settings.filter||(this.settings.filter=function(e){return Math.round(e)})},renderHtml:function(){var e=this._id,t=this.classPrefix;return'
0%
'},postRender:function(){return this._super(),this.value(this.settings.value),this},bindStates:function(){var t=this;function n(e){e=t.settings.filter(e),t.getEl().lastChild.innerHTML=e+"%",t.getEl().firstChild.firstChild.style.width=e+"%"}return t.state.on("change:value",function(e){n(e.value)}),n(t.state.get("value")),t._super()}}),At=function(e,t){e.getEl().lastChild.textContent=t+(e.progressBar?" "+e.progressBar.value()+"%":"")},Bt=st.extend({Mixins:[Se],Defaults:{classes:"widget notification"},init:function(e){var t=this;t._super(e),t.maxWidth=e.maxWidth,e.text&&t.text(e.text),e.icon&&(t.icon=e.icon),e.color&&(t.color=e.color),e.type&&t.classes.add("notification-"+e.type),e.timeout&&(e.timeout<0||0'),e=' style="max-width: '+t.maxWidth+"px;"+(t.color?"background-color: "+t.color+';"':'"'),t.closeButton&&(r=''),t.progressBar&&(o=t.progressBar.renderHtml()),''},postRender:function(){var e=this;return u.setTimeout(function(){e.$el.addClass(e.classPrefix+"in"),At(e,e.state.get("text"))},100),e._super()},bindStates:function(){var t=this;return t.state.on("change:text",function(e){t.getEl().firstChild.innerHTML=e.value,At(t,e.value)}),t.progressBar&&(t.progressBar.bindStates(),t.progressBar.state.on("change:value",function(e){At(t,t.state.get("text"))})),t._super()},close:function(){return this.fire("close").isDefaultPrevented()||this.remove(),this},repaint:function(){var e,t;e=this.getEl().style,t=this._layoutRect,e.left=t.x+"px",e.top=t.y+"px",e.zIndex=65534}});function Lt(o){var s=function(e){return e.inline?e.getElement():e.getContentAreaContainer()};return{open:function(e,t){var n,i=w.extend(e,{maxWidth:(n=s(o),Ce.getSize(n).width)}),r=new Bt(i);return 0<(r.args=i).timeout&&(r.timer=setTimeout(function(){r.close(),t()},i.timeout)),r.on("close",function(){t()}),r.renderTo(),r},close:function(e){e.close()},reposition:function(e){G(e,function(e){e.moveTo(0,0)}),function(n){if(0e.w&&(n=e.x-Math.max(0,t/2),r.layoutRect({w:t,x:n}),i=!0),o&&(o.layoutRect({w:r.layoutRect().innerW}).recalc(),(t=o.layoutRect().minW+e.deltaW)>e.w&&(n=e.x-Math.max(0,t-e.w),r.layoutRect({w:t,x:n}),i=!0)),i&&r.recalc()},initLayoutRect:function(){var e,t=this,n=t._super(),i=0;if(t.settings.title&&!t._fullscreen){e=t.getEl("head");var r=Ce.getSize(e);n.headerW=r.width,n.headerH=r.height,i+=n.headerH}t.statusbar&&(i+=t.statusbar.layoutRect().h),n.deltaH+=i,n.minH+=i,n.h+=i;var o=Ce.getWindowSize();return n.x=t.settings.x||Math.max(0,o.w/2-n.w/2),n.y=t.settings.y||Math.max(0,o.h/2-n.h/2),n},renderHtml:function(){var e=this,t=e._layout,n=e._id,i=e.classPrefix,r=e.settings,o="",s="",a=r.html;return e.preRender(),t.preRender(e),r.title&&(o='
'+e.encode(r.title)+'
'),r.url&&(a=''),void 0===a&&(a=t.renderHtml(e)),e.statusbar&&(s=e.statusbar.renderHtml()),'
'+o+'
'+a+"
"+s+"
"},fullscreen:function(e){var n,t,i=this,r=document.documentElement,o=i.classPrefix;if(e!==i._fullscreen)if(we(window).on("resize",function(){var e;if(i._fullscreen)if(n)i._timer||(i._timer=u.setTimeout(function(){var e=Ce.getWindowSize();i.moveTo(0,0).resizeTo(e.w,e.h),i._timer=0},50));else{e=(new Date).getTime();var t=Ce.getWindowSize();i.moveTo(0,0).resizeTo(t.w,t.h),50<(new Date).getTime()-e&&(n=!0)}}),t=i.layoutRect(),i._fullscreen=e){i._initial={x:t.x,y:t.y,w:t.w,h:t.h},i.borderBox=Pe("0"),i.getEl("head").style.display="none",t.deltaH-=t.headerH+2,we([r,document.body]).addClass(o+"fullscreen"),i.classes.add("fullscreen");var s=Ce.getWindowSize();i.moveTo(0,0).resizeTo(s.w,s.h)}else i.borderBox=Pe(i.settings.border),i.getEl("head").style.display="",t.deltaH+=t.headerH,we([r,document.body]).removeClass(o+"fullscreen"),i.classes.remove("fullscreen"),i.moveTo(i._initial.x,i._initial.y).resizeTo(i._initial.w,i._initial.h);return i.reflow()},postRender:function(){var t,n=this;setTimeout(function(){n.classes.add("in"),n.fire("open")},0),n._super(),n.statusbar&&n.statusbar.postRender(),n.focus(),this.dragHelper=new ft(n._id+"-dragh",{start:function(){t={x:n.layoutRect().x,y:n.layoutRect().y}},drag:function(e){n.moveTo(t.x+e.deltaX,t.y+e.deltaY)}}),n.on("submit",function(e){e.isDefaultPrevented()||n.close()}),It.push(n),Ft(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var e,t=this;for(t.dragHelper.destroy(),t._super(),t.statusbar&&this.statusbar.remove(),Ut(t.classPrefix,!1),e=It.length;e--;)It[e]===t&&It.splice(e,1);Ft(0'+this._super(e)}}),jt=Wt.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t,n=this;n._super(e),e=n.settings,t=n.settings.size,n.on("click mousedown",function(e){e.preventDefault()}),n.on("touchstart",function(e){n.fire("click",e),e.preventDefault()}),e.subtype&&n.classes.add(e.subtype),t&&n.classes.add("btn-"+t),e.icon&&n.icon(e.icon)},icon:function(e){return arguments.length?(this.state.set("icon",e),this):this.state.get("icon")},repaint:function(){var e,t=this.getEl().firstChild;t&&((e=t.style).width=e.height="100%"),this._super()},renderHtml:function(){var e,t,n=this,i=n._id,r=n.classPrefix,o=n.state.get("icon"),s=n.state.get("text"),a="",l=n.settings;return(e=l.image)?(o="none","string"!=typeof e&&(e=window.getSelection?e[0]:e[1]),e=" style=\"background-image: url('"+e+"')\""):e="",s&&(n.classes.add("btn-has-text"),a=''+n.encode(s)+""),o=o?r+"ico "+r+"i-"+o:"",t="boolean"==typeof l.active?' aria-pressed="'+l.active+'"':"",'
"},bindStates:function(){var o=this,n=o.$,i=o.classPrefix+"txt";function s(e){var t=n("span."+i,o.getEl());e?(t[0]||(n("button:first",o.getEl()).append(''),t=n("span."+i,o.getEl())),t.html(o.encode(e))):t.remove(),o.classes.toggle("btn-has-text",!!e)}return o.state.on("change:text",function(e){s(e.value)}),o.state.on("change:icon",function(e){var t=e.value,n=o.classPrefix;t=(o.settings.icon=t)?n+"ico "+n+"i-"+o.settings.icon:"";var i=o.getEl().firstChild,r=i.getElementsByTagName("i")[0];t?(r&&r===i.firstChild||(r=document.createElement("i"),i.insertBefore(r,i.firstChild)),r.className=t):r&&i.removeChild(r),s(o.state.get("text"))}),o._super()}}),Jt=jt.extend({init:function(e){e=w.extend({text:"Browse...",multiple:!1,accept:null},e),this._super(e),this.classes.add("browsebutton"),e.multiple&&this.classes.add("multiple")},postRender:function(){var n=this,t=Ce.create("input",{type:"file",id:n._id+"-browse",accept:n.settings.accept});n._super(),we(t).on("change",function(e){var t=e.target.files;n.value=function(){return t.length?n.settings.multiple?t:t[0]:null},e.preventDefault(),t.length&&n.fire("change",e)}),we(t).on("click",function(e){e.stopPropagation()}),we(n.getEl("button")).on("click",function(e){e.stopPropagation(),t.click()}),n.getEl().appendChild(t)},remove:function(){we(this.getEl("button")).off(),we(this.getEl("input")).off(),this._super()}}),Gt=ct.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var e=this,t=e._layout;return e.classes.add("btn-group"),e.preRender(),t.preRender(e),'
'+(e.settings.html||"")+t.renderHtml(e)+"
"}}),Kt=Wt.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){return arguments.length?(this.state.set("checked",e),this):this.state.get("checked")},value:function(e){return arguments.length?this.checked(e):this.checked()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
'+e.encode(e.state.get("text"))+"
"},bindStates:function(){var o=this;function t(e){o.classes.toggle("checked",e),o.aria("checked",e)}return o.state.on("change:text",function(e){o.getEl("al").firstChild.data=o.translate(e.value)}),o.state.on("change:checked change:value",function(e){o.fire("change"),t(e.value)}),o.state.on("change:icon",function(e){var t=e.value,n=o.classPrefix;if(void 0===t)return o.settings.icon;t=(o.settings.icon=t)?n+"ico "+n+"i-"+o.settings.icon:"";var i=o.getEl().firstChild,r=i.getElementsByTagName("i")[0];t?(r&&r===i.firstChild||(r=document.createElement("i"),i.insertBefore(r,i.firstChild)),r.className=t):r&&i.removeChild(r)}),o.state.get("checked")&&t(!0),o._super()}}),Zt=tinymce.util.Tools.resolve("tinymce.util.VK"),Qt=Wt.extend({init:function(i){var r=this;r._super(i),i=r.settings,r.classes.add("combobox"),r.subinput=!0,r.ariaTarget="inp",i.menu=i.menu||i.values,i.menu&&(i.icon="caret"),r.on("click",function(e){var t=e.target,n=r.getEl();if(we.contains(n,t)||t===n)for(;t&&t!==n;)t.id&&-1!==t.id.indexOf("-open")&&(r.fire("action"),i.menu&&(r.showMenu(),e.aria&&r.menu.items()[0].focus())),t=t.parentNode}),r.on("keydown",function(e){var t;13===e.keyCode&&"INPUT"===e.target.nodeName&&(e.preventDefault(),r.parents().reverse().each(function(e){if(e.toJSON)return t=e,!1}),r.fire("submit",{data:t.toJSON()}))}),r.on("keyup",function(e){if("INPUT"===e.target.nodeName){var t=r.state.get("value"),n=e.target.value;n!==t&&(r.state.set("value",n),r.fire("autocomplete",e))}}),r.on("mouseover",function(e){var t=r.tooltip().moveTo(-65535);if(r.statusLevel()&&-1!==e.target.className.indexOf(r.classPrefix+"status")){var n=r.statusMessage()||"Ok",i=t.text(n).show().testMoveRel(e.target,["bc-tc","bc-tl","bc-tr"]);t.classes.toggle("tooltip-n","bc-tc"===i),t.classes.toggle("tooltip-nw","bc-tl"===i),t.classes.toggle("tooltip-ne","bc-tr"===i),t.moveRel(e.target,i)}})},statusLevel:function(e){return 0